本文内容中:挑出pytorch 版的 BERT 相关代码,从代码结构、具体实现与原理,以及使用的角度进行分析

Transformers版本:4.4.2(2021 年 3 月 19 日发布)

1. 本节接着上节内容,本节具体内容:

 a) BERT-based Models应用模型
 b) Bert解决NLP任务
   - BertForSequenceClassification
   - BertForMultiChoice
   - BertForTokenClassification
   - BertForQuestionAnswering
 c) BERT训练与优化

a. BERT-based Models

  基于 BERT 的模型都写在/models/bert/modeling_bert.py里面,包括 BERT 预训练模型和 BERT 分类等模型。
  首先,以下所有的模型都是基于BertPreTrainedModel这一抽象基类的,而后者则基于一个更大的基类PreTrainedModel。这里我们关注BertPreTrainedModel的功能:
  用于初始化模型权重,同时维护继承自PreTrainedModel的一些标记身份或者加载模型时的类变量。
补充:BERT 预训练任务包括两个:

  1. Masked Language Model(MLM):
      在句子中随机用[MASK]替换一部分单词,然后将句子传入BERT 中编码每一个单词的信息,最终用[MASK]的编码信息预测该位置的正确单词,这一任务旨在训练模型根据上下文理解单词的意思;
  2. Next Sentence Prediction(NSP)
      将句子对 A 和 B 输入 BERT,使用[CLS]的编码信息
    图 Bert预训练
b. Bert解决NLP任务
  1. BERT架构代码分析
      1)以下所有模型 <-(基于) BertPreTrainedModel <-(基于) PreTrainedModel
      2)BertPreTrainingHeads模型:负责两个任务的预测模块
      3)BertPreTrainingHeads模型:包裹了BertLMPredictionHead 和一个代表 NSP 任务的线性层
      4)BertPredictionHeadTransform模型:用来完成一些线性变换
      5)回到BertForPreTraining,继续看两块 loss 是怎么处理的。它的前向传播和BertModel的有所不同,多了labelsnext_sentence_label 两个输入:
       - labels:形状为[batch_size, seq_length] ,代表 MLM 任务的标签,注意这里对于原本未被遮盖的词设置为 -100,被遮盖词才会有它们对应的 id,和任务设置是反过来的。
       - 例如,原始句子是I want to [MASK] an apple,这里我把单词eat给遮住了输入模型,对应的label设置为[-100, -100, -100, 【eat对应的id】, -100, -100];
       - 为什么要设置为 -100 而不是其他数?因为torch.nn.CrossEntropyLoss默认的 gnore_index=-100,也就是说对于标签为 100 的类别输入不会计算 loss。
       - next_sentence_label:这一个输入很简单,就是 0 和 1 的二分类标签。
      6)直接相加,就是这么单纯的策略。
      当然,这份代码里面也包含了对于只想对单个目标进行预训练的 BERT 模型(具体细节不作展开):
       - BertForMaskedLM:只进行 MLM 任务的预训练;
       - 基于BertOnlyMLMHead,而后者也是对BertLMPredictionHead的另一层封装;
      - BertLMHeadModel:这个和上一个的区别在于,这一模型是作为 decoder 运行的版本;
       - 同样基于BertOnlyMLMHead;
       - BertForNextSentencePrediction:只进行 NSP 任务的预训练。
       - 基于BertOnlyNSPHead,内容就是一个线性层。
  2. BertForSequenceClassification
      1)这一模型用于句子分类(也可以是回归)任务,比如 GLUE benchmark 的各个任务。句子分类的输入为句子(对),输出为单个分类标签。结构上很简单,就是BertModel(有 pooling)过一个 dropout 后接一个线性层输出分类:
      2)在前向传播时,和上面预训练模型一样需要传入labels输入。如果初始化的num_labels=1,那么就默认为回归任务,使用 MSELoss;否则认为是分类任务。
  3. BertForMultipleChoice
      这一模型用于多项选择,如 RocStories/SWAG 任务。
      多项选择任务的输入为一组分次输入的句子,输出为选择某一句子的单个标签。 结构上与句子分类相似,只不过线性层输出维度为 1,即每次需要将每个样本的多个句子的输出拼接起来作为每个样本的预测分数。实际上,具体操作时是把每个 batch 的多个句子一同放入的,所以一次处理的输入为[batch_size, num_choices]数量的句子,因此相同 batch 大小时,比句子分类等任务需要更多的显存,在训练时需要小心。
  4. BertForTokenClassification
      这一模型用于序列标注(词分类),如 NER 任务。
      序列标注任务的输入为单个句子文本,输出为每个 token 对应的类别标签。 由于需要用到每个 token对应的输出而不只是某几个,所以这里的BertModel不用加入 pooling 层;同时,这里将_keys_to_ignore_on_load_unexpected这一个类参数设置为[r"pooler"],也就是在加载模型时对于出现不需要的权重不发生报错。
  5. BertForQuestionAnswering
      这一模型用于解决问答任务,例如 SQuAD 任务。
       - 问答任务的输入为问题 +(对于 BERT 只能是一个)回答组成的句子对,输出为起始位置和结束位置用于标出回答中的具体文本。这里需要两个输出,即对起始位置的预测和对结束位置的预测,两个输出的长度都和句子长度一样,从其中挑出最大的预测值对应的下标作为预测的位置。
      - 对超出句子长度的非法 label,会将其压缩(torch.clamp_)到合理范围。
