1. 前言

如何让搜索引擎呈现用户想要的结果是困扰谷歌工程师的一大难题。谷歌搜索英文版于2019年10月25日上线BERT算法,他们的搜索引擎用上了强大的 BERT 预训练模型,可以让搜索引擎结合语境理解用户的搜索意图,甚至能理解一些不起眼的介词在搜索语句中的重要含义。有了 BERT 的加持,用户能在谷歌中搜到相关性更强的结果。下面来看看谷歌搜索算法BERT的介绍。

2019 年 10 月 25 日,Google 宣布 BERT 更新上线,可以以更接近人的方式去理解 Query(用户搜索词)的含义,从而提升搜索体验,预计影响 10% 的英文搜索。

Google 称 BERT 算法是过去五年来突破最大的算法,也是 Google 搜索历史上突破最大的算法之一。Google新发布的BERT模型。BERT来头可不小,其性能超越许多使用任务特定架构的系统,刷新了11项NLP任务的当前最优性能记录。
目前最好的自然语言预训练方法无疑是BERT。它的工作流程分为两步:

首先,使用大量未标记的数据,以预训练、也就是无人监督的方式学习语言表达。然后,使用少量经过标记的训练数据对模型进行fine-tune,以监督学习的方式,执行多种监督任务。 预训练机器学习模型已经在包括视觉、自然语言处理在内的各个领域取得了成功。

1.1 Google为何要推出BERT算法

在阅读英语文章时,最让你挠头的是什么?遇到一词多意时不知道该选哪个解释?还是长句里难以梳理的信息结构?Google搜索引擎其实也跟你一样挠头。

为了「照顾」Google搜索引擎,很多人在搜索时会用「关键词搜索法(keyword-ese)」—— 只输入关键词,不使用完整的句子。譬如,有人会在搜索栏里输入 「痣」「臀部」「癌症」,其实他想问的是「我屁股上的痣是不是癌症的征兆?」

1.2 引擎更新后有什么改变?

简单来说,加入BERT后的 Google搜索引擎,能够更好地理解接近自然对话的长句子,因为它能更好地分析了解句子中单词间的关系。

和传统算法不同的是,BERT在分析词语时,并不是依次从左到右或从右到左地逐词分析,而是借助 Google研发的 Transformer 模型并行分析词语在整个句子中的关系。譬如,如果搜索「math practice books for adults(给成年人的数学练习册)」,更新前的搜索返回结果会将「adults(成年人)」变为「young adults(年轻人)」,更新后则不会这样。
  
  此外,在介词对整个句子意思影响较大的情况下,加入BERT后的理解能力也明显优于从前。搜索「2019 Brazil traveler to usa need a visa(2019 巴西旅客到美国需要签证)」,在更新前,搜索引擎没有将「to」考虑在内,更多返回了美国旅客到巴西旅行的信息。加入BERT后,「to」则没有被忽略。

对于这次更新,Google副总裁 Pandu Nayak 在官方博文中称之为「代表了五年里最大的跨越,也是搜索历史上其中一个最大的改进」。目

1.3 BERT或能让算法更会「聊天」

据《Fastcompany》报道,为了训练BERT,Google向其输入了 11038 本未经标注的书籍文本和合计 25 亿字来自维基百科英文版的内容。而且,研究人员还随机「掩盖」了文本里的单词,让算法模型自行想法子「填空」。

学习完所有文本后,算法开始找到一些在同一文本中经常出现的句子和词语规律,建立了对词语的基本理解,而且还似乎开始「明白」词语背后所代表的事物之间存在的关系,这就像一种「常识」。

举个例子,从前如果在 Google里搜「do estheticians stand a lot at work(美容师在工作中需要站很久吗)」,搜索引擎会将「stand(站)」这个词语套入「stand-alone(独立)」的意思,因此无法返回搜索者想要的信息。

加入BERT后,搜索引擎则能理解,用户所指的是「站立」的动作,再进一步,也可扩大理解为「美容师这个职业的体力劳动量」。前,BERT已经应用到 Google搜索的英文版中,未来还将扩展到更多不同语言版本。
  

1.4 Facebook为何也需要BERT算法

作为 Facebook的副总裁,LeCun带领着团队,通过对BERT进行优化,并输入更大批量的学习资料,研发出了他们的自有模型「RoBERTa」。Google原有的BERT准确率为 80.5%,而 RoBERTa 则可做到 88.5%。但为什么 Facebook也要研究这个?

如果说当搜索引擎能够更好地理解用户输入的自然语言,反馈更有帮助的内容,那这个改进移植到智能语音助手上也是可预见的。和很多科技巨头公司一样,Facebook也在研发智能语音助手,提升算法对自然语言的处理能力也是必须。
  但在语音助手之前,他们先从相对简单的文本对话入手,做了聊天机器人,而且准备在 RoBERTa 的基础上扩展更多功能,让算法和人聊起天来更自然。据 LeCun介绍,很多聊天机器人都会 「把天聊死」。

譬如,很多机器人讲话会自相矛盾。前一分钟可能和你说「XXX 的新单太棒了,赶紧一起去打榜」,下一分钟就说「追星的人都是傻的」。这主要是因为它们背后是一个固定的数据库,收到特定的关键词就会调出对应回答。

而那些真的是自己生成答案的机器人,又会为了规避自相矛盾而用模糊的答案来回应人,显得冷冰冰。
  此外,现有聊天机器人大多知识领域很局限。一旦聊天的人改了话题,聊到它不认识的,机器人就接不下话了。为此,Facebook现在正向自己的算法输入来自各种领域的大批量信息,并尝试将这些信息以更自然的方式加入对话中。未来,他们还计划教导机器人「引导话题」—— 当聊天者将话题扯到比较泛的领域时,将内容拉回到特定任务上。

我们相信,我们已经很接近创造出一个能和人们聊得下去的机器人。Facebook研究人员 Jason Weston 告诉《Fastcompany》。在那天到来之前,希望我能练就出不被聊天机器带跑的技能。
  
  BERT是google最新提出的NLP(natural language processing)预训练方法,在大型文本语料库(如维基百科)上训练通用的“语言理解”模型,然后将该模型用于我们关心的下游NLP任务(如分类、阅读理解)。总而言之,搜索引擎将更好地理解人的语言。

BERT 模型被称为 “最强 NLP 模型”,Google 也在 2018 年底开源了 BERT 模型,相关论文也荣获 NAACL 2018 年的最佳长论文;BERT 算法已经在智能机器人、Feeds 等多个方面实践。
  本次算法是对用户的口语化问题做出更人性化的升级,以前的stop word,比如to、for这些词现在被重视起来了。以前我们在Yoast SEO里面,插件建议我们把stop word尽量少用。但本次算法更新后,我们要合理的把stop word给用起来。

本次算法据searchengineland统计,影响了将近10%的搜索结果,这是一个非常大的搜索结果的变化。因此,这次算法更值得我们去研究新算法BERT下,如何去获取到更多的流量。

还有一点猜想就是:本次BERT算法更新,从某种意义上来讲,是在为以后的智能机器人做铺垫。比如我们用天猫盒子,小米精灵等机器人设备,提出的问题会有对应的回答,但目前还不能很精准的回答出所有的问题。

但随着BERT算法更新后,相信很快这些机器人就能很好的解答我们的问题了。当然,这些回答的数据还是会从网页端进行获取。当你优化好这块的内容并得到不错的排名,机器人会优先使用你的内容来进行解答,但具体这个商业如何变现,就还不得而知。

但有个风向标很明显:口语化的内容创作将会是我们后续发力的重点。

以上就是谷歌搜索引擎新推出的算法BERT的介绍。BERT有哪些作业,对搜索结果将有哪些改变呢?搜索引擎输入词是用户和搜索机器交互的关键,对输入的搜索词理解如何,成为搜索成功的关键。搜索机器对用户长句、词与词之间的关系的理解,还处在学习阶段,毕竟人工智能对人类自然语言的理解还在进步中。

2. BERT原理

