情感分类——Attention(前篇)

32 篇文章 1 订阅
9 篇文章 0 订阅

君恩如水向东流,得宠忧移失宠愁。莫向樽前奏花落,凉风只在殿西头 ——李商隐

  • 文章题目: 《 带你全面认识自然语言处理三大特征抽取器(CNN/RNN/TF)》
  • 作者:张俊林
  • 链接:https://www.jiqizhixin.com/articles/2019-02-22-9
  • 知乎同文连接:https://zhuanlan.zhihu.com/p/54743941
  • 为了避免自己看过一篇经典好文,结果又草草忘了,所以本文对这个篇文章做一个阅读笔记,顺便理一下作者的思路。( ps: 原作者标题名字=子很有趣,我就拿过来直接用了 )
  • 开篇

开篇

  • 首先要明确我们要干什么,我们想证明一句话: 从 NLP 领域的特征抽取器角度来说,Transformer 会逐步取代 RNN 成为最主流的特征抽取器,所以,让我们把注意里放在特征提取这四个字上。
  • 现在流行的特征提取器有: CNN , RNN, Transformer
  • 如果用一句话说明三个的现状的话,作者给出这样的解释:
  • RNN 人老珠黄,已经基本完成它的历史使命,将来会逐步退出历史舞台;CNN 如果改造得当,将来还是有希望有自己在 NLP 领域的一席之地,如果改造成功程度超出期望,那么还有一丝可能作为割据一方的军阀,继续生存壮大,当然我认为这个希望不大,可能跟宋小宝打篮球把姚明打哭的概率相当;而新欢 Transformer 明显会很快成为 NLP 里担当大任的最主流的特征抽取器。
  • 我们开始论证上面的论述。

战场侦查

第一步,了解NLP任务的特点以及任务

  • NLP任务的特点(NLP 的输入往往是一句话或者一篇文章):
    1. 输入是个一维线性序列(一个样本输入,区别于一张图片)
    1. 输入是不定长的,有的长有的短,而这点其实对于模型处理起来也会增加一些小麻烦;(一般都是设置一个max_seq,在数据读取以这个参数为标准进行:填充/截断)
    1. 单词或者子句的相对位置关系很重要,两个单词位置互换可能导致完全不同的意思。(这一点很重要)
    1. 句子中的长距离特征对于理解语义也非常关键。(例如:小明,经过很长的距离后,特征提取器是否会知道加粗部分是有关系的,需要提取出来,这一点对语义很关键)
  • 最后,对于三个特征提取器,他们只是一个解决方案,针对我们NLP问题,他们就要作出调整,进行各种各样的改造,上面的特点就是他们需要尽可能做到的东西。每一个提取器都有其强大的地方,但是如果其强大不适用于本领域,那不就是张飞绣花吗…