c. BERT训练和优化
  1. Pre-Training
      预训练阶段,除了众所周知的 15%、80% mask 比例,有一个值得注意的地方就是参数共享。不止BERT,所有 huggingface 实现的 PLM 的 word embedding 和 masked language model 的预测权重在初始化过程中都是共享的:
      -> 至于为什么,应该是因为 word_embedding 和 prediction 权重太大了,以 bert-base 为例,其尺寸为(30522, 768),降低训练难度。
  2. Fine-Tuning
     微调也就是下游任务阶段,也有两个值得注意的地方。
     2.1 AdamW
      首先介绍一下 BERT 的优化器:AdamW(AdamWeightDecayOptimizer)。这一优化器来自 ICLR 2017 的 Best Paper:《Fixing Weight Decay Regularization in Adam》中提出的一种用于修复 Adam 的权重衰减错误的新方法。论文指出,L2 正则化和权重衰减在大部分情况下并不等价,只在 SGD 优化的情况下是等价的;而大多数框架中对于 Adam+L2 正则使用的是权重衰减的方式,两者不能混为一谈。
      AdamW 是在 Adam+L2 正则化的基础上进行改进的算法,与一般的 Adam+L2 的区别如下:

    图片: AdamW

NLP学习笔记——BERT的一些应用(简记)相关推荐

  1. 利用计算机技术实现对文本篇章,自然语言处理NLP学习笔记一:概念与模型初探...

    前言 先来看一些demo,来一些直观的了解. 自然语言处理: 可以做中文分词,词性分析,文本摘要等,为后面的知识图谱做准备. 知识图谱: 还有2个实际应用的例子,加深对NLP的理解 九歌机器人: 微软 ...

  2. [NLP学习笔记-Task10] Transformer + BERT

    Encoder-Decoder框架 Encoder-Decoder是为seq2seq(序列到序列)量身打造的一个深度学习框架,在机器翻译.机器问答等领域有着广泛的应用.这是一个抽象的框架,由两个组件: ...

  3. NLP学习笔记(一)

    这是一个学习笔记,会有一些学习记录和自己的规划.一些想法...... 一.贪心学院第十期豆瓣电影预测评分项目 1.文本转化成向量,将使用三种方式,分别为tf-idf, word2vec以及BERT向量 ...

  4. NLP学习笔记30-SVM 对偶、KTT,核函数

    一 序 本文属于贪心NLP训练营学习笔记系列. 二 Mapping Feature to High Dimensional Space 如图所示,转换是包含两部分的工作的,第一步是从低维特征向量转换为 ...

  5. NLP学习笔记41-递归神经网络

    一 序 本文属于贪心NLP训练营学习笔记系列.    为什么需要递归神经网络? 类似天气.股票.语音这种数据,是时序数据,对于语音:同一个单词不同人说对应时长不同. 之前学习的多层感知器,假设输入是一 ...

  6. NLP学习笔记25-情绪识别实战及数据集下载

    一 序 本文属于贪心NLP训练营学习笔记系列. 这节课在线性回归及正则里面穿插的讲.对于从逻辑回归开始明显感到主要就是 讲数学公式的推导了.好难. 二 情绪识别实战 Python吧就是看了点语法,所以 ...

  7. NLP学习笔记-Pytorch框架(补充)

    PDF Pytorch初步应用 使用Pytorch构建一个神经网络 学习目标 掌握用Pytorch构建神经网络的基本流程. 掌握用Pytorch构建神经网络的实现过程. 关于torch.nn: 使用P ...

  8. 李宏毅nlp学习笔记04:bert和它的好朋友们

    1.当下追求的模型: 输入文本,训练使得模型可以读懂文本,然后根据不同的任务微调模型! 2.bert大家庭-芝麻街: 3.预训练: 把token用嵌入的向量表示. 针对英文系的前缀后缀等,有fastt ...

  9. 『NLP学习笔记』BERT文本分类实战

    BERT技术详细介绍! 文章目录 一. 数据集介绍 二. 数据读取 三. 训练集和验证集划分 四. 数据分词tokenizer 五. 定义数据读取(继承Dataset类) 六. 定义模型以及优化方法 ...

