bilstm模型怎么用_BI模型

bilstm模型怎么用_BI模型本文着眼于内部计算过程而不是数据原理,分别总结了RNN,BiRNN,LSTM以及BiLSTM等神经网络模型内部结构。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

这是关于BiLSTM的第一篇文章,有关工程细节的介绍可以查看第二篇

关于理解LSTM的一篇英文博客非常经典,可以去这里阅读,本文也参考了该博文。

循环神经网络(RNN)

BiLSTM是RNN的一种延伸,因此,要理解BiLSRM就必须首先弄明白什么是RNN。

普通神经网络的局限

假设我们对于普通的神经网络模型已经比较熟悉,那么不难理解,在神经网络的某一固定层中,该网络的各个输入之间是没有运算连接的。造成的一个直观的影响就是,该模型无法表示输入的“上下文”之间的关系。我们在读一篇文章时,有时需要返回头再看前文的内容,这样便于我们去理解文章真正想表达的含义。既然传统的神经网络无法解决这个问题,那么,一种新的、可以考虑上下文内容的模型——循环神经网络(Recurrent neural network)就诞生了。

RNN的运行机制

RNN的运行原理其实非常的简单,如下图:
RNN计算流程图
上图中,粉色的部分为一个神经元,对输入进行运算。从图中可以看出,与普通神经网络不同的一点在于,神经元接受两个值:一个是当前时刻的输入 x t x_t xt,另一个是前一个神经元的输出 a t − 1 a_{t-1} at1。其蕴含的意义也是不难理解的:通过将前一时刻的运算结果添加到当前的运算中,从而实现了“考虑上文信息”的功能。

下面给出在线性计算过程中各个变量的维度情况。

假定我们的输入是一段文字,首先要做的是将文字转为词向量,因为神经网络只能进行数值运算。假定转换后的词向量维度为50,即每个词可以用一个长度为50的列向量进行表示。如果没有 a a a项,即在普通的神经网络中,要得到维度为10的输出,那么所作的线性运算部分为 W x ∗ x W_x*x Wxx(为简单起见,省去了偏置项 b b b),这里, W x W_x Wx是10×50的矩阵, x x x是50×1的向量。

添加了 a a a项之后,与之对应的有一个权重矩阵 W a W_a Wa,在具体的计算时,实际上是将 x t x_t xt a t − 1 a_{t-1} at1做了简单的“堆叠”: [ a t − 1 ; x t ] [a_{t-1};x_t] [at1;xt]是一个60×1的向量,那么 [ W a ; W x ] [W_a;W_x] [Wa;Wx]就是一个10×60的矩阵,这样在做线性运算之后,得到的输出( a t a_t at o t o_t ot)仍是10×1的向量。

BiRNN

由上一部分可以知道,RNN可以考虑上文的信息,那么如何将下文的信息也添加进去呢?这就是BiRNN要做的事情。

具体运算如下图:
BiRNN计算流程图
与RNN计算流程类似,BiRNN在其基础上添加了反向的运算。可以理解为把输入的序列反转,重新按照RNN的方式计算一遍输出,最终的结果为正向RNN的结果与反向RNN的结果的简单堆叠。这样,模型就可以实现考虑上下文信息了,所以这种RNN叫做Bidirectional recurrent neural network。

注意,这里只是对RNN类神经网络的前向传播过程进行了说明,该类神经网络也可以通过梯度下降法进行后向传播,从而实现训练模型的功能。

RNN存在的问题

由上文可知,理论上BiRNN可以考虑到上下文的信息,因为每一个传递给后面神经元的 a a a的值都包含了前面所有时刻的输入信息。但是直觉告诉我们,如果仅仅依靠这一条线来记录所有输入的信息,工作效果很可能并不理想,实际也的确如此:人们已经证实,RNN很难完美地处理具有长期依赖的信息。一个比较容易理解的英文例子是:当句子很长时,RNN无法记住主语的单复数形式从而在后面选择合适的谓词。

