我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。
想要控管 Token ID 映射的品質,有鑑於此,先定義,先定義 Tokenizer:
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
接著定義一個函數,依據輸出來判斷是否為 Subword:
def tokenize_word(word):
tokens = tokenizer.tokenize(word)
if len(tokens) == 1 and tokens[0] == word:
process = "Direct"
else:
process = "Subword"
print("Word:", word)
print("Tokenized Tokens:", tokens)
print("Tokenization Process:", process)
接著定義一個小部件來輸入 Word:
word_input = widgets.Text(description = 'Enter a Word:')
display(word_input)
再定義一個 Event Handler:
def on_button_click(b):
word = word_input.value
tokenize_word(word)
最後再配置一個開關:
button = widgets.Button(description = "Tokenize")
button.on_click(on_button_click)
display(button)
測試結果為:
詞元 "am" 在 "amoeboid" 中帶來了多義性問題 (即相同序列具有多種含義),"am" 可以是前綴,也可以是像 "I am" 這樣的單詞,或是像 "am + bush" 中的子詞,注意力層可能會將一個詞元中的 "am" 與另一個 "am" 相關聯,從而創造出不存在的關係,複雜單詞中的多義性是一個具有挑戰性的問題。
我們可以看到,即使是 Subword Tokenizer 也可能在處理罕見和複雜詞彙時遇到問題,這些詞可能在訓練數據集中不常見,導致它們被低估,然而,這些詞在醫學或法律文件中可能至關重要。