NLP中的RNN、Seq2Seq与attention注意力机制

news2024/11/18 15:45:37

目录

NLP自然语言处理 的RNN、Seq2Seq与attention注意力机制

RNN循环神经网络

前馈网络入门

前馈网络

循环网络

多层感知器架构示例

循环神经网络的运作原理

展开 RNN

seq2seq模型

Attention(注意力机制)

总结

引用


NLP自然语言处理 的RNN、Seq2Seq与attention注意力机制

RNN循环神经网络

我们为什么需要 RNN?

也许你现在想的是,已经有像卷积网络这样表现非常出色的网络了,为什么还需要其他类型的网络呢?有一个需要用到 RNN 的特殊例子。为了解释 RNN,你首先需要了解序列的相关知识,我们先来讲一下序列。

序列是相互依赖的(有限或无限)数据流,比如时间序列数据、信息性的字符串、对话等。在对话中,一个句子可能有一个意思,但是整体的对话可能又是完全不同的意思。股市数据这样的时间序列数据也是,单个数据表示当前价格,但是全天的数据会有不一样的变化,促使我们作出买进或卖出的决定。

当输入数据具有依赖性且是序列模式时,CNN 的结果一般都不太好。CNN 的前一个输入和下一个输入之间没有任何关联。所以所有的输出都是独立的。CNN 接受输入,然后基于训练好的模型输出。如果你运行了 100 个不同的输入,它们中的任何一个输出都不会受之前输出的影响。但想一下如果是文本生成或文本翻译呢?所有生成的单词与之前生成的单词都是独立的(有些情况下与之后的单词也是独立的,这里暂不讨论)。所以你需要有一些基于之前输出的偏向。这就是需要 RNN 的地方。RNN 对之前发生在数据序列中的事是有一定记忆的。这有助于系统获取上下文。理论上讲,RNN 有无限的记忆,这意味着它们有无限回顾的能力。通过回顾可以了解所有之前的输入。但从实际操作中看,它只能回顾最后几步。

本文仅为了与人类大体相关联,而不会做任何决定。本文只是基于之前关于该项目的知识做出了自己的判断(我甚至尚未理解人类大脑的 0.1%)。

何时使用 RNN?

RNN 可用于许多不同的地方。下面是 RNN 应用最多的领域。

1. 语言建模和文本生成

给出一个词语序列,试着预测下一个词语的可能性。这在翻译任务中是很有用的,因为最有可能的句子将是可能性最高的单词组成的句子。

2. 机器翻译

将文本内容从一种语言翻译成其他语言使用了一种或几种形式的 RNN。所有日常使用的实用系统都用了某种高级版本的 RNN。

3. 语音识别

基于输入的声波预测语音片段,从而确定词语。

4. 生成图像描述

RNN 一个非常广泛的应用是理解图像中发生了什么,从而做出合理的描述。这是 CNN 和 RNN 相结合的作用。CNN 做图像分割,RNN 用分割后的数据重建描述。这种应用虽然基本,但可能性是无穷的。

5. 视频标记

可以通过一帧一帧地标记视频进行视频搜索。

深入挖掘

本文按照以下主题进行。每一部分都是基于之前的部分进行的,所以不要跳着读。

前馈网络循环网络循环神经元基于时间的反向传播(BPTT)RNN 实现

前馈网络入门

前馈网络通过在网络的每个节点上做出的一系列操作传递信息。前馈网络每次通过每个层直接向后传递信息。这与其他循环神经网络不同。一般而言,前馈网络接受一个输入并据此产生输出,这也是大多数监督学习的步骤,输出结果可能是一个分类结果。它的行为与 CNN 类似。输出可以是以猫狗等作为标签的类别。

前馈网络是基于一系列预先标注过的数据训练的。训练阶段的目的是减少前馈网络猜类别时的误差。一旦训练完成,我们就可以用训练后的权重对新批次的数据进行分类

一个典型的前馈网络架构

在前馈网络中,无论在测试阶段展示给分类器的图像是什么,都不会改变权重,所以也不会影响第二个决策。这是前馈网络和循环网络之间一个非常大的不同。

前馈网络

在测试时不会记得之前的输入数据。它们始终是取决于时间点的。它们只会在训练阶段记得历史输入数据。

循环网络

循环网络不仅将当前的输入样例作为网络输入,还将它们之前感知到的一并作为输入

我们试着建立了一个多层感知器。从简单的角度讲,它有一个输入层、一个具备特定激活函数的隐藏层,最终可以得到输出。

多层感知器架构示例

如果在上述示例中的层数增加了,输入层也接收输入。那么第一个隐藏层将激活传递到下一个隐藏层上,依此类推。最后到达输出层。每一个隐藏层都有自己的权重和偏置项。现在问题变成了我们可以输入到隐藏层吗?

每一层都有自己的权重(W)、偏置项(B)和激活函数(F)。这些层的行为不同,合并它们从技术层面上讲也极具挑战性。为了合并它们,我们将所有层的权重和偏置项替换成相同的值。如下图所示:

现在我们就可以将所有层合并在一起了。所有的隐藏层都可以结合在一个循环层中。所以看起来就像下图:

我们在每一步都会向隐藏层提供输入。现在一个循环神经元存储了所有之前步的输入,并将这些信息和当前步的输入合并。因此,它还捕获到一些当前数据步和之前步的相关性信息。t-1 步的决策影响到第 t 步做的决策。这很像人类在生活中做决策的方式。我们将当前数据和近期数据结合起来,帮助解决手头的特定问题。这个例子很简单,但从原则上讲这与人类的决策能力是一致的。这让我非常想知道我们作为人类是否真的很智能,或者说我们是否有非常高级的神经网络模型。我们做出的决策只是对生活中收集到的数据进行训练。那么一旦有了能够在合理时间段内存储和计算数据的先进模型和系统时,是否可以数字化大脑呢?所以当我们有了比大脑更好更快的模型(基于数百万人的数据训练出的)时,会发生什么?

我们用一个例子来阐述上面的解释,这个例子是预测一系列字母后的下一个字母。想象一个有 8 个字母的单词 namaskar。

namaskar(合十礼):印度表示尊重的传统问候或姿势,将手掌合起置于面前或胸前鞠躬。

如果我们在向网络输入 7 个字母后试着找出第 8 个字母,会发生什么呢?隐藏层会经历 8 次迭代。如果展开网络的话就是一个 8 层的网络,每一层对应一个字母。所以你可以想象一个普通的神经网络被重复了多次。展开的次数与它记得多久之前的数据是直接相关的。

循环神经网络的运作原理

循环神经元

这里我们将更深入地了解负责决策的实际神经元。以之前提到的 namaskar 为例,在给出前 7 个字母后,试着找出第 8 个字母。输入数据的完整词汇表是 {n,a,m,s,k,r}。在真实世界中单词或句子都会更复杂。为了简化问题,我们用的是下面这个简单的词汇表。

在上图中,隐藏层或 RNN 块在当前输入和之前的状态中应用了公式。在本例中,namaste 的字母 n 前面什么都没有。所以我们直接使用当前信息推断,并移动到下一个字母 a。在推断字母 a 的过程中,隐藏层应用了上述公式结合当前推断 a 的信息与前面推断 n 的信息。输入在网络中传递的每一个状态都是一个时间步或一步,所以时间步 t 的输入是 a,时间步 t-1 的输入就是 n。将公式同时应用于 n 和 a 后,就得到了一个新状态。

用于当前状态的公式如下所示:

h_t 是新状态,h_t-1 是前一个状态。x_t 是时间 t 时的输入。在对之前的时间步应用了相同的公式后,我们已经能感知到之前的输入了。我们将检查 7 个这样的输入,它们在每一步的权重和函数都是相同的。

现在试着以简单的方式定义 f()。我们使用 tanh 激活函数。通过矩阵 W_hh 定义权重,通过矩阵 W_xh 定义输入。公式如下所示:

上例只将最后一步作为记忆,因此只与最后一步的数据合并。为了提升网络的记忆能力,并在记忆中保留较长的序列,我们必须在方程中添加更多的状态,如 h_t-2、h_t-3 等。最后输出可以按测试阶段的计算方式进行计算:

其中,y_t 是输出。对输出与实际输出进行对比,然后计算出误差值。网络通过反向传播误差来更新权重,进行学习。本文后续部分会对反向传播进行讨论。

基于时间的反向传播算法(BPTT)

本节默认你已经了解了反向传播概念。如果需要对反向传播进行深入了解,请参阅链接:http://cs231n.github.io/optimization-2/。

现在我们了解了 RNN 是如何实际运作的,但是在实际工作中如何训练 RNN 呢?该如何决定每个连接的权重呢?如何初始化这些隐藏单元的权重呢?循环网络的目的是要准确地对序列输入进行分类。这要靠误差值的反向传播和梯度下降来实现。但是前馈网络中使用的标准反向传播无法在此应用。

与有向无环的前馈网络不同,RNN 是循环图,这也是问题所在。在前馈网络中可以计算出之前层的误差导数。但 RNN 的层级排列与前馈网络并不相同。

答案就在之前讨论过的内容中。我们需要展开网络。展开网络使其看起来像前馈网络就可以了。

展开 RNN

在每个时间步取出 RNN 的隐藏单元并复制。时间步中的每一次复制就像前馈网络中的一层。在时间步 t+1 中每个时间步 t 层与所有可能的层连接。因此我们对权重进行随机初始化,展开网络,然后在隐藏层中通过反向传播优化权重。通过向最低层传递参数完成初始化。这些参数作为反向传播的一部分也得到了优化。

展开网络的结果是,现在每一层的权重都不同,因此最终会得到不同程度的优化。无法保证基于权重计算出的误差是相等的。所以每一次运行结束时每一层的权重都不同。这是我们绝对不希望看到的。最简单的解决办法是以某种方式将所有层的误差合并到一起。可以对误差值取平均或者求和。通过这种方式,我们可以在所有时间步中使用一层来保持相同的权重。

RNN循环神经网络被广泛应用于自然语言处理中,对于处理序列数据有很好的效果,常见的序列数据有文本、语音等,至于为什么要用到循环神经网络而不是传统的神经网络,我们在这里举一个例子。

假如有一个智能订票系统,我只需要输入一句话,该系统能识别出我将在什么时间订购去哪里的车票。那么程序需要根据我们输入的文本识别出我们出发的时间,目的地以及始发地。

如:我一月一号去郑州。

那么“一月一号”是时间,“郑州”是目的地,“我”和“去”都是其他不需要提取的信息,我们统一归为其他类。

那么假如我输入另外一个句子:

我一月一号离开郑州

此时“一月一号”是时间,“郑州”就变成了始发地,“我”和“离开”都是其他。

针对这个例子,我输入不同的文本,郑州表示为不同的label,用前馈神经网络去做的话,就不能将两个不同语境下的“郑州”区分开,所以这时我们需要我们的神经网络具有记忆功能,即,当在看到第一个文本中的“郑州”的时候,神经网络已经存储了“去”这个词的信息。当在看到第二个文本中的“郑州”的时候就已经存储了“离开”这个词的信息,因为“去”和“离开”两个词的信息不同,故就可以将两个文本中的“郑州”区分开。

下面我们根据这个例子去了解循环神经网络的结构

对于一个文本的每一个词可以看做是一个时序。RNN的每一个时序是一个前馈神经网络,但是为了在每一个时刻都包含前边时序的信息,所以RNN的每个时序共享了隐藏层,即当前时刻的输入不仅包含了当前时刻的词,还包含了前一时刻的隐藏层的输出。

RNN结构图

因为计算机并不能读懂汉字,所以我们一般会用向量的方式去表示一个词。

向量表示词的方法有很多,常用的比如one-hot、词袋模型、词嵌入等。

在本例中为了方便计算在这里我们使用:

[1,1]表示我

[2,2]表示去

[3,3]表示离开

[4,4]表示郑州

并且假设所有的权重都是1,所有的偏置都是0。

下图为“我去郑州”的循环神经网络结构图。

我去郑州

我离开郑州

下图为“我离开郑州”的循环神经网络结构图。

我们看到,因为“去”和“离开”的词向量不同,所以在循环神经网络中最后的“郑州”的输出也不相同,这样就能把两个“郑州”给区分开来了。

根据上边的例子可以看出来,循环神经网络中每一个时序的隐藏层不仅包含了前边时序的输入信息,也包含了前边时序的顺序信息。可以理解为包含了前边时序的语义信息。

循环神经网络展开图:

RNN展开图

可以看出,每一个时刻的输出不仅包含了该时刻的输入向量,也包含了前一时刻的隐藏层的输出。具体的计算公式如下:

seq2seq模型

刚才的例子其实是N对N的循环神经网络,即我的输入序列长度是N,输出也是对应的N长度的序列。其实循环神经网络还有其他的比如:1对N、N对1。

但很多时候我们会遇到输入序列和输出序列不等长的例子但又不是1对N和N对1,如机器翻译,智能问答,源语言和目标语言的句子往往并没有相同的长度。为此我们引出RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。

seq2seq模型

还有一种做法是将c当做每一步的输入:

seq2seq模型

