精华内容
下载资源
问答
  • [NLP自然语言处理]谷歌BERT模型深度解析

    万次阅读 多人点赞 2018-10-15 17:49:18
    任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料...

    任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

     

    BERT模型代码已经发布,可以在我的github: NLP-BERT--Python3.6-pytorch 中下载,请记得start哦


    目录

    一、前言

    二、如何理解BERT模型

    三、BERT模型解析

          论文的核心:详解BERT模型架构

          关键创新:预训练任务

          实验结果

    四、BERT模型的影响

    对BERT模型的观点

    参考文献


    一、前言

     

    最近谷歌搞了个大新闻,公司AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%)等。可以预见的是,BERT将为NLP带来里程碑式的改变,也是NLP领域近期最重要的进展。

    Rank

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

    从现在的大趋势来看,使用某种模型预训练一个语言模型看起来是一种比较靠谱的方法。从之前AI2的 ELMo,到 OpenAI的fine-tune transformer,再到Google的这个BERT,全都是对预训练的语言模型的应用。

    BERT这个模型与其它两个不同的是

    1. 它在训练双向语言模型时以减小的概率把少量的词替成了Mask或者另一个随机的词。我个人感觉这个目的在于使模型被迫增加对上下文的记忆。至于这个概率,我猜是Jacob拍脑袋随便设的。
    2. 增加了一个预测下一句的loss。这个看起来就比较新奇了。

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

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

    第二,MLM(Masked Language Model),同时利用左侧和右侧的词语,这个在ELMo上已经出现了,绝对不是原创。其次,对于Mask(遮挡)在语言模型上的应用,已经被Ziang Xie提出了(我很有幸的也参与到了这篇论文中):[1703.02573] Data Noising as Smoothing in Neural Network Language Models。这也是篇巨星云集的论文:Sida Wang,Jiwei Li(香侬科技的创始人兼CEO兼史上发文最多的NLP学者),Andrew Ng,Dan Jurafsky都是Coauthor。但很可惜的是他们没有关注到这篇论文。用这篇论文的方法去做Masking,相信BRET的能力说不定还会有提升。

     

    二、如何理解BERT模型

    [1] BERT 要解决什么问题?

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

    受《A Neural Probabilistic Language Model》论文的启发,BERT 也用 unsupervised 的办法,来训练 transformer 模型。神经概率语言模型这篇论文,主要讲了两件事儿,1. 能否用数值向量(word vector)来表达自然语言词汇的语义?2. 如何给每个词汇,找到恰当的数值向量?

    Transformer

    这篇论文写得非常精彩,深入浅出,要言不烦,而且面面俱到。经典论文,值得反复咀嚼。很多同行朋友都熟悉这篇论文,内容不重复说了。常用的中文汉字有 3500 个,这些字组合成词汇,中文词汇数量高达 50 万个。假如词向量的维度是 512,那么语言模型的参数数量,至少是 512 * 50万 = 256M

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

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

    深度学习四大要素,1. 训练数据、2. 模型、3. 算力、4. 应用。训练数据有了,接下去的问题是模型。

     

    [2] BERT 的五个关键词 Pre-training、Deep、Bidirectional、Transformer、Language Understanding 分别是什么意思?

    《A Neural Probabilistic Language Model》这篇论文讲的 Language Model,严格讲是语言生成模型(Language Generative Model),预测语句中下一个将会出现的词汇。语言生成模型能不能直接移用到其它 NLP 问题上去?

    譬如,淘宝上有很多用户评论,能否把每一条用户转换成评分?-2、-1、0、1、2,其中 -2 是极差,+2 是极好。假如有这样一条用户评语,“买了一件鹿晗同款衬衫,没想到,穿在自己身上,不像小鲜肉,倒像是厨师”,请问这条评语,等同于 -2,还是其它?

    语言生成模型,能不能很好地解决上述问题?进一步问,有没有 “通用的” 语言模型,能够理解语言的语义,适用于各种 NLP 问题?BERT 这篇论文的题目很直白,《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,一眼看去,就能猜得到这篇文章会讲哪些内容。

    这个题目有五个关键词,分别是 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 万对语句,是连续的两条上下文语句,另外 2*10 万对语句,不是连续的语句。然后让 Transformer 模型来识别这 20 万对语句,哪些是连续的,哪些不连续。

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

     

    三、BERT模型解析

    首先来看下谷歌AI团队做的这篇论文。

    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使用遮蔽语言模型来实现预训练的深度双向表示。
    • 论文表明,预先训练的表示免去了许多工程任务需要针对特定任务修改体系架构的需求。 BERT是第一个基于微调的表示模型,它在大量的句子级和token级任务上实现了最先进的性能,强于许多面向特定任务体系架构的系统。
    • BERT刷新了11项NLP任务的性能记录。本文还报告了 BERT 的模型简化研究(ablation study),表明模型的双向性是一项重要的新成果。相关代码和预先训练的模型将会公布在goo.gl/language/bert上。

    BERT目前已经刷新的11项自然语言处理任务的最新记录包括:将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%),将SQuAD v1.1问答测试F1得分纪录刷新为93.2分(绝对提升1.5分),超过人类表现2.0分。

    论文的核心:详解BERT模型架构

    本节介绍BERT模型架构和具体实现,并介绍预训练任务,这是这篇论文的核心创新。

    模型架构

    BERT的模型架构是基于Vaswani et al. (2017) 中描述的原始实现multi-layer bidirectional Transformer编码器,并在tensor2tensor库中发布。由于Transformer的使用最近变得无处不在,论文中的实现与原始实现完全相同,因此这里将省略对模型结构的详细描述。

    在这项工作中,论文将层数(即Transformer blocks)表示为L,将隐藏大小表示为H,将self-attention heads的数量表示为A。在所有情况下,将feed-forward/filter 的大小设置为 4H,即H = 768时为3072,H = 1024时为4096。论文主要报告了两种模型大小的结果:

    • BERT_{BASE} : L=12, H=768, A=12, Total Parameters=110M
    • BERT_{LARGE} : L=24, H=1024, A=16, Total Parameters=340M

    为了进行比较,论文选择了 BERT_{LARGE} ,它与OpenAI GPT具有相同的模型大小。然而,重要的是,BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。研究团队注意到,在文献中,双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,因为它可以用于文本生成。BERT,OpenAI GPT和ELMo之间的比较如图1所示。

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

    输入表示(input representation)

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

    图2:BERT输入表示。输入嵌入是token embeddings, segmentation embeddings 和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嵌入。

    关键创新:预训练任务

    与Peters et al. (2018) 和 Radford et al. (2018)不同,论文不使用传统的从左到右或从右到左的语言模型来预训练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%的可能是来自语料库的随机句子。例如:

    Input = [CLS] the man went to [MASK] store [SEP]

    he bought a gallon [MASK] milk [SEP]

    Label = IsNext

    Input = [CLS] the man [MASK] to the store [SEP]

    penguin [MASK] are flight ##less birds [SEP]

    Label = NotNext

    团队完全随机地选择了NotNext语句,最终的预训练模型在此任务上实现了97%-98%的准确率

    实验结果

    如前文所述,BERT在11项NLP任务中刷新了性能表现记录!在这一节中,团队直观呈现BERT在这些任务的实验结果,具体的实验设置和比较请阅读原论文.

    图3:我们的面向特定任务的模型是将BERT与一个额外的输出层结合而形成的,因此需要从头开始学习最小数量的参数。在这些任务中,(a)和(b)是序列级任务,而(c)和(d)是token级任务。在图中,E表示输入嵌入,Ti表示tokeni的上下文表示,[CLS]是用于分类输出的特殊符号,[SEP]是用于分隔非连续token序列的特殊符号。

    图4:GLUE测试结果,由GLUE评估服务器给出。每个任务下方的数字表示训练样例的数量。“平均”一栏中的数据与GLUE官方评分稍有不同,因为我们排除了有问题的WNLI集。BERT 和OpenAI GPT的结果是单模型、单任务下的数据。所有结果来自https://gluebenchmark.com/leaderboardhttps://blog.openai.com/language-unsupervised/

    图5:SQuAD 结果。BERT 集成是使用不同预训练检查点和fine-tuning seed的 7x 系统。

    图6:CoNLL-2003 命名实体识别结果。超参数由开发集选择,得出的开发和测试分数是使用这些超参数进行五次随机重启的平均值。

     

    四、BERT模型的影响

    BERT是一个语言表征模型(language representation model),通过超大数据、巨大模型、和极大的计算开销训练而成,在11个自然语言处理的任务中取得了最优(state-of-the-art, SOTA)结果。或许你已经猜到了此模型出自何方,没错,它产自谷歌。估计不少人会调侃这种规模的实验已经基本让一般的实验室和研究员望尘莫及了,但它确实给我们提供了很多宝贵的经验:

    1. 深度学习就是表征学习 (Deep learning is representation learning):"We show that pre-trained representations eliminate the needs of many heavily engineered task-specific architectures". 在11项BERT刷出新境界的任务中,大多只在预训练表征(pre-trained representation)微调(fine-tuning)的基础上加一个线性层作为输出(linear output layer)。在序列标注的任务里(e.g. NER),甚至连序列输出的依赖关系都先不管(i.e. non-autoregressive and no CRF),照样秒杀之前的SOTA,可见其表征学习能力之强大。
    2. 规模很重要(Scale matters):"One of our core claims is that the deep bidirectionality of BERT, which is enabled by masked LM pre-training, is the single most important improvement of BERT compared to previous work". 这种遮挡(mask)在语言模型上的应用对很多人来说已经不新鲜了,但确是BERT的作者在如此超大规模的数据+模型+算力的基础上验证了其强大的表征学习能力。这样的模型,甚至可以延伸到很多其他的模型,可能之前都被不同的实验室提出和试验过,只是由于规模的局限没能充分挖掘这些模型的潜力,而遗憾地让它们被淹没在了滚滚的paper洪流之中。
    3. 预训练价值很大(Pre-training is important):"We believe that this is the first work to demonstrate that scaling to extreme model sizes also leads to large improvements on very small-scale tasks, provided that the model has been sufficiently pre-trained". 预训练已经被广泛应用在各个领域了(e.g. ImageNet for CV, Word2Vec in NLP),多是通过大模型大数据,这样的大模型给小规模任务能带来的提升有几何,作者也给出了自己的答案。BERT模型的预训练是用Transformer做的,但我想换做LSTM或者GRU的话应该不会有太大性能上的差别,当然训练计算时的并行能力就另当别论了。

    对BERT模型的观点
     

    0. high-performance的原因其实还是归结于两点,除了模型的改进,更重要的是用了超大的数据集(BooksCorpus 800M + English Wikipedia 2.5G单词)和超大的算力(对应于超大模型)在相关的任务上做预训练,实现了在目标任务上表现的单调增长

    1. 这个模型的双向和Elmo不一样,大部分人对他这个双向在novelty上的contribution 的大小有误解,我觉得这个细节可能是他比Elmo显著提升的原因。Elmo是拼一个左到右和一个右到左,他这个是训练中直接开一个窗口,用了个有顺序的cbow。

    2. 可复现性差:有钱才能为所欲为(Reddit对跑一次BERT的价格讨论)

    For TPU pods:
    
    4 TPUs * ~$2/h (preemptible) * 24 h/day * 4 days = $768 (base model)
    
    16 TPUs = ~$3k (large model)
    
    
    
    For TPU:
    
    16 tpus * $8/hr * 24 h/day * 4 days = 12k
    
    64 tpus * $8/hr * 24 h/day * 4 days = 50k

    最后他问到:For GPU:"BERT-Large is 24-layer, 1024-hidden and was trained for 40 epochs over a 3.3 billion word corpus. So maybe 1 year to train on 8 P100s? " ,然后这个就很interesting了。

    参考文献

    1. 知乎:如何评价谷歌最新的BERT模型

    2. 华尔街见闻:NLP历史突破

    3. OPENAI-Improving Language Understanding with Unsupervised Learning

    4. https://gluebenchmark.com/leaderboard

     

    >>>关于作者

    CSDN 博客专家,2019-CSDN百大博主,计算机(机器学习方向)博士在读,业余Kaggle选手,有过美团、腾讯算法工程师经历,目前就职于Amazon AI lab。喜爱分享和知识整合。

    关注微信公众号,点击“学习资料”菜单即可获取算法、编程资源以及教学视频,还有免费SSR节点相送哦。其他平台(微信/知乎/B站),欢迎关注同名公众号「图灵的猫」~

    展开全文
  • 2018 年 10 月 11 日,谷歌 AI 团队在 arXiv 提交了论文,发布了 BERT 模型。BERT(Bidirectional Encoder Representations from Transformers)的中文意思是:语言理解中深度双向转换模型的预训练模式。 BERT 在...

    2018 年 10 月 11 日,谷歌 AI 团队在 arXiv 提交了论文,发布了 BERT 模型。BERT(Bidirectional Encoder Representations from Transformers)的中文意思是:语言理解中深度双向转换模型的预训练模式。
    BERT 在机器阅读理解顶级水平测试 SQuAD 1.1 中表现出惊人的成绩。毋庸置疑,BERT 模型开启了 NLP 的新时代!

    迁移学习与预训练

    预训练是迁移学习的第一步。
    在神经网络中,我们原先的训练是对以后的任务是有好处的。可以直接“拿来主义”。但是拿来的部分是根据应用场景的变化而不同。

    在图片识别中,通常采用神经网络的前几层作为预训练层。
    在语音识别处理中,通常采用神经网络的后几层能作为预训练层。
    在自然语言处理中,因为词库非常巨大,使用 One-Hot 编码的方式很难计算和处理词的含义,NLP 的预处理其实就是 Word Embedding 的过程。

    Word Embedding 文本/单词表示方法的发展历程

    说白了,NLP 做的工作就是想办法将文字或者说词语转变为计算机可以处理的数字化向量的过程,即单词向量化的一个过程。

    之前的文章也提到过,文本/单词表示方法可以化为两个大方向:离散表示和分布表示。
    离散表示主要是 one-hot 表示和 n-gram表示,分布式表示主要是基于矩阵的分布表示,例如GloVe和基于神经网络的分布表示,例如
    Word Embedding (词嵌入)。

    因此,要明确一个观点:词嵌入≠词向量表示,只是词向量其中的一种表示方法而已

    在这里插入图片描述具体可以参考:https://blog.csdn.net/Robin_Pi/article/details/103845731

    后续 BERT 部分参考:
    https://gitbook.cn/books/5c0cae8c5ded757dd52f5157/index.html

    展开全文
  • 自然语言处理领域中最具突破性的发展是BERT的发布(曾被认为是自然语言处理领域的ImageNet)。与传统的自然语言处理模式相比,BERT层次最高,是具有革命性意义的自然语言处理模式。这给很多现有的计算机逻辑框架、...

    全文共2975字,预计学习时长6分钟

    图源Unsplash


    自然语言处理领域中最具突破性的发展是BERT的发布(曾被认为是自然语言处理领域的ImageNet)。与传统的自然语言处理模式相比,BERT层次最高,是具有革命性意义的自然语言处理模式。这给很多现有的计算机逻辑框架、训练方法、语言模型带来了启发,比如说谷歌的TransformerXL, OpenAI’sGPT-2, ERNIE2.0, XLNet, RoBERTa等等。

    让我们一起来了解一下BERT,及其在转换自然语言处理方面的潜力。

     

    什么是BERT?

    BERT(Bidirectional EncoderRepresentations from Transformers)是由谷歌的研究者于2018年开发的 一款开源代码的NLP预训练模型。它是GPT(广义语言模型)的延续,BERT在自然语言处理中优于其他几种模式并且在问答(SQuAD v1.1)、自然语言推理 (MNLI),和其他框架中提供了最优结果。

    BERT建立于预训练上下文表征的基础上——包括半监督序列学习(由Andrew Dai和Quoc Le提出)、ELMo(由Matthew Peters和来自AI2和来自UW,、CSE的研究人员提出)、ULMFiT(由fast.ai 创始人Jeremy Howard和Sebastian Ruder提出)、OpenAI transformer(由OpenAI研究人员Radford、Narasimhan、Salimans和Sutskever提出)和Transformer (Vaswani等人提出)。

    BERT之所以在其他框架中如此独一无二,是因为它首次使用深层双向无监督语言表征和在预训练中只使用纯文本语料库。因为BERT是开源的,所以任何人只要懂得机器学习知识,就能轻松地建立起一个NLP模型,且无需使用训练模型的大量源数据集。因此,节约了时间、精力、知识和资源。

    最后,在未标记文本的大型语料库中对BERT进行预训练,该语料库包括维基百科(大约25亿字)以及一个图书语料库(大约8亿字)。

     

    BERT怎样运作的?

    传统的与上下文无关模型(如word2vec或GloVe)为词汇表中的每个单词生成一个单独的单词嵌入表征,这意味着单词“right”在“I 'm sure I 'm right”和“Take a right turn”中具有相同的上下文无关表征。

    但是,BERT是基于上下文的,所以它是双向的。虽然双向的理念已经存在很长时间了,但是BERT是首次在深层神经网络成功实行预训练双向性的案例。

    BERT是怎么实现这一点的?

    图源: BERT [Devlin et al., 2018]

    BERT使用两种技术。一种是MLM(Mask Language Model)模型—通过屏蔽输入中的一些单词,然后对每个单词进行双向条件设置,以预测屏蔽的单词。在将单词序列输入转换器BERT之前,每个序列中15%的单词被替换为一个[MASK]指令。该模型试图根据序列中其他非屏蔽词提供的上下文来预测屏蔽词的初始值。

     


    第二种技术是NSP(Next Sentence Prediction),BERT学习将句子间的关系进行模型。在训练过程中,该模型接收成对的句子作为输入,并学习预测其中的第二个句子是否是原文档中的第二个句子。考虑两个句子A和B, B是语料库中A后面的下一个句子,还是一个随机的句子?例如:

     

    当训练BERT模型时,两种技术一起训练,因此将两种策略的组合损失函数最小化。

    BERT架构

     


    BERT是深度双向的,OpenAI GPT是单向的,而ELMo是浅层双向的。图片来源:谷歌AI博客

    BERT架构建立在Transformer之上。有两种变体:

    • BERT Base: 12层(transformer blocks),12个注意事项,1.1亿个参数
    • BERT Large:24层(transformer blocks),16个注意事项,3.4亿个参数

    结果

     

    在SQuAD v1.1表格中,BERT的F1分数达到93.2%(测量的准确性),超过了以前最先进的分数91.6%和人类层面的91.2%的得分:BERT在绝对非常具有挑战性的GULE基准下也提高了到了最先进的7.6%,这是一组9个多样化的自然语言理解(NLU)任务的集合。

     

    BERT能在现实中应用吗?

    BERT无疑是机器学习用于自然语言处理的一个里程碑。但是我们需要反思BERT如何在各种自然语言处理场景中使用。

    文本分类是自然语言处理的主要应用之一。例如,这个概念已经在票务工具中有所使用,根据简短的描述或电子邮件对票务进行分类,并将票务分类/发送到正确的团队进行解决。同样,它也可以用来区分电子邮件是否是垃圾邮件。

    在日常生活中也可以找到BERT的一些应用。

     

    邮件的建议回复、智能撰写和谷歌搜索的自动完成

    聊天机器人能回答用户查询和处理各种任务,这正影响着着信息产业。然而,聊天机器人的最大限制之一是意图识别和从句子中捕获词语。

    问答模型(QnA)是自然语言处理的基本系统之一。在QnA中,基于机器学习的系统从知识库或文本段落中生成作为输入的问题的答案。BERT 能够在聊天机器人中使用吗? 毫无疑问,可以。BERT现在被用在许多人工智能对话应用中。所以,聊天机器人应该变得更聪明。

    但是,BERT只能用于回答非常短的段落中的问题,而且有很多关键问题需要解决。作为一种通用的任务,NLP过于复杂,具有更多的含义和微妙之处。BERT只解决了其中的一部分,但肯定很快就会改变字词识别模型。

    BERT如今只能解决有限的一类问题。然而,还有许多其他的任务,如情绪检测、分类、机器翻译、命名实体识别、摘要和问题回答,都需要在此基础上进行。现在关于BERT有这样的批评意见:这样的任务是基于对表象的操纵,没有任何理解,添加简单的对抗性内容,修改原始内容,会使其混淆。

    BERT只有在操作中广泛使用并在实际场景中得以改进,它的真正好处才能在自然语言处理中实现,从而应用在支持企业和用户的广泛应用程序中。

    然而,随着一波基于转换的方法(例如,GPT-2、RoBERTa、XLNet)的出现,情况正在迅速变化,这些方法通过展示更好的性能或更简单的训练或其他一些特定的好处来不断提高标准。

    来看看BERT发布之后的其他模型的发展情况

    RoBERTa

    RoBERTa由Facebook开发,建立在BERT的语言屏蔽策略上,并修改了BERT中的一些关键超参数。为了改进训练过程,RoBERTa从BERT的预训练中删除了NSP任务,并引入了动态掩蔽,使得掩蔽的令牌在训练期间发生变化。它也接受了比BERT多一个数量级的训练,所需时间更长。

    DistilBERT

    DistilBERT由HuggingFace开发,学习了BERT的一个提取(近似)版本,在GLUE标准下保持95%的性能,但只使用了一半的参数(只有6600万个参数,而不是1.1亿个参数)。这意味着,一旦一个大型的神经网络被训练,它的全部输出分布可以用一个更小的网络来近似(比如后验近似)。

    XLM/mBERT

    XLM由Facebook开发,使用了一种已知的预处理技术(BPE)和一种与BERT一样的双语言训练机制,用以学习不同语言单词之间的关系。在多语言分类任务中,该模型的表现优于其他模型,并且当使用预先训练的模型初始化翻译模型时,该模型显著地改进了机器翻译。

    ALBERT

    ALBERT(一种用于自我监督语言表征学习的精简型BERT)由谷歌研究中心和丰田技术研究所联合开发,将会接替BERT。ALBERT比BERT更小、更轻、更聪明。两个关键的架构变化使ALBERT性能更好,并极大地减小了模型的大小。第一个是参数的数量。它通过跨所有层共享所有参数来提高参数效率。这意味着前馈网络参数和注意参数都是共享的。

    研究人员还将隐藏层的大小与词汇嵌入的大小分开。这是通过将一个独热向量投射到一个低维嵌入空间,然后投射到隐藏空间来实现的,这使得在不显著增加词汇表嵌入的参数大小的情况下,更容易增加隐藏层的大小。

    谈及预训练,ALBERT有自己的训练方法,叫做SOP(Sentence-Order Prediction),而不是NSP。NSP的问题在于,它将主题预测与相干预测混为一谈。

    ALBERT代表了几个基准上自然语言处理和参数效率的最新技术。这是一个惊人的突破,ALBERT建立在BERT所做的伟大工作上,并在多个方面发展了自然语言处理。

    BERT和类似的模型无疑是自然语言处理领域游戏规则的变革者。机器现在可以更好地理解语音,并实时做出智能响应。许多基于BERT的模型正在开发,包括VideoBERT、ViLBERT(视觉和语言BERT)、PatentBERT、DocBERT等。

    你对NLP和BERT的未来有什么看法?

     

     

    留言 点赞 关注

    我们一起分享AI学习与发展的干货
    欢迎关注全平台AI垂类自媒体 “读芯术”

    (添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

     

    展开全文
  • 自然语言处理bert

    千次阅读 2019-05-30 21:02:42
    BERT(Bidirectional Encoder Representations from Transformers)是Google AI团队最新开源的NLP模型,正如家林大咖所言:这是2018年人工智能领域最重要的事件!对于技术人员而言,这是整个人工智能领域接下来五年最...

    一、简介

    • BERT(Bidirectional Encoder Representations from Transformers)是Google AI团队最新开源的NLP模型,正如家林大咖所言:这是2018年人工智能领域最重要的事件!对于技术人员而言,这是整个人工智能领域接下来五年最重要的机遇!
      BERT模型具有以下两个特点:
    • 第一,是这个模型非常的深,12层,并不宽(wide),中间层只有1024,而之前的Transformer模型中间层有2048。这似乎又印证了计算机图像处理的一个观点——深而窄比 浅而宽 的模型更好。
    • 第二,MLM(Masked Language Model),同时利用左侧和右侧的词语,这个在ELMo上已经出现了,绝对不是原创。其次,对于Mask(遮挡)在语言模型上的应用,已经被Ziang Xie提出了(我很有幸的也参与到了这篇论文中):[1703.02573] Data Noising as Smoothing in Neural Network Language Models。这也是篇巨星云集的论文:Sida Wang,Jiwei Li(香侬科技的创始人兼CEO兼史上发文最多的NLP学者),Andrew Ng,Dan Jurafsky都是Coauthor。但很可惜的是他们没有关注到这篇论文。用这篇论文的方法去做Masking,相信BRET的能力说不定还会有提升。
      如何理解BERT模型?BERT 要解决什么问题?
    • 通常情况 transformer 模型有很多参数需要训练。譬如 BERT BASE 模型: L=12, H=768, A=12,需要训练的模型参数总数是 12 * 768 * 12 = 110M。这么多参数需要训练,自然需要海量的训练语料。如果全部用人力标注的办法,来制作训练数据,人力成本太大。
    • 受《A Neural Probabilistic Language Model》论文的启发,BERT 也用 unsupervised 的办法,来训练 transformer 模型。神经概率语言模型这篇论文,主要讲了两件事儿,1. 能否用数值向量(word
      vector)来表达自然语言词汇的语义?2. 如何给每个词汇,找到恰当的数值向量?
    • 常用的中文汉字有 3500 个,这些字组合成词汇,中文词汇数量高达 50 万个。假如词向量的维度是 512,那么语言模型的参数数量,至少是 512 * 50万 = 256M 模型参数数量这么大,必然需要海量的训练语料。从哪里收集这些海量的训练语料?《A Neural Probabilistic Language Model》这篇论文说,每一篇文章,天生是训练语料。难道不需要人工标注吗?回答,不需要。
    • 我们经常说,“说话不要颠三倒四,要通顺,要连贯”,意思是上下文的词汇,应该具有语义的连贯性。基于自然语言的连贯性,语言模型根据前文的词,预测下一个将出现的词。如果语言模型的参数正确,如果每个词的词向量设置正确,那么语言模型的预测,就应该比较准确。天下文章,数不胜数,所以训练数据,取之不尽用之不竭。
    • 深度学习四大要素,1. 训练数据、2. 模型、3. 算力、4. 应用。训练数据有了,接下去的问题是模型。关于模型,BERT提出了五个关键词 Pre-training、Deep、Bidirectional、Transformer、Language Understanding 。
      BERT的五个关键词分别是什么意思?
    • 《A Neural Probabilistic Language Model》这篇论文讲的 Language Model,严格讲是语言生成模型(Language Generative Model),预测语句中下一个将会出现的词汇。语言生成模型能不能直接移用到其它 NLP 问题上去?譬如,淘宝上有很多用户评论,能否把每一条用户转换成评分?-2、-1、0、1、2,其中 -2 是极差,+2 是极好。假如有这样一条用户评语,“买了一件鹿晗同款衬衫,没想到,穿在自己身上,不像小鲜肉,倒像是厨师”,请问这条评语,等同于 -2,还是其它?
    • 语言生成模型,能不能很好地解决上述问题?进一步问,有没有 “通用的” 语言模型,能够理解语言的语义,适用于各种 NLP 问题?BERT 这篇论文的题目很直白,《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,一眼看去,就能猜得到这篇文章会讲哪些内容。
    • 这个题目有五个关键词,分别是 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表示可以通过一个额外的输出层进行微调,适用于广泛任务的最先进模型的构建,比如问答任务和语言推理,无需针对具体任务做大幅架构修改。

    二、pytorch版本的BERT分类代码

    • 先安装pytorch的BERT代码
     pip install pytorch-pretrained-bert
    

    算法流程
    在这里插入图片描述
    读取数据
    以输入数据为json文件时为例,数据读取模块包含两个部分:
    基类DataProcessor:

    class DataProcessor(object):		
        def get_train_examples(self, data_dir):
            raise NotImplementedError()
    
        def get_dev_examples(self, data_dir):
            raise NotImplementedError()
    
        def get_test_examples(self, data_dir):
            raise NotImplementedError()
    
        def get_labels(self):
            raise NotImplementedError()
    
        @classmethod
        def _read_json(cls, input_file, quotechar=None):
            """Reads a tab separated value file."""
            dicts = []
            with codecs.open(input_file, 'r', 'utf-8') as infs:
                for inf in infs:
                    inf = inf.strip()
                    dicts.append(json.loads(inf))
            return dicts
    

    用于数据读取的模块MyPro:

    class MyPro(DataProcessor):
        def get_train_examples(self, data_dir):
            return self._create_examples(
                self._read_json(os.path.join(data_dir, "train.json")), 'train')
    
        def get_dev_examples(self, data_dir):
            return self._create_examples(
                self._read_json(os.path.join(data_dir, "val.json")), 'dev')
    
        def get_test_examples(self, data_dir):
            return self._create_examples(
                self._read_json(os.path.join(data_dir, "test.json")), 'test')
    
        def get_labels(self):
            return [0, 1]
    
        def _create_examples(self, dicts, set_type):
            examples = []
            for (i, infor) in enumerate(dicts):
                guid = "%s-%s" % (set_type, i)
                text_a = infor['question']
                label = infor['label']
                examples.append(
                    InputExample(guid=guid, text_a=text_a, label=label))
            return examples
    

    说明:
    data_dir目录下应包含名为train、val、test的三个文件,根据文件格式不同需要对读取方式进行修改
    get_labels()返回的是所有可能的类别label_list,比如[‘数学’, ‘英语’, ‘语文’]、[1, 2, 3]…
    模块最终返回一个名为examples的列表,每个列表元素中包含序号、中文文本、类别三个元素
    特征转换
    convert_examples_to_features是用于将examples转换为特征,也即features的函数。
    features包含4个数据:

    • input_ids:分词后每个词语在vocabulary中的id,补全符号对应的id为0,[CLS]和[SEP]的id分别为101和102。应注意的是,在中文BERT模型中,中文分词是基于字而非词的分词。
    • input_mask:真实字符/补全字符标识符,真实文本的每个字对应1,补全符号对应0,[CLS]和[SEP]也为1。
    • segment_ids:句子A和句子B分隔符,句子A对应的全为0,句子B对应的全为1。但是在多数文本分类情况下并不会用到句子B,所以基本不用管。
    • label_id :将label_list中的元素利用字典转换为index标识,即
    label_map = {}
    for (i, label) in enumerate(label_list):
        label_map[label] = i
    

    转换完成后的特征值就可以作为输入,用于模型的训练和测试

    模型训练

    • 完成读取数据、特征转换之后,将特征送入模型进行训练,训练算法为BERT专用的Adam算法,训练集、测试集、验证集比例为6:2:2。
    • 每一个epoch后会在验证集上进行验证,并给出相应的f1值,如果f1值大于此前最高分则保存模型参数,否则flags加1。如果flags大于6,也即连续6个epoch模型的性能都没有继续优化,停止训练过程。
    f1 = val(model, processor, args, label_list, tokenizer, device)
    if f1 > best_score:
        best_score = f1
        print('*f1 score = {}'.format(f1))
        flags = 0
        checkpoint = {
            'state_dict': model.state_dict()
        }
        torch.save(checkpoint, args.model_save_pth)
    else:
        print('f1 score = {}'.format(f1))
        flags += 1
        if flags >=6:
            break
    

    具体代码参考:github

    展开全文
  • 预训练语言模型是近年来自然语言处理领域的热门话题,以BERT为代表的预训练模型在下游任务上取得了很好的效果。在本次报告中,讲者将梳理融合知识的预训练语言模型的研究进展与典型问题,并对于预训练模型学到了哪些...
  • NLP-BERT 谷歌自然语言处理模型:BERT-基于pytorch Notice: This is only For the convinience of Chineses reader who cannot read English version directly 文章首发自我的CSDN博客:NLP自然语言处理-谷歌BERT...
  • 本文可以任意转载,转载时请标明作者和出处。  张俊林 2018-11-11 (如果图片浏览有问题可以转至:知乎版本) Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Be...
  • 如果你是一名自然语言处理从业者,那你一定听说过大名鼎鼎的 BERT 模型。BERT(Bidirectional Encoder Representations From Transform...
  • 《会话式AI自然语言处理与人机交互》有3个特点: 前瞻性强,专注于NLP和人机交互的前沿技术,以及会话式AI技术在热门场景中的工程实践。 实战性强,每章都提供实战代码,大部分代码简单修改后便可在实际场景中...
  • 点击上方“视学算法”,选择加"星标"或“置顶” 重磅干货,第一时间送达 来源:AI前线 本文大约7510字,阅读时间约10分钟。本文介绍并探索了基于 Transforme...
  • 百度AI──自然语言处理使用教程(情感倾向分析)创建自己的应用python方式调用安装Python SDK创建一个 Python SDK客户端配置AipNlp调用接口情感倾向分析需要注意的几个点完整代码参考 创建自己的应用 百度研发的预...
  • 自然语言处理中的Transformer和BERT

    万次阅读 多人点赞 2018-12-23 23:54:42
    2018年马上就要过去,回顾深度学习在今年的进展,让人印象最深刻的就是谷歌提出的应用于自然语言处理领域的BERT解决方案,BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding...
  • 本文介绍如何让机器理解人类语言,主要是介绍了ELMO、BERT和GPT。
  • 2020上半年收集到的优质AI文章 – 自然语言处理 自然语言处理的蓬勃发展及其未来 人工智能之自然语言处理初探 我所知道的中国NLP「破圈」十年 零基础入门NLP - 新闻文本分类 现代NLP中的零样本学习 ...
  • 目录自然语言处理中的预训练技术发展史—Word Embedding到Bert模型1 图像领域的预训练2 Word Embedding考古史3 从Word Embedding到ELMO4 从Word Embedding到GPT5 Bert的诞生 自然语言处理中的预训练技术发展史—Word...
  • 全文共7055字,预计学习时长14分钟 BERT全称是来自变换器的双向编码器...与BERT模型相似的预训练语言模型例如问答、命名实体识别、自然语言推理、文本分类等在许多自然语言处理任务中发挥着重要作用。 BERT是...
  • 自然语言处理中的语言模型预训练方法(ELMo、GPT和BERT) 最近,在自然语言处理(NLP)领域中,使用语言模型预训练方法在多项NLP任务上都获得了不错的提升,广泛受到了各界的关注。就此,我将最近看的一些相关论文...
  • Bert作为目前自然语言处理领域最流行的技术之一,文本分类作为自然语言处理领域最常见的任务之一,Pytorch作为目前最流程的深度学习框架之一,三者结合在一起将会产生什么样的花火,本套课程基于Pytorch最新1.4版本...
  • Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得。那为什么会有这么高的评价呢?是因为它有重大的理论或者模型创新吗?其实并没有,从模型创新角度看一般,...
  • BERT相关论文、文章和代码资源汇总 4条回复 BERT最近太火,蹭个热点,整理一下相关的资源,包括Paper, 代码和文章解读。 1、Google官方: 1)BERT: Pre-training of Deep Bidirectional Transformers for ...
  • Google提出的BERT(Bidirectional Encoder Representations from Transformers)是现在自然语言处理领域里当之无愧的王者,但是在阅读这篇文献的时候,总有一种和传统自然语言技术断层的感觉。通过研究OpenAI GPT后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,410
精华内容 2,164
关键字:

aibert自然语言处理