BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding学习

2023-11-01

一、什么是BERT模型?

谷歌团队的Thang Luong直接定义:BERT模型开启了NLP的新时代

BERT这个模型与ELMo和OpenAI的fine-tune transformer的不同的是,它在训练双向语言模型时以减小的概率把少量的词替成了Mask或者另一个随机的词。

我个人感觉这个目的在于使模型被迫增加对上下文的记忆。

BERT模型具有以下两个特点:

第一,是这个模型非常的深,12层,并不宽(wide),中间层只有1024,而之前的Transformer模型中间层有2048。这似乎又印证了计算机图像处理的一个观点——深而窄 比 浅而宽 的模型更好。

第二,MLM(Masked Language Model),同时利用左侧和右侧的词语,这个在ELMo上已经出现了。

 

二、如何理解BERT模型

BERT 要解决什么问题?

通常情况 transformer 模型有很多参数需要训练。譬如 BERT BASE 模型: L=12, H=768, A=12, 需要训练的模型参数总数是 12 * 768 * 12 = 110M。这么多参数需要训练,自然需要海量的训练语料。如果全部用人力标注的办法,来制作训练数据,人力成本太大。

受《A Neural Probabilistic Language Model》论文的启发,BERT 也用 unsupervised 的办法,来训练 transformer 模型。

模型参数数量这么大,必然需要海量的训练语料。从哪里收集这些海量的训练语料?《A Neural Probabilistic Language Model》这篇论文说,每一篇文章,天生是训练语料。难道不需要人工标注吗?回答,不需要。

我们经常说,“说话不要颠三倒四,要通顺,要连贯”,意思是上下文的词汇,应该具有语义的连贯性。基于自然语言的连贯性,语言模型根据前文的词,预测下一个将出现的词。如果语言模型的参数正确,如果每个词的词向量设置正确,那么语言模型的预测,就应该比较准确。天下文章,数不胜数,所以训练数据,取之不尽用之不竭。

深度学习四大要素,1. 训练数据、2. 模型、3. 算力、4. 应用。训练数据有了,接下去的问题是模型。关于模型,BERT提出了五个关键词 Pre-training、Deep、Bidirectional、Transformer、Language Understanding 。

BERT的五个关键词分别是什么意思?

这个题目有五个关键词,分别是 Pre-training、Deep、Bidirectional、Transformers、和 Language Understanding。其中 pre-training 的意思是,作者认为,确实存在通用的语言模型,先用文章预训练通用模型,然后再根据具体应用,用 supervised 训练数据,精加工(fine tuning)模型,使之适用于具体应用。为了区别于针对语言生成的 Language Model,作者给通用的语言模型,取了一个名字,叫语言表征模型 Language Representation Model。

 

能实现语言表征目标的模型,可能会有很多种,具体用哪一种呢?作者提议,用 Deep Bidirectional Transformers 模型。假如给一个句子 “能实现语言表征[mask]的模型”,遮盖住其中“目标”一词。从前往后预测[mask],也就是用“能/实现/语言/表征”,来预测[mask];或者,从后往前预测[mask],也就是用“模型/的”,来预测[mask],称之为单向预测 unidirectional。单向预测,不能完整地理解整个语句的语义。于是研究者们尝试双向预测。把从前往后,与从后往前的两个预测,拼接在一起 [mask1/mask2],这就是双向预测 bi-directional。细节参阅《Neural Machine Translation by Jointly Learning to Align and Translate》。

 

BERT 的作者认为,bi-directional 仍然不能完整地理解整个语句的语义,更好的办法是用上下文全向来预测[mask],也就是用 “能/实现/语言/表征/../的/模型”,来预测[mask]。BERT 作者把上下文全向的预测方法,称之为 deep bi-directional。如何来实现上下文全向预测呢?BERT 的作者建议使用 Transformer 模型。这个模型由《Attention Is All You Need》一文发明。