BERT模型的全称是Bidirectional Encoder Representations from Transformers,它是一种新型的语言模型。之所以说是一种新型的语言模型,是因为它通过联合调节所有层中的双向Transformer来训练预训练深度双向表示。

BERT=基于Transformer 的双向编码器表征,顾名思义,BERT模型的根基就是Transformer,来源于attention is all you need。其中双向的意思表示它在处理一个词的时候,能考虑到该词前面和后面单词的信息,从而获取上下文的语义。

想深入了解BERT模型,首先应该理解语言模型。预训练的语言模型对于众多自然语言处理问题起到了重要作用,比如SQuAD问答任务、命名实体识别以及情感识别。目前将预训练的语言模型应用到NLP任务主要有两种策略,一种是基于特征的语言模型,如ELMo模型;另一种是基于微调的语言模型,如OpenAI GPT。这两类语言模型各有其优缺点,而BERT的出现,似乎融合了它们所有的优点,因此才可以在诸多后续特定任务上取得最优的效果。

它基于谷歌2017年发布的Transformer架构,通常的Transformer使用一组编码器和解码器网络,而BERT只需要一个额外的输出层,对预训练进行fine-tune,就可以满足各种任务,根本没有必要针对特定任务对模型进行修改。

BERT将多个Transformer编码器堆叠在一起。Transformer基于著名的多头注意力(Multi-head Attention)模块,该模块在视觉和语言任务方面都取得了巨大成功。

BERT的先进性基于两点:首先,使用Masked Langauge Model(MLM)和Next Sentense Prediction(NSP)的新预训练任务;其次,大量数据和计算能力满足BERT的训练强度。

相比之下,像Word2Vec、ELMO、OpenAI GPT等传统SOTA生成预训练方法,使用从左到右的单向训练,或者浅双向,均无法做到BERT的双向性。

2.1 BERT模型总体结构

BERT是一种基于微调的多层双向Transformer编码器,其中的Transformer与原始的Transformer是相同的,并且实现了两个版本的BERT模型,在两个版本中前馈大小都设置为4层:


2.2 BERT模型输入

输入表示可以在一个词序列中表示单个文本句或一对文本(例如,[问题,答案])。对于给定的词,其输入表示是可以通过三部分Embedding求和组成。Embedding的可视化表示如下图所示:
token Embeddings表示的是词向量,第一个单词是CLS标志,可以用于之后的分类任务,对于非分类任务,可以忽略词向量;

Segment Embeddings用来区别两种句子,因为预训练不只做语言模型还要做以两个句子为输入的分类任务;

Position Embeddings是通过模型学习得到的。

2.3 BERT模型预训练任务(核心)

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

2.3.1 Masked Langauge Model

为了训练深度双向Transformer表示,采用了一种简单的方法:随机掩盖部分输入词,然后对那些被掩盖的词进行预测,此方法被称为“Masked LM”(MLM)。预训练的目标是构建语言模型,BERT模型采用的是bidirectional Transformer。那么为什么采用“bidirectional”的方式呢?因为在预训练语言模型来处理下游任务时,我们需要的不仅仅是某个词左侧的语言信息,还需要右侧的语言信息。

在训练的过程中,随机地掩盖每个序列中15%的token,并不是像word2vec中的cbow那样去对每一个词都进行预测。MLM从输入中随机地掩盖一些词,其目标是基于其上下文来预测被掩盖单词的原始词汇。与从左到右的语言模型预训练不同,MLM目标允许表示融合左右两侧的上下文,这使得可以预训练深度双向Transformer。Transformer编码器不知道它将被要求预测哪些单词,或者哪些已经被随机单词替换,因此它必须对每个输入词保持分布式的上下文表示。此外,由于随机替换在所有词中只发生1.5%,所以并不会影响模型对于语言的理解。
MLM可以从文本执行双向学习,即允许模型从单词前后相邻的单词,学习每个单词的上下文,这是传统方法做不到的。

MLM预训练任务将文本转换为符号,并使用符号表示作为训练的输入和输出。15%的符号随机子集在训练期间被屏蔽(类似被隐藏起来),目标函数则用来预测符号识别的正确率。

