【實戰教程】用Pytorch實現Transformer

2021-12-28 圖靈TOPIA

 

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

相關焦點

  • 用Pytorch輕鬆實現28個視覺Transformer,開源庫 timm 了解一下!(附代碼解讀)
    與此同時,將會為大家詳細介紹其中的視覺Transformer代碼以及一個優秀的視覺Transformer 的PyTorch實現,以幫助大家更快地開展相關實驗。什麼是timm庫?代碼解讀代碼來自:https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py
  • Pytorch實現28個視覺Transformer,開源庫 timm 了解一下!附代碼
    與此同時,將會為大家詳細介紹其中的視覺Transformer代碼以及一個優秀的視覺Transformer 的PyTorch實現,以幫助大家更快地開展相關實驗。什麼是timm庫?代碼解讀代碼來自:https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/vision_transformer.py
  • 福利,PyTorch中文版官方教程來了
    近日,一款完整的 PyTorch 中文版官方教程出爐,讀者朋友可以更好的學習了解 PyTorch 的相關細節了。教程作者來自 pytorchchina.com。教程網站:http://pytorch123.com教程裡有什麼教程根據 PyTorch 官方版本目錄,完整地還原了所有的內容。包括簡單的環境搭建、快速入門相關 API、高級操作、圖像處理實戰、文本處理實戰、GAN 和強化學習等,基本涵蓋了目前所有深度學習相關的知識點。
  • 庫、教程、論文實現,這是一份超全的PyTorch資源列表(Github 2.2K星)
    項目地址:https://github.com/pytorch/audio5.loop:用於生成多個說話人語音的方法。項目地址:https://github.com/facebookresearch/loop6.fairseq-py:用 Python 寫的 Facebook AI 研究院提出的序列到序列工具集。
  • 【Github 3.5K 星】PyTorch資源列表:450個NLP/CV/SP、論文實現、庫、教程&示例
    項目地址:https://github.com/pytorch/audio5.loop:用於生成多個說話人語音的方法。項目地址:https://github.com/facebookresearch/loop6.fairseq-py:用 Python 寫的 Facebook AI 研究院提出的序列到序列工具集。
  • 用 PyTorch 實現一個簡單的分類器
    pytorch 的學習路線,一開始找的各種資料,寫下來都能跑,但是卻沒有給自己體會到學習的過程。有的教程一上來就是寫一個 cnn,雖然其實內容很簡單,但是直接上手容易讓人找不到重點,學的雲裡霧裡。有的教程又淺嘗輒止,師傅領到了門檻跟前,總感覺自己還沒有進門,教程就結束了。所以我總結了一下自己當初學習的路線,準備繼續深入鞏固自己的 pytorch 基礎;另一方面,也想從頭整理一個教程,從沒有接觸過 pytorch 開始,到完成一些最新論文裡面的工作。
  • PyTorch 深度學習官方入門中文教程 pdf 下載|PyTorchChina
    它主要由Facebookd的人工智慧小組開發,不僅能夠 實現強大的GPU加速,同時還支持動態神經網絡,這一點是現在很多主流框架如TensorFlow都不支持的。 PyTorch提供了兩個高級功能: 1.具有強大的GPU加速的張量計算(如Numpy) 2.包含自動求導系統的深度神經網絡 除了Facebook之外,Twitter、GMU和Salesforce等機構都採用了PyTorch。
  • 【乾貨】史上最全的PyTorch學習資源匯總
    · 比較偏算法實戰的PyTorch代碼教程(https://github.com/yunjey/pytorch-tutorial):在github上有很高的star。建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。
  • 教程 | 從頭開始了解PyTorch的簡單實現
    據報告此舉可能實現 10-100 的加速。當然,如果你沒有進行此設置,那麼你仍然可以在僅使用 CPU 的情況下運行 PyTorch。但是,記住,在訓練神經網絡模型時,生命苦短!所以還是儘可能使用 GPU 吧!項目地址:https://github.com/hpcgarage/accelerated_dl_pytorch1.
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    回想了一下自己關於 pytorch 的學習路線,一開始找的各種資料,寫下來都能跑,但是卻沒有給自己體會到學習的過程。有的教程一上來就是寫一個 cnn,雖然其實內容很簡單,但是直接上手容易讓人找不到重點,學的雲裡霧裡。
  • 新手必備 | 史上最全的PyTorch學習資源匯總
    (3)這是一個比較偏算法實戰的PyTorch代碼教程,在github上有很高的star,https://github.com/yunjey/pytorch-tutorial。建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。(4)接下來為大家介紹一本開源書籍:https://github.com/zergtant/pytorch-handbook。
  • PyTorch 中文教程最新版
    本文檔的定位是 PyTorch 入門教程,主要針對想要學習 PyTorch 的學生群體或者深度學習愛好者。通過教程的學習,能夠實現零基礎想要了解和學習深度學習,降低自學的難度,快速學習 PyTorch。
  • 【Pytorch】新手如何入門pytorch?
    推銷一下我寫的教程:chenyuntc/pytorch-book 用notebook寫的教程,裡面還有很多有趣的例子,比如用GAN生成動漫頭像,用CharRNN寫唐詩,類Prisma的濾鏡(風格遷移)和圖像描述等--分割線-2.20 更新:美化了格式,修正語法. 本來還想補充一些內容, 但是想了想還是算了.
  • 新版PyTorch 1.2 已發布:功能更多、兼容更全、操作更快!
    TorchScript 是一種使用 PyTorch 代碼創建可序列化和可優化模型的方法;任何 TorchScript 程序都可以從 Python 進程中保存,並在不依賴於 Python 的進程中實現加載。
  • 資料|【乾貨】PyTorch學習資源匯總
    比較偏算法實戰的PyTorch代碼教程:在github上有很高的star。建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。開源書籍:這是一本開源的書籍,目標是幫助那些希望和使用PyTorch進行深度學習開發和研究的朋友快速入門。但本文檔不是內容不是很全,還在持續更新中。簡單易上手的PyTorch中文文檔:非常適合新手學習。
  • Pytorch 中文文檔和中文教程
    筆者獲得了ApacheCN社區的同意,放出該社區的翻譯文檔和官方教程,歡迎大家多去GitHub頁面 fork,star!簡單介紹GitHub項目管理:https://github.com/apachecn/pytorch-doc-zh
  • onnx實現對pytorch模型推理加速
    對於硬體供應商來說,也可以簡化神經網絡計算的複雜度,實現優化算法。《美團機器學習實踐》_美團算法團隊.pdf《深度學習入門:基於Python的理論與實現》高清中文PDF+源碼特徵提取與圖像處理(第二版).pdfpython就業班學習視頻,從入門到實戰項目2019最新《PyTorch
  • 搞懂Transformer結構,看這篇PyTorch實現就夠了
    雖然原文寫得很清楚,但實際上大家普遍反映很難正確地實現。所以我們為此文章寫了篇註解文檔,並給出了一行行實現的Transformer的代碼。本文檔刪除了原文的一些章節並進行了重新排序,並在整個文章中加入了相應的註解。
  • Github 2.2K星的超全PyTorch資源列表
    項目地址:https://github.com/pytorch/audio5.loop:用於生成多個說話人語音的方法。項目地址:https://github.com/facebookresearch/loop6.fairseq-py:用 Python 寫的 Facebook AI 研究院提出的序列到序列工具集。
  • 60分鐘入門PyTorch,官方教程手把手教你訓練第一個深度學習模型(附連結)
    PyTorch 的一份官方教程表示:只需要 60 分鐘。教程連結:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html這是一份非常簡潔的學習材料,目標是讓學習者了解 PyTorch 的 Tensor 庫和神經網絡,以及如何訓練一個可以進行圖像分類的神經網絡。