小白看得懂的 Transformer (圖解)(3)
在繼續(xù)進(jìn)行下去之前,我們需要提到一個(gè)編碼器架構(gòu)中的細(xì)節(jié):在每個(gè)編碼器中的每個(gè)子層(自注意力、前饋網(wǎng)絡(luò))的周圍都有一個(gè)殘差連接,并且都跟隨著一個(gè)“層-歸一化”步驟。
層-歸一化步驟:https://arxiv.org/abs/1607.06450
如果我們?nèi)タ梢暬@些向量以及這個(gè)和自注意力相關(guān)聯(lián)的層-歸一化操作,那么看起來就像下面這張圖描述一樣:
****的子層也是這樣樣的。如果我們想象一個(gè)2 層編碼-解碼結(jié)構(gòu)的transformer,它看起來會像下面這張圖一樣:
解碼組件
既然我們已經(jīng)談到了大部分編碼器的概念,那么我們基本上也就知道****是如何工作的了。但最好還是看看****的細(xì)節(jié)。
編碼器通過處理輸入序列開啟工作。頂端編碼器的輸出之后會變轉(zhuǎn)化為一個(gè)包含向量K(鍵向量)和V(值向量)的注意力向量集 。這些向量將被每個(gè)****用于自身的“編碼-解碼注意力層”,而這些層可以幫助****關(guān)注輸入序列哪些位置合適:
在完成編碼階段后,則開始解碼階段。解碼階段的每個(gè)步驟都會輸出一個(gè)輸出序列(在這個(gè)例子里,是英語翻譯的句子)的元素
接下來的步驟重復(fù)了這個(gè)過程,直到到達(dá)一個(gè)特殊的終止符號,它表示transformer的****已經(jīng)完成了它的輸出。每個(gè)步驟的輸出在下一個(gè)時(shí)間步被提供給底端****,并且就像編碼器之前做的那樣,這些****會輸出它們的解碼結(jié)果 。另外,就像我們對編碼器的輸入所做的那樣,我們會嵌入并添加位置編碼給那些****,來表示每個(gè)單詞的位置。
而那些****中的自注意力層表現(xiàn)的模式與編碼器不同:在****中,自注意力層只被允許處理輸出序列中更靠前的那些位置。在softmax步驟前,它會把后面的位置給隱去(把它們設(shè)為-inf)。
這個(gè)“編碼-解碼注意力層”工作方式基本就像多頭自注意力層一樣,只不過它是通過在它下面的層來創(chuàng)造查詢矩陣,并且從編碼器的輸出中取得鍵/值矩陣。
解碼組件最后會輸出一個(gè)實(shí)數(shù)向量。我們?nèi)绾伟迅↑c(diǎn)數(shù)變成一個(gè)單詞?這便是線性變換層要做的工作,它之后就是Softmax層。
線性變換層是一個(gè)簡單的全連接神經(jīng)網(wǎng)絡(luò),它可以把解碼組件產(chǎn)生的向量投射到一個(gè)比它大得多的、被稱作對數(shù)幾率(logits)的向量里。
不妨假設(shè)我們的模型從訓(xùn)練集中學(xué)習(xí)一萬個(gè)不同的英語單詞(我們模型的“輸出詞表”)。因此對數(shù)幾率向量為一萬個(gè)單元格長度的向量——每個(gè)單元格對應(yīng)某一個(gè)單詞的分?jǐn)?shù)。
接下來的Softmax 層便會把那些分?jǐn)?shù)變成概率(都為正數(shù)、上限1.0)。概率最高的單元格被選中,并且它對應(yīng)的單詞被作為這個(gè)時(shí)間步的輸出。
這張圖片從底部以****組件產(chǎn)生的輸出向量開始。之后它會轉(zhuǎn)化出一個(gè)輸出單詞。
既然我們已經(jīng)過了一遍完整的transformer的前向傳播過程,那我們就可以直觀感受一下它的訓(xùn)練過程。
在訓(xùn)練過程中,一個(gè)未經(jīng)訓(xùn)練的模型會通過一個(gè)完全一樣的前向傳播。但因?yàn)槲覀冇糜袠?biāo)記的訓(xùn)練集來訓(xùn)練它,所以我們可以用它的輸出去與真實(shí)的輸出做比較。
為了把這個(gè)流程可視化,不妨假設(shè)我們的輸出詞匯僅僅包含六個(gè)單詞:“a”, “am”, “i”, “thanks”, “student”以及 “”(end of sentence的縮寫形式)。
我們模型的輸出詞表在我們訓(xùn)練之前的預(yù)處理流程中就被設(shè)定好。
一旦我們定義了我們的輸出詞表,我們可以使用一個(gè)相同寬度的向量來表示我們詞匯表中的每一個(gè)單詞。這也被認(rèn)為是一個(gè)one-hot 編碼。所以,我們可以用下面這個(gè)向量來表示單詞“am”:
例子:對我們輸出詞表的one-hot 編碼
接下來我們討論模型的損失函數(shù)——這是我們用來在訓(xùn)練過程中優(yōu)化的標(biāo)準(zhǔn)。通過它可以訓(xùn)練得到一個(gè)結(jié)果盡量準(zhǔn)確的模型。
比如說我們正在訓(xùn)練模型,現(xiàn)在是第一步,一個(gè)簡單的例子——把“merci”翻譯為“thanks”。
這意味著我們想要一個(gè)表示單詞“thanks”概率分布的輸出。但是因?yàn)檫@個(gè)模型還沒被訓(xùn)練好,所以不太可能現(xiàn)在就出現(xiàn)這個(gè)結(jié)果。
因?yàn)槟P偷膮?shù)(權(quán)重)都被隨機(jī)的生成,(未經(jīng)訓(xùn)練的)模型產(chǎn)生的概率分布在每個(gè)單元格/單詞里都賦予了隨機(jī)的數(shù)值。我們可以用真實(shí)的輸出來比較它,然后用反向傳播算法來略微調(diào)整所有模型的權(quán)重,生成更接近結(jié)果的輸出。
你會如何比較兩個(gè)概率分布呢?我們可以簡單地用其中一個(gè)減去另一個(gè)。更多細(xì)節(jié)請參考交叉熵和KL散度。
交叉熵:https://colah.github.io/posts/2015-09-Visual-Information/KL散度:https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained
但注意到這是一個(gè)過于簡化的例子。更現(xiàn)實(shí)的情況是處理一個(gè)句子。例如,輸入“je suis étudiant”并期望輸出是“i am a student”。那我們就希望我們的模型能夠成功地在這些情況下輸出概率分布:
每個(gè)概率分布被一個(gè)以詞表大小(我們的例子里是6,但現(xiàn)實(shí)情況通常是3000或10000)為寬度的向量所代表。
第一個(gè)概率分布在與“i”關(guān)聯(lián)的單元格有最高的概率
第二個(gè)概率分布在與“am”關(guān)聯(lián)的單元格有最高的概率
以此類推,第五個(gè)輸出的分布表示“”關(guān)聯(lián)的單元格有最高的概率
依據(jù)例子訓(xùn)練模型得到的目標(biāo)概率分布
在一個(gè)足夠大的數(shù)據(jù)集上充分訓(xùn)練后,我們希望模型輸出的概率分布看起來像這個(gè)樣子:
我們期望訓(xùn)練過后,模型會輸出正確的翻譯。當(dāng)然如果這段話完全來自訓(xùn)練集,它并不是一個(gè)很好的評估指標(biāo)。注意到每個(gè)位置(詞)都得到了一點(diǎn)概率,即使它不太可能成為那個(gè)時(shí)間步的輸出——這是softmax的一個(gè)很有用的性質(zhì),它可以幫助模型訓(xùn)練。
因?yàn)檫@個(gè)模型一次只產(chǎn)生一個(gè)輸出,不妨假設(shè)這個(gè)模型只選擇概率最高的單詞,并把剩下的詞拋棄。這是其中一種方法(叫貪心解碼)。另一個(gè)完成這個(gè)任務(wù)的方法是留住概率最靠高的兩個(gè)單詞(例如I和a),那么在下一步里,跑模型兩次:其中一次假設(shè)第一個(gè)位置輸出是單詞“I”,而另一次假設(shè)第一個(gè)位置輸出是單詞“me”,并且無論哪個(gè)版本產(chǎn)生更少的誤差,都保留概率最高的兩個(gè)翻譯結(jié)果。然后我們?yōu)榈诙偷谌齻€(gè)位置重復(fù)這一步驟。這個(gè)方法被稱作集束搜索(beam search)。在我們的例子中,集束寬度是2(因?yàn)楸A袅?個(gè)集束的結(jié)果,如第一和第二個(gè)位置),并且最終也返回兩個(gè)集束的結(jié)果(top_beams也是2)。這些都是可以提前設(shè)定的參數(shù)。
我希望通過上文已經(jīng)讓你們了解到Transformer的主要概念了。如果你想在這個(gè)領(lǐng)域深入,我建議可以走以下幾步:閱讀Attention Is All You Need,Transformer博客和Tensor2Tensor announcement,以及看看?ukasz Kaiser的介紹,了解模型和細(xì)節(jié)。
Attention Is All You Need:https://arxiv.org/abs/1706.03762Transformer博客:https://ai.googleblog.com/2017/08/transformer-novel-neural-network.htmlTensor2Tensor announcement:https://ai.googleblog.com/2017/06/accelerating-deep-learning-research.html?ukasz Kaiser的介紹:https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb
接下來可以研究的工作:
Depthwise Separable Convolutions for Neural Machine Translationhttps://arxiv.org/abs/1706.03059
One Model To Learn Them Allhttps://arxiv.org/abs/1706.05137
Discrete Autoencoders for Sequence Modelshttps://arxiv.org/abs/1801.09797
Generating Wikipedia by Summarizing Long Sequenceshttps://arxiv.org/abs/1801.10198
Image Transformerhttps://arxiv.org/abs/1802.05751
Training Tips for the Transformer Modelhttps://arxiv.org/abs/1804.00247
Self-Attention with Relative Position Representationshttps://arxiv.org/abs/1803.02155
Fast Decoding in Sequence Models using Discrete Latent Variableshttps://arxiv.org/abs/1803.03382
A****ctor: Adaptive Learning Rates with Sublinear Memory Costhttps://arxiv.org/abs/1804.04235
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。