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 与 GPT 和 ELMo 均为预训练模型,但是三者在结构上是有所区别的。下图展示了具体差别:


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的训练方式

模型有两种训练方式:遮蔽语言模型(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/
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BERT(Bidirectional Encoder Representations from Transformers)模型是一种预训练的语言表示模型,用于处理自然语言处理任务,例如文本分类。要实战BERT模型进行文本分类,首先需要准备好训练数据集和测试数据集。然后按照以下步骤进行代码实现: 1. 导入必要的库和模型:首先导入必要的Python库,例如tensorflow和transformers。然后加载预训练的BERT模型,例如使用transformers库中的BertForSequenceClassification模型。 2. 数据预处理:将文本数据转换为BERT模型的输入格式。可以使用tokenizer对文本进行编码,然后将编码后的文本转换为模型输入的格式。 3. 构建模型:基于BERT模型构建文本分类模型。可以使用BertForSequenceClassification模型构建一个分类器,并根据实际情况调整模型的超参数。 4. 模型训练:使用准备好的训练数据集对构建的BERT文本分类模型进行训练。可以使用适当的优化器和损失函数来训练模型,并根据验证集的表现来调整模型。 5. 模型评估:使用准备好的测试数据集对训练好的BERT文本分类模型进行评估。可以计算模型的准确率、召回率和F1值等指标来评估模型的性能。 6. 模型应用:使用训练好的BERT文本分类模型对新的文本数据进行分类预测。可以将模型应用到实际的文本分类任务中,例如对新闻文本进行分类、对电影评论进行情感分析等。 通过以上步骤,可以实战BERT模型进行文本分类任务,并根据实际情况对模型进行调整和优化,从而得到更好的分类效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值