該回購包含原始變壓器紙的Pytorch實現(:link:Vaswani等人)。
它的目的是使開始和學習變壓器變得容易。
變壓器最初是由Vaswani等人提出的。在一份名為“注意”的開創性論文中。
您可能以一種或另一種方式聽說過變形金剛。 GPT-3和BERT列舉了一些知名的?主要的想法是,他們表明您不必使用經常性或卷積層,而簡單的體系結構和注意力相結合是超級強大的。它給予了更好的長距離依賴建模的好處,並且體系結構本身高度可行(:Computer :: Computer :: Computer :: Computer :: :)可以提高更好的計算效率!
這是他們美麗簡單的建築的樣子:

該存儲庫應該是理解變形金剛作為原始變壓器本身的學習資源,而不再是SOTA。
為此,代碼(希望)評論得很好,我已經包括了playground.py 。所以我們走了!
您可以在眼睛的眼睛中解析這個嗎?

playground.py也visualize_positional_encodings() 。

根據源/目標令牌的位置,您“選擇此圖像的一行”,然後將其添加到嵌入矢量中,僅此而已。他們也可以學習,但是這樣做是更奇怪的! ?
同樣,您可以在O(1)中解析這一點嗎?

noup?所以我想,這裡被可視化:

現在非常容易理解。現在,這部分對於變壓器的成功至關重要嗎?我懷疑。但這很酷,使事情變得更加複雜。 ? ( .set_sarcasm(True) )
注意:模型維度基本上是嵌入矢量的大小,使用的基線變壓器使用512,大一個1024
第一次聽到標籤平滑的聲音聽起來很艱難,但事實並非如此。通常,您將目標詞彙分佈設置為one-hot 。含義為30k中的1個位置(或您的詞彙大小的任何內容)設置為1。概率和其他所有內容。

在標籤平滑而不是放置1。
注意:PAD令牌的分佈設置為所有零,因為我們不希望模型預測這些模型!
除了這個倉庫(好吧),我強烈建議您繼續閱讀Jay Alammar的這個令人驚嘆的博客!
Transformer最初是在WMT-14數據集上針對NMT(神經機器翻譯)任務進行培訓的:
我所做的(目前)是我在IWSLT數據集上訓練了我的模型,該數據集較小,因為我會說這些語言,因此,我會更容易調試和播放。
我還將很快在WMT-14上訓練我的模型,看看Todos部分。
無論如何!讓我們看看這個回購實際上可以為您做什麼!好吧,它可以翻譯!
從我的德語到英文IWSLT模型的一些簡短翻譯:
輸入: Ich bin ein guter Mensch, denke ich. (“黃金”:我是一個好人)
輸出: ['<s>', 'I', 'think', 'I', "'m", 'a', 'good', 'person', '.', '</s>']
或以人為可讀的格式: I think I'm a good person.
這實際上還不錯!也許比Google翻譯的“金”翻譯更好。
當然有這樣的失敗情況:
輸入: Hey Alter, wie geht es dir? (伙計怎麼樣?)
輸出: ['<s>', 'Hey', ',', 'age', 'how', 'are', 'you', '?', '</s>']
或以人類可讀的格式: Hey, age, how are you?
實際上,這也不是完全糟糕的!因為:
同樣,對於英語到德國模型。
因此,我們討論了什麼是變形金剛,以及它們可以為您做什麼(除其他事項)。
讓我們來運行這個東西吧!按照下一步:
git clone https://github.com/gordicaleksa/pytorch-original-transformercd path_to_repoconda env create (這將創建一個全新的Conda環境)。activate pytorch-transformer (用於從控制台運行腳本或在IDE中設置解釋器)就是這樣!它應該在開箱即用的執行環境中進行處理,以處理依賴關係。
可能需要一段時間,因為我會自動下載Spacy的英語和德語統計模型。
Pytorch Pip軟件包將與某些版本的Cuda/cudnn捆綁在一起,但強烈建議您事先安裝系統範圍的CUDA,這主要是因為GPU驅動程序。我還建議使用Minconda安裝程序作為在系統上獲得Conda的一種方式。遵循此設置的點1和第2點,並為您的系統使用最新版本的minconda和cuda/cudnn。
只需從您的Anaconda控制台運行jupyter notebook ,它將在您的默認瀏覽器中打開會話。
打開The Annotated Transformer ++.ipynb ,您可以玩!
注意:如果DLL load failed while importing win32api: The specified module could not be found
只需pip uninstall pywin32 ,然後pip install pywin32或conda install pywin32就可以修復它!
您只需要鏈接您在設置部分中創建的Python環境即可。
要運行培訓啟動training_script.py ,您將要指定一些設置:
--batch_size這很重要的是將設置為最大值,而最大值不會使您無法存儲--dataset_name IWSLT和WMT14之間的選擇(在添加多GPU支持之前,不建議WMT14)--language_direction E2G和G2E之間的選擇因此(從控制台)運行的示例將看起來像這樣:
python training_script.py --batch_size 1500 --dataset_name IWSLT --language_direction G2E
該代碼對您的評論進行了很好的評論,因此您可以(希望)了解培訓本身的工作原理。
腳本將:
models/checkpoints/models/binaries/data/ )runs/ ,只需運行tensorboard --logdir=runs注意:TORCH文本中的數據加載速度很慢,因此我已經實施了一個自定義包裝器,該包裝器添加了緩存機制,並使事情更快地〜30倍! (第一次運行東西時會很慢)
第二部分是要與模型一起玩,並了解它們的翻譯方式!
要獲得一些翻譯啟動translation_script.py ,您需要設置一些設置:
--source_sentence取決於您指定的模型,應該是英語/德語句子--model_name預處理的型號之一: iwslt_e2g , iwslt_g2e或您的型號(*)--dataset_name與模型同步,如果在IWSLT上訓練了該模型,則IWSLT--language_direction保持同步, E2G如果訓練模型從英語翻譯為德語(*)注意:訓練模型後,它將被傾倒到models/binaries中,查看其名稱是什麼,並通過--model_name參數指定它,如果您想使用它以用於翻譯目的。如果您指定了一些驗證的型號,他們將在您第一次運行翻譯腳本時自動下載。
我也將在此處鏈接IWSLT預計的模型鏈接:英語和德語和英語。
就是這樣,您還可以可視化注意力查看本節。有關更多信息。
我在訓練時跟踪了3條曲線:
BLEU是一種基於N克的度量,用於定量評估機器翻譯模型的質量。
我使用了Awesome NLTK Python模塊提供的BLEU-4度量。
當前的結果,模型接受了20個時代的培訓(De Deutch代表德語的德語?):):
| 模型 | BLEU得分 | 數據集 |
|---|---|---|
| 基線變壓器(EN-DE) | 27.8 | IWSLT VAL |
| 基線變壓器(DE-EN) | 33.2 | IWSLT VAL |
| 基線變壓器(EN-DE) | x | WMT-14 Val |
| 基線變壓器(DE-EN) | x | WMT-14 Val |
我使用貪婪的解碼來獲得這些,因此這是一個悲觀的估計,我會盡快添加橫梁解碼。
重要說明:初始化對變壓器很重要!我最初認為,使用Xavier初始化的其他實現再次是這些任意啟發式方法之一,而Pytorch默認Init將會做 - 我是錯誤的:

