01 什麼是Transformer?
Transformer最初是由Vaswani等人在一篇名為《Attention is All You Need》的開創性論文中提出。
其主要思想是,它們表明您不必使用循環或卷積層,並且簡單的體系結構與注意力結合非常強大。它帶來了更好的遠程依賴關係建模,並且架構本身是非常可並行的,從而提高了計算效率!
簡單架構如圖:
02 理解Transformer
此文發表在Github上,對代碼進行了很好的注釋,並在playground.py中包括了一些可視化的概念,這些概念很難用單詞來解釋,但一旦可視化就非常簡單。所以我們開始吧!
關注本公眾號回復「transformer",獲取完整代碼。
以下是文章具體內容:
位置編碼
一眼就能解析出這個嗎?
我也不能。
從playground.py我們運行visualize_positional_encodings()函數可以得到以下信息:
根據源/目標令牌的位置,您「pick one row of this image」,然後將其添加到嵌入向量中,就是這樣。
他們也可以被學習,但是這樣做顯然更花哨!
定製學習率表
同樣,您可以解析其中一個O(1)嗎?
不行嗎?所以我想,這裡是可視化的:
現在超級容易理解。現在,這部分對於Transformer的成功是否至關重要?我對此表示懷疑。但這很酷,並使事情變得更複雜。(.set_sarcasm(True))
標籤平滑
第一次聽到標籤平滑理解起來很困難,但事實並非如此。通常,您將目標詞彙分布設置為one-hot。表示30k中的1個位置設置為1,概率設置為0。
在標籤平滑處理中,將0.9放到另一個位置上,而不是在該特定位置上放置1,然後將其餘的「概率量」均勻地分布在其他位置上(在上面虛構的vocab中,圖像上顯示為不同的紫色陰影,大小4-因此是4列)
注意:Pad令牌的分布設置為全零,因為我們不希望模型預測這些零!
03 機器翻譯
最初針對WMT-14數據集上的NMT(神經機器翻譯)任務對Transformer進行了訓練,以用於:
我現在做的是在IWSLT數據集上訓練我的模型,該數據集對於英語-德語語言對來說要小得多,因為我會講這些語言,因此調試更加容易。
我還將很快在WMT-14上訓練我的模型。
講了什麼是Transformer,現在讓我們開始運行這個東西!請執行以下步驟:
1.git clone https://github.com/gordicaleksa/pytorch-original-transformer
2.打開Anaconda控制臺並導航到項目目錄 cd path_to_repo
3.從項目目錄運行conda env create(這將創建一個全新的conda環境)。
4.運行activate pytorch-transformer(用於從控制臺運行腳本或在IDE中設置解釋器)
就這些而已!它應該可以開箱即用地執行environment.yml文件來處理依賴項。我可能會花一些時間,因為我會自動下載英語和德語的SpaCy統計模型。
PyTorch pip軟體包將與某些版本的CUDA / cuDNN捆綁在一起,但是強烈建議您事先安裝系統範圍的CUDA,主要是因為GPU驅動程序。我還建議使用Miniconda安裝程序作為在系統上獲取conda的方法。
04 用法
訓練
要進行訓練,請從開始training_script.py,這裡有幾個設置需要指定:
--batch_size
-這對於將最大值設置為不會導致CUDA內存不足的最大值很重要
--dataset_name
-在IWSLT和WMT14之間選擇(在添加多GPU支持之前,不建議WMT14 )
--language_direction
-在E2G和G2E之間選擇
因此(從控制臺)運行的示例如下所示:
python training_script.py --batch_size 1500 --dataset_name IWSLT --language_direction G2E
該代碼的注釋很好,因此您可以了解訓練本身的工作方式。
該腳本將:
將檢查點* .pth模型轉儲到 models/checkpoints/
將最終的* .pth模型轉儲到 models/binaries/
下載IWSLT / WMT-14(首次運行並將其放在data/下)
將tensorboard數據轉儲到runs/中,只需從Anaconda運行tensorboard --logdir=runs
定期將一些訓練元數據寫入控制臺
注意:torch text中的數據加載速度很慢,因此我實現了一個自定義包裝器,該包裝器添加了緩存機制,並使處理速度提高了約30倍!(第一次運行東西會很慢)
推論(翻譯)
第二部分是關於使用模型並查看它們如何轉換的全部內容!要獲得一些翻譯,請啟動translation_script.py,您需要設置一些設置:
--source_sentence
-根據您指定的型號,該名稱應為英語/德語句子
--model_name
-預訓練的模型名稱之一:iwslt_e2g,iwslt_g2e或模型(*)
--dataset_name
-IWSLT如果模型是在IWSLT上訓練的,則使其與模型保持同步
--language_direction
-如果模型經過訓練可以將英語翻譯成德語,請保持E2G同步
注意:訓練模型後,會將其轉儲到其中,以models/binaries查看其名稱,--model_name如果要出於轉換目的使用它,則可以通過參數指定它。如果您指定了一些預訓練的模型,則在您第一次運行翻譯腳本時會自動下載它們。
評估NMT模型
訓練時我追蹤了3條曲線:
訓練損失(KL偏差,批量平均值)
驗證損失(KL差異,批量均值)
BLEU-4
BLEU是基於n-gram的度量標準,用於定量評估機器翻譯模型的質量。我使用了很棒的nltk Python模塊提供的BLEU-4指標。
目前的結果是,對模型進行了20個時期的訓練(DE代表Deutch,即德語):
模型
BLEU分數
數據集
27.8
IWSLT值
33.2
IWSLT值
Baseline Transformer(EN-DE)
X
WMT-14 VAL
Baseline Transformer(DE-EN)
X
WMT-14 VAL
我使用貪心解碼得到了這些,所以這是一個悲觀的估計。
重要說明:初始化對於變壓器非常重要!最初,我認為使用Xavier初始化的其他實現又是那些任意啟發式方法之一,並且PyTorch默認初始化將起作用-我錯了:
您可以在這裡看到3次運行,其中較低的2次使用PyTorch默認初始化(一次用於meanKL散度損失,更好的一次使用batchmean),而較高的一次使用Xavier統一初始化!
想法:您可能還可能會定期轉儲翻譯,以供參考句子的源句子使用。這將使您對Transformer的運行情況有定性的了解,儘管我沒有這樣做。當您像GAN和NST領域那樣難以定量評估模型時,也會執行類似的操作。
使用Tensorboard進行跟蹤
上圖是我的Azure ML運行的一個片段,但是當我在本地運行東西時,我使用Tensorboard。
只需tensorboard --logdir=runs從Anaconda控制臺運行,您就可以在訓練期間跟蹤指標。
可視化注意力
您可以使用translation_script.py並將其設置--visualize_attention為True,以進一步了解源句和目標句中模型「paying attention to」的內容。
這是我對輸入句子的注意力 Ich bin ein guter Mensch, denke ich.
這些屬於編碼器的第6層。您可以看到所有8個多頭注意力頭。
這個屬於自動注意力解碼器MHA(多頭注意力)模塊的解碼器第6層。您會注意到一個有趣的三角形圖案,它來自目標令牌不能向前看的事實!
MHA模塊的第三種類型是原始碼,它看起來與您看到的編碼器圖相似。隨意按照自己的節奏玩!
注意:此模型顯然存在一些偏差問題,但在這裡我不會進行分析
原文連結:
https://github.com/gordicaleksa/pytorch-original-transformer