循环神经网络
一、功能简介
循环神经网络(Recurrent Neural Neural Networks, RNN),是一种反馈网络。它可以有效处理序列特性的数据,能够挖掘数据中的时序信息以及语义信息。常用于语言识别、机器翻译、视频分析、生成图像描述的等。RNN主要用于时序类数据的处理,在文档分类、机器翻译、文本情感分析、文本预测等有着重要作用。
二、基本原理
RNN基本网络结构包括一个输入层,一个输出层,一个隐藏层和一个输出层。我们定义
X
t
X_t
Xt表示
t
t
t时刻的输入,
o
t
o_t
ot表示
t
t
t时刻的输出,
S
t
S_t
St表示
t
t
t时刻的记忆。因为我们当前时刻的输出是由记忆和当前时刻的输入决定的,因此我们可以定义RNN的基本原理,即隐藏层当前时刻的值
S
t
S_t
St不仅取决于这次的输入
X
t
X_t
Xt,也取决于上一时刻隐藏层的值
S
t
−
1
S_{t-1}
St−1。用公式表示如下。
提供给下一时刻的记忆:
S
t
=
σ
1
(
U
∗
X
t
+
W
∗
S
t
−
1
+
b
)
S_t=\sigma_{1}(U*X_t+W*S_{t-1}+b)
St=σ1(U∗Xt+W∗St−1+b)
当前时刻的输出:
o
t
=
σ
2
(
V
∗
S
t
+
c
)
o_t=\sigma_2(V*S_t+c)
ot=σ2(V∗St+c)
其中
σ
(
)
\sigma()
σ()是两个激活函数。
b
b
b和
c
c
c是两组偏置。而在整个模型中,网络中的每一个cell样本都共享了一组权重参数
(
U
,
V
,
W
)
(U,V,W)
(U,V,W) 。
三、输入格式
在官方文档中,RNN的输入格式是
(
s
e
q
_
l
e
n
,
b
a
t
c
h
_
s
i
z
e
,
i
n
p
u
t
_
s
i
z
e
)
(seq\_{len},batch\_size,input\_{size})
(seq_len,batch_size,input_size),即输入时一个三维向量。第一个维度表示序列长度,也就是按时间序列展开每个样本有多少个可见的cell。第三维input_size,表示每个时间步输入的x的特征维数,即输入的特征向量的长度。但是在实际应用中,我们常常会遇到一系列样本中每个序列长度不一致的情况,也就是seq_len不一致的情况。比如我们对电影评论进行情感分析时,不可能每个评论的长度都一样,这种情况下我们常常可以对输入序列进行处理,比如对长序列进行截断,对短序列在其之前进行字符补全,使得样本中序列长度一致。此外,我们也可以使用pad_sequence的方式,也就是使用滑动窗口对样本重新采样,使得batch中的样本等长。
四、输出格式
RNN的输出有三项分别为
o
u
t
p
u
t
,
h
n
,
c
n
output,h_n,c_n
output,hn,cn。output是RNN最后一层神经网络的输出,维数为
(
s
e
q
_
l
e
n
,
b
a
t
c
h
_
s
i
z
e
,
p
r
o
j
_
s
i
z
e
)
(seq\_len,batch\_size,proj\_size)
(seq_len,batch_size,proj_size),前两项的大小和输入中一致。第三项是最后一层输出通过变换(比如softmax)得到的满足实际项目需要的输出大小。
h
n
h_n
hn是所有层中每个时间步
o
i
o_i
oi的输出,大小为
(
n
u
m
_
l
a
y
e
r
s
,
b
a
t
c
h
_
s
i
z
e
,
p
r
o
j
_
s
i
z
e
)
(num\_layers,batch\_size,proj\_size)
(num_layers,batch_size,proj_size),参数大小同上,
n
u
m
_
l
a
y
e
r
s
num\_layers
num_layers是隐藏层的个数。
c
n
c_n
cn是所有层中每个时间步
S
i
S_i
Si的输出,参数意义同上。RNN的结构如图所示: