# 專題二 論文討論
## Transformer

此架構是Google在2007年時提出,看此圖時須從下往上看,並分成輸入與輸出的兩個部分。
公式與解釋
https://www.youtube.com/watch?v=b_gJfol7eLU&t=4598s
## Encoder 輸入端

### 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 輸出端

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

### segment embeddings
在句子的開頭加上[CLS],在句子的分隔處加上[SEP],同樣計算token數。固定維數為768。只有兩種向量表示,第一句的input表示為0,第二句為1,只有一句的話sg=0,,若是加上batch_size的話,常用表示(1,n,768)。

### position embeddings
同一句中有不同的標記,不同句中有同一標記。
"I think, therefore I here" 第一個I和第二個I視為不同Position。
"Hello world","Hi friend",其中"Hello"和"Hi"為相同Position,同理"world"和"friend"也是
## LSTM
LSTM内部主要有三个階段:
1. 忘记階段。这个階段主要是對上一个節點傳進來的輸入進行選擇性忘記。簡單來說就是會忘記不重要的,記住重要的”。
具體來說是通過計算得到的 (f表示forget)作為忘記門控,控制上一個狀態  哪些需要留哪些需要忘。
2. 選擇記憶階段。這個階段將現在階段的輸入有選擇性的進行"記憶"。主要是匯兌輸入 逕行選擇記憶。哪些重要則著重紀錄。當前輸入計算內容則由 表示。選擇門控信號則是由  (i代表information)進行控制。
>將上面兩步得到的結果相加,即可得到傳輸給下一個狀態的  。也就是上圖中的第一個公式。
3. 輸出階段。這個階段將決定哪些將會被當成當前狀態的輸出。主要是通過  來進行控制的。並且還對上一階段得到的  進行了放縮(通過一個tanh激活函數進行變化)。
與普通RNN類似,輸出  往往最終也是通過  變化得到。

c會轉換速度很慢的選擇性記憶,h轉換速度很快的記憶
y為輸出值,x為輸入值,z是轉換1~-1之間的信號轉換器
是Hadamard Product,也就是操作矩阵中对应的元素相乘,因此要求两个相乘矩阵是同型的。  则代表进行矩阵加法。
參考資料
https://www.cnblogs.com/d0main/p/10447853.html
https://zhuanlan.zhihu.com/p/32085405
https://ithelp.ithome.com.tw/articles/10281600