RNN循环神经网络入门

前置知识:BP神经网络、CNN卷积神经网络

网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。

RNN结构

RNN循环神经网络入门_第1张图片

X 表示输入,O 表示输出,St 表示t时刻存储的状态信息

W, U, V为权值矩阵,b为偏置值。

S_t=(h_t=)f(W*S_{t-1}+U*X_t+b) \\O_t=g(VS_t)

在t =1时刻,一般初始化输入S0=0,随机初始化W, U, V。

其中,f 和 g 均为激活函数。f 可以是tanh, relu, sigmoid等激活函数,通常取tanh;g 在二分类任务中常采用sigmoid,多酚类任务通常采用softmax。

W, U, V在每个时刻都是相等的(权重共享)

RNN训练方法

每一步的输出不仅仅依赖当前步的网络,并且还需要前若干步网络的状态,这种BP改版的算法叫做Backpropagation Through Time(BPTT) ,也就是将输出端的误差值反向传递,运用梯度下降法进行更新。

损失函数可以使用交叉熵损失函数也可以使用平方误差损失函数

E=\sum\limits_{t=1}^nE_t

整理可得:(注:此处ht=St)
\frac{\partial E_t}{\partial W} =\sum\limits^t_{k=0} \frac{\partial E_t}{\partial o_t} \frac{\partial o_t}{\partial h_t} (\prod\limits^t_{j=k+1} \frac{\partial h_j}{\partial h_{j-1}}) \frac{\partial h_k}{\partial W} \\ \frac{\partial E_t}{\partial U} =\sum\limits^t_{k=0} \frac{\partial E_t}{\partial o_t} \frac{\partial o_t}{\partial h_t} (\prod\limits^t_{j=k+1} \frac{\partial h_j}{\partial h_{j-1}}) \frac{\partial h_k}{\partial U} \\ \frac{\partial E_t}{\partial V} =\frac{\partial E_t}{\partial o_t} \frac{\partial o_t}{\partial V}

这里存在着一个连乘的函数,ht引入激活函数后有
h_t=tanh(U·X_t+W·h_{t-1}+b)

或者

h_t=sigmoid(U·X_t+W·h_{t-1}+b)

其中,

\prod\limits^t_{j=k+1} \frac{\partial h_j}{\partial h_{j-1}} =\prod\limits^t_{j=k+1}tanh'·W_s =\prod\limits^t_{j=k+1}sigmoid'·W_s

存在问题

梯度消失、梯度爆炸

RNN循环神经网络入门_第2张图片

这里的梯度消失主要指由于时间过长造成的记忆值较小的现象。

改进算法:LSTM、GRU

  • 对于梯度消失:有特殊的方式存储“记忆”,那么以前梯度比较大的”记忆”不会像简单的RNN一样马上被抹除。

  • 对于梯度爆炸:使用gradient clipping(梯度裁剪),即当计算的梯度超过阈值c或者小于阈值-c的时候,便把此时的梯度设置成c或-c。

你可能感兴趣的:(机器学习,rnn,人工智能,深度学习)