最新文章

  1. 全球及中国汽车流通行业营销模式及十四五竞争格局展望报告2021-2027年
  2. js获取网页当前页面及路径
  3. Java8 CopyOnWriteArrayList 源码分析
  4. 撒花!算法岗必须复现的上百篇经典论文代码完结啦! | 附下载链接
  5. jQuery经典案例【倒计时】
  6. 嵌入式Linux初始化硬件RTC,嵌入式Linux系统中的快速启动技术研究
  7. 选防晒霜 要看四个要点 - 健康程序员,至尚生活!
  8. 在silverlight中,创建webservice的client报错
  9. 制作种子怎么上传服务器,怎么制作BT种子 使用BitComet制作BT种子文件教程
  10. ssh secure shell:server responded algorithm negotiation failed
  11. win10本次操作由于计算机的限制而取消,手把手修复win10系统本次操作由于计算机限制而被取消的办法...
  12. ubuntu更改网卡设置等出现输入default keyring密码的解决方法
  13. 美国大学倒闭危机!1/4高校或将破产,清华本科留学率下降
  14. OJ刷题之《寄居蟹与海葵》
  15. 读书笔记:《浪潮之巅:下》
  16. 上半年计算机二级试题,2016上半年计算机二级模拟题及答案
  17. ISP(图像信号处理)学习笔记-DPC坏点校正
  18. redis内存消耗详解
  19. java实现生产者消费者模式
  20. 京东程序员离职怒删代码被判10个月,京东到家请人花三万恢复!

热门文章

  1. Java开源GIS系统
  2. 蓝牙协议栈开发板 STM32F1 跑蓝牙协议栈 --传统蓝牙搜索演示以及实现原理
  3. stm32之IIC应用实例(AT24C02芯片,硬件和软件方式驱动)
  4. 如何解锁物联网低代码平台操作日志功能?
  5. SAP中采购交货时间取值物料主数据或采购协议配置分析测试
  6. Java高级编程之常用类
  7. 六大服务器和网络监控工具
  8. 【配置】如何配置Tp-link无线路由器作为无线交换机
  9. ISPRS2018/云检测:Cloud/shadow detection based on spectral indices for multi/hyp基于光谱指数的多/高光谱光学遥感成像仪云/影检测
  10. PDI(kettle) 阻塞数据直到步骤都完成、Blocking step组件用法及区别