Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring

在这里插入图片描述

论文导读

课前基础知识

在这里插入图片描述

学习目标

在这里插入图片描述

知识树

在这里插入图片描述

研究背景

在这里插入图片描述
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”的思路来做模型
  • 这种顶层交互设计的其他策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值