情感分类——Attention

9 篇文章 0 订阅

  • 本文首先主要介绍Attention机制,会另写一篇重新学习并介绍当下刚火热,正处于起步阶段的Transformer。
  • 在开始之前,我希望你对cnn,rnn,transformer的现状有一个简单的印象,可以看之前记过的一个笔记:
  • 情感分类——Attention(前篇)
  • 情感分类——Attention(前篇续)
  • 当然,如果不喜欢看文字的小伙伴,可以去B站搜索找对应视频学习,文末也有对应的推荐传送门(这东西很多了)。
  • 本篇开始!

Encoder-Decoder框架

  • 你可能会有疑问,明明是说attention,为什么扯这个,给你个不严谨的说法,经典的encoder-decoder框架有缺陷,so,我们引入attention机制改正它的缺陷。所以第一步,我们必须知道这个框架是什么?同时它的缺陷是什么?
  • 需要注意的是,Encoder-Decoder并不是一个具体的模型,而是一类框架。Encoder和Decoder部分可以是任意的文字,语音,图像,视频数据,模型可以采用CNN,RNN,BiRNN、LSTM、GRU等等。所以基于Encoder-Decoder,我们可以设计出各种各样的应用算法。
  • Encoder-Decoder框架有一个最显著的特征就是它是一个End-to-End学习的算法

抽象的文本处理领域的encoder-decoder框架
在这里插入图片描述

  • 它是怎么工作的?
    在这里插入图片描述

  • 为了统一,这里我们选encoder和decoder里的模型为RNN。

  • 对于句子对<Source,Target>,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。为了实现这个目的,我们做需要做两件事。

  • 第一件,通过encoder将我们输入的句子的信息,整合到C里面,用函数表示encoder的功能就是:

  • C = F( x1, x2, x3… xm )

  • 第二件事儿就是decoder,所谓的解码,将我们抽取出来的信息,利用到我们的target生成中去( 有一点不同的是,encoder时还依赖于前面解码出来的内容),所以整个decoder的功能就是

  • 已有:y1,y2…yi-1

  • 求: yi

  • yi = g( C, y1, y2…yi-1)

  • 我们从概率的角度看就是:
    在这里插入图片描述

  • 因为是RNN,所以我们可以把每一个条件概率进一步写为:
    在这里插入图片描述

  • 其中st是输出RNN中的隐藏层,c代表之前提过的语义向量,yt−1表示上个时刻的输出。g表示一种非线性变换,往往就是指一种多层的函数,可以输出yt的概率(比如多层RNN后接softmax)。

  • 这里我们单纯就可以总结出,想求target,我们只需要有c就好了,即:y只和c相关。

上面介绍的展开图
在这里插入图片描述

缺点

  • 我觉得我暗示的已经很明显了:基本的Encoder-Decoder模型非常经典,但是也有局限性。最大的局限性就在于编码和解码之间的唯一联系就是一个固定长度的语义向量c。也就是说,编码器要将整个序列的信息压缩进一个固定长度的向量中去。
  • 这样做有两个弊端,一是语义向量无法完全表示整个序列的信息,二是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打个折扣[5]。
  • 当然,还有一个可以和attention对比的弊端,这里target生成时,都使用同一个c,导致所有生成的单词,都会以同样的态度,对待所有的输入单词。

引入Attention

  • 注意我们这里只讨论soft-attention( 区别于 hard-attention)。

引入Attention后的结构(图是随便找的,但是我个人认为这个图更能体现Attention的感觉)

在这里插入图片描述

  • 我们来梳理一下思路:
  • 目的:由于原本encode-decode框架encode时,将所有信息全都压缩到一个向量里,这种做法随着encode的句子的长度变长,越发不合理,所以我们要改进。那怎么改进?
  • 我们肯定不能再把信息压缩成一个了,所以,干脆我们抛掉原来的思维,我直接将所有单元的输出全部保留(即,图中的 r1,r2…可以看做原本对应位置单词输入的编码,本来我把所有信息都压缩到最后一个的隐藏层,现在我所有单元的输出全部保留)
  • 有这么多信息,那由于句子过长信息丢失的问题解决了,可我怎么利用这些信息呢?
  • 好了,这一步骤,attention思想登场了!
  • 举例子:
  • 已知: y1, y2 … yi-1
  • 求:yi
  • 方法: yi = F( ci, y1,y2…yi-1)
  • 现在的关键是,我的ci怎么求,也就是,我怎么从r1,r2,r3(见上图)中找到此时我需要的信息c,并把这个c作为输入,一次求出yi。

找Ci

  • 个人认为,直接给出解决思路,然后反过来思考可行性更好点。单纯直接引出太直接了,我还是给出我参考文章里的例子。

  • 如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。

  • 在翻译“杰瑞”这个中文单词的时候,分心模型里面的每个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,但是分心模型是无法体现这一点的,这就是为何说它没有引入注意力的原因。

  • 上面的例子中,如果引入Attention模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:(Tom,0.3)(Chase,0.2) (Jerry,0.5)

  • 每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。这对于正确翻译目标语单词肯定是有帮助的,因为引入了新的信息。

  • 很巧秒的思想,这就是注意力机制,它是一种思想,只不过这里我们这样呈现了而已。

  • 我们想到了解决思路,所以:

  • ci = a1 * r1 + a2 * r2 + …+ ac * rc (符号可以参考上面那个图,c表示输入句子的长度)

