语言模型

RNN是在自然语言处理领域中最先被用起来的,比如,RNN可以为语言模型来建模。那么,什么是语言模型呢?

我们可以和电脑玩一个游戏,我们写出一个句子前面的一些词,然后,让电脑帮我们写下接下来的一个词。比如下面这句:

我昨天上学迟到了,老师批评了____。

我们给电脑展示了这句话前面这些词,然后,让电脑写下接下来的一个词。在这个例子中,接下来的这个词最有可能是『我』,而不太可能是『小明』,甚至是『吃饭』。

语言模型就是这样的东西:给定一个一句话前面的部分,预测接下来最有可能的一个词是什么。

语言模型是对一种语言的特征进行建模,它有很多很多用处。比如在语音转文本(STT)的应用中,声学模型输出的结果,往往是若干个可能的候选词,这时候就需要语言模型来从这些候选词中选择一个最可能的。当然,它同样也可以用在图像到文本的识别中(OCR)。

使用RNN之前,语言模型主要是采用N-Gram。N可以是一个自然数,比如2或者3。它的含义是,假设一个词出现的概率只与前面N个词相关。我们以2-Gram为例。首先,对前面的一句话进行切词:

我 昨天 上学 迟到 了 ,老师 批评 了 ____。

如果用2-Gram进行建模,那么电脑在预测的时候,只会看到前面的『了』,然后,电脑会在语料库中,搜索『了』后面最可能的一个词。不管最后电脑选的是不是『我』,我们都知道这个模型是不靠谱的,因为『了』前面说了那么一大堆实际上是没有用到的。如果是3-Gram模型呢,会搜索『批评了』后面最可能的词,感觉上比2-Gram靠谱了不少,但还是远远不够的。因为这句话最关键的信息『我』,远在9个词之前!

现在读者可能会想,可以提升继续提升N的值呀,比如4-Gram、5-Gram.......。实际上,这个想法是没有实用性的。因为我们想处理任意长度的句子,N设为多少都不合适;另外,模型的大小和N的关系是指数级的,4-Gram模型就会占用海量的存储空间。

所以,该轮到RNN出场了,RNN理论上可以往前看(往后看)任意多个词。

循环神经网络是啥

循环神经网络种类繁多,我们先从最简单的基本循环神经网络开始吧。

基本循环神经网络

下图是一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:

纳尼?!相信第一次看到这个玩意的读者内心和我一样是崩溃的。因为循环神经网络实在是太难画出来了,网上所有大神们都不得不用了这种抽象艺术手法。不过,静下心来仔细看看的话,其实也是很好理解的。如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);U是输入层到隐藏层的权重矩阵(读者可以回到第三篇文章零基础入门深度学习(3) - 神经网络和反向传播算法,看看我们是怎样用矩阵来表示全连接神经网络的计算的);o也是一个向量,它表示输出层的值;V是隐藏层到输出层的权重矩阵。那么,现在我们来看看W是什么。循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。

如果我们把上面的图展开,循环神经网络也可以画成下面这个样子:

现在看上去就比较清楚了,这个网络在t时刻接收到输入之后,隐藏层的值是,输出值是。关键一点是,的值不仅仅取决于,还取决于。我们可以用下面的公式来表示循环神经网络的计算方法:

式式

式1是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是激活函数。式2是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的值作为这一次的输入的权重矩阵,f是激活函数。

从上面的公式我们可以看出,循环层和全连接层的区别就是循环层多了一个权重矩阵 W。

如果反复把式2带入到式1,我们将得到:

从上面可以看出,循环神经网络的输出值,是受前面历次输入值、、、、...影响的,这就是为什么循环神经网络可以往前看任意多个输入值的原因。

双向循环神经网络

对于语言模型来说,很多时候光看前面的词是不够的,比如下面这句话:

我的手机坏了,我打算____一部新手机。

可以想象,如果我们只看横线前面的词,手机坏了,那么我是打算修一修?换一部新的?还是大哭一场?这些都是无法确定的。但如果我们也看到了横线后面的词是『一部新手机』,那么,横线上的词填『买』的概率就大得多了。

在上一小节中的基本循环神经网络是无法对此进行建模的,因此,我们需要双向循环神经网络,如下图所示:

当遇到这种从未来穿越回来的场景时,难免处于懵逼的状态。不过我们还是可以用屡试不爽的老办法:先分析一个特殊场景,然后再总结一般规律。我们先考虑上图中,的计算。

从上图可以看出,双向卷积神经网络的隐藏层要保存两个值,一个A参与正向计算,另一个值A'参与反向计算。最终的输出值取决于和。其计算方法为:

和则分别计算:

现在,我们已经可以看出一般的规律:正向计算时,隐藏层的值与有关;反向计算时,隐藏层的值与有关;最终的输出取决于正向和反向计算的加和。现在,我们仿照式1和式2,写出双向循环神经网络的计算方法:

从上面三个公式我们可以看到,正向计算和反向计算不共享权重,也就是说U和U'、W和W'、V和V'都是不同的权重矩阵。

深度循环神经网络

前面我们介绍的循环神经网络只有一个隐藏层,我们当然也可以堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。如下图所示:

我们把第i个隐藏层的值表示为、,则深度循环神经网络的计算方式可以表示为:

循环神经网络的训练

循环神经网络的训练算法:BPTT

BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:

  1. 前向计算每个神经元的输出值;
  2. 反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数;
  3. 计算每个权重的梯度。

最后再用随机梯度下降算法更新权重。

循环层如下图所示:

前向计算

使用前面的式2对循环层进行前向计算:

注意,上面的、、都是向量,用黑体字母表示;而U、V是矩阵,用大写字母表示。向量的下标表示时刻,例如,表示在t时刻向量s的值。

我们假设输入向量x的维度是m,输出向量s的维度是n,则矩阵U的维度是,矩阵W的维度是。下面是上式展开成矩阵的样子,看起来更直观一些:

在这里我们用手写体字母表示向量的一个元素,它的下标表示它是这个向量的第几个元素,它的上标表示第几个时刻。例如,表示向量s的第j个元素在t时刻的值。表示输入层第i个神经元到循环层第j个神经元的权重。表示循环层第t-1时刻的第i个神经元到循环层第t个时刻的第j个神经元的权重。

误差项的计算

BTPP算法将第l层t时刻的误差项值沿两个方向传播,一个方向是其传递到上一层网络,得到,这部分只和权重矩阵U有关;另一个是方向是将其沿时间线传递到初始时刻,得到,这部分只和权重矩阵W有关。

我们用向量表示神经元在t时刻的加权输入,因为:

因此:

我们用a表示列向量,用表示行向量。上式的第一项是向量函数对向量求导,其结果为Jacobian矩阵:

同理,上式第二项也是一个Jacobian矩阵:

其中,diag[a]表示根据向量a创建一个对角矩阵,即

最后,将两项合在一起,可得:

上式描述了将沿时间往前传递一个时刻的规律,有了这个规律,我们就可以求得任意时刻k的误差项:

式3就是将误差项沿时间反向传播的算法。

循环层将误差项反向传递到上一层网络,与普通的全连接层是完全一样的,这在前面的文章零基础入门深度学习(3) - 神经网络和反向传播算法中已经详细讲过了,在此仅简要描述一下。

循环层的加权输入与上一层的加权输入关系如下:

上式中是第l层神经元的加权输入(假设第l层是循环层);是第l-1层神经元的加权输入;是第l-1层神经元的输出;是第l-1层的激活函数。

所以,

式4就是将误差项传递到上一层算法。

权重梯度的计算

现在,我们终于来到了BPTT算法的最后一步:计算每个权重的梯度。

首先,我们计算误差函数E对权重矩阵W的梯度。

上图展示了我们到目前为止,在前两步中已经计算得到的量,包括每个时刻t 循环层的输出值,以及误差项。

回忆一下我们在文章零基础入门深度学习(3) - 神经网络和反向传播算法介绍的全连接网络的权重梯度计算算法:只要知道了任意一个时刻的误差项,以及上一个时刻循环层的输出值,就可以按照下面的公式求出权重矩阵在t时刻的梯度:

在式5中,表示t时刻误差项向量的第i个分量;表示t-1时刻循环层第i个神经元的输出值。

我们下面可以简单推导一下式5。

我们知道:

因为对W求导与无关,我们不再考虑。现在,我们考虑对权重项求导。通过观察上式我们可以看到只与有关,所以:

按照上面的规律就可以生成式5里面的矩阵。

我们已经求得了权重矩阵W在t时刻的梯度,最终的梯度是各个时刻的梯度之和:

深度学习(6) - 循环神经网络相关推荐

  1. 深度学习之循环神经网络(12)预训练的词向量

    深度学习之循环神经网络(12)预训练的词向量  在情感分类任务时,Embedding层是从零开始训练的.实际上,对于文本处理任务来说,领域知识大部分是共享的,因此我们能够利用在其它任务上训练好的词向量 ...

  2. 深度学习之循环神经网络(11-b)GRU情感分类问题代码

    深度学习之循环神经网络(11-b)GRU情感分类问题代码 1. Cell方式 代码 运行结果 2. 层方式 代码 运行结果 1. Cell方式 代码 import os import tensorfl ...

  3. 深度学习之循环神经网络(11-a)LSTM情感分类问题代码

    深度学习之循环神经网络(11-a)LSTM情感分类问题代码 1. Cell方式 代码 运行结果 2. 层方式 代码 运行结果 1. Cell方式 代码 import os import tensorf ...

  4. 深度学习之循环神经网络(11)LSTM/GRU情感分类问题实战

    深度学习之循环神经网络(11)LSTM/GRU情感分类问题实战 1. LSTM模型 2. GRU模型  前面我们介绍了情感分类问题,并利用SimpleRNN模型完成了情感分类问题的实战,在介绍完更为强 ...

  5. 深度学习之循环神经网络(10)GRU简介

    深度学习之循环神经网络(10)GRU简介 1. 复位门 2. 更新门 3. GRU使用方法  LSTM具有更长的记忆能力,在大部分序列任务上面都取得了比基础RNN模型更好的性能表现,更重要的是,LST ...

  6. 深度学习之循环神经网络(9)LSTM层使用方法

    深度学习之循环神经网络(9)LSTM层使用方法 1. LSTMCell 2. LSTM层  在TensorFlow中,同样有两种方式实现LSTM网络.既可以使用LSTMCell来手动完成时间戳上面的循 ...

  7. 深度学习之循环神经网络(8)长短时记忆网络(LSTM)

    深度学习之循环神经网络(8)长短时记忆网络(LSTM) 0. LSTM原理 1. 遗忘门 2. 输入门 3. 刷新Memory 4. 输出门 5. 小结  循环神经网络除了训练困难,还有一个更严重的问 ...

  8. 深度学习之循环神经网络(7)梯度裁剪

    深度学习之循环神经网络(7)梯度裁剪 1. 张量限幅 2. 限制范数 3. 全局范数裁剪 梯度弥散  梯度爆炸可以通过 梯度裁剪(Gradient Clipping)的方式在一定程度上的解决.梯度裁剪 ...

  9. 深度学习之循环神经网络(6)梯度弥散和梯度爆炸

    深度学习之循环神经网络(6)梯度弥散和梯度爆炸  循环神经网络的训练并不稳定,网络的善妒也不能任意加深.那么,为什么循环神经网络会出现训练困难的问题呢?简单回顾梯度推导中的关键表达式: ∂ht∂hi= ...

  10. 深度学习之循环神经网络(5)RNN情感分类问题实战

    深度学习之循环神经网络(5)RNN情感分类问题实战 1. 数据集 2. 网络模型 3. 训练与测试 完整代码 运行结果  现在利用基础的RNN网络来挑战情感分类问题.网络结构如下图所示,RNN网络共两 ...

最新文章

  1. 单卡手机怎么变双卡双待全过程
  2. 表达对别人的感激之情
  3. 63.2. 配置 Postfix
  4. 485转换器产品类型介绍
  5. BZOJ 1968: [Ahoi2005]COMMON 约数研究 水题
  6. python while true_Python天坑系列(一):while 1比while True更快?
  7. “自带大屏”的便利店,你见过吗?
  8. comsol如何定义狄利克雷边界_如何使用拓扑优化结果创建几何模型
  9. c 调用c语言头文件,混合使用C、C++和汇编语之:在C++中使用C头文件-嵌入式系统-与非网...
  10. java学习过程记录
  11. 深入浅出 数据库索引
  12. Java多线程研究(八)使用Exchange在多个线程间交换数据
  13. can总线配置读入是什么意思_CAN总线(一)
  14. 关于 Eureka 2.x,别再人云亦云了!
  15. ConcurrentHashMap源码(JDK1.8)
  16. 【Urule源码解析1】开源可视化规则引擎
  17. 【Kotlin学习之旅】使用Kotlin实现常见的对称加密、非对称加密、消息摘要、数字签名的demo
  18. edge怎么开启沉浸式阅读_美人鼓上舞!端午小长假,豫园将开启史上首次沉浸式国风庙会...
  19. 孙子兵法——三十六计
  20. 无源无线测温 无线测温装置

热门文章

  1. java 单向链表 双向链表_java 单向链表与双向链表的实现
  2. java iso-8859-1_如何在Java中的ISO-8859-1和UTF-8之间转换?
  3. C++ 类的定义、作用域及大小计算,限定访问符,this指针
  4. mysql实现点赞和取消_Redis是如何实现点赞、取消点赞的?
  5. the train of thought of collaborative filtering matrix factarization
  6. (二)ngxin设置用户认证
  7. 2-2:python之控制结构
  8. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
  9. Linux-获得命令帮助man
  10. hdu1114Piggy-Bank(完全背包)