1. RNN定义
RNN是处理时序问题的重要工具。对于一个 x x x,与一个 U U U计算后得到一个 h h h,这个 h h h与 V V V计算后得到输出 o o o, h h h与 W W W计算后的结果返回到 h h h的输入,由此形成了一个循环,这就是循环神经网络;
2. RNN参数更新方式
假设一个输入序列
x
x
x=
x
1
,
x
2
,
.
.
.
,
x
n
{x_1,x_2,...,x_n}
x1,x2,...,xn,网络展开后看作一个
n
n
n层的前馈神经网络,第
t
t
t层对应者时刻
t
t
t的状态。记第
t
t
t层的输入状态、隐藏状态和输出状态分别为
x
t
x_t
xt,
h
t
h_t
ht,
o
t
o_t
ot,训练时的输出为
y
t
y_t
yt,则有如下计算过程:
(1)隐藏状态
隐藏状态
h
t
h_t
ht由当前时刻的输入状态
x
t
x_t
xt和上一时刻的隐藏状态
h
t
h_t
ht共同决定:
h
t
h_t
ht=
σ
(
U
x
t
+
W
h
t
−
1
+
b
)
\sigma({Ux_t}+{Wh_{t-1}}+b)
σ(Uxt+Wht−1+b)
其中
U
U
U是输入层到隐藏层之间的权重矩阵,
W
W
W是不同时刻的隐藏层之间的权重矩阵,
b
b
b是偏置向量,
σ
\sigma
σ是激活函数,此处通常使用
t
a
n
h
(
x
)
tanh(x)
tanh(x);
(2)输出状态
输出状态
o
t
o_t
ot的计算公式:
o
t
o_t
ot =
g
(
V
h
t
+
c
)
g(Vh_t+c)
g(Vht+c)
其中
V
V
V是隐藏层到输出层之间的权重矩阵,
c
c
c是偏置向量,
g
g
g是激活函数,在输出层通常使用
s
o
f
t
m
a
x
softmax
softmax;
(3)训练时的状态
在训练时,网络在整个序列上的损失函数可以如下定义:
L
L
L=
∑
t
L
t
\sum_{t}L_t
∑tLt =
∑
t
L
o
s
s
(
o
t
,
y
t
)
\sum_{t}Loss(o_t,y_t)
∑tLoss(ot,yt)
其中
L
t
L_t
Lt为
t
t
t时刻的损失,
L
o
s
s
(
,
)
Loss(,)
Loss(,)为损失函数,通常使用交叉熵损失函数,交叉熵损失函数由信息熵计算而来,信息熵的定义如下:
H
(
p
,
q
)
H(p,q)
H(p,q)=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
-\sum_{i=1}^{n}p(x_i)log(p(x_i))
−∑i=1np(xi)log(p(xi))
其中
p
(
x
i
)
p(x_i)
p(xi)为
i
i
i时刻的概率,可以看到这个值越大,事物越不稳定
交叉熵损失函数:
L
L
L=
−
[
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
(
^
y
)
)
]
-[ylog\hat{y}+(1-y)log(1-\hat(y))]
−[ylogy^+(1−y)log(1−(^y))]
通过观察RNN的计算过程,可以发现整个过程在反复共享 U U U, V V V, W W W这三个权重矩阵,所有循环的参数也被反复使用,这样可以极大的减少参数量,并且可以根据序列时间步的不一样处理不同长度的序列。
3. RNN存在问题
RNN使用反向传播进行梯度下降。由于不同时刻的状态是相互依赖的,所以需要存储各个时刻的状态,这导致整个过程对内存的消耗很大,并且计算速度慢,同时,根据参数更新方式可知,位于序列后端的输入会异常大,如果激活函数得到的值小于1,则到了后面会有梯度消失,如果大于1,到了后面会有梯度爆炸,也把前面的信息给遗忘了。
如果你要转发或者引用,麻烦加上本文的链接。
转发:https://blog.csdn.net/weixin_45885232/article/details/124112359
引用:
RNN的网络结构和参数更新方式(2022-04-11)[EB\OL]https://blog.csdn.net/weixin_45885232/article/details/124112359