BERT 理论与实战

一、语言模型历史线

1、n-gram语言模型

sentence = <x1,x2,x3,x4>
利用n-gram语言模型预测sentence出现的可能性:P(x1,x2,x3,x4) = P(x4|x1,x2,x3) * P(x3|x1,x2) * P(x2|x1) * P(x1) ;
上式右边的P值均需要通过train data来获得,这就存在几个问题:
1)当sentence过长时,需要很大的train data才能寻到sentence出现的可能性,because 需要通过train data来计算等式 右边的概率值。
2)n-gram语言模型无法解决 “长句依赖”问题,如,对于句子:他是法国人,因此,他能说很流利的__。对于这个句子,n-gram无法判断出__为法语的可能性很高。
3)泛化能力很弱,如:我要去北京 在train中概率很高,但如果 我要去上海 在train中数量很少,则其概率很低,但是,实际上,两种句子出现的 概率应该 差不多。

2、NNLM(Neural Network Language Model)(神经网络语言模型)(2003)

NNLM可以很好的解决n-gram泛化能力较弱的问题。

NNLM可以用来训练词向量,与word2vec的CBOW很相似,一个显著不同在于,在NNLM中,是利用word的前向词系列来预测word的,而非context。

二、word embedding

0、word embedding发展史

1、没有考虑上下文的word embedding:word2vec

对word进行编码时,没有将word一词多义的情况考虑在内。没有考虑上下文。

2、考虑上下文的word embedding:
  • ELMo
  • OpenAI GPT
  • BERT

三、attention机制 && self-attention机制 && transformer机制

1、attention机制

在使用seq2seq模型做机器翻译时,其encoder和decoder部分都是不定长的,其中,encoder部分 向 decoder部分 转变时,中间有个context vector,用来存储encoder中的信息,由于context vector 长度固定,而encoder部分则不定长,因此,当encoder部分过长时,context vector将不可能记住所有的encoder内容,这势必会影响decoder部分。为了降低decoder对context vector的这种依赖,我们可以引入attention机制,即:decoder中t时刻output,不仅取决于t-1时刻decoder的output,还取决于attention中的encoder部分:

具体公式:???

2、transformer机制
1、RNN问题:

1)RNN中,t时刻的state计算要依赖于t-1时刻的state。因此,RNN只能一个状态一个状态的计算,无法并行,导致RNN很慢。

2)RNN为单向信息流,无法直接通过"the animal didn’t cross the street because it …"去推断it指代的是谁。(除it的前向信息外,还需后向信息,才能判断it指代的究竟是谁(it was too tired)。

2、attention机制 和 self-attention机制对比

attention机制是一个由外部环境驱动的过程,他需要由decoder部分驱动。是在seq2seq中应用。

而self-attention是一个自驱动的过程。只需要一个sentence。

具体公式:???

3、transformer

transformer结构:多层的encoder - decoder 结构,各个encoder/decoder都相同。

transformer的encoder层有2种layer:self-attention layer,和,全连接层;
transformer的decoder层有3种layer:self-attention layer,和,attention layer,和,全连接层;

其中,要区别self-attention层,和,全连接层:self-attention的计算需要所有上下文才可output,全连接层的计算只需当下时间节点t的input即可output。

4、self-attention 和 attention的计算过程

可以将attention机制看作是self-attention的一个特例。

  • self-attention
    我们先来看self-attention的计算方法:
    首先,self-attention的input是word的embedding向量;
    有了各个word的embedding向量后,我们通过3个矩阵,分别计算 3类vector:query,key,value。如下图所示:

    此时,self-attention即可通过这3中vector变换得到,以单词Thinking的self-attention为例说明:
    我们利用Thinking的query vector q1分别去innerproduct k1, k2,分别表示Thinking的语义在Thinking和machines中的权重。
    在求得<q1,k1>,和,<q1,k2>之后,利用softmax将两个value转为概率p1,p2,代表两个单词在Thinking含义中所占百分比。
    最后,Thinking的self-attention = p1 * v1 + p2 * v2 ;(v1,v2代表两个单词的实际表达);


  • attention
    在attention中,query即为decoder中的state,key,value为encoder中各个cell的output。其它求解方法,与self-attention相同。

    以上self-attention 和 attention 计算的介绍中,是一个attention head的计算,我们可以将一个一个z值的计算,转为直接用矩阵进行计算,从而加快计算速度:

    通常,不同的attention head会代表不同的意义,比如:指代消解,上下文等,因此,在计算一个word的self-attention时,我们可以融入不同的attention head,从而计算一个word的不同含义的z值,将其合并,即可得到经过多个self-attention head的word的表达。



5、transformer中的位置编码

transformer中除引入self-attention机制外,还引入了position encode。

上图中,两句话,编码应该是不一样的,因为,北京和上海的位置不一样,但是,如果只用self-attention的话,这种position信息是识别不出来的。因此,transformer中引入了“位置编码”,使得上述两句话能够被区别开来。“位置编码” 会和 embedding 求 和 作为新的input输入self-attention(原来是直接将embedding作为self-attention的input)。具体如下图所示:
在这里插入图片描述
“位置编码”有2种方式,一种是:绝对编码,另一种是:相对编码。一般,“相对编码”要好一点,因为仅考虑到 北京和上海 的相对位置,而不会考虑 北京和上海 的绝对位置。


note that:位置编码 也是 学习出来的!

以上即为transformer两种重要机制的介绍,下图为transformer的encoder和decoder结构图:



transformer引入上述2种机制后,解决了RNN存在的那2个问题:1)无法并行的问题;2)时序单向性问题(考虑上下文);

