GPT-2:結構、數據和字節對編碼

1. 引言

Generative Pre-trained Transformers2.0 (生成式預訓練Transformers第2版,GPT-2)可能是2019年以來,NLP領域影響力最大的算法之一。

從名字就能看出來,GPT-2和Transformer以及GPT有非常密切的關係(關於Transformer的介紹,可以參考https://zhuanlan.zhihu.com/p/122977440;關於GPT的信息,可以參考https://zhuanlan.zhihu.com/p/125139937)。實際上,GPT2是OpenAI對GPT進行升級的產物。

2. GPT2的結構

Alec Radford等人在論文中,只是用文字對GPT-2的結構進行了描述。這裡為了直觀,以圖示之。

如圖2-1,是GPT的結構;如圖2-2,是GPT-2的結構。相比GPT,GPT-2的layer norm位於“子層”(多頭注意力和全連接層)之前;GPT-2在最後一個Transformer的輸出那裡,增加了一個layer norm。他們應該是試驗了很多結構,最後選擇了最適合當前任務的那一個。

參數規模是GPT-2能力的重要基礎。


GPT-2:結構、數據和字節對編碼

圖 2-1 GPT的結構

GPT-2:結構、數據和字節對編碼

圖 2-2 GPT-2的結構

3. GPT-2效果好的關鍵

結構上,GPT-2沒有特別大的創新,但是效果提升幅度很大,為什麼呢?主要原因在於訓練階段的改進。

3.1. 數據

GPT-2學習了800萬個高質量網頁的文本內容。這份語料涵蓋的領域非常廣泛,可以支持模型在各種場景下較好地理解文本。另外,Alec Radford等人利用社交網絡(Redit)裡的點贊機制,篩選出了其中質量較高的文本。我們在社交網絡裡的所有行為,都是數據標註活動,比如點贊就是同意文本所述觀點。如果點讚的人比較多,說明該文本所述內容被很多人看明白了——在語法、語義等等方面,這段文本的質量是比較高的。

3.2. 文本表示——Byte Pair encoding

3.2.1. 常見的文本切分粒度

我們在切分文本的時候,使用的粒度是字、詞、ngram。而我們說的“嵌入”,指的是將字符、詞語或者網絡節點等具有現實意義的元素,用稠密向量表示為語義空間中的一個點。

對中文和英文來說,字符級別的嵌入都有一定的困難:英文中有意義的文本會比較長(輸入序列對應的時間步較多),訓練會比較慢,遺忘也會比較嚴重;中文有幾萬個字(分類標籤較多),訓練也比較慢。詞嵌入的困難就更明顯了,當前主要語言的詞彙表都是十萬級別大小,導致模型訓練非常耗時。

為了控制詞彙表規模,大家做了很多嘗試:去除停用詞;對英文文本做tokenization;將“不重要的”字、詞替換為統一的符號;將數字替換為統一的符號;(中文中)將英文字符替換為統一的符號;字嵌入;等等。這些方法,以及它們的組合,效果各有千秋。刪掉一些token損失信息;而保留生僻token的話,多多少少又會(因為沒有充分學習)對模型的效果產生負面影響。

Sennrich, R等人(2015)搞了一次嘗試,使用介於字符和詞之間的一種文本粒度對文本進行切分[2],以進一步控制詞彙表規模,並緩解數據稀疏問題。這種切分方式有點類似ngram,不是字符,也不是詞語,不適合人類閱讀,但是對機器非常親和:詞彙量被控制在一個不大不小的規模。他們採用的方法,叫做字節對編碼。

3.2.2. 一種奇怪的文本切分粒度——字節對編碼

Gage, Philip(1994)提出了一種數據壓縮算法,叫做字節對編碼(Byte Pair Encoding, BPE)。這個算法的大意是這樣的:用一個新代號表示數據中最常見的bigram(可以是字節對、字符對、詞語對等等),不斷迭代,直到剩餘bigram的頻率為1(或者可以自定義一個終止條件)。其操作方式很簡單,這裡以壓縮字符串“aabcaacc”為例,如表3-1。

表3-1 字節對編碼計算過程示例

GPT-2:結構、數據和字節對編碼

3.2.3. Byte-level字節對編碼

前面介紹的BPE,是在字符的基礎上進行壓縮,應該叫“二元字符編碼”。而GPT-2劍走偏鋒,選擇了一種對機器更加親和的粒度,即在字節的基礎上、使用BPE算法對文本進行壓縮——得到的subword序列,就是文本的新型表示。下游的“嵌入”,也是在subword的基礎上進行嵌入。

字節級BPE的細節,可以參考文獻[3]。字節級別的BPE,你懂的,模式非常少(當然比英文字母的個數要多),不僅控制了詞彙表規模,還極大的緩解了數據稀疏問題,因此可以支撐更好的分佈式表示。

個人以為,字節級別的BPE是GPT-2能力的重要來源。

4. 結語

BERT、GPT-2這些超重型模型,使NLP領域進入了氪金時代——沒幾塊顯卡,你都不好意思說自己是做自然語言處理的。如果應用場景對實時性有要求,在沒有顯卡的情況下,即使是圖拉丁的“垃圾佬”們也無法解決算力問題。一個更有希望的方向,就是使用結構優化、蒸餾、量化等等方式,壓縮模型。經過壓縮的模型,可以在普通計算機甚至是嵌入式設備裡工作,涉及的成本那可是相當的低。

參考文獻

[1] https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf

[2] Sennrich, R., Haddow, B., and Birch, A. Neural machine translation of rare words with subword units. arXiv preprint
arXiv:1508.07909, 2015.

[3] https://arxiv.org/pdf/1909.03341.pdf

[4] Gage, Philip. (1994). A new algorithm for data compression. The C Users Journal. 12. 23-38.

注意:本文為李鵬宇(知乎個人主頁https://www.zhihu.com/people/py-li-34)原創作品,受到著作權相關法規的保護。如需引用、轉載,請註明來源信息:(1)作者名,即“李鵬宇”;(2)原始網頁鏈接,即https://zhuanlan.zhihu.com/p/136138225。如有疑問,可發郵件至我的郵箱:[email protected]


分享到:


相關文章: