目前,从bert的应用来看,已经在对话系统、机器阅读理解、搜索、文本分类等几乎大多数 NLP 应用领域快速应用,并在部分应用领域取得了突破性的效果提升。
1. BERT
BERT基于一种相对较新的神经网络结构——Transformers,使用一种叫做“Self-attention”的机制来捕捉单词之间的关系。Transformers中没有卷积(如CNNs)或递归操作(如RNNs)(“Attention is all you need”)。
1.1 自注意力机制
- Self-attention是一个sequence-to-sequence的操作,它通过将每个单词的上下文嵌入到其表示中,来更新输入Token的嵌入。这使得它可以同时对所有输入单词之间的关系建模——这与RNNs形成了对比,在RNNs中,输入Token被读入并按顺序处理。Self-attention使用点积计算词向量之间的相似度,由此得到的注意权重通常被可视化为一个注意权重矩阵。
- 注意力权重捕捉单词之间的关系强度,我们允许模型通过使用多个注意力头来学习不同类型的关系。每个注意力头通常捕捉单词之间的一种特定类型的关系(带有一些冗余)。其中一些关系是可以直观地解释的(如主-客体关系,或跟踪邻近的词),而另一些关系则相当难以理解。你可以把注意力头部想象成卷积网络中的过滤器,在卷积网络中,每个过滤器从数据中提取特定类型的特征——无论哪种特征都能帮助神经网络的其余部分做出更好的预测。
- Self-attention机制是Transformer的核心操作,但让我们把它放在上下文中:Transformer最初是为机器翻译而开发的,它们有一个编码器和解码器结构。Transformer编码器和解码器的组成部分是一个Transformer块,它本身通常由一个自注意层、一定量的正则化和一个标准前馈层组成。每个块对输入向量执行这个操作序列,并将输出传递给下一个块。在Transformer中,深度是指Transformer块的数量。
根据以上的Transformer设置,BERT模型被训练在2个无监督语言任务上。BERT训练最重要的一点是它只需要无标注的数据——任何文本语料库都可以使用,你不需要任何特殊的标注数据集。BERT的论文使用了Wikipedia和一个图书语料库来训练模型。与“普通”语言模型一样,数据的成本很低。
1.2 训练模型
- 掩码语言模型(MLM)任务。这个任务鼓励模型学习单词级和句子级的良好表示(因为句子是单词表示的整体)。简单地说,句子中15%的单词是随机选择的,并使用来隐藏(或替代)。该模型的工作是预测这些隐藏单词的身份,利用之前和之后的单词——因此,我们试图从损坏的输入重建文本,并使用左右上下文进行预测。这使得我们能够根据上下文构建单词的表示。与ELMo(一种用于生成上下文感知的单词嵌入的基于rnn-based的语言模型)等方法不同,BERT同时学习它的双向表示,在ELMo方法中,从左到右和从右到左的表示由两个语言模型独立学习,然后连接(简单的向量相加)起来。我们可以说ELMo是一个“浅层双向”模型,而BERT是一个“深层双向”模型。
- 下一个句子预测(NSP)任务。如果我们的模型将被用作语言理解的基础,那么它最好具备一些句子间连贯的知识。为了鼓励模型学习句子之间的关系,我们添加了下一个句子预测任务,在这个任务中,模型必须预测一对句子是否相关,也就是一个句子是否可能出现在另一个句子之后。正训练对是语料库中真实的相邻句子;从语料库中随机抽取负训练对。它不是一个完美的系统,因为随机抽样的配对可能是相关的,但它已经足够好了。
模型必须学会同时完成两项任务,因为实际的训练损失是两项任务损失的组合(MLM和NSP加权平均)。
- Fine-tuning BERT。一旦训练了基本的BERT模型,你通常会在两个步骤中进行调整:首先,对未标注的数据继续进行“无监督”的训练,然后通过添加额外的层和对新目标的训练(使用很少标记的示例)来学习实际任务。这种方法起源于Dai & Le在2015年发表于的LSTM LM论文。
BERT微调实际上会更新模型的所有参数,而不仅仅是新任务特定层中的参数,因此这种方法与完全冻结传输的层参数的技术不同。
在实践中,使用BERT进行迁移学习,通常只重用经过训练的编码器堆栈—将模型的decoder扔了,只使用编码器作为特征提取器。因此,我们并不关心Transformer的decoder部分对它最初训练的语言任务所做的预测,我们感兴趣的只是模型学会在内部表示文本输入的方式。
2.BERT优化算法
从预训练模型改进的角度看,最近一年多也陆续出现了大量效果突出的改进模型,比如 XLNet、SpanBert、RoBERTa、ALBert、BART 等一系列改进。在众多的 BERT 预训练改进模型中,RoBERTa 可能是目前为止最简单有效的,它仅仅通过增加更大规模的高质量数据、延长训练时间以及增大 Batch Size 等简单手段,就能将预训练模型效果推到一个很高的精度,效果超过了很多其它的改进模型。这说明了:目前 BERT 采用的 Transformer 结构,从模型复杂度来说是足够复杂的,表达能力也足够强大,我们仅仅通过增加高质量数据、增加训练时间,依然能够极大幅度提升 BERT 的性能。相对提出新的复杂模型来说,这种改进更加简洁有效。
从工程实用化角度看,因为 BERT 的基础结构采用了 12 层或者 24 层的 Transformer,所以存在参数量大计算速度慢的问题,而真正要想使模型大规模落地应用,如何将预训练模型做小做快是关键所在。目前在这方面的模型改进有几种思路:
- 一种思路以 ALBert 的做法为代表。它一方面将输入单词 Embedding 参数矩阵进行矩阵分解,一方面将 Transformer 各层参数共享。通过结合两者来大量减少参数,但这种方案在计算量上并未减少,仅仅减少了模型参数。
- 第二种是采用 Teacher-Student 模式的知识蒸馏,通过训练小的 Student 模型来模拟大的 Teacher 来减小模型大小,这样可以同时减小模型参数及计算量,以此增加计算速度;除此外,在模型压缩方面常见的剪枝、模型参数二值化等方法也同样可以应用在 BERT 的预训练模型上。