RNN,LSTM算法图解

RNN的工作原理:

RNN可以被认为是一种有记忆力的neural network。在RNN里面,每一次hidden layer的neuron产生output的时候,这个output会被存到memory里面。当下次又有input的时候,需要和上一次的memory结合起来使用。对它来说除了\(x_1,x_2\)以外,这些存在memory里的值\(a_1,a_2\)也会影响它的output。

image-20200226154228719

如上图所示, 用Recurrent Neural Network处理slot filling这件事,就像是这样,使用者说:“arrive Taipei on November 2nd”,arrive就变成了一个vector丢到neural network里面去,neural network的hidden layer的output写成\(a^1\)(\(a^1\)是一排neural的output,是一个vector),\(a^1\)产生\(y^1\),\(y^1\)就是“arrive”属于每一个slot filling的几率。接下来\(a^1\)会被存到memory里面去,"Taipei会变为input",这个hidden layer会同时考虑“Taipei”这个input和存在memory里面的\(a^1\),得到\(a^2\),根据\(a^2\)得到\(y^2\)\(y^2\)是属于每一个slot filling的几率。以此类推(\(a^3\)得到\(y^2\))。

通过这样的方式,RNN就有了推断一句话意思的能力,他不仅仅看到了taibei这个词,也记住了arrive这个词,就可以做自动化做更多的事情。

LSTM的网络架构:

image-20200226154152676

LSTM的网络架构,相比之下复杂了很多,有四个input,一个output,这构成了这个神经网络。分别是一个是想要存进memory的值,input-gate, forget-gate, output-gate,以及output。这个值输出,那么必须保证input_gate打开,forget_gate不会忘掉,且output_gate开启,而这三个值都会由neural network学到是1还是0.

我们看一下下面这个已经赋值好的权重的神经网络的输入和输出情况。

image-20200226174241356

input的三维vector乘以linear transform以后所得到的结果(\(x_1\),\(x_2\),\(x_3\)乘以权重再加上bias),这些权重和bias是哪些值是通过train data用GD学到的。 假设我已经知道这些值是多少了,那用这样的输入会得到什么样的输出。那我们就实际的运算一下。其中绿色的就是bias,

在实际运算之前,我们先根据它的input,参数分析下可能会得到的结果。底下这个外界传入的cell,\(x_1\)乘以1,其他的vector乘以0,所以就直接把\(x_1\)当做输入。在input gate时,\(x_2\)乘以100,bias乘以-10(假设\(x_2\)是没有值的话,通常input gate是关闭的(bias等于-10)因为-10通过sigmoid函数之后会接近0,所以就代表是关闭的,若\(x_2\)的值大于1的话,结果会是一个正值,代表input gate会被打开) 。forget gate通常会被打开的,因为他的bias等于10(它平常会一直记得东西),只有当\(x_2\)的值为一个很大的负值时,才会把forget gate关起来。output gate平常是被关闭的,因为bias是一个很大的负值,若\(x_3\)有一个很大的正值的话,压过bias把output打开。

LSTM的原理:

image-20200226174701864

现在的input \(x_1,x_2\)会乘以不同的weight当做LSTM不同的输入假设我们这个hidden layer只有两个neuron,但实际上是有很多的neuron。input\(x_1,x_2\)会乘以不同的weight会去操控output gate,乘以不同的weight操控input gate,乘以不同的weight当做底下的input,乘以不同的weight当做forget gate。第二个LSTM也是一样的。所以LSTM是有四个input跟一个output,对于LSTM来说,这四个input是不一样的。在原来的neural network里是一个input一个output。在LSTM里面它需要四个input,它才能产生一个output。

LSTM的最终形态:

image-20200226174805623

其代码实现如下:

#single lstm cell
def lstm_cell(batch_dataset, prev_activation_matrix, prev_cell_matrix, parameters):
#get parameters
fgw = parameters['fgw']
igw = parameters['igw']
ogw = parameters['ogw']
ggw = parameters['ggw']

#concat batch data and prev_activation matrix
concat_dataset = np.concatenate((batch_dataset,prev_activation_matrix),axis=1)

#forget gate activations
fa = np.matmul(concat_dataset,fgw)
fa = sigmoid(fa)

#input gate activations
ia = np.matmul(concat_dataset,igw)
ia = sigmoid(ia)

#output gate activations
oa = np.matmul(concat_dataset,ogw)
oa = sigmoid(oa)

#gate gate activations
ga = np.matmul(concat_dataset,ggw)
ga = tanh_activation(ga)

#new cell memory matrix
cell_memory_matrix = np.multiply(fa,prev_cell_matrix) + np.multiply(ia,ga)

#current activation matrix
activation_matrix = np.multiply(oa, tanh_activation(cell_memory_matrix))

#lets store the activations to be used in back prop
lstm_activations = dict()
lstm_activations['fa'] = fa
lstm_activations['ia'] = ia
lstm_activations['oa'] = oa
lstm_activations['ga'] = ga

return lstm_activations,cell_memory_matrix,activation_matrix
def output_cell(activation_matrix,parameters):
#get hidden to output parameters
how = parameters['how']

#get outputs
output_matrix = np.matmul(activation_matrix,how)
output_matrix = softmax(output_matrix)

return output_matrix

主要参考了台大李宏毅老师的youtube视频课程。


   转载规则


《RNN,LSTM算法图解》 胡哲 采用 知识共享署名 4.0 国际许可协议 进行许可。