iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0

第三天,我們進入到 transformer 的執行 pipeline 當中,當模型在處理文本時,需要先將文本轉換為模型能理解的形式,而 tokenizer 就是它用來轉換的工具,能將句子或段落切分為較小的單位,如單詞或字元,並轉換成數字編碼,供 transformer 模型處理。

簡單來說,tokenizer 可以把句子分解並編號,讓 transformer 能夠理解和運算。

token 計算

不同的模型會有不同的 tokenizer 設定文件,以 Llama-3.1-8B 來說,申請到許可之後,可以在 hugging face repo 最下方的 json 檔中看到,而在開發的過程中,如果不是自己架設 LLM 模型也多多少少會遇到需要計算 token 數量的場景,尤其是在以 token 計價的 API 用量計算上,而每個 LLM 單次能理解的 token 數量也有限制,在超過限制之後,有些模型會直接報錯不允許問答,而有些模型則是會降低回應的效能。

網路上有一些 token 視覺化工具,不同的裁切 token 的方式不同,以下便是以 OpenAI 所提供用於 GPT-3.5 和 GPT-4 兩個模型的裁切方式範例:

https://ithelp.ithome.com.tw/upload/images/20240903/20151660b23ncdEkMl.jpg
https://ithelp.ithome.com.tw/upload/images/20240903/20151660kRbQDRePQe.jpg
不確定是模型本身或是平台的關係,看起來並不支援繁體中文。

tokenizer 實作演練

還是以 coding 的方式裁切 token 最為準確,我們以昨日範例中的第一個情感分析為例,也透過簡單的實作更了解 transformer 和 tokenizer 之間的關聯:

  1. 實體化 分類模型(預設的 bert-base 模型)Tokenizer
from transformers import AutoModelForSequenceClassification
from transformers import AutoTokenizer

model_name = "distilbert-base-uncased-finetuned-sst-2-english"

model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 我們可以看到這個分類模型的任務是將字串分類成負面或正面
print(model.config.id2label)

''' output: {0: 'NEGATIVE', 1: 'POSITIVE'} '''
  1. 透過 tokenizer 將文字切分成 token
    透過以下語法,我們可以看到 tokenizer 是如何切分 token,以及各個 token 所對應到的 id,這些都會取決於模型而有所不同
string_input = "We are SI Dream Engineering Team."

# 將文字輸入轉成 token
token_output = tokenizer.tokenize(string_input)
print(token_output)

''' output: ['we', 'are', 'si', 'dream', 'engineering', 'team', '.'] '''

# 把 token 映射到對應的 id
token_id_output = tokenizer.convert_tokens_to_ids(token_output)
print(token_id_output)

''' output: [2057, 2024, 9033, 3959, 3330, 2136, 1012] '''
  1. transformer 架構的 encoding & decoding
    我們也可以透過 .encode.decode 兩個函式更了解 transformer 的最主要的兩個架構,從輸出可以看到在處理的過程中,字首和字尾會被加上特殊的 token
# encode: string -> token
encoded_output = tokenizer.encode(string_input)
print(encoded_output)

''' output: [101, 2057, 2024, 9033, 3959, 3330, 2136, 1012, 102] '''

# decode: token -> string
decoded_output = tokenizer.decode(encoded_output)
print(decoded_output)

''' output: [CLS] we are si dream engineering team. [SEP] '''
  1. tokenizer: 先將文本傳化成 transformer 的讀取形式-tensor
import torch

# transformer 是讀取型態是 tensor (如 PyTorch、TensorFlow),在這裡我們將將文字轉化成 PyTorch 型態來處理
pytorch_output = tokenizer(string_input, padding=True, truncation=True, return_tensors="pt")
print(pytorch_output)

''' output: {'input_ids': tensor([[ 101, 2057, 2024, 9033, 3959, 3330, 2136, 1012,  102]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1]])} '''
  1. transformer 拿到 tensor 後,就可以來加工處理了!
# 將 tensor 餵給 model,並得到 logits 分類的結果
result = model(**pytorch_output)
print(outputs.logits)

''' output: tensor([[-2.9865,  3.1730]], grad_fn=<AddmmBackward0>) '''


# 要轉化為最終結果,還需要透過 softmax 轉化
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
print(predictions)

''' output: tensor([[0.0021, 0.9979]], grad_fn=<SoftmaxBackward0>) '''

對應模型設定,可以看到結果為否定機率:0.0021,肯定機率:0.9979。
吻合昨日的範例:[{'label': 'POSITIVE', 'score': 0.9978912472724915}]


ref.


上一篇
[Day2] 什麼是 LLM 模型?
下一篇
[Day4] Token 之間的關係如何衡量-Embedding & Vectors
系列文
從系統設計切入,探索 GenAI 在企業中的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言