sp5.1 Recurrent Neural Networks
阿新 • • 發佈:2018-11-15
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 他們之間橫向不連線