既然仅仅依靠一条线连接后面的神经元不足以解决问题,那么就再加一条线好了,这就是LSTM。研究表明,与RNN相比,LSTM可以很好的表达输入中的长期依赖的信息。

长短记忆网络(LSTM)

LSTM中一个重要的概念就是“门”,它控制信息通过的量,实质上就是一个 σ \sigma σ函数。

门(gate)函数

对于接触深度学习的人而言,一定不会对 σ \sigma σ函数感到陌生,它的表达式为 σ ( t ) = 1 1 + e − t \sigma\left(t\right)=\frac{1}{1+e^{-t}} σ(t)=1+et1。该函数最重要的一个特征是,它可以把实数轴上的值映射到 ( 0 , 1 ) \left( 0,1\right) (0,1)上,而且,绝大部分的值都是非常接近0或者1的。

这样的特性就仿佛是一个门结构,根据函数的取值可以决定让多少信息通过这个门。

在LSTM中,一共有3种门结构,分别是遗忘门(forget gate)、输入门(input gate)与输出门(output gate)。下面结合一个神经元内部的结构图分析其运算情况。

LSTM的神经元及运行机制

一个LSTM的cell

上图是一个LSTM“神经元”(即英文‘cell’)的内部情况。

首先,忽略其内部细节,单看输入与输出可以发现,每个神经元都有三个输入与三个输出。根据上文,不难想到, X t X_t Xt是该时刻新加入的信息, a t − 1 a_{t-1} at1 C t − 1 C_{t-1} Ct1是上文信息的表示。

其次,在该神经元内部:

  • 黄色的部分表示“逐元素运算”,一共有两种,分别是乘运算和加运算。也就是说,两个相同维度的向量经过黄色运算框之后对应元素进行相乘或相加。
  • 棕色部分表示“激活运算”,也有两种,分别是 σ \sigma σ函数和 t a n h tanh tanh函数。
  • 两条线按箭头方向融合,则是上文说的简单堆叠;一条线分成两条,则是复制为相同的两份。

那么它的运行机制是什么样的呢?

假设没有三个门函数,不难发现, a t − 1 a_{t-1} at1 X t X_t Xt堆叠之后乘以权重 W W W然后经过 t a n h tanh tanh激活函数后输出,这与RNN的运算是一模一样的。

现在, a t − 1 a_{t-1} at1 X t X_t Xt堆叠之后的值被复制成了四份:
第一份乘以遗忘门的权重 W f W_f Wf然后用 σ \sigma σ激活,得到的值可以称之为“遗忘权重”。
第二份乘以输入门的权重 W i W_i Wi然后用 σ \sigma σ激活,得到的值可以称之为“输入权重”。
第三份则是进行了RNN中的运算。
第四份乘以输出门的权重 W o W_o Wo然后用 σ \sigma σ激活,得到的值可以称之为“输出权重”。

应该时刻注意的是,上述“某某权重”其实是一个与 a t − 1 a_{t-1} at1 X t X_t Xt堆叠后的向量同维度的向量,向量中所有的值都在 ( 0 , 1 ) (0,1) (0,1)之间,而且大部分都是非常接近0或者1的。

接下来看神经元内最上方的 C t − 1 C_{t-1} Ct1。与 a t − 1 a_{t-1} at1类似, C t − 1 C_{t-1} Ct1也携带着上文的信息。进入神经元后, C t − 1 C_{t-1} Ct1首先会与遗忘权重逐元素相乘,可以想见,由于遗忘权重中值的特点,因此与该权重相乘之后 C t − 1 C_{t-1} Ct1中绝大部分的值会变的非常接近0或者非常接近该位置上原来的值。这非常像一扇门,它会决定让哪些 C t − 1 C_{t-1} Ct1的元素通过以及通过的比例有多大。反映到实际中,就是对 C t − 1 C_{t-1} Ct1中携带的信息进行选择性的遗忘(乘以非常接近0的数)和通过(乘以非常接近1的数),亦即乘以一个权重。

