1. 程式人生 > >5.1 深度學習序列模型筆記

5.1 深度學習序列模型筆記

第五課 序列模型(Sequence Models)

第一週 迴圈序列模型(Recurrent Neural Networks)

1.1 為什麼選擇序列模型?(Why Sequence Models)

迴圈神經網路(RNN)

在進行語音識別時,給定一個 輸入音訊片段xx, 要求輸出 對應的文字記錄yy

這個例子裡輸入和輸出資料都是序列模型,因為 xx 是一個按時播放的音訊片段,輸出 yy 是一系列單詞

1.2 數學符號(Notation)

如果你想建立一個序列模型,它的輸入語句是這樣的:

Harry Potter and Herminoe Granger invented a new spell

  • 這個輸入資料是 9 個單片語成的序列,所以最終我們會有 9 個特徵集和 來 表示這9個單詞

    按照序列中的位置進行索引:x<1>x<2>x<3>.......x<9>{x^{ < 1 > }}、{x^{ < 2 > }}、{x^{ < 3 > }}.......{x^{ < 9 > }}

    x<9>,我們將用x&lt;t&gt;{x^{ &lt; t &gt; }}來索引這個序列的中間位置

  • 輸出資料也一樣

    y&lt;1&gt;y&lt;2&gt;y&lt;3&gt;.......、、、、、、{y^{ &lt; 1 &gt; }}、{y^{ &lt; 2 &gt; }}、{y^{ &lt; 3 &gt; }}.......

    ....表示輸出資料

  • TxT_x表示輸入序列的長度,TyT_y表示輸出序列的長度

  • x(i)x^{(i)}表示第ii個樣本,所以訓練樣本i的序列中第t個元素用 x(i)&lt;t&gt;x^{(i)&lt;t&gt;}表示

  • 如果TxT_x是序列長度,那麼你的訓練集裡不同的訓練樣本就會有不同的長度,所以Tx(i)T_x^{(i)}就代表第ii個訓練樣本的輸入序列長度; Ty(i)T_y^{(i)}表示第ii個訓練樣本的輸出序列的長度

所以這個例子中,Tx(i)=9T_x^{(i)}=9,但如果另一個樣本是由 15 個單片語成的句子,那麼多餘這個訓練樣本來說,Tx(i)=15T_x^{(i)}=15

怎樣表示一個序列裡單獨的單詞,x&lt;1&gt;x^{&lt;1&gt;}實際代表什麼?

  • 如果想要表示一個句子裡的單詞,第一件事情是做一張詞表,也稱詞典
  • 用one-hot表示詞典裡的每個單詞

舉個例子,x&lt;1&gt;x^{&lt;1&gt;}表示 Harry 這個單詞,它就是一個第1075行是1,其餘值都是0的向量。因為 Harry 在這個詞典裡的位置

  • 所以這種表示方法中,x&lt;t&gt;x^{&lt;t&gt;}指代句子裡的任意詞,它就是 one-hot 向量

目的是用這樣的表示方式表示XX,用序列模型在 XX 和 目標輸出YY 之間建立一個對映

  • 如果遇到一個不在詞表中的單詞,答案就是建立一個新標記, 也就是一個叫做 Unknow Word的偽單詞,用&lt;Unk&gt;&lt;Unk&gt;作為標記

1.3 迴圈神經網路模型(Recurrent Neural Network Model)

怎樣建立一個神經網路學習XXYY的對映?

​ 使用標準神經網路,將它們輸入到標準神經網路中,經過一些隱藏層,最終會輸出9個為0/1的值,它表明每個輸入單詞是否是人名的一部分。

