預訓練語言模型的出現徹底改變了自然語言處理領域。從 ULMFiT 的遷移學習策略到 ELMo 的上下文詞表示,再到 BERT 的雙向 Transformer 架構,每個模型都推動了技術的進步。GPT 系列則專注於生成式預訓練,展現了在零樣本和少樣本學習上的強大能力。這些技術突破使得自然語言處理應用更加廣泛,也為未來的研究方向奠定了基礎。隨著模型規模的擴大和訓練方法的最佳化,預期語言模型將在更多領域展現出更強大的效能。
NLP 的 ImageNet 瞬間:語言模型的重大突破
語言建模是自然語言處理(NLP)中的一項任務,模型被訓練用於預測單詞序列中的下一個單詞。研究人員選擇這項NLP任務來預訓練模型,因為語言建模不需要標籤;它是一種無監督的NLP任務。由於不需要標籤,研究人員可以在大量的文字資料上預訓練語言模型,這使得模型能夠快速且穩健地學習語言的特性。
ULMFiT:遷移學習的先驅
ULMFiT是一種根據遷移學習的方法,它在NLP任務中取得了顯著的成果。與從頭開始訓練的模型相比,預訓練的ULMFiT模型在小型和中型資料集上表現出色。ULMFiT的成功開啟了NLP在各個公司和應用場景中的可能性,尤其是在難以收集大量資料的情況下。
ELMo:上下文詞表示的革新
ELMo由AllenNLP發布,首次引入了上下文詞表示的概念。這改善了由早期詞嵌入演算法(如Word2Vec、GloVe和fastText)生成的詞嵌入。ELMo使得為相同的單詞生成不同的詞表示成為可能,例如「bank」,取決於它出現的上下文(金融銀行與河岸)。ELMo的詞表示是根據字元的,這使得根據ELMo的模型能夠處理在訓練期間未見過的OOV(Out-Of-Vocabulary)標記。
ELMo 的程式碼範例
import tensorflow as tf
import tensorflow_hub as hub
# 載入 ELMo 模型
elmo = hub.load("https://tfhub.dev/google/elmo/3")
# 輸入文字
sentences = ["The bank is a financial institution.", "The river flows into the bank."]
# 取得 ELMo 詞表示
embeddings = elmo(sentences, signature="default", as_dict=True)["elmo"]
print(embeddings)
內容解密:
- 載入 ELMo 模型:使用
tensorflow_hub載入預訓練的 ELMo 模型。 - 輸入文字:定義兩個句子,分別包含不同上下文中的「bank」。
- 取得 ELMo 詞表示:使用 ELMo 模型為輸入文字生成詞表示。
- 輸出結果:列印生成的詞表示。
BERT:語言模型的里程碑
BERT(Bidirectional Encoder Representations from Transformers)是Google在2018年開源的大型預訓練語言模型,它在許多NLP任務上重新整理了效能記錄。BERT是多項NLP進展的結晶,包括Transformer架構、遷移學習和上下文詞表示。BERT透過巧妙地遮蔽句子中的某些單詞,並讓網路預測被遮蔽的單詞,從而引入了雙向元件。
BERTology:BERT 的後續發展
在BERT之後,出現了一系列改進模型,如XLNet和RoBERTa。XLNet透過在隨機順序中預測標記來改進訓練方法,而RoBERTa透過修改關鍵超引數和增加訓練資料來進一步最佳化架構。
GPT 系列:生成式預訓練模型
OpenAI發布了GPT系列模型,包括GPT-1、GPT-2和GPT-3。這些模型根據Transformer架構,並採用生成式預訓練方法。GPT-3在零樣本和少樣本學習任務上取得了新的高度,被認為是目前效能最強大的生成式NLP模型。
GPT-3 的應用範例
import openai
# 設定 OpenAI API 金鑰
openai.api_key = "YOUR_API_KEY"
# 定義輸入提示
prompt = "Translate the following English sentence to French: 'Hello, how are you?'"
# 取得 GPT-3 的回應
response = openai.Completion.create(
engine="text-davinci-003",
prompt=prompt,
max_tokens=100
)
print(response.choices[0].text.strip())
內容解密:
- 設定 OpenAI API 金鑰:替換
YOUR_API_KEY為您的實際 API 金鑰。 - 定義輸入提示:指定要翻譯的英文句子。
- 取得 GPT-3 的回應:使用
openai.Completion.create方法取得 GPT-3 的翻譯結果。 - 輸出結果:列印翻譯後的法文句子。
工具的選擇與應用
在前面的章節中,我們已經探討了自然語言處理(NLP)的基礎知識以及如何開發NLP模型。從本章開始,我們將關注如何將這些模型從實驗室帶到現實世界中,並探討在實際佈署過程中需要考慮的各種問題。
現實世界的挑戰
在將模型佈署到生產環境時,我們面臨著許多挑戰,例如:應該在哪裡執行模型——是在客戶端還是在伺服器上?如何處理多個同時發出的請求?如何將只能透過Python存取的PyTorch模型整合到JavaScript網路應用程式中?如何利用新的、真實的使用者資料進行訓練?如何在模型投入生產後檢測和處理錯誤?如何跨多個節點擴充套件訓練以處理非常大的資料集?
本章重點
本章將討論主流的機器學習軟體以及在決定技術堆疊時需要面對的選擇。隨後,在第10章中,我們將使用一個易於使用的開源Python函式庫——Streamlit,來構建自定義的網路應用程式,以滿足機器學習和資料科學的需求。最後,在第11章中,我們將探討如何使用行業領先的Databricks軟體,以規模化的方式佈署模型。
工具的選擇
許多開發者熱衷於爭論TensorFlow與PyTorch孰優孰劣,或者最佳的程式語言是什麼,但我們希望退一步,來討論一些在現實世界中需要面對的更實際的決定。
免責宣告
- 我們今天推薦的工具很可能會隨著時間的推移而過時。因此,我們希望幫助您培養對技術堆疊決策至關重要的直覺,而不是過於武斷地給出建議。
- 我們知道您可能有自己的限制——例如,公司可能已經有一套您必須使用的工具。或者,您可能是一個大團隊的一員,團隊已經為您做出了程式語言、雲端服務提供商等的選擇。
- 做出技術堆疊的選擇可能會讓人感到不知所措。有太多不同的供應商提供相似的競爭服務,它們的價格和功能經常變化。這使得選擇絕對最好的選項幾乎成為不可能。
分類別與推薦
我們將工具分為幾個類別,並在每個類別下列出幾個選項。在每個部分的末尾,您將找到兩個具體的推薦,分別標為「Ankur的選擇」和「Ajay的選擇」,這是我們的個人最愛:
- Ankur的選擇:傾向於更具生產導向,專注於在行業中穩定和流行的工具,並且具有良好的擴充套件性。
- Ajay的選擇:更具實驗性和研究導向。這些工具旨在進行快速實驗和原型設計,並將幫助您保持在現代研究的前沿。
程式碼範例:
# 使用Streamlit建立簡單的網路應用程式
import streamlit as st
def main():
st.title("我的第一個Streamlit應用程式")
st.write("這是一個簡單的範例")
if __name__ == "__main__":
main()
內容解密:
此範例展示瞭如何使用Streamlit建立一個簡單的網路應用程式。其中,st.title 用於設定應用程式的標題,而 st.write 用於輸出文字內容。這個例子簡單展示了Streamlit的基本用法,讓開發者能夠快速構建網路應用程式。
深度學習框架
讓我們從深度學習框架開始談起。這些框架是大多數自然語言處理(NLP)任務的核心基礎,我們將在整本文中廣泛使用它們。大多數深度學習框架做的都是同樣的事情——在GPU上執行張量計算。
它們的不同之處在於如何實作各種高階功能和抽象,以及如何管理不太明顯的後端實作,這些都會影響到程式碼的實際效能。
過去十年中,多個框架曾經興起又衰落。一些你可能聽過但越來越少被使用的舊框架包括Theano、Chainer、Lua、Torch和Caffe。截至2020年,我們認為這些較小的框架大多已經過時,不值得探討。
你熟悉且可能已經使用過的大型框架是PyTorch和TensorFlow。這兩個框架分別由當今最成功的兩家科技公司——Facebook和Google推出。部分由於它們在科技領域的主導地位,這兩家公司成功地推動了龐大的開發者社群採用和支援它們的深度學習框架。兩個框架都有一些共同點:它們都是開源的,並且以Python作為主要的程式語言介面。但兩者之間也有一些差異,我們將詳細介紹。
PyTorch是根據Torch框架,而TensorFlow則是根據Theano框架。儘管Torch和Theano已經不再流行,它們的衍生框架現在已成為深度學習領域的主流。
然而,也有幾個新興的框架,你可能不太熟悉。Jax、Julia和Swift for TensorFlow都承諾提供強大的新功能、更好的效能/速度,並且與我們迄今為止所見的有很大不同。它們在穩定性、社群支援和硬體支援方面仍然不如PyTorch和TensorFlow成熟,但它們顯示出很大的潛力,並且有良好的開發動力,所以也要準備好接觸這些新框架。
PyTorch
讓我們從PyTorch開始,它是過去幾年中成長最快的深度學習框架。它是由Facebook的人工智慧研究實驗室(FAIR)開發,並於2016年10月公開發布。大家普遍認為PyTorch現在在研究人員中更受歡迎。
PyTorch的核心是torch.tensor物件。它是一種多維陣列,幾乎與numpy.ndarray相同,可以存在於GPU記憶體中,並用於快速平行計算。PyTorch的幾乎所有功能都是為了操作這些張量而構建的,例如矩陣乘法、卷積等運算。
PyTorch的另一個重要組成部分是autograd。這項功能可以在你使用PyTorch張量運算時自動計算一個叫做梯度的量,這對於訓練神經網路非常有用。
除此之外,描述PyTorch最簡單的方式就是將其稱為「GPU上的NumPy」,並為深度學習增加了方便的功能。通常,深度學習涉及在大型張量上重複執行類別似的計算,這正是GPU擅長的領域。NumPy在CPU上執行計算,在大多數情況下,這比在GPU上平行執行低精確度計算要慢得多。
對於大多數Python程式設計師來說,PyTorch會感到自然且「Pythonic」,因為它的介面與NumPy非常相似。這是PyTorch在過去幾年中繼續流行的重要原因之一,儘管它是在TensorFlow之後發布的。
PyTorch和TensorFlow都提供分散式計算功能,但PyTorch對訓練有更好的最佳化,因為它原生支援非同步執行。
深度學習框架的工作可以描述為在張量資料結構上執行計算的「圖」。在PyTorch中,你在執行時定義圖,這使得你可以在規劃和執行之間輕鬆來回切換。立即評估運算而不明確編譯圖的能力,被稱為即時執行(eager execution)。
即時執行讓你可以更快地進行原型設計,並建立新型架構,但代價是速度。將其視為編譯語言和解釋語言之間的差異。
這在幾年前是一個大問題,因為TensorFlow當時使用靜態圖,需要你在將資料推入圖之前先定義整個圖。然而,兩個框架現在都預設支援即時執行,這已經成為業界標準。
以下是使用PyTorch之前需要考慮的事項的清單。首先是優點:
- 更容易學習且更直觀;類別似Python的編碼風格
- 動態圖
- 適合快速實驗和原型設計
- 需要閱讀的檔案較少
內容解密:
- PyTorch的核心元件:PyTorch的核心是
torch.tensor物件和autograd功能。前者用於多維陣列的運算,後者用於自動計算梯度。 - 即時執行的優缺點:即時執行允許開發者快速進行原型設計和建立新型架構,但會犧牲一些速度。
- 與其他框架的比較:與TensorFlow相比,PyTorch提供了更直觀和Python化的介面,並且原生支援非同步執行,使其在訓練方面更具優勢。
- 使用場景:適合需要快速實驗和原型設計的場景,例如研究人員使用PyTorch進行深度學習模型的開發和測試。
深度學習框架比較與選擇
深度學習框架的選擇對於開發者和研究人員來說是一個重要的決定。不同的框架提供了不同的優缺點和特性,適合不同的應用場景和需求。本文將對目前流行的深度學習框架進行比較,重點介紹 PyTorch、TensorFlow、Jax 和 Julia 等。
PyTorch:靈活性和易用性的典範
PyTorch 是由 Facebook 的 AI 研究團隊開發的深度學習框架,以其靈活性和易用性而聞名。它提供了動態計算圖,這使得除錯和開發更加直觀。PyTorch 的優點包括:
- 對新手友善,易於學習和使用
- 動態計算圖支援靈活的模型開發
- 與 Python 生態系統緊密整合
- 快速迭代和原型開發
然而,PyTorch 也有一些缺點,例如:
- 視覺化工具依賴第三方函式庫,如 Visdom
- 對邊緣裝置佈署的支援較弱,需要 API 伺服器
PyTorch 程式碼範例
import torch
import torch.nn as nn
# 定義一個簡單的神經網路
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(5, 10) # 輸入層到隱藏層
self.fc2 = nn.Linear(10, 5) # 隱藏層到輸出層
def forward(self, x):
x = torch.relu(self.fc1(x)) # 使用 ReLU 啟用函式
x = self.fc2(x)
return x
#### 內容解密:
# Net類別定義了一個簡單的神經網路,包含兩個全連線層(fc1和fc2)。
# 在forward方法中,輸入x首先透過fc1層並使用ReLU啟用函式進行非線性變換。
# 然後,結果透過fc2層輸出。
# 這種結構適合用於簡單的迴歸或分類別任務。
TensorFlow:生產就緒的強大框架
TensorFlow 是由 Google Brain 團隊開發的深度學習框架,最初於 2015 年發布。TensorFlow 1.x 版本曾經是業界的主流選擇,但其複雜的 API 和靜態計算圖限制了其靈活性。TensorFlow 2.0 的發布解決了這些問題,引入了動態計算圖和 Keras 的全面整合。TensorFlow 的優點包括:
- 生產就緒,具有優秀的視覺化工具(TensorBoard)
- 對移動平台有良好的支援(TensorFlow Lite)
- 大型開發者社群和全面的檔案
- 在大規模應用中表現良好
然而,TensorFlow 仍然有一些缺點,例如:
- 從 TensorFlow 1.x 到 2.0 的變化較大,舊程式碼需要重構
- 學習曲線較陡峭
TensorFlow 程式碼範例
import tensorflow as tf
# 定義一個簡單的神經網路
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, activation='relu', input_shape=(5,)),
tf.keras.layers.Dense(5)
])
#### 內容解密:
# 使用TensorFlow的Keras API定義了一個簡單的神經網路模型。
# Sequential模型按順序堆積疊層,第一層是具有10個單元和ReLU啟用函式的全連線層,輸入形狀為(5,)。
# 第二層是具有5個單元的全連線層,用於輸出。
# 這種結構同樣適合簡單的迴歸或分類別任務,並且程式碼簡潔易讀。
Jax:高效能數值計算的新星
Jax 是 Google 最近推出的一個數值計算函式庫,它在 PyTorch 的「NumPy on GPUs」概念上更進一步。Jax 提供了直接在標準 NumPy 和 Python 函式上進行自動微分的功能,使得它能夠處理迴圈、條件陳述式和閉包等原生 Python 結構。Jax 的優點包括:
- 高效能,特別是在加速器上
- 自動微分功能強大且靈活
Julia:新一代科學計算語言
Julia 是一種新興的程式語言,專門為數值和科學計算設計。它的建立者認為,Python 在效能方面做出了許多次優的選擇,而 Julia 試圖在保持易用性的同時提供更高的效能。Julia 的優點包括:
- 為科學計算而設計,具有高效能
- 語法簡潔,易於學習
隨著深度學習技術的不斷發展,我們可以預見更多的創新和改進將出現在各種框架和工具中。未來,深度學習框架可能會更加註重易用性、靈活性和高效能,同時也會更好地支援各種硬體平台和應用場景。因此,保持對新技術和新工具的關注和學習,將是每一位深度學習從業者的重要任務。
深度學習工具選擇與實驗追蹤
在深度學習領域,選擇合適的框架和工具對於專案的成功至關重要。本文將探討目前流行的深度學習框架和實驗追蹤工具,並分析其優缺點。
深度學習框架:PyTorch
Ajay 選擇 PyTorch 作為他的深度學習框架。PyTorch 目前仍是最可靠的解決方案,特別是在研究領域。許多最新的學術文獻都使用 PyTorch 實作,使得調整和測試新的架構、最佳化器等變得非常容易。
# PyTorch 簡單範例
import torch
import torch.nn as nn
# 定義簡單的神經網路
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(5, 10) # 輸入層到隱藏層
self.fc2 = nn.Linear(10, 1) # 隱藏層到輸出層
def forward(self, x):
x = torch.relu(self.fc1(x)) # 使用 ReLU 啟用函式
x = self.fc2(x)
return x
#### 內容解密:
1. **匯入必要的 PyTorch 函式庫**:`torch` 和 `torch.nn` 是 PyTorch 的核心模組,分別用於張量運算和神經網路構建。
2. **定義神經網路類別**:`SimpleNN` 繼承自 `nn.Module`,是 PyTorch 中所有神經網路模組的基礎類別。
3. **初始化神經網路層**:在 `__init__` 方法中定義了兩個全連線層 (`nn.Linear`),分別是輸入層到隱藏層 (`fc1`) 和隱藏層到輸出層 (`fc2`)。
4. **前向傳播**:`forward` 方法定義了資料在網路中的流動方式。輸入 `x` 經過 `fc1` 和 ReLU 啟用函式後,再透過 `fc2` 輸出預測結果。
5. **ReLU 啟用函式**:使用 `torch.relu` 對隱藏層的輸出進行非線性轉換,有助於網路學習複雜模式。
實驗追蹤與視覺化工具
在進行深度學習實驗時,研究人員經常需要執行多個實驗並追蹤結果。為此,各種視覺化和實驗追蹤工具應運而生。
TensorBoard
TensorBoard 是 TensorFlow 的內建視覺化工具。它允許研究人員視覺化模型架構、追蹤指標(如損失和準確率)、檢視權重和偏差的直方圖,並將嵌入向量投影到低維空間。
# TensorBoard 使用範例
import tensorflow as tf
# 定義一個簡單的 TensorBoard 寫入器
writer = tf.summary.create_file_writer('logs')
# 在訓練迴圈中寫入資料到 TensorBoard
with writer.as_default():
for step in range(100):
tf.summary.scalar('loss', step * 0.1, step=step)
#### 內容解密:
1. **匯入 TensorFlow**:使用 `tensorflow` 函式庫來建立 TensorBoard 的寫入器。
2. **建立 TensorBoard 寫入器**:`tf.summary.create_file_writer` 用於建立一個寫入器,將紀錄寫入指定的日誌目錄。
3. **寫入資料到 TensorBoard**:在訓練迴圈中,使用 `tf.summary.scalar` 將損失值寫入 TensorBoard,方便視覺化訓練過程。
4. **使用上下文管理器**:`with writer.as_default():` 確保寫入操作在正確的上下文中執行。
Weights & Biases
Weights & Biases(W&B)是一種受歡迎的實驗追蹤工具,提供了自動化的超引數追蹤、指標記錄和視覺化功能。它支援團隊協作,並允許使用者記錄各種形式的資料,如圖表、預測結果、音訊、影片等。
# Weights & Biases 使用範例
import wandb
# 初始化 W&B
wandb.init(project='my_project')
# 在訓練迴圈中記錄資料
for step in range(100):
wandb.log({'loss': step * 0.1}, step=step)
#### 內容解密:
1. **匯入 W&B 函式庫**:使用 `wandb` 函式庫來初始化和記錄實驗資料。
2. **初始化 W&B 專案**:`wandb.init` 初始化一個新的實驗,並指定專案名稱。
3. **記錄實驗資料**:在訓練迴圈中,使用 `wandb.log` 將損失值等指標記錄到 W&B,支援即時的視覺化監控。
4. **支援多種資料型別**:W&B 不僅能記錄數值,還能記錄圖片、音訊等豐富的多媒體資料。
其他工具
- Neptune:提供輕量級的實驗管理功能,特別適合在 Jupyter Notebook 環境中使用。
- Comet:支援多種機器學習任務,不僅限於深度學習,並提供 AutoML 功能。
- MLflow:管理整個機器學習生命週期,包括實驗追蹤、模型註冊和佈署。