---
# System prepended metadata

title: 專題二 論文討論

---

# 專題二 論文討論


## 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