作者|huggingface
編譯|vk
**|github
詞彙表每種模型都不同,但與其他模型相似。因此,大多數模型使用相同的輸入,此處將在用法示例中進行詳細說明。
輸入id通常是傳遞給模型作為輸入的唯一必需引數。它們是標記索引,標記的數字表示構建將被模型用作輸入的序列。
每個tokenizer的工作方式不同,但基本機制保持不變。這是乙個使用berttokenizer(wordpiecetokenizer)的示例:
from transformers import berttokenizer
tokenizer = berttokenizer.from_pretrained(
"bert-base-cased"
)sequence =
"a titan rtx has 24gb of vram"
tokenizer負責將序列拆分為tokenizer詞彙表中可用的標記。
#繼續上乙個指令碼
tokenized_sequence = tokenizer.tokenize(sequence)
assert tokenized_sequence ==
['a'
,'titan'
,'r'
,'##t'
,'##x'
,'has'
,'24'
,'##gb'
,'of'
,'v'
,'##ra'
,'##m'
]
然後可以將這些標記轉換為模型可以理解的id。有幾種方法可以使用,推薦使用的是encode或encode_plus,它們實現了最佳效能。
#繼續上乙個指令碼
encode_sequence = tokenizer.encode(sequence)
assert encoded_sequence ==
[101
,138
,18696
,155
,1942
,3190
,1144
,1572
,13745
,1104
,159
,9664
,2107
,102
]
encode和encode_plus方法自動新增「特殊標記」,這是模型使用的特殊id。
注意掩碼是將序列批處理在一起時使用的可選引數。此引數向模型指示應該注意哪些標記,哪些不應該注意。
例如,考慮以下兩個序列:
from transformers import berttokenizer
tokenizer = berttokenizer.from_pretrained(
"bert-base-cased"
)sequence_a =
"this is a short sequence."
sequence_b =
"this is a rather long sequence. it is at least longer than the sequence a."
encoded_sequence_a = tokenizer.encode(sequence_a)
assert
len(encoded_sequence_a)==8
encoded_sequence_b = tokenizer.encode(sequence_b)
assert
len(encoded_sequence_b)
==19
這兩個序列的長度不同,因此不能按原樣放在同一張量中。需要將第乙個序列填充到第二個序列的長度,或者將第二個序列截短到第乙個序列的長度。
在第一種情況下,id列表將通過填充索引擴充套件:
#繼續上乙個指令碼
padded_sequence_a = tokenizer.encode(sequence_a, max_length=
19, pad_to_max_length=
true
)assert padded_sequence_a ==
[101
,1188
,1110
,170
,1603
,4954
,119
,102,0
,0,0
,0,0
,0,0
,0,0
,0,0
]assert encoded_sequence_b ==
[101
,1188
,1110
,170
,1897
,1263
,4954
,119
,1135
,1110
,1120
,1655
,2039
,1190
,1103
,4954
,138
,119
,102
]
然後可以將它們轉換為pytorch或tensorflow中的張量。注意掩碼是乙個二進位制張量,指示填充索引的位置,以便模型不會注意它們。對於berttokenizer
,1表示應注意的值,而0表示填充值。
方法encode_plus()
可用於直接獲取注意力掩碼:
#繼續上乙個指令碼
sequence_a_dict = tokenizer.encode_plus(sequence_a, max_length=
19, pad_to_max_length=
true
)assert sequence_a_dict[
'input_ids']==
[101
,1188
,1110
,170
,1603
,4954
,119
,102,0
,0,0
,0,0
,0,0
,0,0
,0,0
]assert sequence_a_dict[
'attention_mask']==
[1,1
,1,1
,1,1
,1,1
,0,0
,0,0
,0,0
,0,0
,0,0
,0]
一些模型的目的是進行序列分類或問題解答。這些要求將兩個不同的序列編碼在相同的輸入id中。它們通常由特殊標記分隔,例如分類器標記和分隔符標記。例如,bert模型按如下方式構建其兩個序列輸入:
from transformers import berttokenizer
tokenizer = berttokenizer.from_pretrained(
"bert-base-cased"
)# [cls] seq_a [sep] seq_b [sep]
sequence_a =
"huggingface is based in nyc"
sequence_b =
"where is huggingface based?"
encoded_sequence = tokenizer.encode(sequence_a, sequence_b)
assert tokenizer.decode(encoded_sequence)
=="[cls] huggingface is based in nyc [sep] where is huggingface based? [sep]"
對於某些模型而言,這足以了解乙個序列在何處終止以及另一串行在何處開始。但是,其他模型(例如bert)具有附加機制,即段id。標記型別id是乙個二進位制掩碼,用於標識模型中的不同序列。
我們可以利用encode_plus()為我們輸出標記型別id:
#繼續上乙個指令碼
encoded_dict = tokenizer.encode_plus(sequence_a, sequence_b)
assert encoded_dict[
'input_ids']==
[101
,20164
,10932
,2271
,7954
,1110
,1359
,1107
,17520
,102
,2777
,1110
,20164
,10932
,2271
,7954
,1359
,136
,102
]assert encoded_dict[
'token_type_ids']==
[0,0
,0,0
,0,0
,0,0
,0,0
,1,1
,1,1
,1,1
,1,1
,1]
第乙個序列,即用於問題的「上下文」,其所有標記均由0表示,而問題的所有標記均由1表示。某些模型(例如xlnetmodel
)使用由2表示的附加標記。
模型使用位置id來識別哪個標記在哪個位置。與將每個標記的位置嵌入其中的rnn相反,轉換器不知道每個標記的位置。為此建立了位置id。
它們是可選引數。如果沒有位置id傳遞給模型,則它們將自動建立為絕對位置嵌入。
在[0, config.max_position_embeddings - 1]
範圍內選擇絕對位置嵌入。一些模型使用其他型別的位置嵌入,例如正弦位置嵌入或相對位置嵌入。
opencv中文官方文件:
elasticsearch的詞彙表
分析 analysis 分析是把正文 full text 分解為語彙 terms 的過程。根據分析器的不同,短語 foo bar foo bar foo,bar 都會被分解成 foo 和 bar 語彙是真正儲存在索引中的。乙個全文的查詢 非語彙查詢 比如 foo bar 會被分析器分解為 foo b...
常用數學詞彙表
代數部分 幾何部分 quadrilateral 四邊形 pentagon 五邊形 hexagon 六邊形 heptagon 七邊形 octagon 八邊形 nonagon 九邊形 decagon 十邊形 polygon 多邊形 multilateral 多邊的 parallelogram 平行四邊形...
記憶體技術詞彙表
記憶體是計算機的重要部件之一。它是外存與cpu進行溝通的橋梁,計算機中所有程式的執行都在記憶體中進行。記憶體效能的強弱影響計算機整體發揮的水平。記憶體 memory 也稱記憶體儲器和主儲存器,它用於暫時存放cpu中的運算資料,與硬碟等外部儲存器交換的資料。只要計算機開始執行,作業系統就會把需要運算的...