# 專題二 論文討論 ## Transformer ![](https://i.imgur.com/M5bia1l.png) 此架構是Google在2007年時提出,看此圖時須從下往上看,並分成輸入與輸出的兩個部分。 公式與解釋 https://www.youtube.com/watch?v=b_gJfol7eLU&t=4598s ## Encoder 輸入端 ![](https://i.imgur.com/OXvAsxH.png) ### Input Embeding 將輸入的文字轉換為d維的向量 <font size=4> $$ x = [x_1,x_2,\underbrace{\ldots}_{\rm ldots} ,x_n ],x_i\in\mathbb{R}^{nd} $$ <font size=5> </font>$$x \in\mathbb{R}^{nd} $$ </font> ### Positional Encoding 一次將上述矩陣放入positional encoding,之前是一個一個放,到了Transformer 這邊則是一次放入。直觀來說是對每一個"字"作編號沒錯。但是對於編碼有幾個要求。 1. 需要體現同一單詞在不同位置的區別 2. 需要體現議定的先後次序,並在一定範圍內的編碼不應該依賴於文本的長度,具有一定的差異不變性 3. 有值域的範圍限制 這樣對於文字而言就沒有前後順序。一樣產生為d維的向量 <font size=4> $$ x = [p_1,p_2,\underbrace{\ldots}_{\rm ldots} ,p_n ],p_i\in\mathbb{R}^{nd} $$</font> 公式為 $$ \begin{cases} PE(pos,2i)=sin(\frac{pos}{10000^{2i/d_{model}}} ) \\ PE(pos,2i+1)=cos(\frac{pos}{10000^{2i/d_{model}}} ) \end{cases} $$ 得出 <font size=5> $$p \in\mathbb{R}^{nd} $$ </font> 再將p和x矩陣相加 <font size=5> </font>$$p + x = E\in\mathbb{R}^{nd} $$ </font> 這樣我們就可以進入我們Multi-Head Attention 的階段 參考資料 https://zhuanlan.zhihu.com/p/166244505 ### Multi-Head Attention 可以看上圖知道,Multi-Head Attention 下面有3條線,分別為Q、K、V。Q = Query 是指當前的詞向量,用於對每個 key 做匹配程度的打分 , K = Key 是指序列中的所有詞向量, V = Value是指實際的序列內容,Q值與K值相成的內積越大,相關性越大。 那我們剛剛算出的E矩陣也會通過Q、K、V算出不一樣的解。 若是通過Q的話,Q本身也為矩陣 <font size=5> $$Q \in\mathbb{R}^{nd} $$ </font> ,假設我們今天的Head = 8,那麼會被拆成8等分,再除以8 <font size=4> $$ Q = [q_1,q_2,\underbrace{\ldots}_{\rm ldots} ,q_8 ],q_i\in\mathbb{R}^{\frac{nd}{8}} $$ </font> K和V也是如此 <font size=4> $$ K = [k_1,k_2,\underbrace{\ldots}_{\rm ldots} ,k_8 ],k_i\in\mathbb{R}^{\frac{nd}{8}} $$ </font> <font size=4> $$ V= [v_1,v_2,\underbrace{\ldots}_{\rm ldots} ,v_8 ],v_i\in\mathbb{R}^{\frac{nd}{8}} $$ </font> 算完了以上的算式,進入到Attendtion的公式 $$ Attendtion(Q,K,V) = softmax \left( \frac{QK^T} {\sqrt{d_k} \quad} \right) V $$ 進行計算 $$ QK^T \in\mathbb{R}^{nn} $$ 算出來會是一個N*N的矩陣,這樣的算法主要是為了求出相似度 Attendtion Matrix,除下面的dk是因為為了避免當 dk (q, k 的維度) 太大時,q, k Inner Product 的值過大,softmax 計算的值落入飽和區而導致梯度不穩定。 那softmax也是一樣可以上矩陣內的值變成0~1之間進行計算,也就是變成所謂的權重attendtion weight而softmax也是nd的矩陣。原本的E矩陣回頭在乘上V,就可以變回nd的矩陣。如此,便可以一直堆加各種不同的變數進行計算。 ### Add & Norm 經過 Multi-head Attention 後會進入 Add & Norm 層,這一層是指 residual connection 及 layer normalization。前一層的輸出 Sublayer 會與原輸入 x 相加 (residual connection),以減緩梯度消失的問題,然後再做 layer normalization。 出來的新的矩陣M通過Add的計算以後,可以避免讓梯度消失 $$ M + E \in\mathbb{R}^{nd} $$ 再透過Norm運算可以穩定訓練過程 $$ E = LN(E + sublayer(E)) $$ sublayer 有兩個東西,一個是Multi-Head Attention,另一個是FFN ### Feed Forward 運算的方式大概如下 $$ E \in\mathbb{R}^{nd} \implies\mathbb{R}^{n4d} \implies\mathbb{R}^{nd} $$ 透過轉換高維度的矩陣,可以解決較複雜計算的問題 ## Decoder 輸出端 ![](https://i.imgur.com/XwTSfPS.png) ### Shifted right 會將整個矩陣,往右邊移動,插入<BOS> $$ Y = [<BOS>,y1,y2,y3....ym] , yi\in\mathbb{R}^{d2} $$ 通過Embedding 和Positional 相加得到的結果 $$ P = [p1,p2,p3....pm] , pi\in\mathbb{R}^{d2} $$ $$ P + Y \in\mathbb{R}^{md} $$ 接下來的步驟都與Encoding 相似,差在Masked 和 連接Encoding和Decoding 的想法 ### Mask Transformer 的 Mask 機制有兩種:Padding Mask、Sequence Mask - Padding Mask 在 Encoder和 Decoder 中都有使用到,目的是為了限制每個輸入的長度要相同,對於較短的句子會將不足的部分補 0 - Sequence Mask 只用於 Decoder,目的是為了防止模型看到未來的資訊,因此在超過當前時刻 t 的輸出會加上一個 mask,確保模型的預測只依賴小於當前時刻的輸出。 簡單的來說就是遮蓋掉尚未預測的字,遮蓋的方式就是給那個位子一個很小的值,通過Softmat計算權重的時候,會趨近於0,等於就是沒有權重。如此就不會有作弊的問題產生。 $$ Attendtion(Q,K,V) = mask\,\,softmax \left( \frac{QK^T} {\sqrt{d_k} \quad} \right) V $$ 當電腦跑完Mask以後,會發現m*m的矩陣中,會有一半三角形區塊為0,接下來再去成上V回歸原本m*d的矩陣。 $$ M \in\mathbb{R}^{d2} $$ 第二次的Muit-Head Attendtion 矩陣,下方上來的M的矩陣,視為Q。其他兩線由Encoding過來,視為K和V,一起計算輸入句子和輸出句子的Attendtion分數矩陣。 $$ Encoding \Rightarrow E\in\mathbb{R}^{dn} \quad \text {Value , Key} $$ $$ Decoding \Rightarrow M\in\mathbb{R}^{d2m} \quad \text {Query} $$ d2通常會等於d,所以相乘之後會計算出m*n的矩陣。 在去乘上Add&Norm後會變成m*d2的矩陣,在轉換為要的輸出模型即可。 ## BERT 共三層 1. token embeddings 2. segment embeddings 3. position embeddings ### token embeddings 在句子的開頭加上[CLS],在句子的分隔處加上[SEP],同樣計算token數。固定維數為768,若是加上batch_size的話,常用表示(1,n,768)。 ![](https://i.imgur.com/C3CzgfY.png) ### segment embeddings 在句子的開頭加上[CLS],在句子的分隔處加上[SEP],同樣計算token數。固定維數為768。只有兩種向量表示,第一句的input表示為0,第二句為1,只有一句的話sg=0,,若是加上batch_size的話,常用表示(1,n,768)。 ![](https://i.imgur.com/k6Z36MR.png) ### position embeddings 同一句中有不同的標記,不同句中有同一標記。 "I think, therefore I here" 第一個I和第二個I視為不同Position。 "Hello world","Hi friend",其中"Hello"和"Hi"為相同Position,同理"world"和"friend"也是 ## LSTM LSTM内部主要有三个階段: 1. 忘记階段。这个階段主要是對上一个節點傳進來的輸入進行選擇性忘記。簡單來說就是會忘記不重要的,記住重要的”。 具體來說是通過計算得到的 ![](https://i.imgur.com/yjMs22U.png)(f表示forget)作為忘記門控,控制上一個狀態 ![](https://i.imgur.com/jlgGkrA.png) 哪些需要留哪些需要忘。 2. 選擇記憶階段。這個階段將現在階段的輸入有選擇性的進行"記憶"。主要是匯兌輸入 ![](https://i.imgur.com/zJe7BVi.png)逕行選擇記憶。哪些重要則著重紀錄。當前輸入計算內容則由![](https://i.imgur.com/gYQ59Ej.png) 表示。選擇門控信號則是由 ![](https://i.imgur.com/ccTMCfx.png) (i代表information)進行控制。 >將上面兩步得到的結果相加,即可得到傳輸給下一個狀態的 ![](https://i.imgur.com/KYSoaVk.png) 。也就是上圖中的第一個公式。 3. 輸出階段。這個階段將決定哪些將會被當成當前狀態的輸出。主要是通過 ![](https://i.imgur.com/XuvtAMU.png) 來進行控制的。並且還對上一階段得到的 ![](https://i.imgur.com/4Dcb9Jv.png) 進行了放縮(通過一個tanh激活函數進行變化)。 與普通RNN類似,輸出 ![](https://i.imgur.com/96Reyis.png) 往往最終也是通過 ![](https://i.imgur.com/bdThtkq.png) 變化得到。 ![](https://i.imgur.com/dv3CoFa.png) c會轉換速度很慢的選擇性記憶,h轉換速度很快的記憶 y為輸出值,x為輸入值,z是轉換1~-1之間的信號轉換器 ![](https://i.imgur.com/FpzYpvC.png)是Hadamard Product,也就是操作矩阵中对应的元素相乘,因此要求两个相乘矩阵是同型的。 ![](https://i.imgur.com/PA4yqZS.png) 则代表进行矩阵加法。 參考資料 https://www.cnblogs.com/d0main/p/10447853.html https://zhuanlan.zhihu.com/p/32085405 https://ithelp.ithome.com.tw/articles/10281600