手把手教你训练 RNN

本文为雷锋字幕组编译的技术博客,原标题 Step-by-step walkthrough of RNN Training - Part I,作者为 Eniola Alese。 翻译 | 赵朋飞 程思婕 整理 | 凡江

RNN 前向传播逐步演练

单个 RNN Cell 中的前向传播算法

在之前的文章中,我们介绍了 RNN 的基本结构并将其按时间序列展开成 Cells 循环链,称为 RNN cells。下面,我们将揭示单个 RNN Cell 的内部结构和前向传播计算过程。

将其过程分解成多个步骤:

第一步:cell 接受两个输入:x⟨t⟩ 和 a⟨t-1⟩。

第二步:接下来,计算矩阵乘积 ⨂,W_xh 乘 x⟨t⟩,W_ah 乘 a⟨t-1⟩。然后,通过将以上两项乘积相加,并加上偏置 b_h,计算得出 h⟨t⟩。

第三步:紧接着上面的步骤,将 h(t) 传给激活函数(比如 tanh 或 relu)计算 a(t)。本例中激活函数使用 tanh 函数。

第四步: cell 输出 a⟨t⟩ 并将其传给下一 cell 做进一步计算。

第五步:然后,计算 o⟨t⟩; 这是所有输出可能取值的非标准化对数概率。方法是计算矩阵乘积⨂,W_ao 乘 a⟨t⟩,并与 b_o 相加。

第六步:最后,通过将 o⟨t⟩ 传输给激活函数(例如 sigmoid 或 softmax),得到了一个实际输出的标准化概率向量 ŷ⟨t⟩。输出的激活函数的选择通常取决于期望的输出类型(sigmoid 用于二元输出,softmax 用于多类别输出)。

前向传播算法

前向传播算法在整个 RNN 网络中运行以上步骤,而不仅仅在单个 RNN cell 中运行。从隐藏层状态 a⟨0⟩的初始化开始,在所有时间序列 t = 1 to T 中共享权值和偏置向量 W_xh,W_ah, W_ao, b_h, b_o,在每个时间序列中重复上面的每一步。

例如,如果我们拥有一个 8 个序列的输入 x⟨1⟩,x⟨2⟩,......x⟨8⟩,这个网络的前向传播计算过程是步骤 1-6 在循环中重复 8 次。

RNN 的反向传播是为了计算出关于损失函数的梯度值

单个 RNN 单元的反向传播

RNN 中反向传播的目的是计算出最终的损失值 L 分别对权值矩阵(W_xh,W_ah,W_ao)和偏置向量(b_h,b_o)的偏导数值。

