简介

2018年10月11日,Google发布的论文《Pre-training of Deep Bidirectional Transformers for Language Understanding》[1],提出的 BERT 模型成功在11项 NLP 任务中取得 state of the art 的结果,赢得自然语言处理学界的一片赞誉之声,成为 NLP 发展史上的里程碑式的模型成就。BERT 的全称是 Bidirectional Encoder Representations from Transformer。

  • Bidirectional:BERT 的模型结构和 ELMo 类似,均为双向的。

  • Encoder:BERT 只是用到了 Transformer 的 Encoder 编码器部分。

  • Representation:做词 / 句子的语义表征。

  • Transformer:Transformer Encoder 是 BERT 模型的核心组成部分。

BERT 模型的目标是利用自监督学习方法在大规模无标注语料上进行预训练,从而捕捉文本中的丰富语义信息。在后续特定的 NLP 任务中,我们可以根据任务类型对 BERT 预训练模型参数进行微调,以取得更好的任务效果。BERT 论文链接:https://arxiv.org/abs/1810.04805 ,github 地址:https://github.com/google-research/bert

模型理解

网络架构

BERT 的网络架构使用的是《Attention is all you need》[2] 中提出的多层 Transformer Encoder 结构,其最大的特点是抛弃了传统的 RNN 和 CNN,通过 Attention 机制将任意位置的两个单词的距离转换成1,有效的解决了 NLP 中棘手的长期依赖问题。Transformer 的结构在 NLP 领域中已经得到了广泛应用,其网络架构如下图所示,Transformer 是一个 encoder-decoder 的结构,由若干个编码器和解码器堆叠形成。图中的左侧部分为编码器,由 Multi-Head Attention 和 Feed Forward 全连接层组成,用于将输入语料转化成特征向量。右侧部分是解码器,其输入为编码器的输出以及已经预测出的结果,由 Masked Multi-Head Attention, Multi-Head Attention 以及 Feed Forward 全连接层组成,用于输出最后结果的条件概率。

上图的左侧部分是一个 Transformer Block,对应到下图中的一个 “Trm”。

BERT 提供了基础和复杂两个模型,对应的超参数分别如下:

















  • :L=12,H=768,A=12,参数总量110M


















  • :L=24,H=1024,A=16,参数总量340M

其中 L 表示网络的层数(即 Transformer blocks 的数量),A 表示 Multi-Head Attention 中 self-Attention 的数量,H 是输出向量的维度。谷歌提供了中文 BERT 基础预训练模型 bert-base-chinese,TensorFlow 版模型链接:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip ,Pytorch 版模型权重链接:https://huggingface.co/bert-base-chinese/tree/main

BERT 论文中还对比了 GPT[3] 和 ELMo[4],它们两个的结构如下图所示:

其中 BERT 使用的是双向 Transformer 编码器,GPT 使用的是单向 Transformer 解码器,ELMo 使用两个独立训练的 LSTM 结构,只有BERT表征会基于所有层中的左右两侧语境。除了结构上的不同,BERT 和 GPT 是基于微调的方式,而 ELMo 是基于特征的方法。

输入表示

BERT 模型的输入为表示单个文本句或一对文本的词序列,对于给定的词,其输入表示通过三部分 Embedding 求和得到。

  • Token Embeddings:WordPiece 分词后的词向量。

  • Position Embedding:位置嵌入是指将单词的位置信息编码成特征向量,位置嵌入是向模型中引入单词位置关系的至关重要的一环。

  • Segment Embedding:用于区分两个句子。对于句子对输入,第一个句子的特征值是0,第二个句子的特征值是1。

图中的两个特殊符号[CLS][SEP][CLS]一般位于句首,是输入的第一个 token,其对应的输出向量可以作为整个输入句子的表示,用于之后的分类任务。[SEP]表示分句符号,用于断开输入语料中的两个句子。

预训练任务

BERT 模型使用两个新的无监督预测任务进行预训练,分别是 Masked LM(MLM)和 Next Sentence Prediction(NSP)。

Masked LM

为了训练深度双向 Transformer 表示,采用了一种简单的方法:随机掩盖部分输入词,然后对那些被掩盖的词进行预测,此方法被称为“Masked LM”(MLM)。该任务非常像我们在中学时期经常做的完形填空。正如传统的语言模型算法和 RNN 匹配一样,MLM 的这个性质和 Transformer 的结构也是非常匹配的。

BERT 在预训练时只预测[MASK]位置的单词,这样就可以同时利用上下文信息。但是在后续使用的时候,句子中并不会出现[MASK]的单词,这样会影响模型的性能。因此在训练时采用如下策略,随机选择句子中15%的单词进行 Mask,在选择为 Mask 的单词中,有80%真的使用[MASK]进行替换,10%使用一个随机单词替换,剩下10%保留原词不进行替换。

  • 原句:my dog is hairy

  • 80%:my dog is [MASK]

  • 10%:my dog is apple

  • 10%:my dog is hairy

