導(dǎo)讀
本文分享一篇來自哈佛大學(xué)關(guān)于Transformer的文章,作者為此文章寫了篇注解文檔,詳細(xì)介紹了模型結(jié)構(gòu),訓(xùn)練過程并給出了可實(shí)現(xiàn)的Transformer的代碼。本文僅作為研究人員和開發(fā)者的入門版教程。
下面分享一篇實(shí)驗(yàn)室翻譯的來自哈佛大學(xué)一篇關(guān)于Transformer的詳細(xì)博文。
"Attention is All You Need"[1] 一文中提出的Transformer網(wǎng)絡(luò)結(jié)構(gòu)最近引起了很多人的關(guān)注。Transformer不僅能夠明顯地提升翻譯質(zhì)量,還為許多NLP任務(wù)提供了新的結(jié)構(gòu)。雖然原文寫得很清楚,但實(shí)際上大家普遍反映很難正確地實(shí)現(xiàn)。
所以我們?yōu)榇宋恼聦懥似⒔馕臋n,并給出了一行行實(shí)現(xiàn)的Transformer的代碼。本文檔刪除了原文的一些章節(jié)并進(jìn)行了重新排序,并在整個(gè)文章中加入了相應(yīng)的注解。此外,本文檔以Jupyter notebook的形式完成,本身就是直接可以運(yùn)行的代碼實(shí)現(xiàn),總共有400行庫代碼,在4個(gè)GPU上每秒可以處理27,000個(gè)tokens。
想要運(yùn)行此工作,首先需要安裝PyTorch[2]。這篇文檔完整的notebook文件及依賴可在github[3] 或 Google Colab[4]上找到。
需要注意的是,此注解文檔和代碼僅作為研究人員和開發(fā)者的入門版教程。這里提供的代碼主要依賴OpenNMT[5]實(shí)現(xiàn),想了解更多關(guān)于此模型的其他實(shí)現(xiàn)版本可以查看Tensor2Tensor[6] (tensorflow版本) 和 Sockeye[7](mxnet版本)
- Alexander Rush (@harvardnlp[8] or srush@seas.harvard.edu)
0.準(zhǔn)備工作
# !pip install http://download.pytorch.org/whl/cu80/torch-0.3.0.post4-cp36-cp36m-linux_x86_64.whl numpy matplotlib spacy torchtext seaborn
內(nèi)容目錄
準(zhǔn)備工作
背景
模型結(jié)構(gòu)
- Encoder和Decoder
- Encoder
- Decoder
- Attention
- Attention在模型中的應(yīng)用
- Position-wise前饋網(wǎng)絡(luò)
- Embedding和Softmax
- 位置編碼
- 完整模型
(由于原文篇幅過長,其余部分在下篇)
訓(xùn)練
- 批和掩碼
- 訓(xùn)練循環(huán)
- 訓(xùn)練數(shù)據(jù)和批處理
- 硬件和訓(xùn)練進(jìn)度
- 優(yōu)化器
- 正則化
- 標(biāo)簽平滑
第一個(gè)例子
- 數(shù)據(jù)生成
- 損失計(jì)算
- 貪心解碼
真實(shí)示例
- 數(shù)據(jù)加載
- 迭代器
- 多GPU訓(xùn)練
- 訓(xùn)練系統(tǒng)附加組件:BPE,搜索,平均
結(jié)果
- 注意力可視化
結(jié)論
本文注解部分都是以引用的形式給出的,主要內(nèi)容都是來自原文。
1.背景
減少序列處理任務(wù)的計(jì)算量是一個(gè)很重要的問題,也是Extended Neural GPU、ByteNet和ConvS2S等網(wǎng)絡(luò)的動(dòng)機(jī)。上面提到的這些網(wǎng)絡(luò)都以CNN為基礎(chǔ),并行計(jì)算所有輸入和輸出位置的隱藏表示。
在這些模型中,關(guān)聯(lián)來自兩個(gè)任意輸入或輸出位置的信號(hào)所需的操作數(shù)隨位置間的距離增長而增長,比如ConvS2S呈線性增長,ByteNet呈現(xiàn)以對(duì)數(shù)形式增長,這會(huì)使學(xué)習(xí)較遠(yuǎn)距離的兩個(gè)位置之間的依賴關(guān)系變得更加困難。而在Transformer中,操作次數(shù)則被減少到了常數(shù)級(jí)別。
Self-attention有時(shí)候也被稱為Intra-attention,是在單個(gè)句子不同位置上做的Attention,并得到序列的一個(gè)表示。它能夠很好地應(yīng)用到很多任務(wù)中,包括閱讀理解、摘要、文本蘊(yùn)涵,以及獨(dú)立于任務(wù)的句子表示。端到端的網(wǎng)絡(luò)一般都是基于循環(huán)注意力機(jī)制而不是序列對(duì)齊循環(huán),并且已經(jīng)有證據(jù)表明在簡(jiǎn)單語言問答和語言建模任務(wù)上表現(xiàn)很好。
據(jù)我們所知,Transformer是第一個(gè)完全依靠Self-attention而不使用序列對(duì)齊的RNN或卷積的方式來計(jì)算輸入輸出表示的轉(zhuǎn)換模型。
2.模型結(jié)構(gòu)
目前大部分比較熱門的神經(jīng)序列轉(zhuǎn)換模型都有Encoder-Decoder結(jié)構(gòu)[9]。Encoder將輸入序列映射到一個(gè)連續(xù)表示序列。
對(duì)于編碼得到的z,Decoder每次解碼生成一個(gè)符號(hào),直到生成完整的輸出序列:。對(duì)于每一步解碼,模型都是自回歸的[10],即在生成下一個(gè)符號(hào)時(shí)將先前生成的符號(hào)作為附加輸入。
Transformer的整體結(jié)構(gòu)如下圖所示,在Encoder和Decoder中都使用了Self-attention, Point-wise和全連接層。Encoder和decoder的大致結(jié)構(gòu)分別如下圖的左半部分和右半部分所示。
2.Encoder和Decoder
Encoder
Encoder由N=6個(gè)相同的層組成。
我們?cè)诿績(jī)蓚€(gè)子層之間都使用了殘差連接(Residual Connection) [11]和歸一化 [12]。
每層都有兩個(gè)子層組成。第一個(gè)子層實(shí)現(xiàn)了“多頭”的 Self-attention,第二個(gè)子層則是一個(gè)簡(jiǎn)單的Position-wise的全連接前饋網(wǎng)絡(luò)。
Dncoder
Decoder也是由N=6個(gè)相同層組成。
除了每個(gè)編碼器層中的兩個(gè)子層之外,解碼器還插入了第三種子層對(duì)編碼器棧的輸出實(shí)行“多頭”的Attention。與編碼器類似,我們?cè)诿總€(gè)子層兩端使用殘差連接進(jìn)行短路,然后進(jìn)行層的規(guī)范化處理。
3.Attention
“多頭”機(jī)制能讓模型考慮到不同位置的Attention,另外“多頭”Attention可以在不同的子空間表示不一樣的關(guān)聯(lián)關(guān)系,使用單個(gè)Head的Attention一般達(dá)不到這種效果。
4.Attention在模型中的應(yīng)用
Transformer中以三種不同的方式使用了“多頭”Attention:
1) 在"Encoder-Decoder Attention"層,Query來自先前的解碼器層,并且Key和Value來自Encoder的輸出。Decoder中的每個(gè)位置Attend輸入序列中的所有位置,這與Seq2Seq模型中的經(jīng)典的Encoder-Decoder Attention機(jī)制[15]一致。
2) Encoder中的Self-attention層。在Self-attention層中,所有的Key、Value和Query都來同一個(gè)地方,這里都是來自Encoder中前一層的輸出。Encoder中當(dāng)前層的每個(gè)位置都能Attend到前一層的所有位置。
3) 類似的,解碼器中的Self-attention層允許解碼器中的每個(gè)位置Attend當(dāng)前解碼位置和它前面的所有位置。這里需要屏蔽解碼器中向左的信息流以保持自回歸屬性。具體的實(shí)現(xiàn)方式是在縮放后的點(diǎn)積Attention中,屏蔽(設(shè)為負(fù)無窮)Softmax的輸入中所有對(duì)應(yīng)著非法連接的Value。
5.Position-wise前饋網(wǎng)絡(luò)
6.Embedding和Softmax
7.位置編碼
我們也嘗試了使用預(yù)學(xué)習(xí)的位置Embedding,但是發(fā)現(xiàn)這兩個(gè)版本的結(jié)果基本是一樣的。我們選擇正弦曲線版本的實(shí)現(xiàn),因?yàn)槭褂么税姹灸茏屇P湍軌蛱幚泶笥谟?xùn)練語料中最大序了使用列長度的序列。
8.完整模型
下面定義了連接完整模型并設(shè)置超參的函數(shù)。
審核編輯 :李倩
-
代碼
+關(guān)注
關(guān)注
30文章
4723瀏覽量
68238 -
Transformer
+關(guān)注
關(guān)注
0文章
139瀏覽量
5968 -
pytorch
+關(guān)注
關(guān)注
2文章
802瀏覽量
13116
原文標(biāo)題:搞懂Transformer結(jié)構(gòu),看這篇PyTorch實(shí)現(xiàn)就夠了
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論