您可以在這裡看到3次運行,2個下部使用的pytorch默認初始化(一種用於KL散射損失的mean ,而使用的較好的batchmean ),而上部使用的Xavier統一初始化!
想法:您也可以定期將翻譯轉換為源句子的參考批次。
儘管我沒有這樣做,但這將為您提供一些定性的見解,儘管我沒有這樣做。
當您很難定量地評估模型(例如在gan和nst領域)時,也會做類似的事情。
上面的圖是我的Azure ML運行中的片段,但是當我在本地運行的東西時,我會使用張量。
只需運行tensorboard --logdir=runs ,您就可以在培訓期間跟踪指標。
您可以使用translation_script.py並將--visualize_attention設置為真實,以便在源和目標句子中“注意”模型“注意”。
這是我對輸入句子的注意力Ich bin ein guter Mensch, denke ich.
這些屬於編碼器的第6層。您可以看到所有8個多頭注意力頭。

這屬於自我注意解碼器MHA(多頭注意)模塊的解碼器第6層。
您會注意到一個有趣的三角形模式,該模式來自目標令牌無法展望的事實!

第三種類型的MHA模塊是參與其中的源,它看起來與您看到的編碼圖相似。
隨意按照自己的節奏進行比賽!
注意:這個模型顯然存在一些偏見問題,但我不會在這裡進行分析
如果您想在WMT-14數據集中訓練變壓器,則確實需要一個體面的硬件。
作者接受:
如果我的計算正確,則相當於約19個時期(100k步,每個步驟的基線都有〜25000令牌,WMT-14的SRC/TRG令牌為〜130m src/trg令牌),對於大個子(300k步驟)而言,它的基線為3x。
另一方面,在IWSLT數據集上訓練該模型更為可行。我花了我:
我本來可以將K80推到3500多個令牌/批次,但有一些CUDA出現在內存問題上。
最後,還有幾個Todos,我希望很快就會添加:
存儲庫已經擁有所需的一切,這些只是獎勵點。我已經測試了從環境設置到自動模型下載等所有內容。
如果您很難理解代碼,我在本視頻中對本文進行了深入的概述:
我還有更多視頻,可以進一步幫助您了解變形金剛:
我發現這些資源有用(在開發此資源時):
我在帶註釋的變壓器中找到了模型設計的一些靈感,但我發現很難理解,並且有一些錯誤。它主要是考慮到研究人員。希望這種回購也能使對變壓器的理解也向普通人開放! ?
如果您發現此代碼有用,請引用以下內容:
@misc{Gordić2020PyTorchOriginalTransformer,
author = {Gordić, Aleksa},
title = {pytorch-original-transformer},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/gordicaleksa/pytorch-original-transformer}},
}
如果您想在生活中擁有更多與AI相關的內容?請考慮: