BiLSTM之一:模型理解
这是关于BiLSTM的第一篇文章,有关工程细节的介绍可以查看第二篇。
关于理解LSTM的一篇英文博客非常经典,可以去这里阅读,本文也参考了该博文。
循环神经网络(RNN)
BiLSTM是RNN的一种延伸,因此,要理解BiLSRM就必须首先弄明白什么是RNN。
普通神经网络的局限
假设我们对于普通的神经网络模型已经比较熟悉,那么不难理解,在神经网络的某一固定层中,该网络的各个输入之间是没有运算连接的。造成的一个直观的影响就是,该模型无法表示输入的“上下文”之间的关系。我们在读一篇文章时,有时需要返回头再看前文的内容,这样便于我们去理解文章真正想表达的含义。既然传统的神经网络无法解决这个问题,那么,一种新的、可以考虑上下文内容的模型——循环神经网络(Recurrent neural network)就诞生了。
RNN的运行机制
RNN的运行原理其实非常的简单,如下图:
上图中,粉色的部分为一个神经元,对输入进行运算。从图中可以看出,与普通神经网络不同的一点在于,神经元接受两个值:一个是当前时刻的输入xtx_txt,另一个是前一个神经元的输出at−1a_{t-1}at−1。其蕴含的意义也是不难理解的:通过将前一时刻的运算结果添加到当前的运算中,从而实现了“考虑上文信息”的功能。
下面给出在线性计算过程中各个变量的维度情况。
假定我们的输入是一段文字,首先要做的是将文字转为词向量,因为神经网络只能进行数值运算。假定转换后的词向量维度为50,即每个词可以用一个长度为50的列向量进行表示。如果没有aaa项,即在普通的神经网络中,要得到维度为10的输出,那么所作的线性运算部分为Wx∗xW_x*xWx∗x(为简单起见,省去了偏置项bbb),这里,WxW_xWx是10×50的矩阵,xxx是50×1的向量。
添加了aaa项之后,与之对应的有一个权重矩阵WaW_aWa,在具体的计算时,实际上是将xtx_txt和at−1a_{t-1}at−1做了简单的“堆叠”:[at−1;xt][a_{t-1};x_t][at−1;xt]是一个60×1的向量,那么[Wa;Wx][W_a;W_x][Wa;Wx]就是一个10×60的矩阵,这样在做线性运算之后,得到的输出(ata_tat和oto_tot)仍是10×1的向量。
BiRNN
由上一部分可以知道,RNN可以考虑上文的信息,那么如何将下文的信息也添加进去呢?这就是BiRNN要做的事情。
具体运算如下图:
与RNN计算流程类似,BiRNN在其基础上添加了反向的运算。可以理解为把输入的序列反转,重新按照RNN的方式计算一遍输出,最终的结果为正向RNN的结果与反向RNN的结果的简单堆叠。这样,模型就可以实现考虑上下文信息了,所以这种RNN叫做Bidirectional recurrent neural network。
注意,这里只是对RNN类神经网络的前向传播过程进行了说明,该类神经网络也可以通过梯度下降法进行后向传播,从而实现训练模型的功能。
RNN存在的问题
由上文可知,理论上BiRNN可以考虑到上下文的信息,因为每一个传递给后面神经元的aaa的值都包含了前面所有时刻的输入信息。但是直觉告诉我们,如果仅仅依靠这一条线来记录所有输入的信息,工作效果很可能并不理想,实际也的确如此:人们已经证实,RNN很难完美地处理具有长期依赖的信息。一个比较容易理解的英文例子是:当句子很长时,RNN无法记住主语的单复数形式从而在后面选择合适的谓词。
既然仅仅依靠一条线连接后面的神经元不足以解决问题,那么就再加一条线好了,这就是LSTM。研究表明,与RNN相比,LSTM可以很好的表达输入中的长期依赖的信息。
长短记忆网络(LSTM)
LSTM中一个重要的概念就是“门”,它控制信息通过的量,实质上就是一个σ\sigmaσ函数。
门(gate)函数
对于接触深度学习的人而言,一定不会对σ\sigmaσ函数感到陌生,它的表达式为σ(t)=11+e−t\sigma\left(t\right)=\frac{1}{1+e^{-t}}σ(t)=1+e−t1。该函数最重要的一个特征是,它可以把实数轴上的值映射到(0,1)\left( 0,1\right)(0,1)上,而且,绝大部分的值都是非常接近0或者1的。
这样的特性就仿佛是一个门结构,根据函数的取值可以决定让多少信息通过这个门。
在LSTM中,一共有3种门结构,分别是遗忘门(forget gate)、输入门(input gate)与输出门(output gate)。下面结合一个神经元内部的结构图分析其运算情况。
LSTM的神经元及运行机制
上图是一个LSTM“神经元”(即英文‘cell’)的内部情况。
首先,忽略其内部细节,单看输入与输出可以发现,每个神经元都有三个输入与三个输出。根据上文,不难想到,XtX_tXt是该时刻新加入的信息,at−1a_{t-1}at−1与Ct−1C_{t-1}Ct−1是上文信息的表示。
其次,在该神经元内部:
- 黄色的部分表示“逐元素运算”,一共有两种,分别是乘运算和加运算。也就是说,两个相同维度的向量经过黄色运算框之后对应元素进行相乘或相加。
- 棕色部分表示“激活运算”,也有两种,分别是σ\sigmaσ函数和tanhtanhtanh函数。
- 两条线按箭头方向融合,则是上文说的简单堆叠;一条线分成两条,则是复制为相同的两份。
那么它的运行机制是什么样的呢?
假设没有三个门函数,不难发现,at−1a_{t-1}at−1与XtX_tXt堆叠之后乘以权重WWW然后经过tanhtanhtanh激活函数后输出,这与RNN的运算是一模一样的。
现在,at−1a_{t-1}at−1与XtX_tXt堆叠之后的值被复制成了四份:
第一份乘以遗忘门的权重WfW_fWf然后用σ\sigmaσ激活,得到的值可以称之为“遗忘权重”。
第二份乘以输入门的权重WiW_iWi然后用σ\sigmaσ激活,得到的值可以称之为“输入权重”。
第三份则是进行了RNN中的运算。
第四份乘以输出门的权重WoW_oWo然后用σ\sigmaσ激活,得到的值可以称之为“输出权重”。
应该时刻注意的是,上述“某某权重”其实是一个与at−1a_{t-1}at−1与XtX_tXt堆叠后的向量同维度的向量,向量中所有的值都在(0,1)(0,1)(0,1)之间,而且大部分都是非常接近0或者1的。
接下来看神经元内最上方的Ct−1C_{t-1}Ct−1。与at−1a_{t-1}at−1类似,Ct−1C_{t-1}Ct−1也携带着上文的信息。进入神经元后,Ct−1C_{t-1}Ct−1首先会与遗忘权重逐元素相乘,可以想见,由于遗忘权重中值的特点,因此与该权重相乘之后Ct−1C_{t-1}Ct−1中绝大部分的值会变的非常接近0或者非常接近该位置上原来的值。这非常像一扇门,它会决定让哪些Ct−1C_{t-1}Ct−1的元素通过以及通过的比例有多大。反映到实际中,就是对Ct−1C_{t-1}Ct−1中携带的信息进行选择性的遗忘(乘以非常接近0的数)和通过(乘以非常接近1的数),亦即乘以一个权重。
理解了遗忘门的作用之后,其他两个门也就比较好理解了。输入门则是对输入信息进行限制,而输入信息就是RNN中的前向运算的结果。经过输入门处理后的信息就可以添加到经过遗忘门处理的上文信息中去,这就是神经元内唯一一个逐元素相加的工作。
按照一般的理解,上文的信息根据当前的输入遗忘了旧的信息,并添加了新的信息,那么整体的更新操作就已经完成,即CtC_{t}Ct已经生成。但是CtC_{t}Ct实际扮演的角色是携带上文的信息,因此,如果当前神经元要输出内容,那么还要有一个输出门进行限制。CtC_tCt再乘以一个tanhtanhtanh激活函数之后,与输出权重逐元素相乘,就得到了当前神经元的输出和ata_tat。
可以这样认为:CtC_tCt携带的信息经过由当前时刻的输入构成的输出门限制之后,含有更多的当前时刻的信息,因此得到的ata_tat与CtC_tCt相比可以说是具有短期记忆的,而CtC_tCt则是具有长期记忆的。因此,将它们统称为长短记忆网络。
BiLSTM
类似的,LSTM也可以携带下文的信息,采用的方法与BiRNN并无差别,这里给出运算图,不再细表:
总结
尽管RNN理论上可以衡量上下文的信息,但当上下文过长时效果太差。LSTM的提出可以很好的解决这一问题,从而使循环神经网络可以在实际中有非常好的应用成果。
最后值得注意的是,对于BiRNN来说,前向的计算的所有神经元内的权重参数均是一样的,反向的计算(不是后向传播!!)所有的神经元内的权重参数也都是一样的。同理,LSTM也有这个特点,换句话说,它们是权值共享的。
BiLSTM之一:模型理解相关推荐
- 信息抽取实战:命名实体识别NER【ALBERT+Bi-LSTM模型 vs. ALBERT+Bi-LSTM+CRF模型】(附代码)
实战:命名实体识别NER 目录 实战:命名实体识别NER 一.命名实体识别(NER) 二.BERT的应用 NLP基本任务 查找相似词语 提取文本中的实体 问答中的实体对齐 三.ALBERT ALBER ...
- 零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)
https://github.com/mali19064/LSTM-CRF-pytorch-faster 中文分词 说到命名实体抽取,先要了解一下基于字标注的中文分词. 比如一句话 "我爱北 ...
- border,padding,margin盒模型理解
安静的敲着键盘,已势不可挡的姿势逼近php,我想我是一个幸福的人,未来不可期,做好现在,偶尔写着自己能看懂的API,慢慢悠悠的回味一下前端基础知识. 本文盒模型理解. <!DOCTYPE htm ...
- 对Java中常见的四种I/O模型理解
对Java中常见的四种I/O模型理解 1.1 知识科普 1.1.1 同步阻塞I/O(Blocking I/O) 1.1.1.1 阻塞与非阻塞 1.1.1.2 同步与异步 1.1.1.3 同步阻塞I/O ...
- NLP(二十五)实现ALBERT+Bi-LSTM+CRF模型
在文章NLP(二十四)利用ALBERT实现命名实体识别中,笔者介绍了ALBERT+Bi-LSTM模型在命名实体识别方面的应用. 在本文中,笔者将介绍如何实现ALBERT+Bi-LSTM+CRF ...
- 从UIE模型理解到UIE工业实战
从UIE模型理解到UIE工业实战 UIE: 信息抽取的大一统模型 原始论文 背景 信息抽取语言 损失函数定义 实验与结论 结论 UIE实战 实战一:Paddlenlp之UIE模型实战实体抽取任务[打车 ...
- 让模型理解和推断代码背后的意图是预训练模型的核心挑战 | NPCon演讲实录
分享嘉宾 | 卢帅 整理 | 王子彧 出品 | CSDN(ID:CSDNnews) 2023 年 3 月 25 日下午,在 CSDN 与<新程序员>联合主办的"新程序员(NPCo ...
- 网络七层模型-理解及总结
网络七层模型-理解及总结 引言 初识网络七层模型基本概念 引言 本文主要对网络七层模型做一个总结,便于后期查询与理解,如有不正确的地方请指正. 初识网络七层模型基本概念 OSI模型 OSI 模型(Op ...
- 基于BERT+BiLSTM+CRF模型与新预处理方法的古籍自动标点
摘要 古文相较于现代文不仅在用词.语法等方面存在巨大差异,还缺少标点,使人难以理解语义.采用人工方式对古文进行标点既需要有较高的文学水平,还需要对历史文化有一定了解.为提高古文自动标点的准确率,将深层 ...
最新文章
- 百篇大计敬本年之C++坎坷之路 —— Warning:will be initialized after [-Wreorder]
- HTML5 body设置全屏背景图片 如何让body的背景图片自适应整个屏----实战经验
- Java集成PageOffice在线打开编辑word文件 - Spring Boot
- 【疑难杂症】vmware虚拟机提示“该虚拟机似乎正在使用中”,并且无法获取所有权解决办法(三步解决虚拟机vmware提示正在使用中的问题)
- Unity 2017 Game Optimization 读书笔记 Scripting Strategies Part 5
- 关于cocos creator换装功能的实践与思考
- centos7安装oracle12c 二
- java:自定义数据库连接池
- 一个求矩阵鞍点(即行上最小的数 同时是列上最大的数)的C程序
- android 登录qq接口开发,三方登录-QQ登录开发-Android(as版本)
- 站立会议05--个人进度
- Java 任务调度,分布式定时任务XXL-JOB,elastic-job
- Atitit DbServiceV4qb9 数据库查询类库v4 新特性
- 【免疫优化物流选址】基于MATLAB的免疫优化算法在物流配送中心选址中的应用仿真
- 使用代理服务器隐藏电脑上网真实IP地址
- 【windows】找不到MSVCR100.dll、VCRUNTIME140.dll
- Java——万字总结网络编程
- 分析system_call中断处理过程
- 可能是最优雅的分割线实现方式CSS实现
- 视频教程-全新Go语言前后端分离实战项目(Beego)-Go语言
热门文章
- 无盘服务器 安装客户机程序,网吧无盘环境不开超级安装客户机系统补丁的方法...
- 【JavaScript创建数组】
- (附源码)计算机毕业设计JavaJava毕设项目餐饮掌上设备点餐系统
- Mac电脑如何批量删除office最近打开文件?
- oracle 55道练习题
- 王者荣耀服务器维护1月9号,王者荣耀1月9日更新到几点
- 图片百分比 html,HTML - CSS图像调整自身的百分比?
- 参考平面及其高度_设计规范参考数据
- Pink老师-简易ATM机
- java实现HTTP的POST协议的方法