对于序列到序列的数据来说,可以把Encoder和Decoder分别看成是RNN,在Encoder中根据输入数据生成一个语义编码C,C的获取方式有很多种,最简单的就是把Encoder中最后一个隐藏层赋值给C,也可以对最后一个隐藏状态做一个变换得到C,还可以对所有的隐藏状态做变换得到C。

拿到C之后,就可以用另一个RNN进行解码,这部分RNN被称为Decoder,具体做法就是将C当做之前的初始状态h0输入到Decoder中,C还有一种做法是将C当做每一步的输入。

这里我们用一个机器翻译的例子解释seq2seq模型。

例:机器学习翻译 成 machine learning

Attention(注意力机制)

图片展示的Encoder-Decoder框架是没有体现“注意力模型”的,所以可以把它看做是注意力不集中分心模型。因为在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子的语义编码C都是一样的,没有任何区别。而语义编码C是由原句子中的每个单词经过Encoder编码产生的,这意味着原句子中任意单词对生成某个目标单词来说影响力都是相同的,这就是模型没有体现出注意力的缘由。

在上边那个例子中在生成“machine”时,"机","器","学",""习"的贡献是相同的,很明显,这是不太合理,显然,"机","器",对于翻译成"machine"更为重要。所以我们希望在模型翻译"machine"的时候,"机","器"两个字的贡献(权重)更大,当在翻译成"learning"时,"学","习"两个字贡献(权重)更大。

上图中,输入序列上是“机器学习”,因此Encoder中的h1、h2、h3、h4分别代表“机","器","学","习”的信息,在翻译"macine"时,第一个上下文向量C1应该和"机","器"两个字最相关,所以对应的权重a比较大,在翻译"learning"时,第二个上下文向量C2应该和"学","习"两个字最相关,所以"学","习"对应的权重a比较大。

a其实是一个0-1之间的值,a可以看成是e的softmax后的结果。

翻译matchine

翻译learning

那现在关于attention来说就只剩下一个问题了,就是e是怎么来的。关于e的计算,业界有很多种方法,常用的有以下三种方式:

  1. 计算Encoder的序列h与Decoder的序列h的余弦相似度.
  2. 在1的基础上,乘上一个Wa,Wa是需要学习的参数,从学习到Encoder和Decoder的隐藏的打分e。
  3. 设计一个前馈神经网络,前馈神经网络的输入是Encoder和Decoder的两个隐藏状态,Va、Wa都是需要学习的参数。

总结

到这里,本文已经介绍了RNN循环神经网络的基本概念,seq2seq模型的基本概念及seq2seq中的注意力机制,希望能帮到大家。

引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了,感觉并不是想象中的好用,特别是出现些稀奇古怪的问题不好解决,比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…

2023年备受欢迎的5款团队任务管理工具

任务管理是团队协作的重要环节,选择合适的团队任务管理软件可以提高工作效率、明确责任分工、加强沟通协作。在互联网领域,有许多好用的团队任务管理软件可供选择。下面介绍5款比较知名的团队任务管理软件,并从互联网场景的相关背景内容上进行…

懵了,面试官问我Redis怎么测,直接凉了...

前言 有些朋友来问我,redis要怎么测试?首先我们需要知道,redis是什么?它能做什么? redis是一个key-value类型的高速存储数据库。 redis常被用做:缓存、队列、发布订阅等。 所以,“redis要怎么测…

JavaEE初阶:多线程 - Thread 类的基本用法

上次我们了解了多线程的五种创建方法,今天来学习Thread的基本用法。 目录 run和start Thread常见的构造方法 Thread的几个常见属性 后台线程 是否存活 线程终止 1.使用标志位 2.使用Thread自带的标志 等待线程 run和start 首先需要理解Thread的run和star…

小程序商品如何设置指定的配送规则

小程序配送规则包括商品是否包邮、包邮金额、起总金额、计费方式、配送区域等,这些规则直接影响到商家的运营和用户的购物体验。下面将详细介绍如何给商品设置配送规则。 1. 添加配送规则。商家在配送设置->配送规则,添加配送规则。配送规则支持的功…

openpnp - 做一个抛料盒

文章目录 openpnp - 做一个抛料盒概述效果图零件 - 抛料盒主体零件 - 磁铁仓盖板END openpnp - 做一个抛料盒 概述 8mm散料飞达做回来了, 上面用的长方形磁铁(4x6x10mm)透过0.8mm的3D打印薄壁, 和固定铁板的吸力很大, 用磁力固定的非常好. 正好缺一个抛料盒, 就按照散料飞达的…

