前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >词向量(2)--从ELMo到Bert

词向量(2)--从ELMo到Bert

作者头像
流川枫
发布2020-04-24 11:04:04
1.4K0
发布2020-04-24 11:04:04
举报
文章被收录于专栏:AI星球AI星球

作为一个NLPer,是时候跟你们介绍一下谁是真正的ELMo与Bert啦....

是的...它们是两位来自「芝麻街」的美籍大明星...

好的...介绍完毕,

是不是真的很简单...晚安!

其实,本文到这里,"核心内容"就已经讲完啦...当然如果你还不困的话,可以继续往下看,应该会有助于睡眠的

...

前言

上一篇文章,我们介绍词向量(1)--从word2vec到ELMo,关注的角度是从静态的词向量到动态的词向量(该篇属于旧闻新写,构思的时候还没出现Bert等跨时代的思想)...

时至今日,NLP已经进入了一个新的时代:大规模的预训练的语言模型,开始在NLP的各个研究领域的展现出其碾压一切的王者姿态。

因此,出现了这样的声音:

NLP领域的ImageNet时代到来:词嵌入「已死」,语言模型当立...

从2013年出现的word2vec到如今的Bert,一个显著的转变是:从仅仅预训练词向量来初始化NLP模型的第一层发展到预训练整个NLP模型,预训练关注的不再仅仅是单个词汇信息,而是还有句子级别的信息,从而帮助我们更好的抽取文本的语义信息。

后ELMo时代的进化之路

ELMo模型的有哪些弱点呢?

  1. LSTM抽取特征的能力弱于transformer。
  2. 使用拼接两个双向LSTM的方式来获取文本双向信息的方式并不是真正的双向语言模型。

后续不断提出一系列新的语言模型:ULM-fit、GPT、Bert等,正是针对以上两个弱点,从「特征抽取器」+「双向语言模型」两个方面去不断的改进优化。

特征抽取器

简单的回顾一下Machine Learning领域几个典型的特征抽取器

  • CNN类
    • 只能捕获窗口内有限的词序信息
    • 改进:
      • Dilated CNN(膨胀卷积CNN):
        • 增大感受野,可以捕获较长的序列信息
  • RNN类
    • 理论上可以捕获全序列的次序信息,但由于梯度消失和爆炸的问题,很难训练用了捕获全局信息
    • 改进:
      • LSTM:
        • 梯度裁剪方法的提出也不足以解决此类问题,学习长期依赖的能力有限,但RNN的架构形式天生决定了难以并行。
      • 双向LSTM
  • Transformer
    • 完全摒弃RNN结构,采用self-attention来捕获序列的全局信息,易于并行
    • 通过引入sub-layer,模拟了残差网络
  • Transformer XL
    • 解决Transformer的输入序列必须定长的问题,真正做到了捕获全序列信息

语言模型

简单的回顾一下几种预训练语言模型

  • 自回归语言模型
    • 传统的语言模型,只能利用上文信息或者下文信息来预训练语言模型,本质上是一种单向语言模型
    • 代表:
      • ELMo
      • GPT1/2
    • 缺点:
      • 不同同时利用上下文信息
  • 自编码语言模型
    • 可以同时利用上下文信息进行训练语言模型,一种双向的语言模型
    • 代表:
      • Bert
    • 缺点:
      • 在输入侧引入[Mask]标记,导致预训练阶段和Fine-tuning阶段不一致的问题,因为Fine-tuning阶段是看不到[Mask]标记的。
  • 融合双语言模型
    • 同时融合自回归语言模型+自编码语言模型的特点,抛弃[Mask]标记。
    • 代表:
      • XLNet
        • 通过引入-双流自注意力模型
          • 内容流自注意力
          • Query流自注意力
          • 用于抛弃MASK标记

ULM-fit

ULM-fit是 Fast AI机构提出的一种将预训练的语言模型与具体的NLP任务进行的结合的一种方法。它不是具体的某种结构或模型,而是提出了一个语言模型和一个流程(process),用于针对各种具体的NLP任务(它主要是应用于文本分类问题中)。

特征提取器与 ELMo 相同也是使用LSTM,也使用单向的语言模型,基本思路也是预训练完成后在具体任务上进行 finetune,不同之处主要是:

ULM-fit 将预训练和 finetune 过程分为三个阶段:

  1. 分别是在大规模语料集上(比如 Wikitext 103,有 103 million 个词)先预训练。
  2. 再将预训练好的模型在具体任务的数据上利用语言模型来 finetune(第一次 finetune,叫做 LM finetune)。
  3. 再根据具体任务设计的模型上,将预训练好的模型作为这个任务模型的多层,再一次 finetune(第二次 finetune,如果是分类问题的话可以叫做 Classifier finetune)。