推导出所需的导数值非常简单,我们只需要利用链式法则(https://en.wikipedia.org/wiki/Chain_rule)就能计算出它们。

第一步:为了计算代价,需要先定义损失函数。一般根据具体手中的任务来选择该损失函数。在这个例子里,对于多分类输出问题,我们采用交叉熵损失函数 L⟨t⟩,其具体计算过程如下:

第二步:接下来我们开始往后计算损失函数 L⟨t⟩ 对预测输出值的激活值 ŷ⟨t⟩ 的偏导数值。因为在前向传播过程中 softmax 函数以多分类的输出值作为输入,因此下面的偏导数值

的计算分为两种情况:分类 i 时和分类 k 时:

第三步:接着利用分类 i 时和分类 k 时的偏导数值

,可以计算出损失函数 L⟨t⟩ 对预测输出值 o⟨t⟩ 的偏导数值:

第四步:利用偏导数值

及链式法则,计算出损失函数 L⟨t⟩ 对输出过程中的偏置向量 b_o 的偏导数值:

第五步:利用偏导数值

及链式法则,计算出损失函数 L⟨t⟩ 对隐层至输出层中的权值矩阵 W_ao 的偏导数值:

第六步: 利用偏导数值

及链式法则,计算出损失函数 L⟨t⟩ 对隐状态的激活值 a⟨t⟩ 的偏导数值:

第七步: 利用偏导数值

及链式法则,计算出损失函数 L⟨t⟩ 对隐状态 h⟨t⟩ 的偏导数值:

第八步: 利用偏导数值

及链式法则,计算出损失函数 L⟨t⟩ 对隐状态的偏置向量 b_h 的偏导数值:

第九步:利用偏导数值

及链式法则,计算出损失函数 L⟨t⟩ 对输入层至隐层中的偏置矩阵 W_xh 的偏导数值:

第十步:利用偏导数值

及链式法则,计算出损失函数 L⟨t⟩ 对输入层至隐层中的偏置矩阵 W_ah 的偏导数值:

随时间反向传播(BPTT)

就像前文中提到的前向传播过程一样,将循环网络展开,BPTT 将沿此一直运行着上述步骤。

主要的区别在于我们必须将每个时间步 t 的偏导数值

累加起来,从而更新权值和偏置,这是因为这些参数在前向传播的过程中是被各个时间步所共享的。

总结

在本文的第一部分和第二部分中,我们了解了循环神经网络训练过程中所涉及到的前向传播和反向传播。接下来,我们将着眼于 RNN 中所存在的梯度消失问题,并讨论 LSTM 和 GRU 网络的进展。

博客原址:

Part I

https://medium.com/learn-love-ai/step-by-step-walkthrough-of-rnn-training-part-i-7aee5672dea3

Part II

https://medium.com/learn-love-ai/step-by-step-walkthrough-of-rnn-training-part-ii-7141084d274b

RNN 输入变长序列 padding

原文发布于微信公众号 - AI研习社(okweiwu)

原文发表时间:2018-05-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

手把手教你如何用 TensorFlow 实现 CNN

CNN 的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很...

781120
来自专栏云时之间

深度学习与TensorFlow:实现卷积神经网络

在上一篇文章,我们介绍了CNN的一些基本概念和lenet神经网络的架构,今天这一篇文章我们就模仿lenet网络去微调,使其符合mnist数据集的要求,并且达到我...

17540
来自专栏技术沉淀

02 Learning to Answer Yes/No

从最简单最基础的二分类问题出发,演示一个简单机器学习算法PLA的完整过程,见详细课件。

9620
来自专栏ArrayZoneYour的专栏

用Python从零开始构建反向传播算法

在本教程中,你将探索如何使用Python从零开始构建反向传播算法。

2K90
来自专栏漫漫深度学习路

两种交叉熵损失函数的异同

在学习机器学习的时候,我们会看到两个长的不一样的交叉熵损失函数。 假设我们现在有一个样本 {x,t},这两种损失函数分别是。 [图片] , t_j说明样本...

29490
来自专栏杨熹的专栏

什么是神经网络

本文结构: 什么是神经网络 什么是神经元 神经网络的计算和训练 代码实现 ---- 1. 什么是神经网络 神经网络就是按照一定规则将多个神经元连接起来的网络 例...

34750
来自专栏深度学习与计算机视觉

TensorFlow 图像处理和解码操作函数概述

TensorFlow提供提供了42个图像处理相关的函数,主要涉及解码编码,简单的图像几何变换等等。比较有特点的一个方面是有很多随机性的操作,主要增加模型的泛化能...

34550
来自专栏张洁的专栏

线性回归的高斯假设

在线性回归问题中,我们定义了损失函数,但是为什么用最小二乘(而不是三次方等)作为损失函数? 我们来尝试解决一个完整的线性回归问题。

70500
来自专栏量化投资与机器学习

深度学习Matlab工具箱代码注释之cnnff.m

%%========================================================================= %...

32360
来自专栏小鹏的专栏

机器学习模型训练时候tricks

1. 当训练集的效果(准确率)上不去,和贝叶斯估计(人的表现)存在一定差距的时候:(1)增加模型的复杂度。 或者直接多加几层。(2)现在目前效果非常好的一些模型...

22370

扫码关注云+社区

领取腾讯云代金券