文章目录
什么是RNN?
有记忆被的神经网络就是循环神经网络(RNN)。在RNN里面,每一次隐藏层的神经元产生输出的,这个时候输出会存到内存里去(用蓝色框表示内存)。下一次当有输入时,这些神经元不只是考虑输入 X 1 , X 2 \mathrm{X}_{1}, \mathrm{X}_{2} X1,X2 对它来说, 除了考虑到记忆里的价值。 X 1 , X 2 \mathrm{X}_{1}, \mathrm{X}_{2} X1,X2 以外,这些存在记忆里的价值a1a 2 _{2} 2 也会影响它的输出。
例子
假设现在图上这个neural network,它所有的weight都是1,所有的neuron没有任何的bias。假设所有的activation function都是linear(这样可以不要让计算太复杂)。现在假设input 是sequence [ 1 1 ] [ 1 1 ] [ 2 2 ] . . . \begin{bmatrix} 1\\ 1 \end{bmatrix}\begin{bmatrix} 1\\ 1 \end{bmatrix}\begin{bmatrix} 2\\ 2 \end{bmatrix}... [11][11][22].... 在开始要使用这个Recurrent Neural Network的时候,必须要给memory初始值(memory里面初始值是0)
现在输入第一个 [ 1 1 ] \begin{bmatrix} 1\\ 1 \end{bmatrix} [11],对左边的那个neural来说(第一个hidden layer),它除了接到input的 [ 1 1 ] \begin{bmatrix} 1\\ 1 \end{bmatrix} [11]还接到了memory(0跟0),output就是2(所有的weight都是1),右边也是一样output为2。第二层hidden laeyer output为4。
接下来Recurrent Neural Network会将绿色neuron的output存在memory里去,所以memory里面的值被update为2。接下来再输入
[
1
1
]
\left[\begin{array}{l}1 \\ 1\end{array}\right]
[11], 接下来绿色的neuron输入有四个
[
1
1
]
[
2
2
]
\left[\begin{array}{l}1 \\ 1\end{array}\right]\left[\begin{array}{l}2 \\ 2\end{array}\right]
[11][22], output为
[
6
6
]
(
\left[\begin{array}{l}6 \\ 6\end{array}\right]\left(\right.
[66]( weight
=
1
=1
=1 ) , 第二层的neural output为
[
12
12
]
\left[\begin{array}{l}12 \\ 12\end{array}\right]
[1212] 。
所以对Recurrent Neural Network来说, 就算input一样的东西,它的output是可能不一样了(因为有memory)
现在
[
6
6
]
\left[\begin{array}{l}6 \\ 6\end{array}\right]
[66] 存到memory里去, 接下来input是
[
2
2
]
\left[\begin{array}{l}2 \\ 2\end{array}\right]
[22], output为
[
16
16
]
\left[\begin{array}{l}16 \\ 16\end{array}\right]
[1616],第二层hidden layer为
[
32
32
]
\left[\begin{array}{l}32 \\ 32\end{array}\right]
[3232]
那在做Recurrent Neural Network时,有一件很重要的事情就是这个input sequence调换顺序之后output不同(Recurrent Neural Network里,它会考虑sequence的order)
RNN架构
RNN有memory,memory中记忆arrive或者leave,来区分Taipei
其他结构的RNN
deepRNN
Elman Network & Jordan Network
- elman network:memory中是hidden layer中的output
- jordan network:memory中是整个network的output
Bidirectional RNN
双向循环神经网络在产生output时看的范围比单向的广,performance应当比单向的好
Long Short-term Memory (LSTM)
这个Long Short-term Memor是有三个gate,当外界某个neural的output想要被写到memory cell里面的时候,必须通过一个input Gate,那这个input Gate要被打开的时候,你才能把值写到memory cell里面去,如果把这个关起来的话,就没有办法把值写进去。至于input Gate是打开还是关起来,这个是neural network自己学的(它可以自己学说,它什么时候要把input Gate打开,什么时候要把input Gate关起来)。那么输出的地方也有一个output Gate,这个output Gate会决定说,外界其他的neural可不可以从这个memory里面把值读出来(把output Gate关闭的时候是没有办法把值读出来,output Gate打开的时候,才可以把值读出来)。那跟input Gate一样,output Gate什么时候打开什么时候关闭,network是自己学到的。那第三个gate叫做forget Gate,forget Gate决定说:什么时候memory cell要把过去记得的东西忘掉。这个forget Gate什么时候会把存在memory的值忘掉,什么时候会把存在memory里面的值继续保留下来),这也是network自己学到的。
那整个LSTM你可以看成,它有四个input 1个output,这四个input中,一个是想要被存在memory cell的值(但它不一定存的进去)还有操控input Gate的讯号,操控output Gate的讯号,操控forget Gate的讯号,有着四个input但它只会得到一个output
这个“-”应该在short-term中间,是长时间的短期记忆。想想我们之前看的Recurrent Neural Network,它的memory在每一个时间点都会被洗掉,只要有新的input进来,每一个时间点都会把memory 洗掉,所以的short-term是非常short的,但如果是Long Short-term Memory,它记得会比较久一点(只要forget Gate不要决定要忘记,它的值就会被存起来)。
- 假设要被存到cell的input叫做z,操控input gate的信号叫做 z i z_i zi(一个数值),所谓操控forget gate的信号叫做 z f z_f zf,操控output gate叫做 z o z_o zo,综合这些东西会得到一个output 记为a。
- 假设cell里面有这四个输入之前,它里面已经存了值c。把z通过activation function得到g(z),那 z i z_i zi通过另外一个activation function得到 f ( z i ) f(z_i) f(zi)( z i , z f , z 0 z_i,z_f,z_0 zi,zf,z0)通过的activation function 通常选择sigmoid function,选择sigmoid function的意义是它的值是介在0到1之间的。这个0到1之间的值代表了这个gate被打开的程度(如果这个f的output是1,表示为被打开的状态,反之代表这个gate是关起来的)。
- 把 g ( z ) g(z) g(z) 乘以 g g g ( z i ) \left(z_{i}\right) (zi) 得到 g ( g( g( z z z ) f ( z i ) ) f\left(z_{i}\right) )f(zi), 对于forget gate的 z f \mathrm{z}_{\mathrm{f}} zf, 也通过sigmoid的function得到 f f f ( z f ) \left(\mathrm{z}_{\mathrm{f}}\right) (zf)
- 接下来把存到memory里面的值c乘以 f ( z f ) f(z_f) f(zf)得到 c f ( z f ) cf(z_f) cf(zf),然后加起来 c ′ = g ( z ) f ( z i ) + cf ( z f ) \mathrm{c}^{\prime}=\mathrm{g}(\mathrm{z}) \mathrm{f}\left(\mathrm{z}_{\mathrm{i}}\right)+\operatorname{cf}\left(\mathrm{z}_{\mathrm{f}}\right) c′=g(z)f(zi)+cf(zf), 那么 c ′ \mathrm{c}^{\prime} c′ 就是重新存到memory里面的值。 f ( z f ) f(z_f) f(zf)决定要不要忘记cell中的值,如果 f ( z f ) f(z_f) f(zf)=1,则或保留上次cell中的值,如果 f ( z f ) f(z_f) f(zf)=0,则cell中以前的值相当于被清空。而 f ( z i ) \mathrm{f}(\mathrm{z}_{\mathrm{i}}) f(zi)作用与 f ( z f ) f(z_f) f(zf)相同, f ( z i ) \mathrm{f}(\mathrm{z}_{\mathrm{i}}) f(zi)控制输入 g ( z ) g(z) g(z)是否有效
LSTM输入
、现在有一整排的neuron(LSTM),这些LSTM里面的memory都存了一个值,把所有的值接起来就变成了vector,写为 c t − 1 ( \mathrm{c}^{\mathrm{t}-1}\left(\right. ct−1( 一个值就代表一个 dimension)。 现在在时间点 t \mathrm{t} t, input − - − 个vector x t \mathrm{x}^{\mathrm{t}} xt ,这个vector首先会乘上一matrix(一个linear transform变成一个vector z,z这个vector的dimension就代表了操控每一个LSTM的input(z这个dimension正好就是LSTM memory cell的数目)。z的第一维就丢给第一个cell(以此类推)
这个xt会乘上另外的一个transform得到 z i z^i zi,然后这个zi的dimension也跟cell的数目一样,zi的每一个dimension都会去操控input gate(forget gate 跟output gate也都是一样,这里就不在赘述)。所以把 x t x^t xt乘以四个不同的transform得到四个不同的vector,四个vector的dimension跟cell的数目一样,这四个vector合起来就会去操控这些memory cell运作。