GPT

GPT 是「Generative Pre-Training」的简称,从名字看其含义是指的生成式的预训练。

GPT 也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过 Fine-tuning 的模式解决下游任务,由此NLP正式进入了两阶段时代:预训练语言模型+微调(fine-tuning)

与ULM-fit相比,它的主要改进点是:利用了Transformer代替了LSTM作为语言模型的特征抽取器,来更好的捕获长距离语言结构,然后在进行具体任务有监督微调时使用了语言模型作为附属任务训练目标。

  • 谷歌于 2017 年中提出的 Transformer框架Attention Is All You Need

但有点可惜的是,成也萧何(Transformer)败萧何(Transformer)...

GPT只 使用的 Transformer 框架中的 Decoder,实际上还是训练了一种单向的语言模型--训练的任务是根据上文预测下一个单词,还是存在不能同时利用上下文信息的致命缺点。

Bert

但GPT的遗憾没有持续太久,仅仅四个月之后,Google提出了具有跨时代意义的预训练语言模型--Bert

一个NLPer一定亲身经历过:Bert被放出来的那一周...席卷了NLP的社交圈子...引起的广泛的讨论...

它针对GP使用单向语言模型的不足,Bert使用双向 Transformer,并利用了双向的语言模型。

那么Bert仍然使用的是Transformer模型,那它是怎么解决语言模型只能利用一个方向的信息的问题呢?

答案是它的pretraining训练的不是普通的语言模型,而是Mask语言模型。

为何 BERT 能如此引人注目,主要由以下几个方面:

  1. 使用了新型的特征抽取器--双向 Transformer
  2. 使用了双向的语言模型,并设计了两类联合训练目标:
    1. 利用双向信息,改进了普通语言模型成为完形填空式的 Mask-LM (Mask-Language Model)
    2. 利用 Next Sentence Prediction 任务学习句子级别信息

说BERT 是双向的语言模型结构,实质上是因为借助self-attention机制将序列中每一个词的信息之间交融在一块的模型。此外,借助Multi-Head结构获取了多种交融的方式。当然,这些特性是由Transformer的特殊结构决定的,后续计划单独介绍Bert的核心---最强特征抽取器Transformer

而相应的在 ELMo 与 GPT 中,它们并没有用上这种交融模式,也就是它们本质上还是一个单向的模型,ELMo可能稍微好一点,因为其借助双向LSTM结构将两个单向模型的信息concat起来。

此外,由于Bert的通用性高+代码结构优雅,也是其能够迅速传播开来的主要原因之一...

目前,已经有很多Bert在各种框架下的高层封装工具包,可以更方便的让广大一线工人快速尝鲜...

我最早使用是bert-as-serving,几行代码即可:

https://github.com/hanxiao/bert-as-service/

代码语言:javascript
复制
# 安装bert-as-serving
conda create -n liuchaunfeng_python3 python=3.5
pip install tensorflow==1.10.1
#远程-服务器端
pip install bert-serving-server
#本地-客户端
pip install bert-serving-client

#在服务器端开启服务,指定服务的进程数量
nohup bert-serving-start -model_dir /data0/ml_code/bert_as_service/bert_model_cn/ -num_worker=10 >bert_as_service.log &
# 本地简单的调用Demo脚本

#coding:utf-8
from bert_serving.client import BertClient
bert = BertClient(ip='10.105.105.105')
a = bert.encode([u'中国男篮赢的世界杯冠军'])
print a[0].shape
# 返回一个768位的数组【句向量

还有苏神在Keras下对Bert的封装:

https://kexue.fm/archives/6736

结束

至此,NLP领域与词向量技术相关的知识算是大体讲完了,从word2vec到Bert基本上覆盖了所有的主流方法。当然,近期也不断提出了一些诸如Transformer XL、XLNet等新的方法,本质上还是对Bert的缝缝补补,不能算是夸时代的思想。此外,Transformer XL会在单独讲解Bert的特征抽取器Transformer的时候再放到一块比较。

当然,词向量除了在NLP领域被广泛的探究之外,在其它Machine Learning领域也有许多新颖的实践,后续还会结合词向量的思想,介绍一下其在推荐领域的一些尝试。

历史文章推荐

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI极客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • NLP领域的ImageNet时代到来:词嵌入「已死」,语言模型当立...
  • 后ELMo时代的进化之路
  • 特征抽取器
  • 语言模型
  • ULM-fit
  • GPT
  • Bert
  • 还有苏神在Keras下对Bert的封装:
  • 结束
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档