<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 搞懂Transformer結構,看這篇PyTorch實(shí)現就夠了

搞懂Transformer結構,看這篇PyTorch實(shí)現就夠了

發(fā)布人:計算機視覺(jué)工坊 時(shí)間:2022-06-16 來(lái)源:工程師 發(fā)布文章
作者丨Alexander Rush

來(lái)源丨哈工大SCIR編輯丨極市平臺

下面分享一篇實(shí)驗室翻譯的來(lái)自哈佛大學(xué)一篇關(guān)于Transformer的詳細博文。

圖片

"Attention is All You Need"[1] 一文中提出的Transformer網(wǎng)絡(luò )結構最近引起了很多人的關(guān)注。Transformer不僅能夠明顯地提升翻譯質(zhì)量,還為許多NLP任務(wù)提供了新的結構。雖然原文寫(xiě)得很清楚,但實(shí)際上大家普遍反映很難正確地實(shí)現。

所以我們?yōu)榇宋恼聦?xiě)了篇注解文檔,并給出了一行行實(shí)現的Transformer的代碼。本文檔刪除了原文的一些章節并進(jìn)行了重新排序,并在整個(gè)文章中加入了相應的注解。此外,本文檔以Jupyter notebook的形式完成,本身就是直接可以運行的代碼實(shí)現,總共有400行庫代碼,在4個(gè)GPU上每秒可以處理27,000個(gè)tokens。

想要運行此工作,首先需要安裝PyTorch[2]。這篇文檔完整的notebook文件及依賴(lài)可在github[3] 或 Google Colab[4]上找到。

需要注意的是,此注解文檔和代碼僅作為研究人員和開(kāi)發(fā)者的入門(mén)版教程。這里提供的代碼主要依賴(lài)OpenNMT[5]實(shí)現,想了解更多關(guān)于此模型的其他實(shí)現版本可以查看Tensor2Tensor[6] (tensorflow版本) 和 Sockeye[7](mxnet版本)

  • Alexander Rush (@harvardnlp[8] or srush@seas.harvard.edu)
0. 準備工作
# !pip install http://download.pytorch.org/whl/cu80/torch-0.3.0.post4-cp36-cp36m-linux_x86_64.whl numpy matplotlib spacy torchtext seaborn
圖片

內容目錄

準備工作

背景

模型結構

- Encoder和Decoder

- Encoder

- Decoder

- Attention

- Attention在模型中的應用

- Position-wise前饋網(wǎng)絡(luò )

- Embedding和Softmax

- 位置編碼

- 完整模型

(由于原文篇幅過(guò)長(cháng),其余部分在下篇)

訓練

- 批和掩碼

- 訓練循環(huán)

- 訓練數據和批處理

- 硬件和訓練進(jìn)度

- 優(yōu)化器

- 正則化

- 標簽平滑

第一個(gè)例子

- 數據生成

- 損失計算

- 貪心解碼

真實(shí)示例

- 數據加載

- 迭代器

- 多GPU訓練

- 訓練系統附加組件:BPE,搜索,平均

結果

- 注意力可視化

結論

本文注解部分都是以引用的形式給出的,主要內容都是來(lái)自原文。

1. 背景

減少序列處理任務(wù)的計算量是一個(gè)很重要的問(wèn)題,也是Extended Neural GPU、ByteNet和ConvS2S等網(wǎng)絡(luò )的動(dòng)機。上面提到的這些網(wǎng)絡(luò )都以CNN為基礎,并行計算所有輸入和輸出位置的隱藏表示。

在這些模型中,關(guān)聯(lián)來(lái)自?xún)蓚€(gè)任意輸入或輸出位置的信號所需的操作數隨位置間的距離增長(cháng)而增長(cháng),比如ConvS2S呈線(xiàn)性增長(cháng),ByteNet呈現以對數形式增長(cháng),這會(huì )使學(xué)習較遠距離的兩個(gè)位置之間的依賴(lài)關(guān)系變得更加困難。而在Transformer中,操作次數則被減少到了常數級別。

Self-attention有時(shí)候也被稱(chēng)為Intra-attention,是在單個(gè)句子不同位置上做的Attention,并得到序列的一個(gè)表示。它能夠很好地應用到很多任務(wù)中,包括閱讀理解、摘要、文本蘊涵,以及獨立于任務(wù)的句子表示。端到端的網(wǎng)絡(luò )一般都是基于循環(huán)注意力機制而不是序列對齊循環(huán),并且已經(jīng)有證據表明在簡(jiǎn)單語(yǔ)言問(wèn)答和語(yǔ)言建模任務(wù)上表現很好。

據我們所知,Transformer是第一個(gè)完全依靠Self-attention而不使用序列對齊的RNN或卷積的方式來(lái)計算輸入輸出表示的轉換模型。

