前言:

从20世纪70年代的统计语言模型,到2003年的神经网络语言模型,再到2018年刷新各种NLP任务记录的BERT,再到今年6月份的XLNet再次刷新各种记录,带你一起领略其中奥妙。

目录

  • 1、N-gram语言模型
  • 2、神经网络语言模型(NNLM)
  • 3、One-hot
  • 4、Word2vec
  • 5、ELMo
  • 6、Open AI GPT
  • 7、BERT
  • 8、XLNet
  • 9、Attention机制
  • 10、transfermer

正文

1、N-gram语言模型

  • 统计语言模型

    对于一段文本序列:

    它的概率可以表示为:

    即将序列的联合概率转化为一系列条件概率的乘积。问题变成了如何去预测这些给定words下的条件概率:

  • 统计语言模型简化版本——N-gram模型

    常见的如bigram模型(N=2)和trigram模型(N=3),很少会考虑N>3。

  • (1)符号表示:

    word序列:w1, w2, w3, … , wn
    链式规则:P(w1, w2,w3, … , wn)=P(w1)P(w2|w1)P(w3|w1,w2)…P(wn|w1,w2,…,wn-1)

  • (2)N-gram:

    (2.1)对于1-gram,其假设是
    P(wn|w1,w2,…,wn-1)≈P(wn|wn-1)

     P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)≈P(w1)P(w2|w1)P(w3|w2)P(w4|w3)…P(wn|wn-1)
    

    (2.2)对于2-gram,其假设是
    P(wn|w1,w2,…,wn-1)≈P(wn|wn-1,wn-2)

     P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w2w3)…P(wn|wn-2wn-1)
    

    (2.3)对于3-gram,其假设是
    P(wn|w1,w2,…,wn-1)≈P(wn|wn-1,wn-2,wn-3)

     P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|wn-3wn-2wn-1)
    

2、神经网络语言模型(NNLM)

Begio(贝西奥)等人在2003年提出

网络结构:

整个模型可以概括为如下公式:

3、one-hot编码

  • 什么是One-hot编码
    one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

  • 举例说明
    有三句话:
    我喜欢北京
    爸爸喜欢深圳
    妈妈喜欢上海
    先对三句话分词,获取词典,然后进行索引编号:
    我:1;喜欢:2;北京:3;爸爸:4;深圳:5;妈妈:6;上海:7

    然后得到每个特征词的向量如下:
    我 ->(1,0,0,0,0,0,0)
    喜欢 -> (0,1,0,0,0,0,0)
    北京 -> (0,0,1,0,0,0,0)
    爸爸 -> (0,0,0,1,0,0,0)
    妈妈 -> (0,0,0,0,1,0,0)
    深圳 -> (0,0,0,0,0,1,0)
    上海 -> (0,0,0,0,0,0,1)
    然后我们有单个词的one-hot表示可以得到语料库中三句话的特征向量:
    我喜欢北京 –> (1,1,1,0,0,0,0)
    爸爸喜欢深圳 –> (0,1,0,1,0,1,0)
    妈妈喜欢上海 –> (0,1,0,0,1,0,1)

  • one-hot编码在文本表示的优缺点

    • 优点:
      1、解决了分类器不好处理离散数据的问题;
      2、在一定程度上也起到了扩充特征的作用;

    • 缺点:
      1、它基于词袋模型,不考虑词与词之间的顺序;
      2、它假设词与词相互独立(在大多数情况下,词与词是相互影响的);
      3、它得到的特征是离散稀疏的(在词典过大的情况下,表现尤为突出);

4、Word2Vec

  • Continuous Bag of Words Model(CBOW)

    给定上下文预测目标词的概率分布,例如,给定{我,喜欢, (),苹果}预测中心词是“吃”的概率,模型的结构如下:

  • Skip-Gram Model

    skip-gram模型是给定目标词预测上下文的概率值,模型的结构如下:

    • Skip-Gram细节

5、ELMo

ELMo: Embeddings from Language Models

已知tokens = (t1,t2,…,tN)
ELMo是Bidirectional language models。具体可以表示为:
给定前k-1个token序列计算第k个token出现的概率:

同理,后向的计算方法:

biLM训练过程中的目标就是最大化:

这里的ΘxΘ_xΘx代表token embedding, ΘsΘ_sΘs代表softmax layer的参数。

ELMo对于每个tkt_ktk, 通过一个L层的biLM计算出2L+1个表示:

6、Open AI GPT

利用了Transformer网络代替了LSTM作为语言模型来更好的捕获长距离语言结构。然后在进行具体任务有监督微调时使用了语言模型作为附属任务训练目标。


仍然使用的是标准的语言模型目标函数,即通过前k个词预测当前词,但是在语言模型网络上他们使用了google团队在《Attention is all your need》论文中提出的Transformer解码器作为语言模型。Transformer模型主要是利用自注意力(self-attention)机制的模型。

7、BERT

BERT是使用Transformer的编码器来作为语言模型,在语言模型预训练的时候,提出了两个新的目标任务(即遮挡语言模型MLM和预测下一个句子的任务)

在语言模型上,BERT使用的是Transformer编码器,并且设计了一个小一点的Base结构和一个更大的Large网络结构。

ELMo、OpenAI GPT、BERT对比

  • (1)语言模型结构:
    BERT使用的是Transformer编码器,由于self-attention机制,所以模型上下层直接全部互相连接的。
    而OpenAI GPT使用的是Transformer解码器,它是一个需要从左到右的受限制的Transformer。
    而ELMo使用的是双向LSTM,虽然是双向的,但是也只是在两个单向的LSTM的最高层进行简单的拼接。
    所以只有BERT是真正在模型所有层中是双向的。

  • (2)模型的输入
    BERT使用了WordPiece embedding作为词向量,并加入了位置向量和句子切分向量。并在每一个文本输入前加入了一个CLS向量,后面会有这个向量作为具体的分类向量。

  • (3)语言模型预训练
    BERT不在使用标准的从左到右预测下一个词作为目标任务,而是提出了两个新的任务。
    第一个任务他们称为MLM,即在输入的词序列中,随机的挡上15%的词,然后任务就是去预测挡上的这些词,可以看到相比传统的语言模型预测目标函数,MLM可以从任何方向去预测这些挡上的词,而不仅仅是单向的。但是这样做会带来两个缺点:1)预训练用[MASK]提出挡住的词后,在微调阶段是没有[MASK]这个词的,所以会出现不匹配;2)预测15%的词而不是预测整个句子,使得预训练的收敛更慢。但是对于第二点,作者们觉得虽然是慢了,但是效果提升比较明显可以弥补。
    对于第一点他们采用了下面的技巧来缓解,即不是总是用[MASK]去替换挡住的词,在10%的时间用一个随机词去替换,10%的时间就用这个词本身。

    而对于传统语言模型,并没有对句子之间的关系进行考虑。为了让模型能够学习到句子之间的关系,作者们提出了第二个目标任务就是预测下一个句子。其实就是一个二元分类问题,50%的时间,输入一个句子和下一个句子的拼接,分类标签是正例,而另50%是输入一个句子和非下一个随机句子的拼接,标签为负例。最后整个预训练的目标函数就是这两个任务的取和求似然。

  • (4)微调
    在微调阶段,不同任务的模型如下图,只是在输入层和输出层有所区别,然后整个模型所有参数进行微调。

ELMo、OpenAI GPT、BERT优缺点

  • 1、ELMo机制(contextual word embedding)
    word2vec中,是不含上下文的,而ELMo改进了word2vec的这个缺点.

    ELMo的具体结构如图所示:
    采用多层双向的LSTM,最后word embedding结果,采用各层word embedding结果的加权平均。

    虽然ELMo机制包含了上下文信息,但是,ELMo训练的word embedding并不适用于特定的任务。因为ELMo中训练的word embedding是基于一个普适语料库,并不一定 与 “特定任务中的 context”相吻合。

  • 2、OpenAI GPT
    OpenAI GPT在ELMo的基础上 改进了一些,使得OpenAI GPT能够 适用于 特定任务,具体改进点有:
    1)将ELMo中的LSTM改为了用transformer(使用的是没有encoder的transformer),使得OpenAI GPT能够训练更深的model;
    2)OpenAI GPT将根据语料库训练出的word embedding,又根据特定任务进行了微调。

    OpenAI GPT使用的还是“语言模型”的那套思路,transformer中的self-attention只能使用word前边的一系列word,而不能用word后边的word。

  • 3、Bert

    • BERT相比OpenAI GPT的几个优势:
      1)弥补了OpenAI GPT中self-attention只能利用前向word的缺陷;
      2)弥补了 Pretraining 和 fine tuning的不匹配;pretraining时利用的是 语言模型,输入只有一个sentence,但是fine tuning时,根据task的不同,输入可能是多个sentence;

    • BERT存在的一些问题:
      1)基于DAE预训练模型虽然可以很好地建模双向语境信息,但由于需要 mask 一部分输入,从而忽略了被 mask 位置之间的依赖关系
      2)出现预训练和微调效果的差异(pretrain-finetune discrepancy)。

8、XLNet

XLNet是一种基于 a novel generalized permutation language modeling objective的无监督表示学习方法。此外,采用Transformer-XL作为主干模型,在长文本表示的语言任务中表现出了卓越的性能。

首先,XLNet 不使用传统 AR 模型中固定的前向或后向因式分解顺序,而是最大化所有可能因式分解顺序的期望对数似然。由于对因式分解顺序的排列操作,每个位置的语境都包含来自左侧和右侧的 token。因此,每个位置都能学习来自所有位置的语境信息,即捕捉双向语境。
其次,作为一个泛化 AR 语言模型,XLNet 不依赖残缺数据。因此,XLNet 不会有 BERT 的预训练-微调差异。同时,自回归目标提供一种自然的方式,来利用乘法法则对预测 token 的联合概率执行因式分解(factorize),这消除了 BERT 中的独立性假设。
除了提出一个新的预训练目标,XLNet 还改进了预训练的架构设计。
简单地使用 Transformer(-XL) 架构进行基于排列的(permutation-based)语言建模是不成功的,因为因式分解顺序是任意的、训练目标是模糊的。因此,研究人员提出,对 Transformer(-XL) 网络的参数化方式进行修改,移除模糊性。

  • 目标:排列语言建模(Permutation Language Modeling)
    为了提供一个完整的概览图,研究者展示了一个在给定相同输入序列 x(但因式分解顺序不同)时预测 token x_3 的示例,如下图所示:

  • 模型架构:对目标感知表征的双流自注意力

    下图 2 的 a、b 分别展示了这两种表征的学习。其中内容表征与 Transformer 的隐藏状态类似,它将同时编码输入本身的内容及上下文信息。Query 表征仅能获取上下文信息及当前的位置,它并不能获取当前位置的内容。具体来说,他们借鉴了 Transformer-XL 中的两项重要技术——相对位置编码范式和分割循环机制。现在,结合双流注意力和 Transformer-XL 的改进,上面图 2© 展示了最终的排列语言建模架构。
    图 2:(a)内容流注意力,与标准自注意力相同;(b)Query 流注意力,没有获取内容xztx_{z_t}xzt 的信息;(c)利用双流注意力的排列语言建模概览图。

    原论文:

9、attention机制

  • Encoder-Decoder框架

    Encoder顾名思义就是对输入句子X进行编码,将输入句子通过非线性变换转化为中间语义表示C:

    对于解码器Decoder来说,其任务是根据句子XXX的中间语义表示CCC和之前已经生成的历史信息y1,y2….yi−1y_1,y_2….y_{i-1}y1,y2.yi1来生成i时刻要生成的单词yiy_iyi

  • 引入AM模型的Encoder-Decoder框架

  • 举例
    输入的是英文句子:Tom chase Jerry
    生成中文单词:“汤姆”,“追逐”,“杰瑞”
    引入AM模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:
    (Tom,0.3) (Chase,0.2) (Jerry,0.5)
    每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。每个Ci的计算过程:

  • Ci计算公式:

  • 例子说明:
    假设Ci中那个i就是上面的“汤姆”,那么Tx就是3,代表输入句子的长度,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”),对应的注意力模型权值分别是0.6,0.2,0.2,所以g函数就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的形成过程类似下图:

  • a如何计算?
    Encoder采用RNN模型,Decoder也采用RNN模型,这是比较常见的一种模型配置,则图1的图转换为下图:

    用下图可以较为便捷地说明注意力分配概率分布值的通用计算过程:

    计算生成Yi时的输入句子单词“Tom”、“Chase”、“Jerry”对Yi来说的注意力分配概率分布,那么可以用i时刻的隐层节点状态Hi去一一和输入句子中每个单词对应的RNN隐层节点状态hj进行对比,即通过函数F(hj,Hi)来获得目标单词Yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。

    论文“A Neural Attention Model for Sentence Summarization”中,Rush用AM模型来做生成式摘要给出的一个AM的一个非常直观的例子。

    NLP中常用attention的计算方法:
    Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,如下图。

    在计算attention时主要分为三步,第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;然后第二步一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention。目前在NLP研究中,key和value常常都是同一个,即key=value。

  • 多头attention(Multi-head attention):

    放缩点积attention(scaled dot-Product attention)
    多头attention(Multi-head attention)结构如下图:

  • Self-attention
    self-attention显然是attention机制的一种。上面所讲的attention是输入对输出的权重,例如在将“I am a student”翻译成中文“我是一个学生”中,是“I am a student ”对“学生”的权重。self-attention则是自己对自己的权重,例如I am a student分别对am的权重、对student的权重。之所以这样做,是为了充分考虑句子之间不同词语之间的语义及语法联系。

  • Self-attention权值怎么计算?

10、Transformer

Transformer的主体结构图:

  • 模型分为编码器和解码器两个部分。
    编码器由6个相同的层堆叠在一起,每一层又有两个支层。第一个支层是一个多头的自注意机制,第二个支层是一个简单的全连接前馈网络。在两个支层外面都添加了一个residual的连接,然后进行了layer nomalization的操作。模型所有的支层以及embedding层的输出维度都是dmodeldmodel。
    解码器也是堆叠了六个相同的层。不过每层除了编码器中那两个支层,解码器还加入了第三个支层,如图中所示同样也用了residual以及layer normalization。具体的细节后面再讲。

  • 输入层
    编码器和解码器的输入就是利用学习好的embeddings将tokens(一般应该是词或者字符)转化为d维向量。对解码器来说,利用线性变换以及softmax函数将解码的输出转化为一个预测下一个token的概率。

  • 位置向量
    由于模型没有任何循环或者卷积,为了使用序列的顺序信息,需要将tokens的相对以及绝对位置信息注入到模型中去。论文在输入embeddings的基础上加了一个“位置编码”。位置编码和embeddings由同样的维度都是dmodeldmodel所以两者可以直接相加。有很多位置编码的选择,既有学习到的也有固定不变的。

使用位置编码表示序列的顺序:

  • 残差(The Residuals)
    我们之前提到过一个细节,每个编码模块的子层(自注意力层和前馈网络层)中间都有残差(residual)连接,然后紧跟着一个层标准化步骤。
    展开:
    整体看Transformer的编、解码模块(以两层为例),它长这样:

参考

https://www.jianshu.com/p/e91f061d6d91
https://blog.csdn.net/qq_36330643/article/details/80143960
https://cloud.tencent.com/developer/article/1449495
https://baijiahao.baidu.com/s?id=1636855977017438795&wfr=spider&for=pc
https://blog.csdn.net/u014765410/article/details/90294889
https://arxiv.org/pdf/1906.08237.pdf

