RNN
首先思考這樣一個問題:在處理序列學習問題時,為什么不使用標准的神經網絡(建立多個隱藏層得到最終的輸出)解決,而是提出了RNN這一新概念?
標准神經網絡如下圖所示:
標准神經網絡在解決序列問題時,存在兩個問題:
- 難以解決每個訓練樣例子輸入輸出長度不同的情況,因為序列的長度代表着輸入層、輸出層的維度,不可能每訓練一個樣例就改變一次網絡結構。
- 標准的神經網絡不能共享從文本不同位置上學到的特征。舉例說明:如果Harry作為人名位於一個訓練例子中的第一個位置,而當Harry出現在其他例子的不同位置時,我們希望模型依然能識別其為人名,而不是只能識別位於第一個位置的Harry。
前向傳播
以NLP中“命名實體識別“任務為例,序列中每一個輸入字符對應一個輸出,即\(T_y=T_x\):
- \(a^{<0>}\)是初始的隱狀態,一般置為零向量。
- \(a^{<i>}\)代表輸入序列中第\(i\)個輸入所隱含的信息,即時間步\(i\)的激活值。
- \(x^{<i>}\)代表輸入序列中第i個字符,輸入序列的長度為\(T_x\) 。
- \(\hat{y}^{<i>}\)代表與\(x^{<i>}\)相對應的輸出值。
RNN在進行前向傳播時,不光考慮當前時刻的輸入\(x^{<i>}\),也會考慮包含上一時刻的信息(激活值\(a^{<i-1>}\))。計算公式如下:
\[a^{<t>}=g(W_{aa}a^{<t-1>}+W_{ax}x^{<t>}+b_a) \]
\[\hat{y}^{<t>}=g(W_{ya}a^{<t>}+b_y) \]
為了方便記憶,可以將公式進行簡化,其中\(W_{aa}\), \(W_{ax}\)合並為\(W_a\),\(a^{<t-1>}\)與\(x^{<t>}\)合並為新的矩陣\([a^{<t-1>},x^{<t>}]\)。舉例說明:假定激活值\(a^{<t-1>}\)(也可以成為隱狀態)為\(100\)維,輸入值\(x^{<t>}\)為\(10000\)維。那么權重矩陣\(W_{aa}\)為\(100\times 100\)維,\(W_{ax}\)為\(100\times 10000\)維。合並后的新權重矩陣為\(W_a\)為\(100\times (100+10000)\)維,合並后的新輸入\([a^{<t-1>},x^{<t>}]\)為\((100+10000)\)維向量,即將\(a^{<t-1>}\)堆疊(stack)在\(x^{<t>}\)上方。
- 簡化的原理為:
\[\begin{bmatrix}W_{aa}&W_{ax}\end{bmatrix}\begin{bmatrix}a^{<t-1>}\\ x^{<t>}\end{bmatrix}=W_{aa}a^{<t-1>}+W_{ax}x^{<t>} \]
- 簡化后的計算公式為:
\[a^{<t>}=g(W_{a}[a^{<t-1>},x^{<t>}]+b_a) \]
\[\hat{y}^{<t>}=g(W_{y}a^{<t>}+b_y) \]
RNN類型總結
- One to one
- One to many
- Many to one
- Many to many(\(T_x == T_y\))
- Many to many(\(T_x != T_y\))