原始的transformer中有6层 encoder-decoder;
OpenAI GPT中有12层 encoder-decoder;
BERT中有16/24层 encoder-decoder;

四、ELMo机制 vs word2vec vs OpenAI GPT vs 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。
在语言模型中,一个sample是一个句子,但是在OpenAI GPT中,一个sample可能由于 task的不同 而有多个不同的句子。在word embedding fine tune时要将这些句子拼接起来,如下图:

OpenAI GPT better than ELMo
在OpenAI GPT出来没多久后,BERT就出来了,他较OpenAI GPT有以下几个优势:

3、Bert

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

所谓Masked LM是指:从句子中随机的扣掉一定百分比的word,让BERT来预测。这种方法解决了OpenAI GPT中只能 “前向word”self-attention的局限;
下图中:Segment Embeddings:编码了word属于不同sentence 值;


NSP Multi-task learning的方法解决了OpenAI GPT中pretraining和fine tuning不匹配的问题。在NSP Multi-task learning中,input为:两个连续的句子,或,两个随机选取的句子,output label:这两个句子是否连续?

BERT中的fine tuning(classification task),其input为一个句子开始符的embedding(因为有self-attention机制,所以CLS实际上涵盖了整个句子的语义):
通过fine tune可以微调BERT中的参数,如下图所示:



4、BERT code

1)pretrained model(谷歌已经预训练好的model):
BERT针对不同语言的模型,如下图:
前4个为针对 English的model,前两个为小模型,有110M参数,后两个为大模型,有340M参数。第5个为针对 除了English和Chinese 的其它语言的 模型。第6个为针对Chinese的模型。
这里uncased是指 保持原有 大小写字母的形式;
cased是指 将字母都转为小写的形式;

2)fine tune

3)pretraining
如果想自己pretraining的话,也是在别人已经pretraining model的基础上进行,不然训练速度会很慢(设定 init_checkpoint 参数)。

在这里插入图片描述

五、环信机器人:智能问答系统

1、项目简介:客户向系统输入一个问题,系统给出回答;

系统搭建方案:
1)相似度计算
将经常问到的问题进行搜集,组成(question,answer)HDFS:
当客户提出一个问题时,比对该问题 与 HDFS中的问题的相似度,选出最相似的问题,并将对应答案返回。
2)意图分类
构建一个分类系统,当用户输入一个问题时,该系统能够将该问题自动归类(比如,归为:我还剩多少钱),并返回相应回答。
意图分类需要大量的train data。

2、BERT训练Tips:

六、进阶阅读




引进一个BERT总结:彻底搞懂BERT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sarah ฅʕ•̫͡•ʔฅ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值