NLP领域分类

  • NLP 是个很宽泛的领域,包含了几十个子领域,理论上只要跟语言处理相关,都可以纳入这个范围。

  • 经过归结,我们分为四大类简单介绍:

  • 第一类,序列标注,( 例如 : 中文分词/词性标注/命名体识别/语义标注…), 它的特点是句子中每个单词要求模型根据上下文都要给出一个分类类别,本质是一个分类问题(除去中文分词)。

  • 个人最近接触这一部分较多,可以简单说一下。上面的序列标注任务,如果做的话,现在方法大致应该是分两块:概率图 or 深度学习,单纯从名字看,也可以看得出,前者是基于概率统计的,属于深度学习没有在这个领域火的时候的做法,后者就不说了。概率图模型属于一个很独立的模块,本人掌握还不够不敢妄言,基本上对于上面的序列问题,常见的是用里面的:HMM( 隐马尔科夫 ) 和 CRF (条件随机场,但是我们一般用线性的)去做,本质其实就是预测分类问题,不再展开,有空肯定我还得再学一遍,那时候再出专门的文章。

  • 第二类,分类任务,它的特点是不管文章有多长,总体给出一个分类类别即可。( 例如:文本分类/情感分类,其实就是 input someting,output label,跟单纯的分类没啥区别,只是NLP领域分类时,有自己独特的预处理,以及自己需要考虑的问题,像上面介绍过的特点),当然个人这里吐槽下,我真菜,其实对于这种分类问题我一直认为是最简单的问题…但是做了才知道,自己以前掌握的东西跟被没落到实处。

  • 第三类,句子关系判断,(例如:Entailment(蕴含),QA , 语义改写,自然语言推理等),它的特点是给定两个句子,模型判断出两个句子是否具备某种语义关系。个人对这个领域不是很了解,句法树什么的都还没系统学,但是我仅仅看例子,觉得这个领域本质:更偏向于一个匹配问题,或者说计算相似度的问题

  • 第四类,生成式任务,(例如:机器翻译,文本摘要,写诗造句,跟CV很像),它的特点是输入文本内容后,需要自主生成另外一段文字,seq2seq算是它的经典框架了,我个人仅仅跑过一个demo,计划是未来做一个闲聊式或者其他类型的对话机器玩。

  • 好了,分类介绍完了,解决这些不同的任务,从模型角度来讲什么最重要?是特征抽取器的能力。尤其是深度学习流行开来后,这一点更凸显出来。因为深度学习最大的优点是端到端(end to end),即:把原始输入扔给好的特征抽取器,它自己会把有用的特征抽取出来。

  • 对于我们这种”尘民“来说:原本繁琐的特征工程可以全部抛弃了,现在我们需要将重点放在:如何选择一个合适的特征抽取器,喂给它大量的训练数据,设定好优化目标(loss function),告诉它你想让它干嘛……… 然后等结果。

  • "上民"们都是在想着,如何设计一个更强大的特征抽取器,这样的上民还有一个别称:算法大神。

作者: 身为资深 Bug 制造者和算法工程师,你现在需要做的事情就是:选择一个好的特征抽取器,选择一个好的特征抽取器,选择一个好的特征抽取器,喂给它大量的训练数据,设定好优化目标(loss function),告诉它你想让它干嘛……… 然后你觉得你啥也不用干等结果就行了是吧?那你是我见过的整个宇宙中最乐观的人……. 你大量时间其实是用在调参上…….。从这个过程可以看出,如果我们有个强大的特征抽取器,那么中初级算法工程师沦为调参侠也就是个必然了,在 AutoML(自动那啥)流行的年代,也许以后你想当调参侠而不得,李斯说的吾欲与若复牵黄犬,俱出上蔡东门逐狡兔,岂可得乎!请了解一下。所以请珍惜你半夜两点还在调整超参的日子吧,因为对于你来说有一个好消息一个坏消息,好消息是:对于你来说可能这样辛苦的日子不多了!坏消息是:对于你来说可能这样辛苦的日子不多了!!!那么怎么才能成为算法高手?你去设计一个更强大的特征抽取器呀。

沙场老将 RNN:廉颇老矣,尚能饭否?

  • 为何 RNN 能够成为解决 NLP 问题的主流特征抽取器?,为什么大佬们会想到它?
  • 我们应该这样想,RNN解决了上面NLP特征中的哪些问题?
  • 1)RNN 的序列结构天然适配解决 NLP 的问题 (第一个)
  • 2)NLP 的输入往往是个不定长的线性序列句子,而 RNN 本身结构就是个可以接纳不定长输入的由前向后进行信息线性传导的网络结构。(我们见到的一层RNN网络其实是一个basic RNN单元根据时间步的展开,其时间步长根据输入数据维度决定,所以这里说的变长没毛病)
  • 3)在LSTM引入三个门后,对于捕获长距离特征也是非常有效的。

RNN的发展

  1. 普通的RNN (只能从左到右获取信息,单向)
  2. 双向RNN (双向,即所谓的上下文信息都有了)
  3. LSTM 和 GRU ( RNN反向传播容易出现梯度指数级的增长或者消失,即:梯度爆炸或者梯度消失,rnn引入门控制机制,解决这一问题,同时lstm对长距离依赖表现也不错)
  • 补充
  • 1)图像领域最早由HighwayNet/Resnet等导致模型革命的skip connection的原始思路就是从LSTM的隐层传递机制借鉴来的。
  • 2)NLP又从图像领域借鉴并引入了attention机制(从这两个过程可以看到不同领域的相互技术借鉴与促进作用)

RNN的缺陷

  • 个人简单叙述就是:
  • (由于本身存在依赖关系)RNN无法并行计算 -> 工业界很难应用( 无法并行,导致速度太慢 ) -> 工业界无法落地,导致,空有理论 -> 空有理论,没有落地,意味着:无意义
  • 有缺陷,就要改进,我们不深入理解原理,我们简单叙述,首先,我们指出RNN的依赖问题:

在这里插入图片描述

  • 如上图,为了yt+2,我们必须计算整个路径上的所有单元后,才可以计算出它,这个问题是RNN本身设计结构导致的,而这个依赖是RNN无法并行计算的根本原因,所以RNN训练比较慢
  • 改进思路,既然无法并行的原因是依赖问题,那我们就打破依赖,基于这个思路,有两种方法。
  • 个人起名字:横向打破,纵向打破

横向打破
在这里插入图片描述
纵向打破

在这里插入图片描述

  • 看图我觉得很容易理解,两种方式之间比较,很明显,后者比较好,因为前者只是各个层之间的打破,层的数量一般不多,层内限制还是很大问题,但是后者,用作者的话来说:哈哈,你好,CNN

作者:我个人对于RNN的并行计算能力持悲观态度,主要因为RNN本质特性决定了我们能做的选择太少。无非就是选择打断还是不打断隐层连接的问题。如果选择打断,就会面临上面的问题,你会发现它可能已经不是RNN模型了,为了让它看上去还像是RNN,所以在打断片段里仍然采取RNN结构,这样无疑会拉慢速度,所以这是个两难的选择,与其这样不如直接换成其它模型;如果我们选择不打断,貌似只能在隐层神经元之间进行并行,而这样做的缺点是:一方面并行能力上限很低;另外一方面里面依然存在的序列依赖估计仍然是个问题。这是为何悲观的原因,主要是看不到大的希望。

偏师之将CNN:刺激战场绝地求生

  • 刚做完TextCNN,这里正好来窥一波它的发展历史。
  • 我们先来看一下CNN在NLP的发展历史,以及改进结果。

TextCNN

  • 应该是将CNN引入NLP领域的领航者了。
    在这里插入图片描述
  • 优点就不说了,我们来说一下它的缺点,主要两方面:
  • 第一方面, 单层卷积无法捕获远距离特征。
  • 原因:(放上原话)CNN捕获到的是什么特征呢?从上述怀旧版本CNN卷积层的运作机制你大概看出来了,关键在于卷积核覆盖的那个滑动窗口,CNN能捕获到的特征基本都体现在这个滑动窗口里了。大小为k的滑动窗口轻轻的穿过句子的一个个单词,荡起阵阵涟漪,那么它捕获了什么?其实它捕获到的是单词的k-gram片段信息,这些k-gram片段就是CNN捕获到的特征,k的大小决定了能捕获多远距离的特征。也就是单层,CNN,它一次只看得到filter内的内容。
  • 第二方面,池化层会吞掉句子原本的位置信息。
  • 原因:input:一个句子,对句子卷积后的结果,由于卷积是以stride为步长,按照从左到右的顺序进行卷积,所以结果还可以看作一个序列(保留有相对的位置信息),但是后面接上一个池化层呢?仔细看图,池化层后,一切都没了,它吞掉了所有,只留下了最大的那个特征,这么以来他的位置信息就没了。

在这里插入图片描述

CNN的进化:物竞天择的模型斗兽场

  • 有了上面两个缺点,那大神们是怎么解决的?

