目录
论文导读
课前基础知识
学习目标
知识树
研究背景
Bert应用广泛
初始BERT
BERT: Bidirectional Encoder Representation from Transformers.
- 1.what is Bidirectional language model
- 2.how get Representations
- 3.why use Transformers
BERT做文本匹配的一般模式:
首先先去忽略一些细节,它的一般设计是文本匹配一般是前、后两句话,通过一个分隔符拼起来,在序列的最前面再加上一个字符,将这些拼接起来,作为BERT的输入,通过模型的一系列运算,其实每个位置都会得到对应向量的输出,通常使用CLS对应位置的输出向量,使用这个向量去设计后面的loss,如全连接网络或softmax层等,这就是bert做文本匹配的一般的模式。
【思考】 - 1.文本匹配任务如何设计loss函数?
- 2.为什么可以用来计算?其他方法呢?
- 3.这种模式的最大问题是什么?
- 4.都是Encoder,凭啥你就行?
研究成果
- 1.在四个著名的文本匹配相关任务上取得了SOTA的成果(ConvAI2, DTSC7, Ubuntu V2, Wikipedia IR)
- 2.提出Poly-encoder, 站在BERT的肩膀之上,又好又快实现文本匹配
- 3.发现在领域数据内继续per-train,可以进一步提升模型表现
- 4.首次定义并命名 三种文本匹配的设计模式
研究意义
Poly-encoder模型价值:
- 解决BERT过大、预测太慢的问题
- 提出一种不阉割bert仍然可以生成上线的模型
- 验证了poly-encoder这种模式的有效性和高效性,可以方便迁移到其他模型
论文结构
摘要
摘要核心:
- 1.定义了pairwise文本匹配的两种基本范式:cross-encoder、bi-encoder
- 2.提出了基于bert的poly-encoder模型
- 3.模型最大优势:在保证准确率的前提,可以达到实时预测速度,非常适合工业场景的部署
- 4.poly-encoder在四个数据集上达到了SOTA
- 5.在数据集领域内继续预训练可以进一步提升预训练模型效果
【思考】 - 为什么bert这么厉害?
- 还可以有哪些“poly-encoder”的设计?
论文精读
模型总览BERT、Poly-encoder
知识树
BERT的出现
预测一个句子中的某一个词语,是通过语言模型做的,但是语言模型只是通过单方向的,单边的这种语言模型往往很难做到很周全。
每个词用一个固定维度的向量表示,并没有考虑语境,但是在不同的语境中,相同的词却有不同的语义。解决办法是希望从预料中,训练得到在不同的语境或不同的句子中,词语有不同的表征,这种表征是带有上下文的。到这个阶段,一般就不会用word/token级别的表征,一般是做整句的表征或其他的任务,而不是像词向量那样,每个词有固定的词向量。带有上下文的表征如何得到?
通常来讲,通过预训练一个语言模型,再在分类任务上做微调,所谓的微调就是用某一个分类任务的数据,来继续训练这个模型的参数。微调之后得到的模型来继续做这个分类任务。
这个模型的问题在于只是使用了单向的语言模型。
实现双向的语言模型。
ELMO存在的问题:
- 有位置偏见—只能关注到“前面”的token
- 无法并行—大规模训练受限制
- “假”双向语言模型(独立训练,实际上它们之间是没有信息交互的)
GPT使用transformer训练单向语言模型,但是transformer的优势就可以使GPT使用非常大的语料进行训练,当使用大语料训练模型时,肯定可以获得更多的有用的知识,可以使得模型更强大。GPT的缺点是仍然是单向语言模型。适合做文本生成的任务
之前方法的问题:
- 语言模型只能看到左边语境或者右边语境,但是语言理解应该是双向的;
- 单向语言模型中,语言只是为了得到一个很好的概率分布,但是但部分任务重并不需要很好的概率分布,比如说做整句的分类、做token的标注、句子的编码,实际上很少用到这种概率分布;
- 之前的双向语言模型中,即“假”双向模型,在预测过程中,词语是可以“看见自己的”,即标准的语言模型为目标,没办法实现真正的双向训练,因为这种模型在预测某一个单词时,会间接在多层中看见自己,比如elmo是多层实现的,它可能在多层的上下文中看见自己,这样会导致泄露,这样训练语言模型会失真的。
考虑到以上问题,bert引入Masked LM,即遮盖住%k的序列中的词然后再预测他们。
随机的掩盖住一个序列中的一些词,比如“同学”、“篮球”,然后再对整句话进行编码,去预测这句话。
存在的问题:遮盖的词语在fine-tuning阶段看不见。因为bert也是先pre-training,再fine-tuning。在pre-training阶段,用masked lm去训练一个模型,然后在fine-tuning阶段用某一个任务的语料继续训练,因为在pre-training的时候,用了masked lm,这时候是有masked的,但是mask具体是什么,在fine-tuning阶段是看不见的,因此如何很好的从pre-training过渡到fine-tuning,让fine-tuning阶段减少对mask固定token符号所带来的偏差或信息的不匹配,这是一个主要的问题,这个问题的解决方案是什么?
Masked LM:如何解决遮盖的词语在fine-tuning阶段看不见?
Bert还可以应用到Next Sentence Prediction任务(预测两句话是否是相邻的)中,像QA、NLI、PI等任务是基于理解句子之间的关系,这是做句子级别任务的。
BERT结构
BERT的实现
BERT = Encoder of Transformer
模型的输入:
模型的输入部分是由三种embedding加起来,bert解决两种任务masked lm和next sentence prediction。通常需要将两句话拼接起来,[CLS]为开始标志,[SEP]为结尾标志,[SEP]为分隔符。
每个位置对应三种embedding:
- token embedding:之前常见的词向量embedding
- segment embedding:用于区分两句话
- position embedding:随机初始化的,随机初始化后同模型一块训练
训练BERT—Masked LM
例如input中improvisation被mask,通过bert后,所有的位置都会有对应的隐向量,通常是512个序列长度,mask标志对应的隐向量后接一层神经网络FFNN和softmax,得到整个词典上所有token的概率分布。
训练BERT—Next Sentence Prediction
用于测试Sentence A与Sentence B是否是相邻的。同样,所有位置都有对应的输出,第一个token即开头标志[CLS],这里使用第一个位置的隐向量,输入到FFNN+softmax中,做一个二分类。
小结
BERT出现所要解决的问题:
- 词向量–>带语境:词向量是一种独立的token,独立的向量表示,因此想训练一个带语料的语言模型;
- 带语境的模型,既可以用单向的也可以用双向的,双向的效果比单向的好,但之前的双向模型是“假”双向的,可能会看到自己,存在泄露问题,bert也是为了解决这种问题;
- 之前都是用LSTM,但是LSTM无法并行且存在位置偏见问题。
BERT使用Masked LM替换常规的语言模型,用transformer替换LSTM。
What is Bidirectional language model?
对应bert为Masked LM
How get Representations?
bert通过使用transformer,从大量的预料中来训练语言模型,用token-level和sentence-level多任务去训练bert,然后将bert看做是一个编码器,从而得到任意句子的向量表征,此向量表征带有真正学习到的知识。
Why use Transformers?
transformer可以并行,可以使用大批量的语料训练,从更大的预料中学习知识;且没有位置偏见
Poly-Encoder结构
Bi-Encoder
类似孪生网络,Context Encoder使用的是BERT,聚合层是将所有输出的向量表示进行降维,做信息的聚合,得到固定维度的向量,这个向量用来表示输入的序列,在计算层做计算。
Cross-encoder
Bi-encoder的左、右两边完全是独立运算,只是在最后计算得分;
Cross-Encoder也是输入两句话,将这两句话先拼接起来,这里的拼接与bert的输入是相同的,然后输入到bert编码器中,得到每个位置的向量表示,聚合层对向量进行降维、聚合,得到固定维度的向量,在计算层算出score,score表示两句话的关系,这个关系可能是相似关系、推理关系等。
聚合层可能有不同的表示方法。
Poly-encoder
poly-encoder是本文提出的模型,相比之前的两种encoder,主要的区别是加了交互层。
做文本匹配任务,很重要的一个方法或方式就是做更多的交互,比如在多层做交互、在更早的时候做交互,因此,交互是文本匹配这个任务很重要的一个技能,做交互其实就是为了做对齐,那如何做对齐呢?其实就是通过做attention来实现。
论文算法模型的细节
BERT模型细节
BERT模型的实现是用transformer的encoder部分。
Transformer
- Multi-headed self attention
学习序列的上下文语义特征 - Feed-forward layers
学习多层的非线性特征 - Layer norm and residuals
有利于训练深度神经网络 - Positional embeddings
让模型学习序列中词语的相对位置信息
self-attention
通过self-attention,it可以更多的关注到与它相关的那部分。模型处理每个位置的token时,self-attention可以让模型关注到序列中其他位置的信息,让模型更好的编码每个位置的token,因为需要对每个位置的token做学习或编码,在编码每个位置的token时,需要真正的了解它指的是什么东西。
self-attention的实现
1.得到Q、K、V
2.计算一个得分score
对应的矩阵运算
Multi-head attention
目的是为了关注不同的位置
BERT模型
通过pre-training得到预训练语言模型之后,再在不同的任务上进行fine-tuning,只是bert做编码器是一个基础,不同的任务做不同的上层的损失函数设计,在不同的任务上进行fine-tuning。
Bert—文本匹配
- 1.文本匹配任务如何设计loss函数?
常规的分类任务,softmax做一个交叉熵损失来做loss函数。 - 2.为什么可以用来计算?其他方法呢?
向量可以很好的表征整句话的知识或信息,通过实验也表明,这种效果比较好;其它方法可以用平均或求和或pooling等方法。 - 3.这种模式的最大问题是什么?
慢。 - 4.都是encoder,凭啥你就行?
这也是bert的优势,它可以学到更多知识,因为bert使用了双向语言模型,从根本上很好的去理解序列。
Poly-Encoder模型细节
Bi-encoder模型
点积操作的集合意义为一个向量在另一个向量上的投影,可以用来计算一些两个向量的相似性或相关性。
图中Context Encoder和Candidate Encoder为bert,Red(.)为聚合方法
这个模型的问题是完全没有交互。
Cross-encoder模型
拼接两句话,使用bert进行编码,得到各个位置的隐向量,取第一个位置的向量作为ctxt和cand这两个向量的表征;scoring的计算是将向量转换成标量
特点:完全交互
Poly-encoder模型
之前都是使用一个向量来表示context向量,在poly-encoder中,想用多个向量来表示context。
将Cand emb看做是query,与左边得到的m个context embedding做attention运算。
Poly-encoder简化模型
直接使用前m个隐向量或后m个隐向量
实验设置及结果分析
数据集
实验结果及分析
三种模型在测试集上的表现:
- 1.微调过的cross-encoder想过最好,达到SOTA
- 2.用相同的batch-size和优化器训练poly-encoder
2.1poly-encoder效果全面好于bi-encoder
2.2使用更多codes,一般效果都会更好
2.3 poly-encoder使用bert在DSTC数据集上甚至比cross-encoder结果要好
Domain-specific Pre-training
相同的模型超参和训练设置
-
在Reddit数据集上fine-tuning得到SOTA
-
pre-train的语料,而不是模型训练细节,是影响模型在下游任务的表现的主要原因
不同版本Poly-encoder的对比
-
First m outputs 一般表现很好
-
不同数据集上结果表现不同
-
codes越多,结果往往越好
不同策略Fine-tuning的结果
微调整个模型有帮助,但是不要改变embedding
预测速度
ConvAI2,对n个candidate打分
-
1.cross-encoder的耗时指数量级的增加,达不到实时效果(对话系统需要实时)
-
2.在1k额候选集,poly-encoder与bi-encoder耗时差不多
-
3.使用learnt-codes几乎不增加耗时,但是增加learnt-codes会增加效果
训练速度
不同reductions策略的对比
-
1.使用cls位置向量做下游任务一般比较好
-
2.不同任务需要尝试不同策略
论文总结
BERT
关键点:
- 带有上下文的表征
- 双向语言模型
- Masked LM
- Transformer
- 迁移学习
创新点: - Masked LM实现双向语言模型
- Token-level和Sentence-level两种task的多任务加成
- 大规模双向预训练语言模型的实现
Poly-Encoder
关键点:
- 使用BERT
- 表现与性能具佳
- 三种模式
创新点: - 引入codes,非常巧妙的改造BERT
- 使用领域相关数据来预训练和微调
- 结合Bi和Cross两者优点,可以生产部署
启发点: - 语料越多,效果越好:
- “trade-off”的思路来做模型
- 这种顶层交互设计的其他策略