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

阅读大概需要8分钟

跟随小博主,每天进步一丢丢

作者 刘博

链接 https://zhuanlan.zhihu.com/p/32755043

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

导读

目录

  1. 我们需要一个用于处理序列的神经网络

  2. 什么是循环神经网络(RNN)

  3. 理解循环神经元(Recurrent Neuron)的细节

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

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

用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个时间步,那么网络展开后将变得非常巨大(这是个挑战性的问题,我们后面讲介绍如何克服)。

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

每日托福单词

inclined adj.趋向于...的  v. 使...倾向(incline的过去式)

synthetic adj.综合的;合成的,人造的  n.合成物

excusable adj.可原谅的;可辩解的;可免除的

prohibit vt.阻止,禁止

recipe n.食谱;处方;秘诀

优质公众号推荐

公众号名称:痴海

简介:只要把握风口,猪也能飞起来。如今时代编程风口「Python」,值得每个人关注。痴海,一个专注于 Python 编程,每天定时推送各种 Python 干货文章。但这不仅仅是一个技术公众号,每周还会分享职场、人生、认知原创文章

推荐阅读:

精彩知识回顾

深度学习之激活函数详解

谈谈我在自然语言处理入门的一些个人拙见

中心极限定理通俗介绍

深度学习之RNN、LSTM及正向反向传播原理

TreeLSTM Sentiment Classification

一分钟搞懂的算法之BPE算法

基于attention的seq2seq机器翻译实践详解

【干货】基于注意力机制的seq2seq网络


欢迎关注深度学习自然语言处理公众号,我会每天更新自己在机器学习深度学习NLPlinuxpython以及各种数学知识学习的一点一滴!再小的人也有自己的品牌!期待和你一起进步!

长按识别二维码

点个赞呗

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
循环神经网络(RNN)是一种能够处理序列数据的人工神经网络。相比于传统神经网络而言,RNN具有记忆性,能够利用之前的计算结果来影响后续的计算。这一特性为RNN在语音识别、自然语言处理、机器翻译等领域的应用提供了更多的可能性。 MATLAB是一种强大的工具,特别适合用于计算机科学和工程的数值计算、数据分析和可视化。在RNN的应用中,MATLAB提供了丰富的工具和函数库,使得对RNN的相关研究更加方便和高效。 针对循环神经网络(RNN)与MATLAB程序详解的视频内容,首先介绍了RNN如何应用于序列数据处理,并详细讲解了RNN的基本结构、前向传播和反向传播算法原理。其次,视频详细讲解了如何在MATLAB中搭建RNN,并介绍了相关工具和函数库的使用方法和技巧,包括如何定义网络结构,如何初始化权重,如何设置损失函数,如何进行训练和预测等方面。最后,视频还提供了一些实际应用案例,具体展示了RNN在文本分类、图像识别和语音合成等领域的应用实践,让观众更加深入地了解该技术的实用性和潜力。 总之,循环神经网络(RNN)与MATLAB程序详解视频内容详尽,既提供了理论知识的讲解,也提供了实践技巧和应用案例,对于有兴趣了解和应用RNN的计算机科学和工程领域从业者和学者来说,具有较高的参考价值和启发作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值