这与使用单向预测作为目标、或使用从左到右和从右到左训练,来近似双向性的传统训练方法形成了对比。

但是MLM中的BERT屏蔽策略,将模型偏向于实际的单词,还没有数据显示这种偏见对训练所产生的影响。
缺点1:预训练与微调之间的不匹配,因为微调期间是没有看到[Mask]token。

Solution:不是总用实际的[Mask]token替换被“masked”的词汇,而是采用训练数据生成器随机去选择15%的token。
例子:句子= my dog is hairy, 选择的token是hairy。执行的流程为:

Transformer不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入词块的分布式语境表征。此外,因为随机替换只发生在所有词块的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。
缺点2:每个batch只预测了15%的token,这说明了模型可能需要更多的预训练步骤才能收敛。

2.3.2 Next Sentence Prediction

很多句子级别的任务如自动问答(QA)和自然语言推理(NLI)都需要理解两个句子之间的关系,譬如上述Masked LM任务中,经过第一步的处理,15%的词汇被遮盖。那么在这一任务中我们需要随机将数据划分为等大小的两部分,一部分数据中的两个语句对是上下文连续的,另一部分数据中的两个语句对是上下文不连续的。然后让Transformer模型来识别这些语句对中,哪些语句对是连续的,哪些对子不连续。

NSP使得BERT可以通过预测上下句之间是否连贯来得出句子之间的关系。

给出50%正确上下句配对,并补充50%的随机上下句配对,然后对模型进行训练。

MLM和NSP是同时进行的。
现在从句子的角度来考虑问题,预训练了一个二值化下一句预测任务,该任务可以从任何单语语料库中轻松生成。具体来说,选择句子A和B作为预训练样本:A的下一句有50%的可能是B,另外50%的可能是来自语料库的。
例子:
输入=[CLS]男子去[MASK]商店[SEP]他买了一加仑[MASK]牛奶[SEP]
Label= IsNext
输入=[CLS]男人[面具]到商店[SEP]企鹅[面具]是飞行##少鸟[SEP]
Label= NotNext

2.4 预训练过程

训练批量大小为256个序列(256个序列*512个词块=128,000个词块/批次),持续1,000,000个步骤,这比33亿个单词语料库大约40个周期

2.5、微调过程

微调过程中,大多数模型超参数与预训练相同。批量大小、学习率和训练周期数量会有区别。最佳超参数值是特定于任务的,但我们发现以下范围的可能值可以在所有任务中很好地工作:

2.6 模型比较

ELMo、GPT、BERT都是近几年提出的模型,在各自提出的时候都取得了不错的成绩。并且相互之间也是相辅相成的关系。

3个模型比较如下:
再往前看,在NLP中有着举足轻重地位的模型和思想还有Word2vec、LSTM等。

Word2vec作为里程碑式的进步,对NLP的发展产生了巨大的影响,但Word2vec本身是一种浅层结构,而且其训练的词向量所“学习”到的语义信息受制于窗口大小,因此后续有学者提出利用可以获取长距离依赖的LSTM语言模型预训练词向量,而此种语言模型也有自身的缺陷,因为此种模型是根据句子的上文信息来预测下文的,或者根据下文来预测上文,直观上来说,我们理解语言都要考虑到左右两侧的上下文信息,但传统的LSTM模型只学习到了单向的信息。

ELMo采用的是双向的LSTM的架构,所以能够抓取到左右上下文的语义
由于GPT和BERT都采用了Transformer,所有它们都是能够完成并行计算,但是由于GPT采用的是单向的,导致了每个token只能关注左侧的语境,在文献中被称为了“Transformer解码器”,而BERT采用了双向的双向的自注意机制,所以被称为了“Transformer编码器”。

2.7 数据和TPU/GPU runtime

BERT的训练总共使用了33亿单词。其中25亿来自维基百科,剩下8亿来自BooksCorpus。

使用2500-392000标记的样品进行fine-tune。重要的是,100K以上训练样本的数据集在各种超参数上表现出强大的性能。

每个fine-tune实验在单个云TPU上运行1小时,在GPU上需要运行几个小时不等。

结果显示,BERT优于11项NLP任务。在SQUAD和SWAG两个任务中,BERT成为第一个超越人类的NLP模型!

训练使用TPU完成,GPU估算如下所示。

2.8 BERT能够解决的实际任务类型

BERT预训练了104种语言,已在TensorFlow和Pytorch中实现并开源。Clone地址:https://github.com/google-research/Bert

BERT可以针对几种类型的任务进行fine-tune。例如文本分类、文本相似性、问答、文本标签、如词性、命名实体识别等。

但是,预训练BERT是很贵的,除非使用类似于Nvidia V100这样的TPU或GPU。

BERT人员还发布了一个单独的多语种模型,该模型使用整个维基百科的100种语言进行训练,性能比单语种的低几个百分点

2.9 实验

(1)GLUE数据集
上图中,(a)和(b)是序列级任务,©和(d)是词块级任务。图中E代表其输入嵌入,Ti代表词块i的语境表征,[CLS]是分类输出的特殊符号,[SEP]是分割非连续词块序列的特殊符号。
结果:
(2)斯坦福问答数据集SQuAD v1.1
斯坦福问答数据集SQuAD v1.1:一种100k众包问答对的集合
任务:给出一个问题和包含答案的来自维基百科的一个段落,任务是预测该段落中的其答案文本的跨度
(3)命名实体识别(NER)
数据集:CoNLL 2003命名实体识别(NER)数据集,由200k个训练单词组成,这些单词已注释为人员、组织、位置、杂项或其他(非命名实体)。

2.10 实践部分

尝试用github上面的bert-ner中文的项目,跑了一下ner,具体操作如下:

git clone https://github.com/ProHiryu/bert-chinese-ner

然后需要将Google写的bert的源码给放到当前的文件夹下,可以采用git clone的方式

git clone https://github.com/google-research/bert

同时需要下载Google遇训练好了模型,然后放到了checkpoint文件夹里面。下载地址是:https://github.com/ProHiryu/bert-chinese-ner
最后的文件目录树是


准好了之后,就可以进行训练了:
python BERT_NER.py --data_dir=data/ --bert_config_file=checkpoint/bert_config.json --init_checkpoint=checkpoint/bert_model.ckpt --vocab_file=vocab.txt --output_dir=./output/result_dir/
最后写在output文件下面,可以找到eval_results.txt文件,然后我们可以看到本次训练的结果如下:

3. 总结

NLP后续方法的提出主要源于Word Embedding 存在 多义词问题,比如:bank(河岸、银行),熟悉word2vector应该很清楚为什么存在多义词问题了。

而下游 NLP 任务在使用 Word Embedding 的时候也类似图像有两种做法:(两种做法就是 18 年之前 NLP 领域里面采用预训练的典型做法)

(1)一种是 Frozen,就是 Word Embedding 那层网络参数固定不动;

(2)另外一种是 Fine-Tuning,就是 Word Embedding 这层参数使用新的训练集合训练也需要跟着训练过程更新掉。

基于上面的骚操作作用不是很大哦,故有了:ELMO、GPT等,到现在的Bert

语言模型的每一次进步都推动着NLP的发展,从Word2vec到ELMo,从OpenAI GPT到BERT。通过这些发展我们也可以洞悉到,未来表征学习(Deep learning is representation learning)将会越来越多的应用到NLP相关任务中,它们可以充分的利用目前海量的数据,然后结合各种任务场景,去训练出更为先进的模型,从而促进AI项目的落地。

附tf代码:最强谷歌BERT算法

基础比较弱的,直接看bert,可能要结合这个文章一起看:

从Word Embedding到Bert模型——自然语言处理预训练技术发展史。

