图解 RNN 背后的数学原理
0引言
这篇文章的目的是对循环神经网络的功能、结构提供一个直观的认识。
一个神经网络通常取自变量
但如果数据的顺序很重要呢?想象一下,如果所有自变量的顺序都很重要呢?
让我来直观地解释一下吧。
只要假设每个蚂蚁是一个独立变量,如果一个蚂蚁朝着不同的方向前进,对其他蚂蚁来说都没关系,对吧?但是,如果蚂蚁的顺序很重要怎么办?
此时,如果一只蚂蚁错过或者离开了群体,它将会影响到后面的蚂蚁。
那么,在机器学习空间中,哪些数据的顺序是重要的呢?
-
自然语言数据的词序问题 -
语音数据 -
时间序列数据 -
视频/音乐序列数据 -
股市数据 -
等等
那么 RNN 是如何解决整体顺序很重要的数据呢?我们用自然文本数据为例来解释 RNN。
假设我正在对一部电影的用户评论进行情感分析。
从这部电影好
(This movie is good) — 正面的,再到这部电影差
(This movie is bad) — 负面的。
我们可以通过使用简单的词汇袋模型对它们进行分类,我们可以预测(正面的或负面的),但是等等。
如果影评是这部电影不好
(This movie is not good),怎么办?
BOW 模型可能会说这是一个积极的信号,但实际上并非如此。而 RNN 理解它,并预测它是消极的信息。
1RNN 如何做到的呢?
1各类 RNN 模型
1、一对多
RNN 接受一个输入,比如一张图像,并生成一个单词序列。
2、多对一
RNN 接受一个单词序列作为输入,并生成一个输出。
3、多对多
接下来,我们正专注于第二种模式多对一
。RNN 的输入被视为时间步长。
示例: 输入(X) = [" this ", " movie ", " is ", " good "]
this
的时间戳是 x(0),movie
的是 x(1),is
的是 x(2),good
的是 x(3)。
2网络架构及数学公式
下面让我们深入到 RNN 的数学世界。
首先,让我们了解 RNN 单元格包含什么!我希望并且假设大家知道前馈神经网络,FFNN 的概括,
在前馈神经网络中,我们有 X(输入)、H(隐藏)和 Y(输出)。我们可以有任意多的隐藏层,但是每个隐藏层的权值 W 和每个神经元对应的输入权值是不同的。
上面,我们有权值 Wy10 和 Wy11,分别对应于两个不同的层相对于输出 Y 的权值,而 Wh00、Wh01 等代表了不同神经元相对于输入的不同权值。
由于存在时间步长,神经网络单元包含一组前馈神经网络。该神经网络具有顺序输入、顺序输出、多时间步长和多隐藏层的特点。
与 FFNN 不同的是,这里我们不仅从输入值计算隐藏层值,还从之前的时间步长值计算隐藏层值。对于时间步长,隐藏层的权值(W)是相同的。下面展示的是 RNN 以及它涉及的数学公式的完整图片。
在图片中,我们正在计算隐藏层的时间步长 t 的值:
上面我们只计算了 Ht,类似地,我们可以计算所有其他的时间步长。
步骤:
-
1、从
-
2、由
-
3、从
-
4、由
需要注意的是:
-
1、
-
2、我们甚至可以先计算隐藏层(所有时间步长),然后计算
-
3、权重向量一开始是随机的。
一旦前馈输入完成,我们就需要计算误差并使用反向传播法来反向传播误差,我们使用交叉熵作为代价函数。
2BPTT(时间反向传播)
如果你知道正常的神经网络是如何工作的,剩下的就很简单了,如果不清楚,可以参考本号前面关于人工神经网络的文章。
我们需要计算下面各项,
-
1、相对于输出 (隐藏和输出单元)的总误差如何变化? -
2、相对于权重 (U, V, W)的输出如何变化?
因为 W 对于所有的时间步长都是一样的,我们需要返回到前面,来进行更新。
记住 RNN 的反向传播和人工神经网络的反向传播是一样的,但是这里的当前时间步长是基于之前的时间步长计算的,所以我们必须从头到尾遍历来回。
如果我们运用链式法则,就像这样
在所有时间步长上的 W 都相同,因此按链式法则展开项越来越多。
在 Richard Sochers 的循环神经网络讲座幻灯片[1]中,可以看到一种类似但不同的计算公式的方法。
-
类似但更简洁的 RNN 公式:
-
总误差是各时间步长 t 对应误差的总和:
-
链式法则的应用:
所以这里,
2回到实例
现在我们回过头来谈谈我们的情感分析问题,这里有一个 RNN,
我们给每个单词提供一个词向量或者一个热编码向量作为输入,并进行前馈和 BPTT,一旦训练完成,我们就可以给出新的文本来进行预测。它会学到一些东西,比如不+积极的词 = 消极的
。
RNN 的问题 → 消失/爆炸梯度问题
由于 W 对于所有的时间步长都是一样的,在反向传播过程中,当我们回去调整权重时,信号会变得要么太弱要么太强,从而导致要么消失要么爆炸的问题。为了避免这种情况,我们使用 GRU 或 LSTM,将在后续文章中介绍。
⟳参考资料⟲
Richard Sochers 的循环神经网络讲座幻灯片: http://cs224d.stanford.edu/lectures/CS224d-Lecture7.pdf
[2]英文链接: https://medium.com/towards-artificial-intelligence/a-brief-summary-of-maths-behind-rnn-recurrent-neural-networks-b71bbc183ff
本文分享自微信公众号 - 机器学习与数学(Mathinside2016)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Hibernate ORM 5.4.20 版本发布
近日,Hibernate ORM 5.4.20 版本发布,主要修复和改进如下: 缺陷 [HHH-13974] - 忽略通过SessionBuilder#flushMode()设置的 FlushMode [HHH-14109] - 修复参数在两个数字与in表达式限制时IN子句参数填充不生效的问题; [HHH-14124] - 修复实体 (fetch graph)无法正确应用于第一个查询结果之外的查询结果的问题; [HHH-14129] - 修复采用 @NotNull 注入时双向关系保存失败的问题; 任务 [HHH-14033] - SQL 脚本有多行注释时的解析问题 [HHH-14126] - 添加 CockroachDB 到DefaultDialectSelector 并更新对应的文档及方言 [HHH-14143] - 新增检测LogicalConnectionManagedImpl的非法并发使用 [HHH-14144] - 显式地为构件和测试套件设置本地化断言 改进 [HHH-14133] - 修复用户指南中“二级缓存”示例代码错误的问题 [HHH-14137] - 改进空字符串检查...
- 下一篇
花十分钟的时间武装你的代码库
当我们的代码库有很多人维护时,经常会出现代码风格不一致或者代码质量不过关,提交信息杂乱的情况,当然啦,即使是一个人的代码库,有的时候,自己写代码时不太注意细节,也会出现风格不一致的情况。 本文正是为了解决这个问题而生,阅读本篇文章并不需要很长时间,如果你的代码库还没有进行这些配置,正是你大展身手的好时机,武装一下你的代码库。 1. 规范 commit 信息 首先,看下 angular 的代码库的 commit 记录,如图: 我们可以利用 commitizen 和 husky 来规范代码库的 commit。 安装以下依赖: npminstall@commitlint/cli@commitlint/config-conventionalhusky-D 如果你还没有安装过 commitizen,那么先全局安装: npminstallcommitizen-g 在 package.json 中增加 husky 字段。 {"husky":{"hooks":{"commit-msg":"commitlint-EHUSKY_GIT_PARAMS"}},} husky 是 git hook 工具,使用 ...
相关文章
文章评论
共有0条评论来说两句吧...