RNN model
1、Notation
吳恩達深度學習課程中采用了如下的記号
以命名體識别為例子來舉例,如輸入一句話,識别出哪個單詞是人名,有以下句子:
He said,“Teddy Roosevelt was a great President”.
N o t a t i o n : Notation: Notation:
- T x T^{x} Tx表示輸入序列的長度,如上面這句話有8個單詞是以 T x = 8 T^{x}=8 Tx=8, T y T^{y} Ty表示輸出序列長度,本例中 T x = T y T^{x}=T^{y} Tx=Ty
- x < 1 > , x < 2 > . . . x T x x^{<1>},\ x^{<2>}...x^{T_x} x<1>, x<2>...xTx 表示輸入語句的序列,如 x < 1 > x^{<1>} x<1>表示第一個單詞He
- y < i > y^{<i>} y<i>是根據已經輸入的資訊計算的結果,如果是二分類,如人名識别可以是0或者1,1表示 x < i > x^{<i>} x<i>是一個人名,比如第三個和第四個單詞Teddy,Roosevelt是人名,是以希望 y < 3 > = 1 , y < 4 > = 1 y^{<3>}=1,y^{<4>}=1 y<3>=1,y<4>=1
- a < i > a^{<i>} a<i>是由 x < i > x^{<i>} x<i>和 a i − 1 a^{i-1} ai−1(之前的資訊)計算出來的激活值,其中 a < 0 > a^{<0>} a<0>是随機生成的向量
2、Forward Propagation
basic notation
符号 w y a w_{ya} wya中的第一個下标表示這個參數最終要計算的是 y y y,而第二個參數表示這個參數将會乘以一個 a a a, w a a w_{aa} waa同理
首先為了計算前向傳播,現将上圖藍色框框住的參數進行随機初始化,包括 a < 0 > , W a a , W a x , W y a a^{<0>},W_{aa},W_{ax},W_{ya} a<0>,Waa,Wax,Wya
I n i t i a l i z e : a < 0 > = 0 ⃗ , W a a , W a x , W y a Initialize: a^{<0>} = \vec0,W_{aa},W_{ax},W_{ya} Initialize:a<0>=0
,Waa,Wax,Wya
RNN的計算過程如上圖中間的箭頭方向所示,從左向右進行計算,每一時間步都有目前這一步的文本輸入 x < t > x^{<t>} x<t>,和前一步的激活值 a < t − 1 > a^{<t-1>} a<t−1>,利用這些輸入分别和對應的參數 W a x , W a a W_{ax},W_{aa} Wax,Waa進行線性運算再經過激活函數得到目前這步的激活值 a < t > a^{<t>} a<t>
a < 1 > = g 1 ( W a a a < 0 > + W a x x < 1 > + b a ) , w h e r e g 1 ( x ) c a n b e s i g m o i d / t a n h / R e l u ( X ) . . . a^{<1>}=g_1(W_{aa}a^{<0>}+W_{ax}x^{<1>}+b_a), where\ g_1(x)\ can\ be\ sigmoid/tanh/Relu(X)... a<1>=g1(Waaa<0>+Waxx<1>+ba),where g1(x) can be sigmoid/tanh/Relu(X)...
得到目前時間步t的激活值 a < t > a^{<t>} a<t>之後,用 a < t > a^{<t>} a<t>和對應的參數 W y a W_{ya} Wya進行線性運算再經過激活函數得到輸出 y < t > y^{<t>} y<t>,如果需要輸出多個值,激活函數可以選擇 s o f t m a x softmax softmax激活函數
y < 1 > = g 2 ( W y a a < 1 > + b y ) , w h e r e g 2 ( x ) c a n b e s o f t m a x ( x ) . . . y^{<1>}=g_2(W_{ya}a^{<1>}+b_y),where\ g_2(x)\ can \ be \ softmax(x)... y<1>=g2(Wyaa<1>+by),where g2(x) can be softmax(x)...
. . . ... ...
每一步都按照上面的公式進行計算,并且每一步的參數 W a a , W a x , W y a W_{aa},W_{ax},W_{ya} Waa,Wax,Wya使用的都是同一套參數(在每個時間步上參數是共享的)
a < t > = g 1 ( W a a a < t − 1 > + W a x x < t > + b a ) a^{<t>} = g_1(W_{aa}a^{<t-1>}+W_{ax}x^{<t>}+b_a) a<t>=g1(Waaa<t−1>+Waxx<t>+ba)
y < t > = g 2 ( W y a a < t > + b y ) y^{<t>} = g_2(W_{ya}a^{<t>}+b_y) y<t>=g2(Wyaa<t>+by)
why RNN works?
RNN優點:
RNN 可以對整個句子序列進行表示,保持完整的上文資訊。尤其是較長距離(超過卷積視窗)的詞彙間的關聯資訊。(理論上)
從上圖以及前向傳播的過程可以看出:RNN的計算結果不僅僅取決于目前時間步的輸入 x < t > x^{<t>} x<t>,而是在時間步t上加入了前一步的激活值 a < t > a^{<t>} a<t>進而綜合考慮了前面 x < 1 > , x < 2 > , . . . x < t − 1 > x^{<1>},x^{<2>},...x^{<t-1>} x<1>,x<2>,...x<t−1>的輸入對目前輸出的影響。如上圖中 h 3 h_3 h3的輸出不僅僅和 x 3 x_3 x3有關,而且還受 x 0 x_0 x0和 x 1 x_1 x1的影響。正是因為RNN這種考慮目前輸出不僅僅和目前輸入有關,還與之前的輸入有關的特性(可以稱為RNN具有記憶能力,記憶了之前輸入的資訊),使得RNN對于序列資料具有很好的模組化能力。
Simplified RNN notation
a < t > = g ( W a a a < t − 1 > + W a x x < t > + b a ) a^{<t>} = g(W_{aa}a^{<t-1>}+W_{ax}x^{<t>}+b_a) a<t>=g(Waaa<t−1>+Waxx<t>+ba)
y < t > = g ( W y a a < t > + b y ) y^{<t>} = g(W_{ya}a^{<t>}+b_y) y<t>=g(Wyaa<t>+by)
将 w a a w_{aa} waa和 w a x w_{ax} wax按列水準堆疊起來得到新的矩陣 w a w_{a} wa,
W a = [ W a a , W a x ] W_a= \begin{bmatrix} W_{aa},W_{ax} \end{bmatrix} Wa=[Waa,Wax]
然後将 a < t − 1 > a^{<t-1>} a<t−1>和 x < t > x^{<t>} x<t>按行縱向堆疊起來得到:
[ a < t − 1 > x < t > ] \begin{bmatrix} a^{<t-1>}\\ x^{<t>} \end{bmatrix} [a<t−1>x<t>]
是以得到:
W a [ a < t − 1 > x < t > ] = [ W a a , W a x ] [ a < t − 1 > x < t > ] = W a a a < t − 1 > + W a x x < t > W_a\begin{bmatrix} a^{<t-1>}\\ x^{<t>} \end{bmatrix}= \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>} Wa[a<t−1>x<t>]=[Waa,Wax][a<t−1>x<t>]=Waaa<t−1>+Waxx<t>
是以最初的公式可以簡化如下:
a < t > = g ( W a [ a < t − 1 > x < t > ] + b a ) a^{<t>}=g(W_a\begin{bmatrix} a^{<t-1>}\\ x^{<t>} \end{bmatrix}+b_a) a<t>=g(Wa[a<t−1>x<t>]+ba)
y < t > = g ( W y a < t > + b y ) , W y = W y a y^{<t>}=g(W_ya^{<t>}+b_y),W_y=W_{ya} y<t>=g(Wya<t>+by),Wy=Wya
以上就是RNN的前向傳播過程
3、Rough Sense of Backprop Works in RNN
前向傳播的計算圖如下:
首先前向傳播:用 a < 0 > a^{<0>} a<0>, x < 1 > x^{<1>} x<1>計算出 a < 1 > a^{<1>} a<1>,由 a < 1 > a^{<1>} a<1>計算出 y ^ < 1 > \hat y^{<1>} y^<1>,到此完成了第一步的前向傳播…以此類推由 a < t − 1 > , x < t > a^{<t-1>},x^{<t>} a<t−1>,x<t>計算出 a < t > a^{<t>} a<t>,然後由 a < t > a^{<t>} a<t>計算出 y ^ < t > \hat y^{<t>} y^<t>,到此完成了第t步的前向傳播。
以下計算圖中的紅色箭頭表示反向傳播的步驟
首先定義在每一個時間步上的損失函數,這裡使用交叉熵損失函數:
L < t > ( y ^ < t > , y < t > ) = − y ^ < t > l o g ( y ^ < t > ) − ( 1 − y < t > ) l o g ( 1 − y < t > ) L^{<t>}(\hat y^{<t>},y^{<t>})=-\hat y^{<t>}log(\hat y^{<t>})-(1-y^{<t>})log(1-y^{<t>}) L<t>(y^<t>,y<t>)=−y^<t>log(y^<t>)−(1−y<t>)log(1−y<t>)
對每一時間步的損失加起來,得到總的損失:
L = ( y ^ , y ) = ∑ t = 1 T x L < t > ( y ^ < t > , y < t > ) L=(\hat y, y)=\sum_{t=1}^{T^x}L^{<t>}(\hat y^{<t>},y^{<t>}) L=(y^,y)=t=1∑TxL<t>(y^<t>,y<t>)
反向傳播的方向如上圖紅色箭頭所示
4、Different types of RNNS
1、one-to-many
應用場景音樂生成,或者序列生成。給定一個整數表示序列、音樂的種類,然後生成一段序列、音樂
2、many-to-one
應用場景情感分類。給定一個文本序列,通過RNN模型給出對該段文本的情感評價,1-5的一個整數,越大表示文本情感越接近積極
3、many-to-many
3.1輸入序列和輸出序列長度相等
命名體識别。給定一段文本,識别文本中的人名,輸出向量和輸入的文本單詞數一樣( T x = T y T^x=T^y Tx=Ty, T x T^x Tx表示輸入序列長度, T y T^y Ty表示輸出序列長度),輸出向量中為1的表示該單詞為名字,為0的表示不是。
3.2輸入序列和輸出序列長度不相等
機器翻譯。給定一段文本将其翻譯成另一種語言的文本( T x ̸ = T y T^x \not = T_y Tx̸=Ty, T x T^x Tx表示輸入序列長度, T y T^y Ty表示輸出序列長度)