[NLP]高级词向量之谷歌BERT详解相关推荐

  1. [NLP]高级词向量表达之Word2vec详解(知识点全覆盖)

    1.词表征(Word Representation) 首先明确句子是 序列化 ,里面携带了大量大信息.在NLP发展的进程里面, 采用了one-hot vector的形式来表示一个句子里面的词是一种方式 ...

  2. [NLP]高级词向量表达之ELMo详解

    一.引言 词向量是自然语言处理任务中非常重要的一个部分,词向量的表征能力很大程度上影响了自然语言处理模型的效果.如论文中所述,词向量需要解决两个问题: (1)词使用的复杂特性,如句法和语法. (2)如 ...

  3. NLP︱高级词向量表达(二)——FastText(简述、学习笔记)

    FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...

  4. NLP︱高级词向量表达(三)——WordRank(简述)

    如果说FastText的词向量在表达句子时候很在行的话,GloVe在多义词方面表现出色,那么wordRank在相似词寻找方面表现地不错. 其是通过Robust Ranking来进行词向量定义. 相关p ...

  5. NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、Rpython实现、相关应用)

    有很多改进版的word2vec,但是目前还是word2vec最流行,但是Glove也有很多在提及,笔者在自己实验的时候,发现Glove也还是有很多优点以及可以深入研究对比的地方的,所以对其进行了一定的 ...

  6. NLP【05】pytorch实现glove词向量(附代码详解)

    上一篇:NLP[04]tensorflow 实现Wordvec(附代码详解) 下一篇:NLP[06]RCNN原理及文本分类实战(附代码详解) 完整代码下载:https://github.com/ttj ...

  7. 词向量之TF-IDF模型详解

    目录 0 前言 1 TF-IDF模型 1.1 TF-IDF数学形式 1.2 举例 2 TF-IDF的实现 2.1 TF-IDF简单python实现 2.2 TF-IDF的gesim实现: 2.3 TF ...

  8. FastText 总结:文本分类、词向量训练、参数详解

    FastText:文本分类.词向量训练.参数详解 前言 - FastText 简介 一.FastText - 安装 1.1 - Github下载安装 1.2 - 编译器安装 二.FastText - ...

  9. 系统学习NLP(二十六)--BERT详解

    转自:https://zhuanlan.zhihu.com/p/48612853 前言 BERT(Bidirectional Encoder Representations from Transfor ...

最新文章

  1. 博弈最高位POJ 1704(Georgia and Bob-Nim博弈)
  2. 返回指针值的函数(1)
  3. jspider java运行_Web Spider 网络蜘蛛爬虫
  4. Spring开发包介绍
  5. Java多线程(4)--线程的同步解决线程安全问题
  6. Java-排序算法-冒泡排序
  7. java微信上传本地视频教程_java微信开发之上传下载多媒体文件,java上传下载_PHP教程...
  8. 别闲的没事去听讲座!
  9. c#和python_C#学习笔记(与Java、C、C++和Python对比)
  10. 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足
  11. shell 脚本案例
  12. SSM项目使用ConfigTools对数据库的密码进行加密
  13. 《解构产品经理互联网产品策划入门》PDF+《互联网产品运营产品经理的10堂精英课》PDF分析...
  14. 用8051单片机编程由P1.0和P1.1引脚分别输出周期为1ms和500us的方波
  15. 论文阅读Measuring Regularity of Individual Travel Patterns
  16. 编译原理实验二 自上而下的语法分析器(算术表达式)
  17. Linux7/CentOS7 磁盘结构与分区
  18. mysql空间数据类型的使用_MySQL空间数据类型
  19. pytorch自动求导机制
  20. ecdf函数的逆函数_如何区分反函数和逆函数

热门文章

  1. 澳大利亚AUSTRAC监管DCE牌照怎么申请?
  2. java计算机毕业设计网络学习平台源代码+数据库+系统+lw文档
  3. kubernetes认证-CKA、CKS考试
  4. 设计模式解密(6) - 建造者模式(生成器模式)
  5. html图片如何滤镜,学会使用CSS3滤镜,必需先知道的滤镜的常规用法
  6. 光遇自动弹琴脚本代码_光遇自动弹琴脚本下载,光遇自动弹琴脚本代码软件 v0.6.2-手游汇...
  7. CSS width = 100vw 和width = 100%的区别
  8. xlwings:python好用的excel操作模块
  9. SD/TF卡测试与比较
  10. PS李涛老师的课程笔记 【PS初级】绘画与修饰工具