基本结构
如图所示,从图中可以看到输入 x, 隐含层,输出层等,这些与传统神经网络类似。自循环W却是它的一大特色。
其中U是输入层到隐含层的权重矩阵,W是状态到隐含层的权重矩阵,s为状态,V是隐含层到输出层的权重矩阵。
从图中可以看出,它的共享参数是各个时间节点对W, U,V都是不变的,这个机制就像卷积神经网络的过滤器机制一样,通过这个方法,实现参数共享,可以大大降低参数量。
隐含层结构
这个网络在每个时间t都有相同的网络结构。假设 输出的 x 是 n 维向量,隐含层的神经元个数是m,输出层的神经元个数为r个,则U的矩阵大小为 n x m维,W是上一次的at-1作为这一次输入的权重矩阵,大小为m×m维;V是连输出层的权重矩阵,大小为m×r维。而xt、at和ot都是向量。
各自的含义如下:
-xt:t时刻的输入
-at是t时刻的隐层状态。是网络记忆,at基于前一时刻的隐层状态和当前时刻的输入进行计算,即at=f(Uxt+Wat-1)。函数f通常是非线性的,如tanh或者ReLU。at-1为前一个时刻的隐藏状态,其初始化通常为0;
-ot是t时刻的输出,
at认为是网络的记忆状态,at可以捕获之前所有时刻发生的信息。输出ot的计算仅仅依赖于时刻t的记忆
前向传播
一般的神经网络采用前向传播和反向来更新,RNN基本思路也是一样的,便于理解,进行图例说明:
其中x为输入值,一般是向量,a为状态值,y为输出值或预测值,wax、waa、wya为参数矩阵。其前向传播可表示为:初始化状态a为
,然后计算状态及输出,具体如下:
随机设置一些数字实现一下:
import numpy as np
X = [2,3] # 输入值
state = [0.0,0.0] # 初始状态
w_cell_state = np.asarray([[0.1,0.2],[0.3,0.4],[0.5,0.6]]) # waa = [[0.1,0.2],[0.3,0.4]] wax = [0.5,0.6]
b_cell = np.asarray([0.2,-0.2]) # b
w_output = np.asarray([[1.0],[2.0]])
b_output = 0.1
for i in range(len(X)):
state = np.append(state,X[i])
before_activation = np.dot(state