1、简介
RNN主要用来处理序列数据,在传统的神经网络模型中,是从输入层到隐含层再到输出层,每层内的节点之间无连接,循环神经网络中一个当前神经元的输出与前面的输出也有关,网络会对前面的信息进行记忆并应用于当前神经元的计算中,隐藏层之间的节点是有连接的,并且隐藏层的输入不仅包含输入层的输出还包含上一时刻隐藏层的输出。理论上,RNN可以对任意长度的序列数据进行处理。
2、模型
一个经典的RNN网络:
RNN采用参数共享的机制,在时间维度上共享权重U、V、W一个简单的前向传播过程入下图所示:
h
t
h_t
ht是t时刻隐藏层的值,
y
t
y_t
yt是t时刻输出层的值,也就是最终的标签,其中参数
w
h
h
w_{hh}
whh 、
w
x
h
w_{xh}
wxh、
w
h
y
w_{hy}
why是需要通过训练学习到的参数。
通常我们这样定义一个RNN模型:
x
x
x是输入,
h
h
h是隐层单元,
o
o
o为输出,
L
L
L为损失函数,
y
y
y为训练集的标签。下标
t
t
t代表
t
t
t时刻的状态,其中需要注意的是,隐藏单元
h
h
h在
t
t
t时刻的表现不仅由此刻的输入决定,还受
t
t
t时刻之前时刻的影响。
V
V
V、
W
W
W、
U
U
U是权值。
h
t
=
ϕ
(
U
x
i
+
W
h
t
−
1
+
b
)
h_t=\phi(Ux_i+Wh_{t-1}+b)
ht=ϕ(Uxi+Wht−1+b)
ϕ
\phi
ϕ是激活函数,一般为
t
a
n
h
tanh
tanh函数,
b
b
b是偏置。
t
t
t时刻的输出为:(
c
c
c是偏置)
o
t
=
V
h
t
+
c
o_t=Vh_t+c
ot=Vht+c
模型的输出:
y
^
t
=
σ
(
o
t
)
\hat y_t=\sigma(o_t)
y^t=σ(ot)这里
σ
\sigma
σ是激活函数,通常RNN用于分类,所以常为softmax函数。
3、训练
RNN使用反向传播梯度下降法更新权重。
上图的损失函数的定义针对机器翻译,不同的任务,损失函数的设定不同。
由上图可知,对于较大程度的序列,使用RNN的训练过程容易出现梯度消失的现象。因为求到的偏导数本身就是一个比较小的值,较长的链式求导,易导致梯度几乎为0,导致系统误差仍是一个较大的值,最终导致训练失败。对于较长的序列,我们通常使用LSTM模型。
参考:
[1]赵卫东《机器学习》