1. 程式人生 > >sp5.1 Recurrent Neural Networks

sp5.1 Recurrent Neural Networks

3 Sequence models & Attention mechanism.note http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 時間序列資料是指在不同時間點上收集到的資料,這類資料反映某一事物現象等隨時間的變化狀態或程度。 序列模型可用於序列資料sequence data 都算監督學習 比如語音識別 輸入輸出都是序列。對於音樂生成,輸出是序列 而輸入是整數比如音樂型別甚至空集 也可以視訊物體運動識別 輸入是序列模型 輸出是個整數   Named entity recognition 識別一句話中名字在哪 輸入的時間序列模型 用x^t表示位置 在句子裡就是第幾個單詞 輸出也一樣 Tx和Ty表示總長度 可以相同可以不相同 看你要什麼 這裡識別一句話每個單詞 所以兩者長度相同
這樣表示不太好 X^<I>表示這個序列的第幾個單詞   X^i表示第幾個訓練樣本       x^i t 表示第i個樣本的第t個單詞   第i個樣本的序列長度     怎樣表示單詞? 首先建立字典 一般長度為30-50000 商業3萬-5萬 也許百萬 用在字典裡的位置表示序列裡單個單詞 one-hot方式編碼 不再詞表中的單詞用unk表示 unknow 整個x就是一個很大的稀疏矩陣了
對於不在詞表中的用個unk表示   為什麼不用以前標準的神經網路? 對於人名判斷舉例:為什麼不用以前的DNN? 使用標準神經網路表現不好:比如每個單詞看成一個特徵屬性 輸入進去 1 每個樣本比如句子長度不一樣 雖然可以設個最大長度 不夠的用0啥的填充 但是仍然不好 2 並不共享文字在不同位置上學到的特徵 3 特別大啊 比如用的是幾萬長度的字典 每個特徵值不就是幾萬了 再乘以一句話的單詞數量 很大 比如每個one-hot是 一萬 然後每句話 10個單詞 這一下子就是 10W了輸入進去 這裡的最後輸出是判斷這t個單詞哪個是人名   RNN 每層只是一個單詞x<1> 每個單詞對應一個輸出Y 一個迴圈使用的是相同的w權數 第二個單詞 就用了前一個單詞傳過來的引數 這樣子一句話單詞數不管多少 都可以了 缺點是隻用了前面的資訊 沒用後面的 比如第二例子泰迪熊 就不是人名 waa、wax都是相同的 最後一個迴圈圖相當於前面展開的,有些論文這樣畫
用相同的W_ax 水平啟用值W_aa 輸出Y是 W_ya BRNN雙向傳播神經網路 向前傳播: g(上一步的a0 * Waa + 當前x * Wxx+b)   Waa 就是對應隱藏層的啊 這裡假設他是100維的 Wax是對應one-hot的 這裡假設一萬維 原本是隱藏層Waa100*100 * a 100*1=100*1 + Wax 100*10000 * X 10000*1的=100*1 + b   上面兩個合成一個矩陣運算 左右劃線公式是一樣的啊 把Waa Wax 水平放在一起 就是Wa 兩者一個100*100 一個100*10000 水平放在一起 這樣是100* 10100   把a和X垂直放在一起啊 兩者一個100*1 一個 10000*1 這樣是10100*1   Wax(100,10000) * Xt(10000,m)=100*m 同時處理m個樣本的 一步 Waa(100 , 100)* at(100,m)=100 *m 兩者相加+ba Wya(?,100) * 1 00*1   waa wax矩陣水平放置 【,】矩陣豎著放 a1不是一個數字啊 假設設定a是100維的隱藏層 x1這裡設每個單詞one-hot是10000維的   反向傳播:從最最右上角的損失函式最終值來反向回來 Wax往前傳吧 Waa Wya都一樣往前傳的 這裡第一行loss是單個單詞的 其實就是交叉熵 這是個二分類問題啊 要不0要不1 真實標籤           不同型別的RNN: 多對多(輸入輸出長度一樣 比如識別人名) 多對一(整個句子對應一個輸出 比如識別情感)   一對多(給個型別 音樂生成)前一個輸出也給下個 另外一種多對多(輸入輸出長度不同 翻譯 )           ——————————————————————————     序列生成:比如語音識別/機器翻譯 兩句話很相似 判斷哪個概率大 利用語言模型來判斷 相當於用概率打分了 在整個語境下 接下來每個句子的概率 這裡每個單詞以Y表示   1 建立語言模型 1 需要一個語料庫corpus 數量很大的英語句子 2 將一個樣本(句子)裡的單詞onehot 句子結尾可以加EOS標記 詞不在裡面還用UNK   3構建RNN,讓xt=y(t-1) 就是把上一步的真實值傳進來 當做當前步驟的x 其實這裡y就是監督學習裡 籤值 下面算出來都是y^ 實際算出來值 這裡y1 y2都指的是單詞 都是one-hot 有時候會產生unk 要是避免的話 若是出現就繼續進行取樣直到不出現     2取樣:對於訓練好的 模型進行取樣 看他學到了什麼 這裡每個Y就是個softmax過得10000維 每個單詞概率 根據這些概率大小隨機選一個 作為下一個輸入 原本是真實單詞 這樣子就隨機生成了一個句子   SAMPLE取樣   D 是以概率分佈隨機取樣的 不是取樣最高概率那個     y也可以是基於字元的(字母) 優點 :不會產生unk 但是這樣子會產生太長 依賴關係也不如基於單詞的好。但可能隨著計算機效能變好可能會用基於字母的     ——————————————————————     其實梯度消失一直存在 之前的標準網路什麼的都有這個問題 不過在這裡比較突出 不管你用sigmoid 還是tanh都容易 出現這個問題 兩者影象幾乎一樣啊 一個是0-1 一個是-1到1 梯度消失 比較難解決vanishing gradients:缺點存在梯度消失 就會很難影響前面的層 比如前面是cats 後面應該是were 但是RNN其實不太擅長這件事 距離比較遠的依賴關係 更多受到最近距離幾個層的影響     梯度爆炸指數級的用梯度修剪gradient clipping:縮放梯度向量 設個閥值 讓其不溢位 不爆炸 這裡直接讓10 -10作為上下邊界了 梯度消失比較麻煩 用下面的網路 可以有更遠的依賴   梯度消失解決方法 利用下面模型方法: GRU Gated Recurrent Unit門控制迴圈單元 改變了RNN的隱藏層來應對RNN梯度消失的問題 使前後依賴關係大了) 原本RNN是這樣的   現在有個新變數C作為記憶單元,把a的值賦予它 在GRU中 兩者相等 在LSTMS中不同 C^t在每一步驟更新Ct 而用γ門來決定是否更新 γ門代表更新門(0-1之間) 用sigmoid啟用 根據影象知道 一般要不接近0 要不接近1   假設記憶細胞被記為0或1表示 這個單詞是單數或者複數 假設單數1 如下文的cat 會一直記著Ct 則一直記到was那裡。 門的作用就是什麼時候更新Ct的值,在was那裡 就變回了不用再記著了   γ不更新時候是接近0的 所以Ct約等於=ct-1的 一直都大致相等         這裡只是個例子讓ct=1 其實c可以是任意設定的維度啊!!!!γ門和a相同維度   再看圖理解 就是前一步有a^t-1 c^t-1傳進來 用當前步X^t 輸進去 算一個Chat^t 和 門 然後門和他相乘決定是否更新C 紫色部分 紫色部分C也傳下 一步 而且softmax來算yhat 門一般非常接近0 (是個sigmoid) 有利於保持記憶細胞C 這裡Ct是個任意維的 比如100維的 門也一樣 其實這裡一百維直覺可以理解為 每一個數 可能都記憶不同的關係 比如有的單複數 有的時態等     全GRU多了個r門 來算計Ct-1和下一項CT多大相關性 尼瑪第一個式子變了 沒注意看       LSTM長短時記憶網路 有了單獨的記憶們和遺忘門 可能比GRU更有效和通用:其實GRU是最新提出的 像簡化版LSTM 能用於更大的網路   讓很多偏導連乘起來不會太大也不會太小 解決了爆炸或者T梯度消失的問題   多了 遺忘門 和 輸出門 這樣關於記憶細胞C 就成更新門*當前算出的C + 遺忘門*上一步C at不直接等於ct 而是 輸出門 * 上面算出來的Ct   其實就是之前y=wa+b 啟用傳給下一個 現在程式設計把用遺忘和更新門 變成了C a原本也是直接傳給下一個 現在用了輸出門             最常用的版本 輸出門裡多了個00000000000000000000000000000000000000000000000.       。。//。//。0/'“?   ”000000000000000000000000000000000000000   y=softmax(w*a+b)000000       Long Short Term 網路—— 一般就叫做 LSTM ——是一種 RNN 特殊的型別,可以學習長期依賴資訊。LSTM 由Hochreiter & Schmidhuber (1997)提出,並在近期被Alex Graves進行了改良和推廣。在很多問題,LSTM 都取得相當巨大的成功,並得到了廣泛的使用。 LSTM 通過刻意的設計來避免長期依賴問題。記住長期的資訊在實踐中是 LSTM 的預設行為,而非需要付出很大代價才能獲得的能力! 所有 RNN 都具有一種重複神經網路模組的鏈式的形式。在標準的 RNN 中,這個重複的模組只有一個非常簡單的結構,例如一個 tanh 層。       模型3   之前單向的 對於人名識別就容易出問題   雙向神經網路:不僅可以獲取以前資訊也可獲得未來資訊 前面幾種都是單向的       增加了反向迴圈 變成了無向圖 缺點是 需要完整的資料序列 語音識別系統 的話 需要使用者把一句話說完才可以 而不是邊說邊出       這裡還可以用GRU LSTM   模型4 深層迴圈神經網路:多個RNN疊起來 一般沒多少層 不像卷積啥的 幾層一般 a【】橫著算一層 a等於X傳進去算 加上 橫向同層穿過來的   a可能就兩三層, 上面又多加了幾層 是為了算Y 他們之間橫向不連線