但這樣做有兩個問題:

  1. 輸入和輸出資料在不同例子中有不同的長度,不是所有的例子都有著同樣的 輸入長度TxT_x 或者 同樣的輸出長度TyT_y;
  2. 這樣單純的神經網路結構,它並不共享從文字的不同位置學到的特徵。具體說,如果神經網路學習到了再位置 1 出現的 Harry 可能是人名的一部分,那麼如果 Harry 出現在其他位置,比如x&lt;t&gt;x^{&lt;t&gt;}時,它就不奏效。
  3. 之前我們提到過那些:x&lt;1&gt;x&lt;2&gt;x&lt;3&gt;.......x&lt;9&gt;、、、、、、{x^{ &lt; 1 &gt; }}、{x^{ &lt; 2 &gt; }}、{x^{ &lt; 3 &gt; }}.......{x^{ &lt; 9 &gt; }}都是 10,000 維的 one-hot 向量,因此這回事十分龐大的輸入層。如果總的輸入大小是 最大單詞書x10000,那麼第一層的權重矩陣就會有著巨量的引數

  1. 從左到右的順序讀這個句子,第一個單詞,也就是x&lt;1&gt;x^{&lt;1&gt;},要做的就是將第一個詞輸入一個神經層, 可以讓神經網路嘗試預測輸出,判斷是否是人名的一部分
  2. 迴圈神經網路讀到句子中的第二個單詞時,假設是x&lt;2&gt;x^{&lt;2&gt;},它不是僅用x&lt;2&gt;x^{&lt;2&gt;}就預測出y^&lt;2&gt;{{\hat y}^{ &lt; 2 &gt; }},它會輸入一些來自時間步 1 的資訊;具體說:時間步1的啟用值會傳遞到時間步 2
  3. 在下一個時間步,迴圈神經網路輸入單詞x&lt;3&gt;x^{&lt;3&gt;},然後它預測出了預測結果y^&lt;3&gt;{{\hat y}^{ &lt; 3 &gt; }}…等等抑制到最後一個時間步,輸入了x&lt;Tx&gt;{x^{ &lt; {T_x} &gt; }},然後輸出了y&lt;Ty&gt;{y^{ &lt; {T_y} &gt; }}
  4. 至少在這個例子中Tx=TyT_x=T_y,如果不相等,這個結構需要作出一些改變
  5. 所以在每一個時間步中,迴圈神經網路傳遞一個啟用值到下一個時間步中用於計算
  6. 迴圈神經網路是從做到右掃描資料的,同時每個時間步的引數都是 共享的,我們用**WaxW_{ax}表示管理著x&lt;1&gt;x^{&lt;1&gt;}到隱藏層的連線的一系列引數,每個時間步使用著相同的引數WaxW_{ax}**。
  7. 而啟用值,也就是水平聯絡是由引數WaaW_{aa}決定的,同時每個時間步使用的都是相同的引數WaaW_{aa}
  8. 輸出結果由WyaW_{ya}決定

詳細講述這些引數如何起作用

在這個迴圈神經網路中,意思是在預測y^&lt;3&gt;{{\hat y}^{ &lt; 3 &gt; }}時候,不僅要使用x&lt;3&gt;x^{&lt;3&gt;}的資訊,還要使用來自x&lt;1&gt;x^{&lt;1&gt;}x&lt;2&gt;x^{&lt;2&gt;}的資訊

前向傳播過程

  1. 首先輸入a&lt;0&gt;a^{&lt;0&gt;},它是一個零向量

  2. 接著計算前向傳播過程,先計算啟用值a&lt;1&gt;a^{&lt;1&gt;},然後再計算y&lt;1&gt;y^{&lt;1&gt;}
    a&lt;1&gt;=g1(Waaa&lt;0&gt;+Waxx&lt;1&gt;+ba)y^&lt;1&gt;=g2(Wyaa&lt;1&gt;+by) \begin{array}{l} {a^{ &lt; 1 &gt; }} = {g_1}\left( {{W_{aa}}{a^{ &lt; 0 &gt; }} + {W_{ax}}{x^{ &lt; 1 &gt; }} + {b_a}} \right)\\ {{\hat y}^{ &lt; 1 &gt; }} = {g_2}\left( {{W_{ya}}{a^{ &lt; 1 &gt; }} + {b_y}} \right) \end{array}