简介:

BERT,全称Bidirectional Encoder Representations from Transformers,是一个预训练的语言模型,可以通过它得到文本表示,然后用于下游任务,比如文本分类,问答系统,情感分析等任务.BERT像是word2vec的加强版,同样是预训练得到词级别或者句子级别的向量表示,word2vec是上下文无关的(Context-Free),而BERT是上下问有关的(Contextual).意思就是,word2vec只是具有词本身的语义信息,而没有包含文本(不是特指某个文本,而是所有跟该词相关的文本信息)上下文信息,BERT却是相反的.目前为止,BERT已经取得了所有NLP任务的最好结果,所以才称之为最强NLP模型.

以下是BERT的详细介绍:

1.Mask-LM

传统的一般形式语言模型,都是从前向后(从左到右)的得到文本的语义表示.

图1

这样得到的文本表示句子结尾处的词可以包含前面词的语义信息,但是前面的词并有包含后面词的语义信息.为了解决这一问题,从而引出了双向RNN结构的模型(Bi-RNN/Bi-LSTM).但是如果模型加深,那么最后可能会形成一个"cycle"(作者原话),这是因为一层Bi-RNN会使前面的词包含后面词的语义,后面的词包含前面词的语义,那么一层一层的加深,每个词都会包含整个句子的语义信息,最后加深就变成了自己包含自己的"cycle".

所以作者在这里并没有使用循环神经网络架构,而是使用一种叫做Mask-LM的方法,使用Transformer进行训练:
We mask out 15% of the words in the input, run the entire sequence through a deep bidirectional Transformer encoder, and then predict only the masked words. For example:

图2

根据文中的意思很好理解Mask-LM的意思,就是随机的去掉部分输入句子的单词,让其作为要预测的label(相当于完形填空),然后用双向深度Transformer模型进行训练.

2.Next Sentence Prediction

此外,为了学习句子之间的关系,作者还训练一个简单任务:给出两个句子A和B,B是A之后的实际下一个句子,或者只是语料库中的随机句子?也就是判断句子B是不是句子A的下一个句子,是或者不是,这是一个二分类问题,称之为Next Sentence Prediction,它是BERT论文新提出的一项NLP任务,所以目前应该没有专门针对NSP的语料库.

图3

3.模型结构

BERT包括两个步骤:预训练Pre-training和微调fine-tuning.预训练是要花费很长的时间,而且硬件要求也很高,作用使用了4到16个云TPU训练了4天,所以家里没有矿的伙伴就直接使用预训练好的模型参数进行微调吧.文章开头也说了,BERT可以作为预训练模型,用于其他下游NLP任务,所以只需要使用预训练好的模型参数,加上微调就可以在常见的NLP任务上取得较好的效果.

作者给出了两个主要模型:Basic-model,Large-model.分别有12层/768个神经单元/12-heads/110M参数和24层/1024个神经单元/16heads/340M参数.以下是一些模型的其他release版本,其中uncased是指文本已经分词和小写处理.

图4

作者强调,BERT模型的硬件要求高,参数量较小的Basic-model也需要在12g-16g的GPU上才可以运行(所以我也就只能看看文章--.).

模型更详细的其他信息,可参考BERT代码github:BERT

