---
# System prepended metadata

title: 深度學習 05：RNN／Attention 自然語言處理
tags: [Deep Learning]

---

# 深度學習 05：RNN／Attention 自然語言處理
###### tags: `Deep Learning`

## Stateful／Stateless RNN

- **Stateful RNN**

    學樣本間及樣本內的時序，例如用 1000 句文章預測第 1001 句，每一個樣本都有前後關聯。意味著每批樣的狀態將被重新用作下一批樣品的初始狀態。
    
    當使用 Stateful RNN 時，假定：

    - 所有的批次都有相同數量的樣本
    - 如果 x1 和 x2 是連續批次的樣本，則對於每個 i，x2[i] 是 x1[i] 的後續序列。

    要使用 Stateful RNN 你需要：

    - 通過將 batch_size 參數傳遞給模型的第一層來顯式指定你正在使用的批大小。例如，對於 10 個時間步長的 32 樣本的 batch，每個時間步長具有 16 個特徵，batch_size = 32
    - 在 RNN 層中設置 stateful = True
    - 在調用 fit() 時指定 shuffle = False
    
    ![](https://i.imgur.com/JULabm4.png)
    
    假設Timestep=5，batch_size=2
    
    - X1 和 X2 就是連續的兩個批次，X2[i] 是 X1[i] 的後續序列，也就是說，床前明月光後面是疑是地上霜
    - **光**的狀態會傳遞到**疑**作為初始狀態，也就是用**光**輸出的 (h, c) 來初始化**疑**的 (h, c)
    - 那就不難理解為什麼"所有的批次都有相同數量的樣本"，如果不同批次的樣本數不同，那上一批次傳過來的 (h, c) 將沒人接手
    - stateful RNN 需要指定，不指定的話，Keras 默認容忍最後一個批次樣本數不同。例如，samples=9、batch_size=2，那麼默認分成5批，最後一批只有1個樣本
    - shuffle = True 會在每個 epoch 開始之前打亂訓練集數據順序，使用 stateful LSTM 肯定要設置 shuffle = False，不然**光**可能會傳給**汗**
    - Stateful RNN 訓練完一個 epoch 要手動重置網絡，如果不重置，就會將上個epoch最後一個batch的狀態傳遞給下個epoch的第一個batch


- **Stateless RNN**
    
    學樣本內的時序，例如用 1000 首詩訓練自動寫出一個新詩。也是我們最常用的 RNN 類型。
    
---
## 遮罩

自然語言處理必須學習忽略省略符號，即在 Embedding 層加入 mask_zero=True，代表填補符號會被所有下游 layers 忽略。

**當遞迴層遇到被遮住的時步時，它會直接複製上一個時步的輸出，而被遮住時步的 loss 將會是 0。**

---
## 翻譯／產生文章

1. 反轉輸入資料
    
    將輸入的資料反轉，例如 I am a cat 變成 cat a am I，使得 I 和對應的輸出"我"距離相近，可以降低第一個字就出錯的機率，不會有第一個字錯後面跟著全錯的情況。這種方法比較容易傳遞梯度，提高學習效率，且字詞的平均距離不變。
    
2. Peeky

---
## Attention

與其只把 Encoder 處理完句子產生的最後「一個」向量交給 Decoder 並要求其從中萃取整句資訊，不如將 Encoder 在處理每個詞彙後所生成的「所有」輸出向量都交給 Decoder，讓 Decoder 自己決定在生成新序列的時候要把「注意」放在 Encoder 的哪些輸出向量上面。

![](https://i.imgur.com/Tf2BLWx.jpg)

為了更徹底運用 hs，必須將 decoder 改良，目標是利用某種運算將各時刻的 LSTM 隱藏層及  encoder 的 hs 中萃取必要的資料。這也是 **Attention** 做的事情。

![](https://i.imgur.com/bkHxS50.jpg)

具體而言就是將 hs 乘上代表各單字重要度的權重。

![](https://i.imgur.com/oym9Hkw.jpg)

具體而言這個權重 a 就是利用 hs 和 LSTM 的輸出 h 做內積找出相似度 s。

![](https://i.imgur.com/Nkwg5Cf.jpg)

最後再套一層 softmax 函數進行正規化就是權重 a。

總而言之，Attention 會注意 encoder 各輸出的詞向量 hs，計算各字詞的權重 a，接著會計算 a 和 hs 的加權總和，輸出上下文向量 c。稱為 Attention 層，**其得出的結果為目標和來源的每個詞之依賴關係**。

- **self-Attention**
    來源或目標對自己的關係，再把來源的 attention 加到目標的 attention，取得目標來源的關係。

- **Multi-Head Attention**
    將 Q、K、V 轉成 embedding 維空間，可同時關注不同位置字詞在不同子空間下的 repr.

---
## Transformer

![](https://i.imgur.com/tnO3h5I.png)








---
https://blog.csdn.net/qq_27586341/article/details/88239404
https://www.zydarchen.top/20180925/21_stateful_LSTM/
https://leemeng.tw/neural-machine-translation-with-transformer-and-tensorflow2.html