2.1 總體結構 2.2.1 Embedding層Transformer模型中缺少一種解釋輸入序列中單詞「順序」的方法,它跟序列模型還不一樣。為了處理這個問題,Transformer給Encoder層和Decoder層的輸入添加了一個額外的向量「Positional Encoding」,維度和embedding的維度一樣。這個位置向量的具體計算方法有很多種,論文中的計算方法如下: 所以,最終一個詞的embedding,就是它的語義信息embedding(預訓練模型查表)+序列信息embedding (positional encoding): 2.2.2 Self-attention層讓我們從宏觀視角看自注意力機制,精煉一下它的工作原理。 例如,下列句子是我們想要翻譯的輸入句子:
這個“it”在這個句子是指什么呢?它指的是street還是這個animal呢?這對于人類來說是一個簡單的問題,但是對于算法則不是。 當模型處理這個單詞“it”的時候,自注意力機制會允許“it”與“animal”建立聯系。 隨著模型處理輸入序列的每個單詞,自注意力會「關注整個輸入序列的所有單詞」,幫助模型對本單詞「更好地進行編碼(embedding)」。 如上圖所示,當我們在編碼器#5(棧中最上層編碼器)中編碼“it”這個單詞的時,注意力機制的部分會去關注“The Animal”,將它的表示的一部分編入“it”的編碼中。接下來我們看一下Self-Attention詳細的處理過程。 「step1:」 首先,對于輸入序列的每個單詞,它都有三個向量編碼,分別為:Query、Key、Value。這三個向量是用embedding向量與三個矩陣( )相乘得到的結果。這三個矩陣的值在BP的過程中會一直進行更新。 「step2:」 第二步計算Self-Attention的分數值,該分數值決定了當我們在某個位置encode一個詞時,對輸入句子的其他部分的關注程度。這個分數值的計算方法是用該詞語的Q與句子中其他詞語的Key做點乘。以下圖為例,假設我們在為這個例子中的第一個詞“Thinking”計算自注意力向量,我們需要拿輸入句子中的每個單詞對“Thinking”打分。這些分數決定了在編碼單詞“Thinking”的過程中重視句子其它部分的程度。 「step3:」 再對每個分數除以 (d是維度),之后做softmax。 「step4:」 把每個Value向量和softmax得到的值進行相乘,然后對相乘的值進行相加,得到的結果即是一個詞語的self-attention embedding值。 這樣,自注意力的計算就完成了。得到的向量就可以傳遞給前饋神經網絡。 2.2.3 Multi-Headed Attention通過增加一種叫做'多頭'注意力('multi-headed'attention)的機制,論文進一步完善了自注意力層。 接下來我們將看到,對于“多頭”注意力機制,我們有多個Query/Key/Value權重矩陣集 (Transformer使用八個注意力頭)。 現在對于每一個詞語,我們有了八個向量 ! ,它們分別由八個head產生。但是對于下一個feed-forward層,我們應該把每個詞語都用一個向量來表示。所以下一步,我們需要把這八個向量壓縮成一個向量。 可以直接把這些矩陣拼接在一起,然后用一個附加的權重矩陣 與它們相乘: 這幾乎就是多頭自注意力的全部。這確實有好多矩陣,我們試著把它們集中在一個圖片中,這樣可以一眼看清。 既然我們已經摸到了注意力機制的這么多“頭”,那么讓我們重溫之前的例子,看看我們在例句中編碼“it”一詞時,不同的注意力“頭”集中在哪里: 當我們編碼“it”一詞時,一個注意力頭集中在“animal”上,而另一個則集中在“tired”上,從某種意義上說,模型對“it”一詞的表達在某種程度上是“animal”和“tired”的代表。 2.2.4 The Residuals and Layer normalization在繼續進行下去之前,我們需要提到一個encoder中的細節:在每個encoder中都有一個殘差連接,并且都跟隨著一個Layer Normalization(層-歸一化)步驟。 如果我們去「可視化」這些向量以及這個和自注意力相關聯的layer-norm操作,那么看起來就像下面這張圖描述一樣: Layer-Norm也是歸一化數據的一種方式,不過 Layer-Norm 是在每一個樣本上計算均值和方差,而不是 Batch-Norm 那種在批方向計算均值和方差! 2.2.5 小結這幾乎就是Encoder的全部。Encoder就是用來給input一個比較好的embedding,使用self-attention來使一個詞的embedding包含了上下文的信息,而不是簡單的查look-up table。Transformer使用了多層(6層)的Encoder是為了把握一些高階的信息。 2.3 Decoder層2.3.1 簡介從更高的角度來看,Transformer的Decoder作用和普通seq2seq一樣:從<Start>開始,基于之前的Decoder輸出,以及Encoder輸出的帶注意力權重的embedding,來預測下一個詞的概率分布。 以對話系統為例:
下面我們來詳細介紹Decoder的內部結構。 ![]() 2.3.2 Masked Multi-Head Attention和Encoder一樣,Decoder先經過embedding+positional encoding之后得到了一個embedding,輸入到multi-head attention中。 和前面不同的是,Decoder的self-attention層其實是「masked」 multi-head attention。mask表示掩碼,它對某些值進行掩蓋。這是為了防止Decoder在計算某個詞的attention權重時“看到”這個詞后面的詞語。
「Look-head mask」 是為了使得 decoder 不能看見未來的信息。也就是對于一個序列,在 time_step 為 t 的時刻,我們的「解碼」輸出應該只能依賴于 t 時刻之前的輸出,而不能依賴 t 之后的輸出。因此我們需要想一個辦法,把 t 之后的信息給隱藏起來。 那么具體怎么做呢?也很簡單:產生一個上三角矩陣,上三角的值全為 「-inf」 。把這個矩陣加在每一個序列上,就可以達到我們的目的: 加上-inf的目的是,做softmax之后-inf會變成0: 這個mask是Decoder中self-attention和Encoder中的self-attention唯一有區別的地方。 2.3.3 第二個Multi-head Attention -- 普通attention
3. Q/A(1) Transformer為什么需要進行Multi-head Attention?原論文中說進行Multi-head Attention的原因是將模型分為多個頭,形成多個子空間,可以讓模型去關注不同方面的信息,最后再將各個方面的信息綜合起來。其實直觀上也可以想到,如果自己設計這樣的一個模型,必然也不會只做一次attention,多次attention綜合的結果至少能夠起到增強模型的作用,也可以「類比CNN中同時使用多個卷積核的作用」,直觀上講,多頭的注意力有助于網絡捕捉到更豐富的特征/信息。 (2) Transformer相比于RNN/LSTM,有什么優勢?
(3)Transformer如何并行化的?Transformer的并行化我認為主要體現在self-attention模塊。對于某個序列 ,self-attention模塊可以直接計算 的點乘結果,而RNN系列的模型就必須按照順序從 計算到 . ![]() 本文參考資料Attention is All you need: https:///abs/1706.03762 [2]Illustrated Guide to Transformers- Step by Step Explanation: https:///illustrated-guide-to-transformers-step-by-step-explanation-f74876522bc0 [3]Self-Attention 與 Transformer: https://www./article/1584719677724 - END - |
|