# 深度學習 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