1. RNN定义
RNN是处理时序问题的重要工具。对于一个xxx,与一个UUU计算后得到一个hhh,这个hhh与VVV计算后得到输出ooo,hhh与WWW计算后的结果返回到hhh的输入,由此形成了一个循环,这就是循环神经网络;
2. RNN参数更新方式
假设一个输入序列xxx=x1,x2,...,xn{x_1,x_2,...,x_n}x1,x2,...,xn,网络展开后看作一个nnn层的前馈神经网络,第ttt层对应者时刻ttt的状态。记第ttt层的输入状态、隐藏状态和输出状态分别为xtx_txt,hth_tht,oto_tot,训练时的输出为yty_tyt,则有如下计算过程:
(1)隐藏状态
隐藏状态hth_tht由当前时刻的输入状态xtx_txt和上一时刻的隐藏状态hth_tht共同决定:
hth_tht=σ(Uxt+Wht−1+b)\sigma({Ux_t}+{Wh_{t-1}}+b)σ(Uxt+Wht−1+b)
其中UUU是输入层到隐藏层之间的权重矩阵,WWW是不同时刻的隐藏层之间的权重矩阵,bbb是偏置向量,σ\sigmaσ是激活函数,此处通常使用tanh(x)tanh(x)tanh(x);
(2)输出状态
输出状态oto_tot的计算公式:
oto_tot = g(Vht+c)g(Vh_t+c)g(Vht+c)
其中VVV是隐藏层到输出层之间的权重矩阵,ccc是偏置向量,ggg是激活函数,在输出层通常使用softmaxsoftmaxsoftmax;
(3)训练时的状态
在训练时,网络在整个序列上的损失函数可以如下定义:
LLL=∑tLt\sum_{t}L_t∑tLt = ∑tLoss(ot,yt)\sum_{t}Loss(o_t,y_t)∑tLoss(ot,yt)
其中LtL_tLt为ttt时刻的损失,Loss(,)Loss(,)Loss(,)为损失函数,通常使用交叉熵损失函数,交叉熵损失函数由信息熵计算而来,信息熵的定义如下:
H(p,q)H(p,q)H(p,q)=−∑i=1np(xi)log(p(xi))-\sum_{i=1}^{n}p(x_i)log(p(x_i))−∑i=1np(xi)log(p(xi))
其中p(xi)p(x_i)p(xi)为iii时刻的概率,可以看到这个值越大,事物越不稳定
交叉熵损失函数:
LLL=−[ylogy^+(1−y)log(1−(^y))]-[ylog\hat{y}+(1-y)log(1-\hat(y))]−[ylogy^+(1−y)log(1−(^y))]
通过观察RNN的计算过程,可以发现整个过程在反复共享UUU,VVV,WWW这三个权重矩阵,所有循环的参数也被反复使用,这样可以极大的减少参数量,并且可以根据序列时间步的不一样处理不同长度的序列。
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