这个模型的核心是聚焦机制,对于一个语句,可以同时启用多个聚焦点,而不必局限于从前往后的,或者从后往前的,序列串行处理。不仅要正确地选择模型的结构,而且还要正确地训练模型的参数,这样才能保障模型能够准确地理解语句的语义。BERT 用了两个步骤,试图去正确地训练模型的参数。第一个步骤是把一篇文章中,15% 的词汇遮盖,让模型根据上下文全向地预测被遮盖的词。假如有 1 万篇文章,每篇文章平均有 100 个词汇,随机遮盖 15% 的词汇,模型的任务是正确地预测这 15 万个被遮盖的词汇。通过全向预测被遮盖住的词汇,来初步训练 Transformer 模型的参数。然后,用第二个步骤继续训练模型的参数。譬如从上述 1 万篇文章中,挑选 20 万对语句,总共 40 万条语句。挑选语句对的时候,其中 2乘10万对语句,是连续的两条上下文语句,另外 2x10 万对语句,不是连续的语句。然后让 Transformer 模型来识别这 20 万对语句,哪些是连续的,哪些不连续。

这两步训练合在一起,称为预训练 pre-training。训练结束后的 Transformer 模型,包括它的参数,是作者期待的通用的语言表征模型。

 

三、BERT模型解析

BERT的新语言表示模型,它代表Transformer的双向编码器表示。与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示。因此,预训练的BERT表示可以通过一个额外的输出层进行微调,适用于广泛任务的最先进模型的构建,比如问答任务和语言推理,无需针对具体任务做大幅架构修改。

论文作者认为现有的技术严重制约了预训练表示的能力。其主要局限在于标准语言模型是单向的,这使得在模型的预训练中可以使用的架构类型很有限。在论文中,作者通过提出BERT:即Transformer的双向编码表示来改进基于架构微调的方法。

BERT 提出一种新的预训练目标:遮蔽语言模型(masked language model,MLM),来克服上文提到的单向性局限。MLM 的灵感来自 Cloze 任务(Taylor, 1953)。MLM 随机遮蔽模型输入中的一些 token,目标在于仅基于遮蔽词的语境来预测其原始词汇 id。

与从左到右的语言模型预训练不同,MLM 目标允许表征融合左右两侧的语境,从而预训练一个深度双向 Transformer。除了遮蔽语言模型之外,本文作者还引入了一个“下一句预测”(next sentence prediction)任务,可以和MLM共同预训练文本对的表示。

 

BERT使用双向Transformer。OpenAI GPT使用从左到右的Transformer。ELMo使用经过独立训练的从左到右和从右到左LSTM的串联来生成下游任务的特征。三个模型中,只有BERT表示在所有层中共同依赖于左右上下文。

论文的输入表示(input representation)能够在一个token序列中明确地表示单个文本句子或一对文本句子(例如, [Question, Answer])。对于给定token,其输入表示通过对相应的token、segment和position embeddings进行求和来构造。下图是输入表示的直观表示:

 

具体如下:

  • 使用WordPiece嵌入(Wu et al., 2016)和30,000个token的词汇表。用##表示分词。
  • 使用学习的positional embeddings,支持的序列长度最多为512个token。
  • 每个序列的第一个token始终是特殊分类嵌入([CLS])。对应于该token的最终隐藏状态(即,Transformer的输出)被用作分类任务的聚合序列表示。对于非分类任务,将忽略此向量。
  • 句子对被打包成一个序列。以两种方式区分句子。首先,用特殊标记([SEP])将它们分开。其次,添加一个learned sentence A嵌入到第一个句子的每个token中,一个sentence B嵌入到第二个句子的每个token中。
  • 对于单个句子输入,只使用 sentence A嵌入。

论文不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,使用两个新的无监督预测任务对BERT进行预训练。

任务1: Masked LM

从直觉上看,研究团队有理由相信,深度双向模型比left-to-right 模型或left-to-right and right-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地“see itself”。

为了训练一个深度双向表示(deep bidirectional representation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“masked LM”(MLM),尽管在文献中它经常被称为Cloze任务(Taylor, 1953)。

在这个例子中,与masked token对应的最终隐藏向量被输入到词汇表上的输出softmax中,就像在标准LM中一样。在团队所有实验中,随机地屏蔽了每个序列中15%的WordPiece token。与去噪的自动编码器(Vincent et al., 2008)相反,只预测masked words而不是重建整个输入。

虽然这确实能让团队获得双向预训练模型,但这种方法有两个缺点。首先,预训练和finetuning之间不匹配,因为在finetuning期间从未看到[MASK]token。为了解决这个问题,团队并不总是用实际的[MASK]token替换被“masked”的词汇。相反,训练数据生成器随机选择15%的token。例如在这个句子“my dog is hairy”中,它选择的token是“hairy”。然后,执行以下过程:

数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:

  • 80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]
  • 10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple
  • 10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy. 这样做的目的是将表示偏向于实际观察到的单词。

Transformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。

使用MLM的第二个缺点是每个batch只预测了15%的token,这表明模型可能需要更多的预训练步骤才能收敛。团队证明MLM的收敛速度略慢于 left-to-right的模型(预测每个token),但MLM模型在实验上获得的提升远远超过增加的训练成本。

 

任务2:下一句预测

许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于理解两个句子之间的关系,这并没有通过语言建模直接获得。

在为了训练一个理解句子的模型关系,预先训练一个二进制化的下一句测任务,这一任务可以从任何单语语料库中生成。具体地说,当选择句子A和B作为预训练样本时,B有50%的可能是A的下一个句子,也有50%的可能是来自语料库的随机句子。

 

BERT,OpenAI GPT和ELMo之间的比较如下图所示:

参考:https://github.com/Y1ran/NLP-BERT--ChineseVersion

https://arxiv.org/pdf/1810.04805.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding学习 的相关文章

  • 使用 Hadoop MapReduce 的计算语言学项目构想

    我需要做一个关于计算语言学课程的项目 是否有任何有趣的 语言 问题 其数据密集程度足以使用 Hadoop MapReduce 来解决 解决方案或算法应尝试分析并提供 语言 领域的一些见解 但是它应该适用于大型数据集 以便我可以使用 hado
  • 在非单一维度 1 处,张量 a (2) 的大小必须与张量 b (39) 的大小匹配

    这是我第一次从事文本分类工作 我正在使用 CamemBert 进行二进制文本分类 使用 fast bert 库 该库主要受到 fastai 的启发 当我运行下面的代码时 from fast bert data cls import Bert
  • 使用 nltk 进行分块

    如何从给定模式的句子中获取所有块 示例 NP
  • 在Python或Sklearn中用整数值对具有字符串值的列变量进行编码

    如何用整数值对数据表中字符串类型的列值进行编码 例如 我有两个特征变量 颜色 可能的字符串值 R G 和 B 和技能 可能的字符串值 C Java SQL 和 Python 给定数据表有两列 Color gt R G B B G R B G
  • python 中单词的动名词形式

    我想获得字符串的动名词形式 我还没有找到调用库来获取动名词的直接方法 我应用了以 ing 结尾的单词的规则 但是因为异常导致我收到了一些错误 然后 我检查 cmu 单词以确保生成的动名词单词正确 代码如下 import cmudict im
  • 将单引号替换为双引号并排除某些元素

    我想用双引号替换字符串中的所有单引号 但出现的情况除外 例如 n t ll m 等 input the stackoverflow don t said hey what output the stackoverflow don t sai
  • 否定句子的算法

    我想知道是否有人熟悉算法句子否定的任何尝试 例如 给定一个句子 这本书很好 请提供任意数量的意思相反的替代句子 例如 这本书不好 甚至 这本书不好 显然 以高精度实现这一点可能超出了当前 NLP 的范围 但我确信在这个主题上已经有了一些工作
  • 将 python NLTK 解析树保存到图像文件[重复]

    这个问题在这里已经有答案了 这可能会复制这个 stackoverflowquestion https stackoverflow com questions 23429117 saving nltk drawn parse tree to
  • 实时跟踪每分钟/小时/天的前 100 个 Twitter 单词

    我最近遇到这样一个面试问题 Given a continuous twitter feed design an algorithm to return the 100 most frequent words used at this min
  • 使用正则表达式标记化进行 NLP 词干提取和词形还原

    定义一个函数 名为performStemAndLemma 它需要一个参数 第一个参数 textcontent 是一个字符串 编辑器中给出了函数定义代码存根 执行以下指定任务 1 对给出的所有单词进行分词textcontent 该单词应包含字
  • NLTK 中的 wordnet lemmatizer 不适用于副词 [重复]

    这个问题在这里已经有答案了 from nltk stem import WordNetLemmatizer x WordNetLemmatizer x lemmatize angrily pos r Out 41 angrily 这是 nl
  • SpaCy 中的自定义句子边界检测

    我正在尝试在 spaCy 中编写一个自定义句子分段器 它将整个文档作为单个句子返回 我编写了一个自定义管道组件 它使用以下代码来执行此操作here https github com explosion spaCy issues 1850 但
  • 如何在R中使用OpenNLP获取POS标签?

    这是 R 代码 library NLP library openNLP tagPOS lt function x s lt as String x word token annotator lt Maxent Word Token Anno
  • PHP 和 NLP:嵌套括号(解析器输出)到数组?

    想要将带有嵌套括号的文本转换为嵌套数组 以下是 NLP 解析器的输出示例 TOP S NP PRP I VP VBP love NP NP DT a JJ big NN bed PP IN of NP NNS roses 原文 我喜欢一大床
  • 除非 POS 显式,否则 WordNetLemmatizer 不会返回正确的引理 - Python NLTK

    我正在对 Ted 数据集成绩单进行词形还原 我注意到一些奇怪的事情 并非所有单词都被词形还原 要说的是 selected gt select 哪个是对的 然而 involved gt involve and horsing gt horse
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • 验证 Transformer 中多头注意力的实现

    我已经实施了MultiAttention head in Transformers 周围有太多的实现 所以很混乱 有人可以验证我的实施是否正确 DotProductAttention 引用自 https www tensorflow org
  • 给定文档,选择相关片段

    当我在这里提出问题时 自动搜索返回的问题的工具提示给出了问题的前一点 但其中相当一部分没有给出任何比理解问题更有用的文本 标题 有谁知道如何制作一个过滤器来删除问题中无用的部分 我的第一个想法是修剪仅包含某个列表中的单词的任何前导句子 例如
  • Lucene 标准分析器与 Snowball

    刚刚开始使用 Lucene Net 我使用标准分析器索引了 100 000 行 运行了一些测试查询 并注意到如果原始术语是单数 则复数查询不会返回结果 我知道雪球分析器增加了词干支持 这听起来不错 不过 我想知道 超过标准的雪球锣是否有任何
  • R 中带有变音符号的字符列表

    我试图将字符串中的电话 字符 出现次数制成表格 但变音符号单独作为字符制成表格 理想情况下 我有一个国际音标的单词列表 其中包含大量变音符号以及它们与基本字符的几种组合 我在这里给出了仅包含一个单词的 MWE 但对于单词列表和更多类型的组合