Vue中拖动排序功能,引入SortableJs,前端拖动排序。

背景: 作为一名前端开发人员,在工作中难免会遇到拖拽功能,分享一个github上一个不错的拖拽js库,能满足我们在项目开发中的需要,支持Vue和React,下面是我在vue后台项目中中使用SortableJS的使用详细流程&am…

现代C++:使用 shared_from_this 防止 this 提前被释放

首先概括一下shared_from_this的作用:可以在类的成员函数中直接通过this得到指向当前所在对象的shared_ptr的智能指针,具体操作如下。 使用方法 设需要提供shared_from_this方法的类为C0定义为类,首先需要将C0定义为 std::enable_shared_fr…

NCAA棒球介绍·棒球1号位

NCAA棒球介绍 1. NCAA简介 NCAA(National Collegiate Athletic Association)的历史与发展 NCAA,这个拥有94年悠久历史的体育联盟,从一所校际体育比赛,发展成为世界上最大的大学体育组织,NCAA的发展历程充…

.NET Core发布到IIS

项目介绍 1、开发工具Visual Studio 2017,语言C#,SQL SERVER,WIN10 2、本地IIS,手机上或其他用户在和本地在同一个局域网内访问,同时要把防火墙关掉 3、IIS全名Internet Information Services,用来发布网站 先决条件 安…

[UE4][C++]使用qrencode动态生成二维码

一、使用CMake编译x64版本qrencode 下载地址 GitHub - fukuchi/libqrencode: A fast and compact QR Code encoding libraryA fast and compact QR Code encoding library. Contribute to fukuchi/libqrencode development by creating an account on GitHub.https://github.…

同创永益郑阳|与数智化共舞·业务稳定性保障新动力

2023年8月2日,由北大创新评论主办的2023 Inno China中国产业创新大会-保险产业创新论坛在京举办。本次论坛由同创永益、青牛软件、DaoCloud道客联合主办,INNO创新家、产业集群发展提供战略支持,未名数创承办,邀请到了学术专家、行…

抖音怎样发才有更多人看?四川玖璨电商

抖音是一款非常受欢迎的短视频应用程序,如果你想让更多人看到你的视频,那么你需要学习如何正确地使用抖音平台。在本文中,我们将提供一些有用的建议,以帮助你增加你的观众数量,让你的视频更加受欢迎。 1. 精心选择主题…

配置/var/tmp/fstab 权限/配置用户账户/查找文件/查找字符串

目录 配置/var/tmp/fstab 权限 配置用户账户 查找文件 查找字符串 创建归档 配置/var/tmp/fstab 权限 配置文件权限,将文件 /etc/fstab 复制到 /var/tmp/fstab 。配置 /var/tmp/fstab 的权限以满足 如下条 件: /var/tmp/fstab 属于 root 用户…

光致发光荧光量子产率测试系统

荧光量子产率,是单位时间(s)内,发射荧光的光子数与吸收激发光的光子数之间的比值,符号φf。它表示物质将吸收的光能转变成荧光的能力,是荧光物质一个最基本而重要的参数。φf值的大小与物质的化学结构紧密相…

ARM64是什么意思?与x86有什么区别?

你知道ARM64是什么意思?与x86有什么区别?哪款堡垒机支持ARM64架构?且听我道来。 ARM64是什么意思? 【回答】:ARM64是CPU构架的一种,通常用于手机、平板等CPU,目前笔记本电脑也会采用ARM64构架…

SpringBoot案例 调用第三方接口传输数据

一、前言 最近再写调用三方接口传输数据的项目,这篇博客记录项目完成的过程,方便后续再碰到类似的项目可以快速上手 项目结构: 二、编码 这里主要介绍HttpClient发送POST请求工具类和定时器的使用,mvc三层架构编码不做探究 pom.x…

磁力线试验+多图

今天要磨制一个钢针工具。磨下来很多的铁屑,灵机一动,何不来试验一下磁铁的磁力线。这可是难得的材料。 下放7颗强力磁铁,可见强力磁铁的磁力线非常集中。 下放直径4CM的喇叭磁铁 强力磁铁U型铁 强力磁铁E型铁氧体磁芯,可见磁力线…

项目管理工具和方法有哪些:了解项目管理的必备工具和有效方法

先谈谈什么是项目管理,简单直白,就是对项目进行管理。项目管理涉及有效的计划和对工作的系统管理,但很多工具可以使项目管理更有效、更高效。比如,Zoho Projects项目管理工具。 1.项目合理拆解 当确定了项目目标后,无疑…