BERT初探——以情感分类为例(理论篇)

目录

  • BERT初探——以情感分类为例(理论篇)
    • 初步了解BERT
      • BERT的定义
      • BERT 的模型结构
      • BERT的输入表示
      • BERT的训练方式
        • 遮蔽语言模型(masked language modeling)
        • 下一句预测(next sentence prediction)
        • 具体参数
      • BERT的微调过程
      • 总结

BERT初探——以情感分类为例(理论篇)

在“BERT初探——以情感分类为例”系列文章中,你将学到:

  • 初步了解BERT (本文将涵盖该部分)
    • BERT的定义
    • BERT的遮蔽语言模型(masked language modeling)与下一句预测(next sentence prediction)
    • BERT与其它预训练模型的区别
  • 针对BERT的数据预处理以及如何使用PyTorch的Dataset package(包括tokenization, attention, masks 以及 padding)
  • 使用 Transformers 包构建情感分类器
  • 使用测试集评估模型
  • 预测文本的情感

初步了解BERT

BERT的定义

BERT最好的定义就是其原始论文 的标题:预训练双向 Transformer 语言模型。标题中包括三个关键词:

  • 预训练(Pretrained):NLP的预训练方法(大概)最初在 ELMo 这篇论文提出。预训练模型会依据单词的上下文来对单词进行编码,这意味着同一个单词在不同句子中的编码很可能是不同的。因此这种编码单词的方法也叫动态编码/嵌入(dynamic encoding / embedding),其与以 Skip-gram, CBOW, GloVe, FastText等静态编码(static encoding)是相对的。
  • 双向(Bidirectional):双向模型的概念很早就出现了,包括双向RNN,双向LSTM等。其主要目的是使模型对当前单词的操作不仅考虑其之前的文本,也考虑其后的文本。这是很自然的,举例来说:当解答完形填空问题时,我们不仅要根据前文得到可能的答案,也要根据后文来找。
  • Transformer:transformer 最初在 《Attention is All You Need》 这篇文章中提出。Transformer 是没有方向的,这不同于LSTM等序列化的方法,这是因为 transformer 的基础是注意力机制(attention),而注意力机制允许当前单词对某特定单词给予更多的关注。Transformer的诸多细节无法一言以蔽之,更多介绍请移步本人的另外一篇翻译+部分原创博文《序列处理的深度学习框架——从RNN到Transformer》。

BERT 的模型结构

BERT的基本结构是多层双向Transformer。设层数(即Transformer块的数量)为 L L L,隐藏层的大小为 H H H,自注意力头的个数为 A A A。原文将前馈/过滤器的大小设置为 4 H 4H 4H。原文给出了 baselarge 两个模型的大小,具体为:

  • B E R T B A S E : L = 12 , H = 768 , A = 12 BERT_{BASE}: L=12, H=768, A=12 BERTBASE:L=12,H=768,A=12, Total Parameters = 110 M 110M 110M

  • B E R T L A R G E : L = 24 , H = 1024 , A = 16 BERT_{LARGE}: L=24, H=1024, A=16 BERTLARGE:L=24,H=1024,A=16, Total Parameters = 340 M 340M 340M

下图是模型结构的简单图示:

BERT初探——以情感分类为例(理论篇)_第1张图片

BERT 与 GPT 和 ELMo 均为预训练模型,但是三者在结构上是有所区别的。下图展示了具体差别:

BERT初探——以情感分类为例(理论篇)_第2张图片

BERT 使用双向 Transformer。OpenAI GPT 使用 从左到右的 Transformer。ELMo 使用独立训练的从左到右和从右到左的 LSTM 的连接来为下游任务生成特征。其中,只有 BERT 表示在所有层中同时受到左右语境的制约。[参考2]


BERT的输入表示

论文中区别了两个概念:

  • 句子(sentence):“句子”可以是任意长度的连续文本,不一定必须是实际意义上的句子。
  • 序列(sequence):“序列”是指输入到BERT的标记序列,可以是一个句子,可以是多个句子的组合。

通过把给定标记对应的标记嵌入、句子嵌入和位置嵌入求和来构造其输入表示。下图给出了输入表示的可视化表示。 细节是[参考2]:

  • 我们使用含 3 万个标记词语的 WordPiece 嵌入(Wu et al., 2016)。我们用 ## 表示拆分的单词片段。
  • 我们使用学习到的位置嵌入,支持的序列长度最长可达 512 个标记。
  • 每个序列的第一个标记始终是特殊分类嵌入([CLS])。该特殊标记对应的最终隐藏状态(即,Transformer 的输出)被用作分类任务中该序列的总表示。对于非分类任务,这个最终隐藏状态将被忽略。
  • 句子对被打包在一起形成一个单独的序列。我们用两种方法区分这些句子。方法一,我们用一个特殊标记([SEP])将它们分开。方法二,我们给第一个句子的每个标记添加一个可训练的句子 A 嵌入,给第二个句子的每个标记添加一个可训练的句子 B 嵌入。
  • 对于单句输入,我们只使用句子 A 嵌入。
BERT初探——以情感分类为例(理论篇)_第3张图片

BERT的训练方式

模型有两种训练方式:遮蔽语言模型(masked language modeling)与下一句预测(next sentence prediction)