针对第一个问题

  • 解决方案有两个:
  • 为了和上面RNN的解决方案做对比,我这里再起一个cuo cuo的名字
  • 横向skip, 纵向stack

横向skip

在这里插入图片描述

  • 放上原话 : 滑动窗口大小k假设为3,就是只接收三个输入单词,但是我们想捕获距离为5的特征,怎么做才行?显然,如果卷积核窗口仍然覆盖连续区域,这肯定是完不成任务的。提示一下:你玩过跳一跳是吧?能采取类似策略吗?对,你可以跳着覆盖呀,是吧?这就是Dilated 卷积的基本思想,确实也是一种解决方法。

纵向stack
在这里插入图片描述

  • 放上原话:把深度做起来。第一层卷积层,假设滑动窗口大小k是3,如果再往上叠一层卷积层,假设滑动窗口大小也是3,但是第二层窗口覆盖的是第一层窗口的输出特征,所以它其实能覆盖输入的距离达到了5。如果继续往上叠加卷积层,可以继续增大卷积核覆盖输入的长度。

对比两种方案:

  • Dilated CNN偏技巧一些,而且叠加卷积层时超参如何设置有些学问,因为连续跳接可能会错过一些特征组合,所以需要精心调节参数搭配,保证所有可能组合都被覆盖到。相对而言,把CNN作深是主流发展方向。
  • 但是做深也有缺陷。
  • 自从CNN一出现,人们就想各种办法试图把CNN的深度做起来,但是现实往往是无情的,发现怎么折腾,CNN做NLP问题就是做不深,做到2到3层卷积层就做不上去了,网络更深对任务效果没什么帮助。目前看来,还是深层网络参数优化手段不足导致的这个问题,而不是层深没有用。后来Resnet等图像领域的新技术出现后,很自然地,人们会考虑把Skip Connection及各种Norm等参数优化技术引入,这才能慢慢把CNN的网络深度做起来。

针对第二个问题

  • 同样也是两个:
  • 我起不了名字了…
  • 第一个:由于CNN的卷积层其实是保留了相对位置信息的,所以,中间层不要随手瞎插入Pooling层,问题就不大。简单来说,就是舍弃pooling层。

作者:
在NLP领域里,目前CNN的一个发展趋势是抛弃Pooling层,靠全卷积层来叠加网络深度,这背后是有原因的(当然图像领域也是这个趋势)。

  • 第二个: 类似ConvS2S那样,专门在输入部分给每个单词增加一个position embedding,将单词的position embedding和词向量embedding叠加起来形成单词输入,这样也可以,也是常规做法。

放上一句作者很有道理的话:

  • 介绍了怀旧版CNN是如何在NLP修罗场一步步通过自我进化生存到今天的。CNN的进化方向,如果千言万语一句话归纳的话,那就是:想方设法把CNN的深度做起来,随着深度的增加,很多看似无关的问题就随之解决了。就跟我们国家最近40年的主旋律是发展经济一样,经济发展好了,很多问题就不是问题了。最近几年之所以大家感到各方面很困难,症结就在于经济不行了,所以很多问题无法通过经济带动来解决,于是看似各种花样的困难就冒出来,这是一个道理。
  • 最后,CNN本身有良好的并行能力。

白衣骑士Transformer:盖世英雄站上舞台

Transformer的历史和资料
  • Transformer是谷歌在17年做机器翻译任务的“Attention is all you need”的论文中提出的,引起了相当大的反响。 每一位从事NLP研发的同仁都应该透彻搞明白Transformer,它的重要性毫无疑问,尤其是你在看完我这篇文章之后,我相信你的紧迫感会更迫切,我就是这么一位善于制造焦虑的能手。
  • 想要入门Transformer的可以参考以下三篇文章:
  • 一个是Jay Alammar可视化地介绍Transformer的博客文章The Illustrated Transformer ,非常容易理解整个机制,建议先从这篇看起,这是中文翻译版本:
  • https://zhuanlan.zhihu.com/p/54356280
  • 第二篇是 Calvo的博客:Dissecting BERT Part 1: The Encoder ,尽管说是解析Bert,但是因为Bert的Encoder就是Transformer,所以其实它是在解析Transformer,里面举的例子很好:(不能翻墙这篇可能打不开)
  • https://link.zhihu.com/?target=https%3A//medium.com/dissecting-bert/dissecting-bert-part-1-d3c3d495cdb3
  • 再然后可以进阶一下,参考哈佛大学NLP研究组写的“The Annotated Transformer. ”,代码原理双管齐下,讲得也很清楚。
  • http://nlp.seas.harvard.edu/2018/04/03/attention.html
