上一节详细介绍了RNN的网络结构和前向传播,但在了解RNN结构后,如何训练RNN是关键问题,训练模型就是更新模型的参数,即如何进行反向传播,如何推导参数本文详细介绍了RNN的反向传播算法BPTT。
首先,让我们用动态图来表示RNN的损失是如何发生的,以及如何反向传播。 如下图所示。
上面的两幅照片详细说明了损失是如何发生的,以及如何推导参数。 这是一个无视细节的RNN反向传播过程,我认为已经说明的非常清楚。 下图(trask )显示了RNN的详细结构中的反向传播过程。
如果有明确的反向传播过程,接下来就需要理论上坚持下去。 符号很多,为了不混淆,根据下图,现在的符号如表所示。
公式符号符号的含义
输入向量的大小。 one-hot的长度也是词典大小
输入的每个序列的长度
隐层神经元的数量
样品收藏
第一时刻的输入
第一时刻通过Softmax层的输出。
在第一时间输入样本的真实标签
第一时刻的损失函数使用交叉熵函数,
对应于序列的损耗函数:
因为RNN的反向传播需要在每次处理样本时更新参数,所以在执行序列之后,总损耗函数是目前获得的损耗之和。
第一个时间RNN隐藏层的输入。
第t个时刻RNN隐藏层的输出。
输入输出层,即输入Softmax函数
输入层和隐藏层之间的权重。
上一个隐藏图层和当前隐藏图层之间的权重。
隐藏层和输出层之间的权重。
我们寻求参数的引导很方便,只有与各时刻输出对应的损失和关联才能直接寻求引导。 即,如下所示。
更新参数并不容易。 参数是共享的,但不仅有助于最初刻出的输出,还有助于输入非显示时刻,因此在导出参数时,需要从后面一步一步地进行引导。
假设我们导出了时间的参数,利用连锁法则可以知道以下内容。
我们发现在寻求指导的时候,都需要先寻求,所以我们要:
那么,现在开始需要的是。
注:在求解激活函数的导数时,先对已知部分进行导数,再对其和激活函数的导数部分进行哈达玛乘积。 激活函数的导数一般是与前面的进行哈达玛积,这里的激活函数是双曲正切的,用矩阵中的对角线元素表示向量中各值的导数可以去除哈达玛积,变换为矩阵乘法。
如果是:
我们可以求出,然后返回第一个参数的指导。 因此,有以下情况:
有了各参数导数,就可以进行参数更新。
参考:
刘建平《循环神经网络(RNN)模型与前向反向传播算法》
时尚红牛老师《深度学习》