2. 模型結構

目前大部分比較熱門(mén)的神經(jīng)序列轉換模型都有Encoder-Decoder結構[9]。Encoder將輸入序列  映射到一個(gè)連續表示序列  。

對于編碼得到的z,Decoder每次解碼生成一個(gè)符號,直到生成完整的輸出序列: 。對于每一步解碼,模型都是自回歸的[10],即在生成下一個(gè)符號時(shí)將先前生成的符號作為附加輸入。

圖片

Transformer的整體結構如下圖所示,在Encoder和Decoder中都使用了Self-attention, Point-wise和全連接層。Encoder和decoder的大致結構分別如下圖的左半部分和右半部分所示。

圖片2. Encoder和Decoder

Encoder

Encoder由N=6個(gè)相同的層組成。

圖片

我們在每?jì)蓚€(gè)子層之間都使用了殘差連接(Residual Connection) [11]和歸一化 [12]。

圖片圖片圖片

每層都有兩個(gè)子層組成。第一個(gè)子層實(shí)現了“多頭”的 Self-attention,第二個(gè)子層則是一個(gè)簡(jiǎn)單的Position-wise的全連接前饋網(wǎng)絡(luò )。

圖片

Dncoder

Decoder也是由N=6個(gè)相同層組成。

圖片

除了每個(gè)編碼器層中的兩個(gè)子層之外,****還插入了第三種子層對編碼器棧的輸出實(shí)行“多頭”的Attention。 與編碼器類(lèi)似,我們在每個(gè)子層兩端使用殘差連接進(jìn)行短路,然后進(jìn)行層的規范化處理。

圖片圖片圖片3. Attention圖片圖片圖片

“多頭”機制能讓模型考慮到不同位置的Attention,另外“多頭”Attention可以在不同的子空間表示不一樣的關(guān)聯(lián)關(guān)系,使用單個(gè)Head的Attention一般達不到這種效果。

圖片圖片圖片4. Attention在模型中的應用

Transformer中以三種不同的方式使用了“多頭”Attention:

1) 在"Encoder-Decoder Attention"層,Query來(lái)自先前的****層,并且Key和Value來(lái)自Encoder的輸出。Decoder中的每個(gè)位置Attend輸入序列中的所有位置,這與Seq2Seq模型中的經(jīng)典的Encoder-Decoder Attention機制[15]一致。

2) Encoder中的Self-attention層。在Self-attention層中,所有的Key、Value和Query都來(lái)同一個(gè)地方,這里都是來(lái)自Encoder中前一層的輸出。Encoder中當前層的每個(gè)位置都能Attend到前一層的所有位置。

3) 類(lèi)似的,****中的Self-attention層允許****中的每個(gè)位置Attend當前解碼位置和它前面的所有位置。這里需要屏蔽****中向左的信息流以保持自回歸屬性。具體的實(shí)現方式是在縮放后的點(diǎn)積Attention中,屏蔽(設為負無(wú)窮)Softmax的輸入中所有對應著(zhù)非法連接的Value。

5. Position-wise前饋網(wǎng)絡(luò )圖片6. Embedding和Softmax圖片7. 位置編碼圖片圖片圖片

我們也嘗試了使用預學(xué)習的位置Embedding,但是發(fā)現這兩個(gè)版本的結果基本是一樣的。我們選擇正弦曲線(xiàn)版本的實(shí)現,因為使用此版本能讓模型能夠處理大于訓練語(yǔ)料中最大序了使用列長(cháng)度的序列。

8. 完整模型

下面定義了連接完整模型并設置超參的函數。

圖片
END. 參考鏈接[1] https://arxiv.org/abs/1706.03762
[2] https://pytorch.org/
[3] https://github.com/harvardnlp/annotated-transformer
[4] https://drive.google.com/file/d/1xQXSv6mtAOLXxEMi8RvaW8TW-7bvYBDF/view?usp=sharing
[5] http://opennmt.net
[6] https://github.com/tensorflow/tensor2tensor
[7] https://github.com/awslabs/sockeye
[8] https://twitter.com/harvardnlp
[9] https://arxiv.org/abs/1409.0473
[10] https://arxiv.org/abs/1308.0850
[11] https://arxiv.org/abs/1512.03385
[12] https://arxiv.org/abs/1607.06450
[13] https://arxiv.org/abs/1409.0473
[14] https://arxiv.org/abs/1703.03906
[15] https://arxiv.org/abs/1609.08144
[16] https://arxiv.org/abs/1608.05859
[17] https://arxiv.org/pdf/1705.03122.pdf


原文 :http://nlp.seas.harvard.edu/2018/04/03/attention.html


本文僅做學(xué)術(shù)分享,如有侵權,請聯(lián)系刪文。


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>