详解循环神经网络RNN(实践篇)

阅读大概需要8分钟 跟随小博主,每天进步一丢丢

作者 刘博 链接 https://zhuanlan.zhihu.com/p/32755043

昨天的是理论篇,想看的小伙伴点击这里啦。

导读

用Excel实现循环神经元的前向传播

我们先来看看输入。

我们对输入进行one-hot编码。这是因为我们的整个词汇表只有四个字母{h,e,l,o}。

接下来我们将利用

把输入转换为隐藏状态,这里我们采取随机的方式将权重初始化为3x4的矩阵。

(注:这里矩阵的大小为什么是3x4?因为我们想计算

其中

是4x1的one-hot矩阵,根据矩阵乘法运算的法则,

大小必须是nx4,n一般取比4小的值,因此

的矩阵维度取3x4)

步骤1:

输入网络的第一个字母是“h”, 我们想要得到隐藏层状态,那么首先我们需要计算

。通过矩阵相乘,我们得到

步骤2:

现在我们看一下循环神经元, 权重

是一个1x1的矩阵,值为0.427043,偏差也是1x1的矩阵,值为0.56700.

对于字母“h”,没有前一个状态,所以我们也可以认为前一个状态是[0,0,0,0]。

接下来计算

(译者注:读者一定注意到了,1x1的矩阵与一个4x1的矩阵相乘再加上一个1x1的矩阵,根据矩阵乘法的规则,是无法运算的。因此这里应该是使用了矩阵广播运算,而得到的结果应该是4x1的矩阵,而不是3x1的矩阵,但是被强制转换为了3x1的矩阵,原因是步骤1的输出结果是3x1的矩阵,接下来的步骤3将计算步骤1和步骤2的相加,所以步骤2的输出必须是3x1)

步骤3:

Ok,有了前两步,我们就可以计算当前循环神经元的状态了,根据以下公式

将前两步的结果代入公式即可得到当前步的状态,计算如下

步骤4:

现在我们继续关注下一个字母“e”被传入网络。上一步计算得到的

现在变成了这一步的

,而e的one-hot向量是

.现在我们来计算以下这一步的

.

首先计算

再计算

(译者注:注意观察,计算上一步的状态与计算此步骤的状态使用的权重是一样的,也就是说使用的是同样的

,所以说循环神经元的特点是**权重共享)

步骤5:

有了步骤4的结果,代入公式可得输入字母“e”后的状态

同样,这一步得到的状态将变成下一步的

,而循环神经元将使用这个状态和新输入字母来计算下一个状态.

步骤6:

在每一个状态,循环神经元还会计算输出. 现在我们来计算一下字母e的输出

(译者注:注意,一个循环神经元根据输入和前一时间步的状态计算当前时间步的状态,然后根据当前时间步的状态计算输出。另外需要注意的是,这里的

的维度大小是4x3,这是因为我们想得到4x1的输出,因为one-hot的维度是4x1,而通过下一步的计算每一个维度可以代表该维度的字母出现的概率)

步骤7:

通过应用softmax函数,我们可以得到词汇表中一个特定字母的出现的概率,所以我们现在计算

我们来理解一下得到的概率值。我们看到,这个模型认为字母e后面将出现的字母是h,因为概率最高的是代表字母h的那一维。可是实际上下一个字母应该是l,我们哪里做错了吗?并没有,只是我们还没有训练我们的网络。

好,我们面对的下一个大问题就是:RNN网络中如何实现后向传播?如何通过反馈循环来升级我们的权重?

循环神经网络的后向传播(BPTT)

很难凭想象理解一个递归神经网络的权重是如何更新的。因此,为了理解和可视化反向传播,让我们按照时间步展开网络。在其中我们可以计算也可以不计算每一个时间步的输出。

在向前传播的情况下,输入随着每一个时间步前进。在反向传播的情况下,我们“回到过去”改变权重,因此我们叫它通过时间的反向传播(BPTT)。

如果

是预测值,

是对应的实际值,那么,误差通过交叉熵损失来计算:

我们通常把整个序列(单词)看作一个训练样本,所以总的误差是每个时间步(字符)中误差的和。权重在每一个时间步长是相同的(所以可以计算总误差后一起更新)。让我们总结一下反向传播的步骤。

  1. 首先使用预测输出和实际输出计算交叉熵误差
  2. 网络按照时间步完全展开
  3. 对于展开的网络,对于每一个实践步计算权重的梯度
  4. 因为对于所有时间步来说,权重都一样,所以对于所有的时间步,可以一起得到梯度(而不是像神经网络一样对不同的隐藏层得到不同的梯度)
  5. 随后对循环神经元的权重进行升级

展开的网络看起来像一个普通的神经网络。反向传播也类似于普通的神经网络,只不过我们一次得到所有时间步的梯度。我知道你在担心什么,现在如果有100个时间步,那么网络展开后将变得非常巨大(这是个挑战性的问题,我们后面讲介绍如何克服)。

如果你不想深入了解这背后的数学,所有你需要知道的是,按照时间步展开后的反向传播类似于常规神经网络的反向传播。

原文发布于微信公众号 - 深度学习自然语言处理(zenRRan)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机视觉战队

卷积神经网络就是这么简单就能学会

卷积神经网络和前几次介绍的神经网络非常相似:它们都是由神经元组成,神经元中有具有学习能力的权重和偏差。每个神经元都得到一些输入数据,进行内积运算后再进行激活函数...

14420
来自专栏YG小书屋

深度学习之Logistic Regression

24760
来自专栏杨熹的专栏

详解循环神经网络(Recurrent Neural Network)

今天的学习资料是这篇文章,写的非常详细,有理论有代码,本文是补充一些小细节,可以二者结合看效果更好: https://zybuluo.com/hanbingt...

55960
来自专栏老秦求学

【手把手系列之一】手写实现单层神经网络

训练集: \(X = [x^{(1)},x^{(2)},...,x^{(i)},....,x^{(m)}]\) ;对应标签:\(Y=[y^{(1)},y^{(2...

14420
来自专栏AI研习社

监督学习最常见的五种算法,你知道几个?

在机器学习中,无监督学习(Unsupervised learning)就是聚类,事先不知道样本的类别,通过某种办法,把相似的样本放在一起归位一类;而监督型学习(...

424110
来自专栏人工智能头条

北大、北理工、旷视联手:用于图像语义分割的金字塔注意力网络

22480
来自专栏WD学习记录

卷积神经网络 CNN

参数共享机制   在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即...

21530
来自专栏梦里茶室

读论文系列:Object Detection ECCV2016 SSD

转载请注明作者:梦里茶 Single Shot MultiBox Detector Introduction 一句话概括:SSD就是关于类别的多尺度RPN...

32760
来自专栏Python中文社区

机器学习算法实践:树回归

專 欄 ❈PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,...

44790
来自专栏marsggbo

DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络

介绍 DeepLearning课程总共五大章节,该系列笔记将按照课程安排进行记录。 另外第一章的前两周的课程在之前的Andrew Ng机器学习课程笔记(博...

24090

扫码关注云+社区

领取腾讯云代金券