一文讀懂BERT中的WordPiece

2022-07-04 06:24:08 字數 1569 閱讀 5432

2023年最火的**要屬google的bert,不過今天我們不介紹bert的模型,而是要介紹bert中的乙個小模組wordpiece。

現在基本效能好一些的nlp模型,例如openai gpt,google的bert,在資料預處理的時候都會有wordpiece的過程。wordpiece字面理解是把word拆成piece一片一片,其實就是這個意思。

wordpiece的一種主要的實現方式叫做bpe(byte-pair encoding)雙位元組編碼。

bpe的過程可以理解為把乙個單詞再拆分,使得我們的此表會變得精簡,並且寓意更加清晰。

比如"loved","loving","loves"這三個單詞。其實本身的語義都是「愛」的意思,但是如果我們以單詞為單位,那它們就算不一樣的詞,在英語中不同字尾的詞非常的多,就會使得詞表變的很大,訓練速度變慢,訓練的效果也不是太好。

bpe演算法通過訓練,能夠把上面的3個單詞拆分成"lov","ed","ing","es"幾部分,這樣可以把詞的本身的意思和時態分開,有效的減少了詞表的數量。

bpe的大概訓練過程:首先將詞分成乙個乙個的字元,然後在詞的範圍內統計字元對出現的次數,每次將次數最多的字元對儲存起來,直到迴圈次數結束。

我們模擬一下bpe演算法。

我們原始詞表如下:

其中的key是詞表的單詞拆分層字母,再加代表結尾,value代表詞出現的頻率。

下面我們每一步在整張詞表中找出頻率最高相鄰序列,並把它合併,依次迴圈。

原始詞表 

出現最頻繁的序列 ('s', 't') 9

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('e', 'st') 9

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('est', '') 9

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('l', 'o') 7

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('lo', 'w') 7

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('n', 'e') 6

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('w', 'est') 6

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('ne', 'west') 6

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('low', '') 5

合併最頻繁的序列後的詞表

出現最頻繁的序列 ('i', 'd') 3

合併最頻繁的序列後的詞表

這樣我們通過bpe得到了更加合適的詞表了,這個詞表可能會出現一些不是單詞的組合,但是這個本身是有意義的一種形式,加速nlp的學習,提公升不同詞之間的語義的區分度。

介紹一些關於wordpiece和bpe的資料供同學們參考。

wordpiece或者bpe這麼好,我們是不是**都能這麼用呢?其實在我們的中文中不是很適用。首先我們的中文不像英文或者其他歐洲的語言一樣通過空格分開,我們是連續的。其次我們的中文乙個字就是乙個最小的單元,無法在拆分的更小了。在中文中一般的處理方式是兩中,分詞和分字。理論上分詞要比分字好,因為分詞更加細緻,語義分的更加開。分字簡單,效率高,詞表也很小,常用字就3000左右。

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...

堆疊 一文讀懂

堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out 的原則。因此 棧 ...