NLP三大特征抽取器概况认识

0x00 起始

今天1.14在往返杭州的火车上读了机器之心的一篇好文,获益很大,此处外链

我水平很菜,以下是我对文章的一些摘要和理解

0x01 NLP任务分类

NLP的四大类任务
具体解释见原文。

0x02 特征抽取器状况总体概述

  • RNN 人老珠黄
  • CNN 如果改造得当,将来还是有希望有自己在 NLP 领域的一席之地,如果改造成功程度超出期望,那么还有一丝可能作为割据一方的军阀,继续生存壮大
  • 新欢 Transformer 明显会很快成为 NLP 里担当大任的最主流的特征抽取器

0x03 RNN

  • 在04-18占主流地位
  • LSTM和GRU,对于长距离捕获变得有效
  • 严重问题一:并行计算能力差。

    原因:T 时刻的隐层状态 St 还依赖 T-1 时刻的隐层状态 S(t-1) 的输出。形成了所谓的序列依赖关系,隐层神经元之间的连接是全连接,就是说 T 时刻某个隐层神经元与 T-1 时刻所有隐层神经元都有连接,无法并行计算

改进方法:
法①:
- 并行释义(假设隐层神经元有 3 个,那么我们可以形成 3 路并行计算(红色箭头分隔开成了三路),而每一路因为仍然存在序列依赖问题,所以每一路内仍然是串行的)
- 如何改变隐藏层全连接现状(T 时刻和 T-1 时刻的隐层神经元之间的连接关系需要改造,从之前的全连接,改造成对应位置的神经元有连接,和其它神经元没有连接)(e.g. 全连接 to 哈达马乘积)

法② 为了能够在不同时间步输入之间进行并行计算,那么只有一种做法,那就是打断隐层之间的连接,但是又不能全打断,因为这样基本就无法捕获组合特征了,所以唯一能选的策略就是部分打断,比如每隔 2 个时间步打断一次,但是距离稍微远点的特征如何捕获呢?只能加深层深,通过层深来建立远距离特征之间的联系
作者说法②类似于 CNN~

0x04 CNN

  • NLP中早期的怀旧版CNN(Kim 2014)
  • 问题一、k-gram导致的问题:单卷积层无法捕获远距离特征

解决方法① 跳着覆盖——Dilated卷积

解决方法② 加深CNN网络来捕获远距离特征

  • 无情现实: NN 做 NLP 问题就是做不深,做到 2 到 3 层卷积层就做不上去了,网络更深对任务效果没什么帮助
  • 问题二: 单词位置信息的编码

    问题原因:RNN 因为是线性序列结构,所以很自然它天然就会把位置信息编码进去;CNN 的卷积核是能保留特征之间的相对位置的。但是如果卷积层后面立即接上 Pooling 层的话,Max Pooling 择一强弃其弱位置信息就被扔掉了

针对问题二注意事项:

①别瞎插入 Pooling 层破坏位置编码

②或者专门在输入部分对 position 进行编码也行

③也可以类似 ConvS2S 那样,专门在输入部分给每个单词增加一个 position embedding,将单词的 position embedding 和词向量 embedding 叠加起来形成单词输入

  • NLP界主流CNN(ConvS2S、TCN*)
    1-D 卷积层             叠加深度
    Skip Connection 辅助优化
    Dilated CNN 待选手段
    卷积核里引入 GLU 门控 CNN 模型必备

0x05 Transform

  • 谷歌17年论文【Attention is all you need】中提出的
  • 每一位从事 NLP 研发的同仁都应该透彻搞明白 Transformer
  • 一般指的是抽取器角度来说Transformer,而不是完整的Encoder-Decoder
  • Jay Alammar把每个Block称为Encoder不太符合常规叫法)是由若干个相同的Transformer Block堆叠成的
    Transformer Block

  • 能让Transformer效果好的,不仅仅是Self attention,这个Block里所有元素,包括Multi-head self attention,Skip connection,LayerNorm,FF一起在发挥作用

  • Padding填充来定长
  • 位置信息编码方式:用位置函数在输入端将Positon信息编码
  • 句子中长距离依赖特征的问题: Self attention天然就能解决
  • Transformer有两个版本,base包含12个Block叠加,big包含24个

0x06 位置信息编码总结

  • RNN天然
  • CNN卷积层其实也是保留了位置相对信息的,但注意别乱用pooling破坏
  • Transform使用位置函数单独编码
  • Bert等模型则给每个单词一个Position embedding,将单词embedding和单词对应的position embedding加起来形成单词的输入embedding,类似上文讲的ConvS2S的做法

0x07 句子中长距离依赖特征的问题

  • RNN需要通过隐层节点序列往后传
  • CNN需要通过增加网络深度或跳跃来捕获远距离特征
  • Transformer:Self attention天然就能解决该问题~

0x08 华山论剑——三大抽取器比较

对比内容:


1.语义特征提取能力;
2.长距离特征捕获能力;
3.任务综合特征抽取能力;
4.并行计算能力及运行效率

学了这个3h了累死了
具体的实验我下次再看呜呜┭┮﹏┭┮
顺便再补牢Transform(下期)

照搬下大佬的结论:

单从任务综合效果方面来说,Transformer明显优于CNN,CNN略微优于RNN。速度方面Transformer和CNN明显占优,RNN在这方面劣势非常明显。这两者再综合起来,如果我给的排序结果是Transformer>CNN>RNN

从速度和效果折衷的角度看,对于工业界实用化应用,我的感觉在特征抽取器选择方面配置Transformer base是个较好的选择。

最后容我喊句:“Transform牛逼!”