理解了遗忘门的作用之后,其他两个门也就比较好理解了。输入门则是对输入信息进行限制,而输入信息就是RNN中的前向运算的结果。经过输入门处理后的信息就可以添加到经过遗忘门处理的上文信息中去,这就是神经元内唯一一个逐元素相加的工作。

按照一般的理解,上文的信息根据当前的输入遗忘了旧的信息,并添加了新的信息,那么整体的更新操作就已经完成,即 C t C_{t} Ct已经生成。但是 C t C_{t} Ct实际扮演的角色是携带上文的信息,因此,如果当前神经元要输出内容,那么还要有一个输出门进行限制。 C t C_t Ct再乘以一个 t a n h tanh tanh激活函数之后,与输出权重逐元素相乘,就得到了当前神经元的输出和 a t a_t at

可以这样认为: C t C_t Ct携带的信息经过由当前时刻的输入构成的输出门限制之后,含有更多的当前时刻的信息,因此得到的 a t a_t at C t C_t Ct相比可以说是具有短期记忆的,而 C t C_t Ct则是具有长期记忆的。因此,将它们统称为长短记忆网络。

BiLSTM

类似的,LSTM也可以携带下文的信息,采用的方法与BiRNN并无差别,这里给出运算图,不再细表:
BiLSTM

总结

尽管RNN理论上可以衡量上下文的信息,但当上下文过长时效果太差。LSTM的提出可以很好的解决这一问题,从而使循环神经网络可以在实际中有非常好的应用成果。

最后值得注意的是,对于BiRNN来说,前向的计算的所有神经元内的权重参数均是一样的,反向的计算(不是后向传播!!)所有的神经元内的权重参数也都是一样的。同理,LSTM也有这个特点,换句话说,它们是权值共享的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195359.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月18日 下午8:22
下一篇 2025年10月18日 下午9:01


相关推荐

  • PCL 基于B样条曲线的曲面重建「建议收藏」

    PCL 基于B样条曲线的曲面重建「建议收藏」基于B样条曲线的曲面重建

    2022年6月18日
    58
  • js往对象中添加属性

    js往对象中添加属性首先 定义一个要添加进去的属性及属性值 letobj a 123 将要被添加的对象 letobj1 c 1 d 2 使用 Object assign 将两个对象合并 lettwoobj Object assign obj1 obj 两个注意的点 用一个新的名称来接受 Object assign 的值 不要用 obj1 来接受 会报错 第一个参数是原来的对象 第二个是要添加进去的对象

    2026年3月16日
    3
  • jQuery Sizzle选择器

    jQuery Sizzle选择器转载 http www baiduux com blog 2010 07 15 the sizzle in jquery 这是一篇关于介绍 jQuerySizzle 选择器的文章 由我和 obility 共同完成 在文中 我们试图用自己的语言配以适量的代码向读者展现出 Sizzle 在处理选择符时的流程原理 以及末了以少许文字给你展示出如何借用 Sizzle 之手实现自定义选择器 也许更标准的叫

    2026年3月17日
    1
  • dom 自定义事件_pix4D生成dom

    dom 自定义事件_pix4D生成dom之前做项目都是直接用jquery的bind绑定事件,不过当时都不是动态生成dom元素,而是已经页面中原本存在的dom元素进行事件绑定,最近在测试给动态生成的dom绑定事件的时候发现事件失效,于是就测试了一下:1.事件失效的原因:(1)bind事件绑定只对dom中存在的元素有效,对于我们后来动态增加的元素是监测不到,所以绑定不了(2)同样,当你使用varaa=docu

    2025年10月27日
    6
  • 文心大模型能力汇总

    文心大模型能力汇总

    2026年3月12日
    3
  • 错误缓解方案

    错误缓解方案

    2026年3月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号