Transformer简单介绍
  • 作者没有详细解释解释Transformer原理,本人学过一遍,但是已经模糊了,而且不准备放这里讲,这篇文章已经太长了…

  • 我直接引用作者的内容,做个简单的介绍。

  • 本文所说的Transformer特征抽取器并非原始论文所指。我们知道,“Attention is all you need”论文中说的的Transformer指的是完整的Encoder-Decoder框架,而我这里是从特征提取器角度来说的,你可以简单理解为论文中的Encoder部分.

在这里插入图片描述

这里需要强调一下,尽管Transformer原始论文一直重点在说Self Attention,但是目前来看,能让Transformer效果好的,不仅仅是Self attention,这个Block里所有元素,包括Multi-head self attention,Skip connection,LayerNorm,FF一起在发挥作用。为什么这么说?你看到后面会体会到这一点。

NLP任务中的Transformer

  • 首先,自然语言一般是个不定长的句子,那么这个不定长问题怎么解决呢?Transformer做法跟CNN是类似的,一般设定输入的最大长度,如果句子没那么长,则用Padding填充,这样整个模型输入起码看起来是定长的了。
  • 另外,NLP句子中单词之间的相对位置是包含很多信息的,上面提过,RNN因为结构就是线性序列的,所以天然会将位置信息编码进模型;而CNN的卷积层其实也是保留了位置相对信息的,所以什么也不做问题也不大。但是对于Transformer来说,为了能够保留输入句子单词之间的相对位置信息,必须要做点什么。为啥它必须要做点什么呢?因为输入的第一层网络是Muli-head self attention层,我们知道,Self attention会让当前输入单词和句子中任意单词发生关系,然后集成到一个embedding向量里,但是当所有信息到了embedding后,位置信息并没有被编码进去。所以,Transformer不像RNN或CNN,必须明确的在输入端将Positon信息编码,Transformer是用位置函数来进行位置编码的,而Bert等模型则给每个单词一个Position embedding,将单词embedding和单词对应的position embedding加起来形成单词的输入embedding,类似上文讲的ConvS2S的做法。
  • 而关于NLP句子中长距离依赖特征的问题,Self attention天然就能解决这个问题,因为在集成信息的时候,当前单词和句子中任意单词都发生了联系,所以一步到位就把这个事情做掉了。不像RNN需要通过隐层节点序列往后传,也不像CNN需要通过增加网络深度来捕获远距离特征,Transformer在这点上明显方案是相对简单直观的。

华山论剑:三大特征抽取器比较

  • 上面这些其实都不是这些文章的精华,这里才是我个人认为这篇文章最好的地方,它给了我一个宏观的参考价值,作者就:
  • 语义特征提取能力;
    长距离特征捕获能力;
    任务综合特征抽取能力;
    并行计算能力及运行效率
    对三者在这些维度各自表现进行了比较。

( 链接: https://zhuanlan.zhihu.com/p/54743941 )

END

  • 第一:
    由于是原作者的实验比较结果,直接拿过来不好,而且上面原文个人感觉衔接不紧凑的地方已经顺完了,剩下就是几个表格的对比,个人这里就不套用大佬成果了,给你们连接(同开头),当然个人准备开一篇新的做个转载,把内容放进去。
  • 第二:
  • 原文章评论里有不少觉得不错的点,但是由于这种评论不是系统成文,所以个人建议读,不放出了。

全文完!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值