可视化的效果图
在这里插入图片描述

  • 这里另一个问题出来,我的ai怎么求?即每个单词我应该怎么分配权重

权重?

  • 换个高大上的说法就是:注意力分配概率分布怎么求?
  • 第一,肯定是个自动的过程; 第二,得有一定的合理性。
  • 好吧,我直接说它是怎么做的。
  • 用Target输出句子i-1时刻的隐层节点状态Hi-1去一一和输入句子Source中每个单词对应的RNN隐层节点状态rj进行对比,即通过函数F(rj,Hi-1)来获得目标单词yi和每个输入单词对应的对齐可能性。
  • 直白举例子:
  • 已知: y1…yi-1 ( 由于是RNN,所以我也知道了 H1…Hi,这里表示的是隐藏层 )
  • 这里用Hi-1和每一个输入单词的vector(这样说比较直观)比较相似性,用这个比叫结果来当作我们要求的权重。
  • 上面这句话数学表示就是: similary( Hi-1, rj ) j = 1,2…n,其中 similary是个函数

到这里,我们终于可以开始扯那些泛泛之谈了,而且也看的懂了

  • Attention机制就是根据当前的某个状态,从已有的大量信息中选择性的关注部分信息的方法。Attention机制打破了传统Encoder-Decoder结构在解码时都依赖于内部一个固定长度向量的限制。基本思想是:通过保留编码器对输入序列编码的中间结果,然后训练一个模型来对这些输入进行选择性的学习并且在输出时将输出序列与之进行关联,不再是使用固定的向量c,而是在模型输出时会选择性地专注考虑输入中的对应相关的信息。

  • Attention机制可以理解成:当我们人在看一样东西的时候,我们当前时刻关注的一定是我们当前正在看的这样东西的某一地方。换句话说,当我们目光移到别处时,注意力随着目光的转移也在转移。这意味着,当人们注意到某个目标或某个场景时,该目标内部以及该场景内每一处空间位置上的注意力分布是不一样的。

但是,我们还需要思考两个问题?

  1. 为什么用Hi-1,不用Hi啊?
  2. similary这个用于评价相似性的函数,具体是什么?

为什么用Hi-1

  • 个人暂时没有找到对应的资料,这里先留个坑。

相似性函数

  1. 点积求相似性
  2. 余弦求相似性
  3. 搞一个神经网络求相似性
  • 我直接贴我参考文章的图了,自己实在不想打公式了。

  • 对于一,我们需要注意维度的问题,维度不同你点积不了,按照神经网络管用套路,加一个转换矩阵就好啦。
    在这里插入图片描述

  • 对于二:

在这里插入图片描述

  • 对于三,一般都用加了转换矩阵的点积,因为可解释性比粗暴用一个网络更强一点,三的格式如下:
    在这里插入图片描述

  • 最后,我们只需要对求出的结果套一层softmax把结果变为概率,就ok了。

在这里插入图片描述

Attention的本质探讨

  • 拓展视野的章节,觉得不错,就放上来了。

  • 一般在自然语言处理应用里会把Attention模型看作是输出Target句子中某个单词和输入Source句子每个单词的对齐模型,这是非常有道理的。目标句子生成的每个单词对应输入句子单词的概率分布可以理解为输入句子单词和这个目标生成单词的对齐概率,这在机器翻译语境下是非常直观的:传统的统计机器翻译一般在做的过程中会专门有一个短语对齐的步骤,而注意力模型其实起的是相同的作用。

  • 从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。

在这里插入图片描述

  • 参考上图,可以将Attention机制看作一种软寻址(Soft Addressing):Source可以看作存储器内存储的内容,元素由地址Key和值Value组成,当前有个Key=Query的查询,目的是取出存储器中对应的Value值,即Attention数值。通过Query和存储器内元素Key的地址进行相似性比较来寻址,之所以说是软寻址,指的不像一般寻址只从存储内容里面找出一条内容,而是可能从每个Key地址都会取出内容,取出内容的重要性根据Query和Key的相似性来决定,之后对Value进行加权求和,这样就可以取出最终的Value值,也即Attention值。所以不少研究人员将Attention机制看作软寻址的一种特例,这也是非常有道理的。

END

  • 本文不想添加过多的内容,只想以最单纯的方式,来一次有逻辑的探讨,尽可能简化这个环节,至于self-attention和attention的分类,我准备另外开一个文章。

本篇完!

参考

[ 1 ] 深度学习中的注意力模型(2017版)

[ 2 ] ]Attetion计算稍微详细(又不太数学化的文章)

[ 3 ] BERT大火却不懂Transformer?读这一篇就够了

[ 4 ] The Annotated Transformer

[ 5 ] 自然语言处理中的Encoder-Decoder模型

[ 6 ]Attention 机制学习小结

[ 7 ] b站上一个介绍视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值