遮蔽语言模型(masked language modeling)

遮蔽语言模型的任务目标是猜测被遮盖起来的单词是什么。比如:

She is a [mask] girl. --> She is a pretty girl.

这样的方法有两个缺点。

第一个缺点是[MASK]标记在微调(即下游任务)中从未出现。为了缓解这个问题,训练数据随机选择15%的词进行标记,在被选中的词中,80%的情况被替换为[MASK],10%的情况随机选择一个语料库中的词替换,10%的情况保持单词不变。

第二个缺点是这样会使得模型训练变慢,因为每批次数据只有15%的标记被预测。但这是值得的,因为模型效果好啊!


下一句预测(next sentence prediction)

许多下游任务,如问答和自然语言推理,都是以理解句子关系为基础。因此原文与训练了一个下一句预测的二元分类任务,具体如下:

输入 = [CLS] That’s [mask] she [mask]. [SEP] Hahaha, nice! [SEP]

标签 = IsNext

输入 = [CLS] That’s [mask] she [mask]. [SEP] Dwight, you ignorant [mask]! [SEP]

标签 = NotNext


具体参数

  • 训练语料:Toronto Book Corpus (800M words) 及英文维基百科 (2,500M 单词)
  • 输入序列:从语料库中选取两段文本(即“句子”),第一个句子添加 A 嵌入,第二个句子添加 B 嵌入。50% 情况下为真正的下一句,50%为随机选取,这是为了“下一句预测”任务。两句话的长度之和必须小于512个标记。语言模型遮蔽过程是在使用WordPiece序列化句子后,以均匀的15% 的概率遮蔽标记,不考虑部分词片的影响(那些含有被 WordPiece 拆分,以##为前缀的标记)。[参考2]
  • 批大小:256
  • 步数:1,000,000(33亿词的预料库中,训练40个epoch)
  • 优化算法:Adam
  • 学习率: 1 0 − 4 10^{-4} 104 β 1 = 0.9 \beta_1 = 0.9 β1=0.9 β 2 = 0.999 \beta_2 = 0.999 β2=0.999,L2权重衰减为 0.01 0.01 0.01,并在前10000步学习率热身(learning rate warmup),然后学习率开始线性衰减。
  • 激活函数:gelu(与OpenAI GPT一样)
  • 损失函数:这比语言模型的似然值与下语句预测的似然值的平均。
  • 硬件: B E R T B A S E BERT_{BASE} BERTBASE:4块Cloud TPU; B E R T L A R G E BERT_{LARGE} BERTLARGE:16块Cloud TPU。每次需要训练4天。

BERT的微调过程

BERT的微调过程很简单,因为Transformer中的自注意力机制允许BERT通过交换适当的输入和输出来模拟许多下游任务——无论是设计单个文本还是文本对。对于涉及文本对的应用,一种常见的模式是在应用双向交叉注意力之前独立编码文本对。但是BERT正相反,使用自注意力机制来统一这两个阶段,因为对连接文本对的自注意力编码有效地包含了两个句子之间的双向交叉注意力。

对于每个任务,我们只需将特定任务的输入和输出插入BERT中,并对所有参数进行端到端的微调。在输入时,预训练的A句和B句类似于(1)释义时的句对,(2)隐含时的假设-前提对,(3)问答时的问题-段落对,(4)文本分类或序列标注时的简并文本-∅对。在输出时,标记表示被送入输出层进行标记级任务,如序列标记或问题回答,而[CLS]表示被送入输出层进行分类,如娱乐或情感分析。

具体微调过程详见原文第四节。

对于微调,除了批量大小、学习率和训练次数外,大多数模型超参数与预训练期间相同。Dropout 概率总是使用 0.1。最优超参数值是特定于任务的,但我们发现以下可能值的范围可以很好地在所有任务中工作:

  • Batch size: 16, 32
  • Learning rate (Adam): 5e-5, 3e-5, 2e-5
  • Number of epochs: 3, 4

我们还观察到大数据集(例如 100k+ 标记的训练集)对超参数选择的敏感性远远低于小数据集。微调通常非常快,因此只需对上述参数进行完全搜索,并选择在验证集上性能最好的模型即可。[参考2]


总结

以上是对BERT的一个最基本最初步的介绍,主要基于BERT的原始论文和部分优秀博文。下一篇文章将使用 hugging face 的 Transformer 包来用BERT进行文本情感分类的实验。后续的文章,我们会介绍各种基于BERT的NLP预训练模型。


参考:

  1. 英文的BERT情感分类tutorial,写的非常好!
    https://curiousily.com/posts/sentiment-analysis-with-bert-and-hugging-face-using-pytorch-and-python/
  2. 中文BERT论文翻译以及相关资料整理的repo: https://github.com/yuanxiaosc/BERT_Paper_Chinese_Translation
  3. 原始论文:https://arxiv.org/abs/1810.04805v2
  4. 英文博文《The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning)》,其对BERT, ELMo 等预训练模型进行了非常简单清晰的解释:http://jalammar.github.io/illustrated-bert/

你可能感兴趣的:(BERT,Transformer,python,自然语言处理,pytorch,神经网络,深度学习)