NLP进化史系列之语言模型相关推荐

  1. NLP进化史系列之意图识别

    前言 从规则模板到统计方法,再到机器学习方法,最后到深度学习算法,一起回顾NLP之意图识别的历程. 作用 1.在搜索中会用到意图 比如在baidu中搜索"怎么做龙虾馅饺子",意图是 ...

  2. 越学越有趣:『手把手带你学NLP』系列项目02 ——语义相似度计算的那些事儿...

    点击左上方蓝字关注我们 课程简介 "手把手带你学NLP"是基于飞桨PaddleNLP的系列实战项目.本系列由百度多位资深工程师精心打造,提供了从词向量.预训练语言模型,到信息抽取. ...

  3. NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)

    摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P4 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bce ...

  4. NLP 第五周 语言模型,bert(2)

    BERT类预训练语言模型 我们传统训练网络模型的方式首先需要搭建网络结构,然后通过输入经过标注的训练集和标签来使得网络可以直接达成我们的目的.这种方式最大的缺点就是时间长,因为我们对于模型权重的初始化 ...

  5. ​越学越有趣:『手把手带你学NLP』系列项目01 ——词向量应用的那些事儿

    点击左上方蓝字关注我们 课程简介 "手把手带你学NLP"是基于飞桨PaddleNLP的系列实战项目.本系列由百度多位资深工程师精心打造,提供了从词向量.预训练语言模型,到信息抽取. ...

  6. 【NLP】Pytorch中文语言模型bert预训练代码

    ACL2020 Best Paper有一篇论文提名奖,<Don't Stop Pretraining: Adapt Language Models to Domains and Tasks> ...

  7. 【NLP免费系列直播】图卷积神经网络, BERT,知识图谱, 对话生成

    大家好,我是贪心学院的小编.自从今年二月份举办的火爆的BERT.XLNet专题课以来,已经三个月没有跟大家见面了.这一次我们又给大家带来了重磅级的系列公开课,由贪心学院和京东智联云联合打造,共四次公开 ...

  8. 景联文科技:自然语言处理(NLP)系列(一)——自然语言理解(NLU)

    作为人工智能领域的基础,自然语言处理(NLP)一直是该领域最热门技术之一.近年来,一种潜在的新语言模型GPT-4出现,他能够掌握更广泛的会话主题,甚至成为对话的 "主导者",实时语 ...

  9. 自然语音处理(NLP)系列(五)——详解智能问答系统

    为方便客户进行网上登记,提升各大官网系统的智能化水平,很多官网已上线"智能小客服"."智能小客服"支持语音引导.机器人24小时智能问答.文字提问.上传图片咨询. ...

最新文章

  1. java 图形化库_java图形界面之图形化按钮
  2. 你以为你真的了解final吗?
  3. 【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(六)
  4. php中args,PHP中的重载,即__call($name , $args)的使用
  5. 在Linux环境下给php添加mbstring扩展
  6. 角色关联权限操作-代码实现
  7. LeetCode 1886. 判断矩阵经轮转后是否一致
  8. 90后占六成 花小猪如何吸引年轻人又安全不减配?
  9. 转:java工程师成神之路
  10. hive-sql中平方和开根号函数
  11. 转:有关Forth语言
  12. 浅谈“Robots文件信息泄露”
  13. Mycat分库分表优缺点分析
  14. ODL中版本变化引起包位置的变化
  15. snmp使用默认团体名_snmp默认团体名/弱口令漏洞及安全加固
  16. 使用树莓派3B+ 制作一个属于自己的无线AP 无线路由器 一个Wi-Fi热点
  17. docker之旅,附带实例脚本
  18. 看完就明白/dev/sda、/dev/hda是什么了
  19. mysql in 查询效率慢优化
  20. 走进就职演说幕后:大有深意的用词

热门文章

  1. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java民宿平台bwla1
  2. JavaScript 游戏系列(一): 贪吃蛇
  3. [读书笔记]《没人会告诉你的PPT真相》
  4. 吐血整理的 Android 性能优化思维导图,让面试官眼前一亮
  5. 由网管平台转型智慧运维,智和信通产品全线升级
  6. 创新实训 dsy13
  7. 应用市场无法连接服务器怎么办,三星应用商店进不去,显示网络无法连接,其它程序可以上网,怎么回事?...
  8. 光学仿真案例(4) 基于纳米微粒激发平面波的米氏散射FDTD仿真模拟
  9. 在link.c中已经include了头文件了,为什么使用ld还无法识别mian和printf?
  10. 2020低压电工考试题库及低压电工模拟考试题库