随机推荐

  • Qt编译工程报错:No rule to make target

    第一种情况 Qt编译工程时候 所有用到的源文件包括头文件和库文件的 总路径长度不能超过190个左右字符 一旦超过 就会提示找不到那个文件 这个可能是Qt的makefile的机制问题 解决方法 工程文件夹名字命名尽量比较短 而且工程目录文件夹
  • Linux:CentOS7下配置 iptables

    iptables也叫netfilter 是Linux下自带的一款免费且优秀的基于包过滤的防火墙工具 他的功能十分强大 使用也非常灵活 可以对流入 流出 流经服务器的数据包进行精细的控制 但是iptables在CentOS7的版本上已经被阉割
  • kubernetes(K8s)集群(一)——简介及部署

    kubernetes K8s 集群 一 简介及部署 1 kubernetes简介 1 1 Kubernetes概述 1 2 kubernetes设计架构 1 3 kubernetes设计理念 2 kubernetes部署 2 1 准备工作
  • Python3读取txt文本并利用matplotlib绘制折线图(txt按行读取、字符串分割、matplotlib绘图)

    需要安装matplotlib库 可以用如下命令安装 pip install matplotlib txt文本数据如下所示 示例中的每一行内部用空格分开 100 0 6692215 200 0 57682794 300 0 45037615
  • Windows10安装torch

    w10中使用conda安装并且是3 6的环境输入命令 conda install pytorch cpu c pytorch pip3 install torchvision
  • vue-cli3.0的项目上,配置多个环境

    vue cli3 0的项目上 配置多个环境 一般情况下 我们会需要三个环境 开发环境 测试环境 生产环境 而3 0默认只支持两个环境 即测试环境 生产环境 创建测试环境 1 在根目录下创建一个evn test文件 NODE ENV test
  • 重磅福利

    声明 我已加入 维权骑士 http rightknights com 的版权保护计划 如需转载请先私信申请授权 版权所有 违者必究 知乎上的问题林林总总 每个主题下的问题都也不少 打开知乎 总是容易沉浸在茫茫的问题海洋中 如何找到好的问题和
  • Qt之自定义搜索框

    简述 关于搜索框 大家都经常接触 例如 浏览器搜索 Windows资源管理器搜索等 当然 这些对于Qt实现来说毫无压力 只要思路清晰 分分钟搞定 方案一 调用QLineEdit现有接口 void addAction QAction acti
  • MySQL中按周、月、季、年分组统计

    https blog csdn net xie8409959 article details 82663899 根据日期 按照周 月 季 年对数据进行分组统计 一 前言 带着问题去学习 我觉得是一种非常有效的学习方法 不知下面的几个问题是否
  • flutter的Container(2.0以上版本)

    前言 在flutter中Container是常用的一个标签 这里整理下他里面支持的属性和使用方法 注意我的是 2 0以上的版本 所以方法前没有new 目录 具体支持的参数和案例 一 Alignment 相当于css的text align 属
  • 2021年5月19日 Centos8 安装yapi 全过程 亲自实践有效

    环境要求 centos8 nodejs 7 6 mongodb 2 6 安装nodejs 有一个前期 确保你的yum是可以用的 yum module list nodejs sudo yum module install nodejs no
  • C#如何定义位(Bit)

    StructLayout LayoutKind Explicit Size 16 CharSet CharSet Ansi public class Flag FieldOffset 0 public ushort ReserveBits
  • KEIL中的 USE_STDPERIPH_DRIVER 宏定义

    在项目中使用stm32标准外设库 STM32F10x Standard Peripherals Library 的时候 我们会在项目的选项中预定义两个宏定义 USE STDPERIPH DRIVER STM32F10X MD 如下图 这两个
  • 前端常见跨域解决方案

    什么是跨域 跨域是指一个域下的文档或脚本去请求另一个域下的资源文档 根据浏览器同源策略 同源是指 协议 域名 端口都相同 有一个不同都会产生跨域行为 跨域解决方案 JSONP 通常为了减轻web服务器的负载 我们把js css img等静态
  • 【趣味JavaScript】我的天! 居然工作了5年的前端开发都不知道eval函数其中居然暗藏玄机!

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 eval 函数介绍 首先你要知道在JS中eval 函数是用来干嘛的 它主要的功能就是
  • node_modules/XXX/index.js:XXX;XX

    这个语法是 ECMAScript 2021的语法 还挺新的 对node版本要求会比较高 这里这个 icon this options icon level 意思就是 如果this options icon level 拿得到值 就等于它 否
  • 谷粒商城基础班

    4 分布式组件 SpringCloud Alibaba简介 注册中心 配置中心 网关 结合SpringCloud Alibaba我们最终的技术搭配方案 SpringCloud Alibaba Nacos 注册中心 服务发现 注册 Sprin
  • 第十四届蓝桥杯.子串简写(前缀和\后缀和)

    程序猿圈子里正在流行一种很新的简写方法 对于一个字符串 只保留首尾字符 将首尾字符之间的所有字符用这部分的长度代替 例如internationalization简写成 i18n Kubernetes 简写成 K8s Lanqiao 简写成
  • 解决finalshell无法连接,一直提示登陆密码

    问题描述 在使用FinalShell连接配置虚拟机时 无法正常连接 一直提示输入登录密码 即使输入的密码是正确的 解决方案 直接从虚拟机内打开终端 切换至root用户 进入配置文件修改内容 admin localhost su root 密
  • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding学习

    一 什么是BERT模型 谷歌团队的Thang Luong直接定义 BERT模型开启了NLP的新时代 BERT这个模型与ELMo和OpenAI的fine tune transformer的不同的是 它在训练双向语言模型时以减小的概率把少量的词