本文從 Hugging Face 的 pipeline 函式出發,講解如何應用變壓器模型構建問答系統、生成文字摘要、進行機器翻譯以及實作文字生成。同時,也介紹了 Hugging Face 生態系統中的核心元件,包含 Transformers 函式庫、預訓練模型中心 Hub、分詞工具 Tokenizers 以及資料集處理工具 Datasets,它們如何協同簡化模型開發流程。最後,文章也探討了 Transformer 模型在實際應用中遭遇的瓶頸,例如跨語言支援、資料量需求、長文字處理效率、模型可解釋性以及潛在偏差等問題。這些都是開發者在使用 Transformer 模型時需要關注的重要議題。
變壓器(Transformers)應使用案例項探討
在前面的章節中,我們瞭解瞭如何利用 Hugging Face 的 pipeline 函式來處理不同的自然語言處理(NLP)任務。現在,我們將進一步探討變壓器模型在實際應用中的多樣性,包括問答系統、文字摘要、翻譯和文字生成等。
問答系統(Question Answering)
問答系統是一種能夠根據給定的文字內容回答問題的技術。我們可以透過 pipeline 函式輕鬆實作一個問答系統:
from transformers import pipeline
# 初始化問答系統
qa_pipeline = pipeline("question-answering")
# 定義問題和文字
question = "誰訂購了Optimus Prime玩具?"
text = "亞馬遜客戶Bumblebee上週從德國的線上商店訂購了一個Optimus Prime的玩具模型。"
# 取得答案
result = qa_pipeline(question=question, context=text)
# 輸出答案
print(result['answer'])
#### 內容解密:
- `pipeline("question-answering")` 初始化了一個預訓練的問答模型,能夠根據上下文回答問題。
- `qa_pipeline(question=question, context=text)` 將問題和文字傳入模型,傳回包含答案的結果。
- `result['answer']` 輸出了模型的答案。
### 文字摘要(Summarization)
文字摘要旨在將長篇文字壓縮成簡短的摘要,保留關鍵資訊。這一任務比前面的任務更具挑戰性,因為它需要模型生成連貫的文字。
```python
# 初始化摘要模型
summarizer = pipeline("summarization")
# 定義輸入文字
text = "亞馬遜客戶Bumblebee上週從德國的線上商店訂購了一個Optimus Prime的玩具模型,但收到的卻是Megatron。"
# 生成摘要
outputs = summarizer(text, max_length=45, clean_up_tokenization_spaces=True)
# 輸出摘要
print(outputs[0]['summary_text'])
#### 內容解密:
- `pipeline("summarization")` 載入了一個預訓練的文字摘要模型。
- `summarizer` 函式根據輸入文字生成摘要,並透過 `max_length` 引數控制輸出長度。
- `clean_up_tokenization_spaces=True` 確保輸出文字的格式乾淨。
### 翻譯(Translation)
翻譯任務涉及將文字從一種語言轉換為另一種語言。與摘要類別似,翻譯也需要生成連貫的文字。
```python
# 初始化翻譯模型
translator = pipeline("translation_en_to_de", model="Helsinki-NLP/opus-mt-en-de")
# 定義輸入文字
text = "亞馬遜客戶Bumblebee上週從德國的線上商店訂購了一個Optimus Prime的玩具模型。"
# 進行翻譯
outputs = translator(text, clean_up_tokenization_spaces=True, min_length=100)
# 輸出翻譯結果
print(outputs[0]['translation_text'])
#### 內容解密:
- `pipeline("translation_en_to_de")` 初始化了一個英語到德語的翻譯模型。
- `translator` 函式將輸入文字翻譯成德語,並透過 `min_length` 引數確保輸出的最小長度。
- 使用特定的預訓練模型(如 "Helsinki-NLP/opus-mt-en-de")來提高翻譯品質。
### 文字生成(Text Generation)
文字生成技術可以用於自動完成客戶服務回覆等場景。
```python
# 初始化文字生成模型
generator = pipeline("text-generation")
# 定義初始回覆
response = "親愛的Bumblebee,對於您的訂單混淆,我深表歉意。"
# 組合輸入提示
prompt = text + "\n\n客戶服務回覆:\n" + response
# 生成回覆內容
outputs = generator(prompt, max_length=200)
# 輸出生成結果
print(outputs[0]['generated_text'])
#### 內容解密:
- `pipeline("text-generation")` 載入了一個預訓練的文字生成模型。
- `generator` 函式根據輸入提示生成進一步的文字內容,並透過 `max_length` 控制輸出長度。
- 自動生成的回覆可以作為客戶服務的初步回應。
## Hugging Face 生態系統
Hugging Face 生態系統已經發展成為一個龐大的工具和函式庫的集合,不僅限於 `Transformers` 函式庫。它還包括用於處理資料、分享結果和評估模型的各種元件。
### 主要組成部分
1. **Transformers 函式庫**:提供了變壓器模型的實作和相關功能。
2. **Hugging Face Hub**:一個集中存放預訓練模型、資料集和評估指令碼的平台。
這些工具共同構成了現代 NLP 和機器學習工作流程的重要基礎設施。隨著對變壓器模型的深入瞭解,我們將繼續探索 Hugging Face 生態系統的其他元件及其在實際專案中的應用。
## Hugging Face 生態系統:推動 Transformer 成功的關鍵工具
在前面的章節中,我們已經瞭解到遷移學習是推動 Transformer 成功的重要因素之一,因為它使得我們能夠將預訓練模型重用於新的任務。因此,能夠快速載入預訓練模型並進行實驗至關重要。
### Hugging Face Hub:豐富的模型資源
Hugging Face Hub 提供了超過 20,000 個免費可用的模型。如圖 1-10 所示,Hub 提供了多種篩選器,例如任務、框架、資料集等,幫助使用者快速導航和尋找合適的模型。就像我們在 pipeline 中看到的那樣,只需一行程式碼就能在程式中載入一個有潛力的模型。這使得嘗試多種模型變得簡單,並讓開發者能夠專注於專案中與特定領域相關的部分。
#### 圖 1-10:Hugging Face Hub 的模型頁面,左側顯示篩選器,右側顯示模型列表
除了模型權重之外,Hub 還提供了資料集和計算指標的指令碼,讓使用者能夠重現已發表的研究結果或利用額外的資料來改進應用。
Hub 還提供了模型和資料集卡片,以記錄模型和資料集的詳細資訊,幫助使用者做出明智的選擇。Hub 的一個特色功能是,使用者可以直接透過各種任務特定的互動式小工具來試用任何模型,如圖 1-11 所示。
#### 圖 1-11:來自 Hugging Face Hub 的模型卡範例:右側顯示允許與模型互動的推理小工具
值得注意的是,PyTorch 和 TensorFlow 也提供了自己的 Hub,如果 Hugging Face Hub 上沒有特定的模型或資料集,可以考慮在這些平台上查詢。
### Hugging Face Tokenizers:高效的分詞工具
在我們在本章節中看到的每個 pipeline 範例背後,都有一套將原始文字分割成更小的部分(稱為 tokens)的分詞步驟。我們將在第 2 章中詳細探討這是如何工作的,但現在只需要瞭解 tokens 可以是單詞、單詞的一部分或只是標點符號等字元。Transformer 模型是根據這些 tokens 的數值表示進行訓練的,因此正確處理這一步驟對於整個 NLP 專案來說非常重要。
Tokenizers 提供了多種分詞策略,並且由於其 Rust 後端,分詞速度極快。它還負責所有前處理和後處理步驟,例如標準化輸入和將模型輸出轉換為所需的格式。使用 Tokenizers,我們可以像使用 Transformers 載入預訓練模型權重一樣載入分詞器。
### Hugging Face Datasets:簡化資料集處理
載入、處理和儲存資料集可能是一個繁瑣的過程,尤其是當資料集太大而無法放入筆記型電腦的 RAM 中時。此外,通常需要實作各種指令碼來下載資料並將其轉換為標準格式。
Datasets 簡化了這個過程,提供了一個標準化的介面,用於存取 Hub 上的數千個資料集。它還提供了智慧快取(因此不必每次執行程式碼時都重新進行預處理)並透過利用一種特殊的機制(稱為記憶體對映)來避免 RAM 的限制,這種機制將檔案的內容儲存在虛擬記憶體中,並使多個程式能夠更有效地修改檔案。該函式庫還與流行的框架(如 Pandas 和 NumPy)相互操作,因此使用者不必離開自己喜歡的資料處理工具。
擁有一個好的資料集和強大的模型是沒有價值的,如果不能可靠地衡量效能。遺憾的是,經典的 NLP 評估指標有多種不同的實作方式,這可能會導致結果的誤導。透過提供許多評估指標的指令碼,Datasets 有助於使實驗結果更加可重現和可信。
### Hugging Face Accelerate:簡化訓練流程
如果您曾經使用 PyTorch 編寫過自己的訓練指令碼,那麼在嘗試將執行在筆記型電腦上的程式碼移植到組織叢集上時,可能會遇到一些麻煩。Accelerate 在正常的訓練迴圈上增加了一層抽象,處理了訓練基礎架構所需的所有自定義邏輯。這樣,透過簡化基礎架構的變更,Accelerate 加速了工作流程。
綜上所述,這些就是 Hugging Face 開源生態系統的核心元件。在結束本章之前,讓我們來看看在現實世界中佈署 Transformer 時會遇到的一些常見挑戰。
```python
# 以下是一個簡單的使用 Hugging Face Transformers 的範例程式碼
from transformers import pipeline
# 載入一個預訓練的情感分析模型
classifier = pipeline("sentiment-analysis")
# 對文字進行情感分析
result = classifier("I love using Transformers!")
# 輸出分析結果
print(result)
內容解密:
- 載入情感分析模型:使用
pipeline("sentiment-analysis")載入預訓練的情感分析模型。 - 進行情感分析:將待分析的文字傳入
classifier物件,進行情感分析。 - 輸出結果:列印預出情感分析的結果,通常包括情感標籤(正面或負面)和相應的置信度。
這段程式碼展示瞭如何使用 Hugging Face 的 Transformers 函式庫來進行情感分析。透過這種方式,使用者可以輕鬆地將預訓練模型應用於自己的 NLP 任務中。
Transformer 的主要挑戰
本章節讓我們對 transformer 模型能夠處理的廣泛 NLP 任務有了一定的瞭解。媒體的頭條新聞有時讓人覺得 transformer 的能力是無限的。然而,盡管 transformer 非常有用,但它遠非萬能。以下是我們將在整本文中探討的與 transformer 相關的一些挑戰:
語言
NLP 研究主要以英語為主。雖然有一些模型可用於其他語言,但很難找到適用於罕見或低資源語言的預訓練模型。在第 4 章中,我們將探討多語言 transformer 及其執行零樣本跨語言遷移的能力。
資料可用性
雖然我們可以使用遷移學習來大幅減少模型所需的標記訓練資料量,但與人類執行任務所需的資料量相比,仍然非常龐大。處理標記資料極少或沒有的場景是第 9 章的主題。
處理長檔案
自注意力機制在處理段落長度的文字時表現出色,但當處理更長的文字(如整個檔案)時,成本會變得非常高。第 11 章將討論一些減輕這種情況的方法。
不透明性
與其他深度學習模型一樣,transformer 在很大程度上是不透明的。很難或無法弄清楚模型為何做出某種預測。當這些模型被用來做出關鍵決策時,這是一個特別棘手的挑戰。我們將在第 2 章和第 4 章探討一些探查 transformer 模型錯誤的方法。
偏差
Transformer 模型主要在網際網路上的文字資料上進行預訓練。這使得資料中存在的所有偏差都被印入模型中。確保這些模型既不是種族主義、性別歧視,也不是更糟糕的,是一個具有挑戰性的任務。我們將在第 10 章更詳細地討論其中一些問題。
文字分類別
文字分類別是 NLP 中最常見的任務之一;它可以用於廣泛的應用,例如將客戶反饋標記為類別或根據支援請求的語言進行路由。您的電子郵件程式的垃圾郵件過濾器很可能正在使用文字分類別來保護您的收件匣免受大量不想要的垃圾郵件的侵擾!
另一種常見的文字分型別別是情感分析,其目的是識別給定文字的極性。例如,像 Tesla 這樣的公司可能會分析 Twitter 上的帖子,以確定人們是否喜歡其新的汽車車頂。
現在,假設您是一名資料科學家,需要建立一個系統,可以自動識別人們在 Twitter 上對公司產品表達的情緒狀態,例如「憤怒」或「喜悅」。在本章中,我們將使用 BERT 的一種變體 DistilBERT 來完成這項任務。
使用 DistilBERT 的優勢
DistilBERT 的主要優勢在於,它實作了與 BERT 相當的效能,同時顯著縮小和提高了效率。這使我們能夠在幾分鐘內訓練一個分類別器,如果您想訓練更大的 BERT 模型,您只需更改預訓練模型的檢查點。
資料集
為了建立我們的情緒檢測器,我們將使用一篇論文中的一個很好的資料集,該論文探討瞭如何在英語 Twitter 訊息中表示情緒。與大多數只涉及「正面」和「負面」極性的情感分析資料集不同,該資料集包含六種基本情緒:憤怒、厭惡、恐懼、喜悅、悲傷和驚訝。給定一條推文,我們的任務是訓練一個模型,可以將其分類別為其中一種情緒。
# 以下是一個簡單的使用 Hugging Face Transformers 函式庫進行文字分類別的範例程式碼
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
# 載入預訓練模型和 tokenizer
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 定義一個函式來對文字進行分類別
def classify_text(text):
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
probs = torch.nn.functional.softmax(logits, dim=1)
return probs
# 對一條推文進行分類別
tweet = "I love the new car roof!"
probs = classify_text(tweet)
print(probs)
內容解密:
- 載入預訓練模型和 tokenizer:我們使用 Hugging Face Transformers 函式庫中的
AutoModelForSequenceClassification和AutoTokenizer類別來載入預訓練的 DistilBERT 模型和對應的 tokenizer。 - 定義分類別函式:
classify_text函式接受一段文字,將其轉換為模型可以理解的輸入格式,然後使用模型進行預測,最後輸出預測的機率分佈。 - 對文字進行分類別:我們對一條示例推文進行分類別,並列印出預測的機率分佈。
這種方法使我們能夠利用預訓練模型的強大功能,快速建立一個高效且準確的文字分類別系統。