最强NLP模型-BERT的更多相关文章

  1. 5 分钟入门 Google 最强NLP模型:BERT

    BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...

  2. 【转载】最强NLP预训练模型!谷歌BERT横扫11项NLP任务记录

    本文介绍了一种新的语言表征模型 BERT--来自 Transformer 的双向编码器表征.与最近的语言表征模型不同,BERT 旨在基于所有层的左.右语境来预训练深度双向表征.BERT 是首个在大批句 ...

  3. NLP新秀 - Bert

    目录 什么是Bert Bert能干什么? Bert和TensorFlow的关系 BERT的原理 Bert相关工具和服务 Bert的局限性和对应的解决方案 沉舟侧畔千帆过, 病树前头万木春. 今天介绍的 ...

  4. Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题

    Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题 阅读本文可以理解什么是“强”整数规划模型. 单源固定费用网络流问题见文献[1]第13.4.1节(p229-231),是"强整 ...

  5. 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型

    先上开源地址: https://github.com/huggingface/pytorch-transformers#quick-tour 官网: https://huggingface.co/py ...

  6. NLP采用Bert进行简单文本情感分类

    参照当Bert遇上Kerashttps://spaces.ac.cn/archives/6736此示例准确率达到95.5%+ https://github.com/CyberZHG/keras-ber ...

  7. 知识图谱辅助金融领域NLP任务

    从人工智能学科诞生之初起,自然语言处理(NLP)就是人工智能核心的研究问题之一.NLP的重要性是毋庸置疑的,它能够实现以自然语言交流为特征的高级人机交互,使机器能“阅读”所有以文字形式记录的人类知识, ...

  8. NLP学习(3)---Bert模型

    一.BERT模型: 前提:Seq2Seq模型 前提:transformer模型 bert实战教程1 使用BERT生成句向量,BERT做文本分类.文本相似度计算 bert中文分类实践 用bert做中文命 ...

  9. 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史(转载)

    转载 https://zhuanlan.zhihu.com/p/49271699 首发于深度学习前沿笔记 写文章   从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 张 ...

随机推荐

  1. 苹果编程语言Swift简介

    Swift是什么? Swift是苹果于WWDC 2014发布的编程语言,The Swift Programming Language的原话: Swift is a new programming la ...

  2. C# 4.0 不要跨程序集用dynamic指向匿名类型 (转载)

    今天写代码时偷懒用了dynamic,结果遇到问题,运行时始终无法获取dynamic对象的属性.原问题简化后如下: 程序集A包含SampleClass类,有一个静态方法,接收一个dynamic类型参数并 ...

  3. django中对数据库的增删改查

    Django的配置文件时settings.py中的 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplate ...

  4. echarts踩坑---容器高度自适应

    在echarts中,若设置固定高度,当柱状图数据过多时会出现数据相互挤压,给用户的体验十分糟糕,可以通过给容器设置自适应高度,然后通过getDom()的方法解决此问题. 具体解决办法如下: <d ...

  5. c#开发微信公众号——关于c#对象与xml的转换

    在成为微信公众号开发者以后,整个交互流程:用户->微信服务器->自己的服务器->返回微信服务器->用户: 举个例子:用户在微信公众号里面发了个“您好!”,微信服务器会以特定的x ...

  6. window7下 cmd命令行 Mysql导出表结构 + 表数据

    命令格式 mysqldump -uroot -p 密码 库名 > 自定义路径/库名.sql

  7. 调试日志——基于stm32的智能声光报警器(三)

    智能声光报警器基本功能调试完成. 1.通过拨码开关来设置LED闪烁的频率. 2.关门时喇叭不想,灯熄灭. 3.旁路模式时,灯处于闪烁状态,此时关门灯扔闪烁. 关于此次代码我觉得还是有可以优化的地方,电 ...

  8. Python学习笔记九:装饰器,生成器,迭代器

    装饰器 本质是函数,装饰其他函数,为其他函数添加附加功能 原则: 1不修改原函数的源代码 2不修改原函数的调用方式 知识储备: 1函数即变量 使用门牌号的例子说明函数,调用方式与变量一致 2高阶函数 ...

  9. Go黑帽子

    使用go语言来实现python黑帽子和绝技的代码 1.unix密码破解器 package main import( "bufio" "flag" "i ...

  10. linux中配置JDK环境变量

    使用的centos版本为 7.5 首先我们要把jdk拷到linux中,这里我们借助XShell工具,我们先来看看Xshell的用法 打开Xshell 后点击文件,“新建“,如下图: 起一个名称,主机填 ...