一、RNN的作用和粗略介绍:
RNN可解决的问题:
训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN/CNN进行训练。
T个时间步:
我们先来看单个RNN cell:
简单的RNN前向传播实现过程:
以上代码实现:
import numpy as np # 定义RNN的参数。 X = [1,2] state = [0.0, 0.0] w_cell_state = np.asarray([[0.1, 0.2], [0.3, 0.4]]) w_cell_input = np.asarray([0.5, 0.6]) b_cell = np.asarray([0.1, -0.1]) w_output = np.asarray([[1.0], [2.0]]) b_output = 0.1 # 执行前向传播过程。 for i in range(len(X)): before_activation = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell state = np.tanh(before_activation) final_output = np.dot(state, w_output) + b_output print ("before activation: ", before_activation) print ("state: ", state) print ("output: ", final_output)
二、RNN模型:
上图中左边是RNN模型没有按时间展开的图,如果按时间序列展开,则是上图中的右边部分。我们重点观察右边部分的图。
这幅图描述了在序列索引号附近RNN的模型。其中:
1)t+1
时训练样本的输入。
2)h(t)
代表在序列索引号 h(t)
由h(t−1)
共同决定。
3)o(t)
代表在序列索引号 o(t)
只由模型当前的隐藏状态决定。
4)L(t)
代表在序列索引号 时模型的损失函数。
5)y(t)
代表在序列索引号 时训练样本序列的真实输出。
6)U,W,V
这三个矩阵是我们的模型的线性关系参数,它在整个RNN网络中是共享的,这点和DNN很不相同。 也正因为是共享了,它体现了RNN的模型的“循环反馈”的思想。
三、 RNN前向传播算法
- 对于任意一个序列索引号 t
,我们隐藏状态x(t)
和得到:
- )
- 其中为线性关系的偏倚。
- 序列索引号t
时模型的输出的表达式比较简单:
- c
-
在最终在序列索引号预测输出为:
- )
- 通常由于RNN是识别类的分类模型,所以上面这个激活函数一般是softmax。
- 通过损失函数的差距。
四、RNN反向传播算法推导
RNN反向传播算法的思路和DNN是一样的,即通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数。
BPTT(back-propagation through time)。
参数共享的,反向传播时我们更新的是相同的参数。
为了简化描述,这里的损失函数我们为对数损失函数,输出的激活函数为softmax函数,隐藏层的激活函数为tanh函数。
(1)对于RNN,由于我们在序列的每个位置 t 都有损失函数,因此最终的损失为:
(2)其中 的梯度计算是比较简单的:注意:这里 o(t) = ^y(t),没有激活函数。
(3)的梯度计算比较复杂:
从RNN的模型可以看出,在反向传播时,在某一序列位置t的梯度损失由当前位置的输出对应的梯度损失和序列索引位置隐藏状态的梯度为:
各个参数的更新式子:
五、RNN的应用:
(1)多对多【输入输出个数相同】
(2)多对一
(3)一对多:
只在序列中开始进行输入计算。
或者:
摘自:https://www.cnblogs.com/pinard/p/6509630.html
relu + rNN论文: Improving performance of recurrent neural network with relu nonlinearity
https://blog.csdn.net/qq_32284189/article/details/82225121
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:序列模型(2)—–循环神经网络RNN - Python技术站