注意最后10%保留原句是为了将表征偏向真实观察值,而另外10%用其它随机词替代原词并不会影响模型对语言的理解能力,因为它只占所有词的1.5%(0.1 × 0.15)。此外,作者在论文中还表示因为每次只能预测15%的词,因此模型收敛比较慢。

Next Sentence Prediction

Next Sentence Prediction(NSP)是一个二分类任务,其目标是判断句子 B 是否是句子 A 的下文,如果是的话输出标签为 ‘IsNext’,否则输出标签为 ‘NotNext’。BERT 使用这一预训练任务的主要原因是,很多句子级别的任务如自动问答(QA)和自然语言推理(NLI)都需要理解两个句子之间的关系。训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合 IsNext 关系,另外50%的第二句话是随机从预料中提取的,它们的关系是 NotNext 的。BERT 模型使用[CLS]的编码信息进行预测。

  • 输入:[CLS]我 喜 欢 玩 英 [MASK] 联 盟 [SEP] 我 最 擅 长 的 [MASK] 色 是 亚 索 [SEP]

  • 类别:IsNext

  • 输入:[CLS]我 喜 欢 玩 英 [MASK] 联 盟 [SEP] 今 天 天 气 很 [MASK] [SEP]

  • 类别:NotNext

BERT 预训练的过程可以用下图来表示。

微调

预训练得到的 BERT 模型可以在后续用于具体 NLP 任务的时候进行微调 (Fine-tuning 阶段),BERT 模型可以适用于多种不同的 NLP 任务,如下图所示。

句子对分类任务

例如自然语言推断 (MNLI),句子语义等价判断 (QQP) 等,如上图 (a) 所示,需要将两个句子传入 BERT,然后使用 [CLS] 的输出向量 C 进行句子对分类。

单句分类任务

例如句子情感分析 (SST-2),判断句子语法是否可以接受 (CoLA) 等,如上图 (b) 所示,只需要输入一个句子,无需使用 [SEP] 标志,然后也是用 [CLS] 的输出向量 C 进行分类。

问答任务

如 SQuAD v1.1 数据集,样本是语句对 (Question, Paragraph),Question 表示问题,Paragraph 是一段来自 Wikipedia 的文本,Paragraph 包含了问题的答案。而训练的目标是在 Paragraph 中找出答案的起始位置 (Start,End)。如上图 (c) 所示,将 Question 和 Paragraph 传入 BERT,然后 BERT 根据 Paragraph 所有单词的输出预测 Start 和 End 的位置。

单句标注任务

例如命名实体识别 (NER),输入单个句子,然后根据 BERT 对于每个单词的输出向量 T 预测这个单词的类别,是属于 Person,Organization,Location,Miscellaneous 还是 Other (非命名实体)。

任务效果

中文文本分类实践

基于 pytorch-transformers 实现的 BERT 中文文本分类代码仓库:https://github.com/zejunwang1/bert_text_classification 。该仓库主要包含 data 文件夹、pretrained_bert 文件夹和4个 python 源文件。

  • config.py:模型配置文件,主要配置训练集 / 验证集 / 测试集数据路径,模型存储路径,batch size,最大句子长度和优化器相关参数等。

  • preprocess.py:实现 DataProcessor 数据预处理类。

  • main.py:主程序入口。

  • train.py:模型训练和评估代码。

从 THUCNews 中随机抽取20万条新闻标题,一共有10个类别:财经、房产、股票、教育、科技、社会、时政、体育、游戏、娱乐,每类2万条标题数据。数据集按如下划分:

  • 训练集:18万条新闻标题,每个类别的标题数为18000

  • 验证集:1万条新闻标题,每个类别的标题数为1000

  • 测试集:1万条新闻标题,每个类别的标题数为1000

训练集对应 data 文件夹下的 train.txt,验证集对应 data 文件夹下的 dev.txt,测试集对应 data 文件夹下的 test.txt。可以按照 data 文件夹中的数据格式来准备自己任务所需的数据,并调整 config.py 中的相关配置参数。

预训练 BERT 模型

从 huggingface 官网上下载 bert-base-chinese 模型权重、配置文件和词典到 pretrained_bert 文件夹中,下载地址:https://huggingface.co/bert-base-chinese/tree/main

模型训练

文本分类模型训练:

python main.py --mode train --data_dir ./data --pretrained_bert_dir ./pretrained_bert

训练中间日志如下:

模型在验证集上的效果如下:

Demo演示

文本分类 demo 展示:

python main.py --mode demo --data_dir ./data --pretrained_bert_dir ./pretrained_bert

模型预测

对 data 文件夹下的 input.txt 中的文本进行分类预测:

python main.py --mode predict --data_dir ./data --pretrained_bert_dir ./pretrained_bert --input_file ./data/input.txt

输出如下结果:

参考文献

[1] BERT: https://arxiv.org/pdf/1810.04805.pdf

[2] Transformer: https://arxiv.org/pdf/1706.03762.pdf

[3] GPT: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf

[4] ELMo: https://arxiv.org/pdf/1802.05365.pdf


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》视频课
本站qq群851320808,加入微信群请扫码:

【NLP】BERT 模型与中文文本分类实践相关推荐

  1. textcnn文本词向量_基于Text-CNN模型的中文文本分类实战

    1 文本分类 文本分类是自然语言处理领域最活跃的研究方向之一,目前文本分类在工业界的应用场景非常普遍,从新闻的分类.商品评论信息的情感分类到微博信息打标签辅助推荐系统,了解文本分类技术是NLP初学者比 ...

  2. Bert模型做多标签文本分类

    Bert模型做多标签文本分类 参考链接 BERT模型的详细介绍 图解BERT模型:从零开始构建BERT (强推)李宏毅2021春机器学习课程 我们现在来说,怎么把Bert应用到多标签文本分类的问题上. ...

  3. PyTorch入门(五)使用CNN模型进行中文文本分类

      本文将会介绍如何在PyTorch中使用CNN模型进行中文文本分类.   使用CNN实现中文文本分类的基本思路: 文本预处理 将字(或token)进行汇总,形成字典文件,可保留前n个字 文字转数字, ...

  4. 科大讯飞NLP算法赛baseline:文本分类实践+0.79

    比赛题目:学术论文分类挑战赛 比赛链接:https://challenge.xfyun.cn/topic/info?type=academic-paper-classification&ch= ...

  5. BERT微调做中文文本分类

    BERT模型在NLP各项任务中大杀四方,那么我们如何使用这一利器来为我们日常的NLP任务来服务呢?我们首先介绍使用BERT做文本分类任务. 重写读取数据的类 需要根据文件格式重写读取数据的类,只要能够 ...

  6. 基于Text-CNN模型的中文文本分类实战

    七月 上海 | 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习  快速带你入门阅读全文> 正文共5260个字,21张图,预计阅读时间28分钟. Text-CNN 1.文本分类 ...

  7. 百度开源其NLP主题模型工具包,文本分类等场景可直接使用L——LDA进行主题选择本质就是降维,然后用于推荐或者分类...

    2017年7月4日,百度开源了一款主题模型项目,名曰:Familia. InfoQ记者第一时间联系到百度Familia项目负责人姜迪并对他进行采访,在本文中,他将为我们解析Familia项目的技术细节 ...

  8. NLP实战之textCNN中文文本分类

    原理可以参考:使用textCNN进行文本分类的原理 Keras的另一个实现可以参考:Keras实现textCNN文本分类 模型构建与训练 定义网络结构 定义一个textCNN类, 代码为tensorf ...

  9. NLP - 15 分钟搭建中文文本分类模型

    https://eliyar.biz/nlp_chinese_text_classification_in_15mins/

最新文章

  1. 电商课题I:集群环境下业务限流
  2. java我们一起打雪仗_我们一起打雪仗作文
  3. [CSS] 点击事件触发的动画
  4. 《白鹿原》金句摘抄(二)
  5. Ubuntu 14.04 文件服务器--samba的安装和配置
  6. Feign 简介和使用
  7. fckeditor 上传图片 php_fckeditor 上传图片乱码的解决方法_PHP教程
  8. fs hadoop 压缩_Hadoop 压缩图文教程
  9. python语言能做什么游戏好玩_太好玩了我用 Python 制作一款小游戏
  10. .net开发常用工具备忘录
  11. ssh-add - 向认证代理添加 RSA 或 DSA 身份数据
  12. linux交叉编译 i2c-tools
  13. JanusGraph 创建索引步骤
  14. 【雷达】毫米波雷达和激光雷达
  15. 简单理解什么叫联邦学习(全)
  16. lzx: ssh: connect to host lzx port 22: Connection timed out-------hadoop
  17. Python案例-网络编程-socket入门-serverclient
  18. Nginx和Tomcat优化
  19. Python基础复习--print()函数、转义符、变量命名
  20. 南大通用参加1024程序员节 沉淀自主知识产权 共建中国标准

热门文章

  1. Fragment要点复习
  2. MSI failed, 不能卸载VMware
  3. 无限极分类中递归查找一个树结构
  4. sqlserver的四种分页方式
  5. UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径
  6. 配置nginx,支持php的pathinfo路径模式
  7. gradient 渐变
  8. 怎么在VS监视DataSet类型的数据
  9. Altium Designer 09 使用要点:电气连接工具
  10. ie8.0 不能用document.all兼容IE7模式