文档章节

一篇文章看懂自然语言处理——word表示技术的变迁(从bool模型到BERT)

 冷血狂魔
发布于 09/25 00:12
字数 2289
阅读 2546
收藏 68

一、背景

    自然语言处理就是要让计算机理解人类的语言,至于到目前为止,计算机是否真的理解的人类的语言,这是一个未知之数,我的理解是目前为止并没有懂得人类语言,只是查表给出一个最大概率的回应而已。那么自然语言处理(NLP)包括哪些领域的东西呢?文本分类(如:垃圾邮件分类、情感分析)、机器翻译、摘要、文法分析、分词、词性标注、实体识别(NER)、语音识别等等,都是NLP要解的问题。那么这些解了这些问题,计算机是否真的懂得人类语言的含义,现在还未知,本片文章不过多的展开讨论。语言的单位是词,那么计算机是如何来表示词的,用什么技术来表示一个词,就可以让计算机理解词的含义呢?本篇博客将进行详细的讨论,从bool模型,到向量空间模型、到各种word embedding(word2vec、elmo、GPT、BERT)

二、原始时代

    在Deeplearning之前,表示一个词,并没有一个约定俗成的办法,如何表示,取决于想解决的任务。

    1、Bool模型

    下面有两句话,求文本相似度。

    我喜欢张国荣

    你喜欢刘德华

    那么,布尔模型比较简单粗暴,出现了词所在维度为1,没出现的所在维度为0,如下图:

   

   然后求两个向量的cosine即可。

   在bool模型中,由于特征值只有1和0两个取值,不能很好的反应特征项在文本中的重要程度。

    2、VSM(向量空间模型)

    Bool模型其实可以看做是VSM的特例,只不过VSM每个维度填进去的值是用了一些特殊的规则处理罢了,VSM如下图:

    

    t表示特征项,d表示一个Document,那么D可表示为D={t1,t2,t3……tN}的N维向量,w的值怎么填呢?只好的做法是TF*IDF,TF表示词频、IDF表示反词频,公式如下:

    TF(t)=特征词在文档中出现次数/文档总词数

    IDF(t)=log(N/(n+1)),其中N为文本集文本总数,n为包含特征词t的文档数量

    当然TF*IDF也有他的缺陷,忽略了类中分布情况和忽略了类间分布情况,那么也有一些改进,例如:TF*IDF*IG,IG表示信息增益。

   这些词/文档的表示方法,非常机械,反映不出词与词之间的上下文之间的关系、相似的关系等等。

三、深度学习时代

    首先不得不提语言模型,语言模型在估测一个句子出现的概率,概率越大,越合理。

    P(w1,w2,w3,……wn)=P(w1)*P(w2|w1)*P(w3|w1,w2)...P(wn|w1,w2....wn-1)

    通常上面的式子没办法估测,于是会做一个马尔科夫假设,假设后面的词只和前面的一个词有关,那么就简化为下面的式子:

     P(w1,w2,w3,……wn)=P(w1)*P(w2|w1)*P(w3|w2)...P(wn|wn-1)

    当然也可以假设后面的词和前面的N个词有关,这就是常说的N-gram。语言模型在elmo和gpt中有大用处。

    1、word2vec

    word2vec,其实是一个单隐层的神经网络,的思想很简单,请看下图

    

    上图中李雷和韩梅梅,都跟着“在教室”这个词,当向神经网络输入李雷或者韩梅梅,希望神经网络output“在教室”这个词的几率越高越好,那么神经网络的权重进行调节,把两个不同的词映射到了相同的空间,那么说明李雷和韩梅梅存在某种联系,这就是word2vec的思想。word2vec有两种,cbow和skip-gram,cbow是由上下文推出一个词,skip-gram是由一个词推出上下文,如下图所示。我实践的结果是cbow效果要更好一点。

    这个代码怎么实现呢?其实自己实现一个单隐层的神经网络就搞定了,output层激活函数为softmax,用cross entropy Loss,梯度下降即可。事实上,我们完全不用这么麻烦,DL4J已经提供了全套解决方案,几行代码就搞定了,代码如下:

  Word2Vec vec = new Word2Vec.Builder()
                .minWordFrequency(5)
                .iterations(1)
                .layerSize(100)
                .seed(42)
                .windowSize(5)
                .iterate(iter)
                .tokenizerFactory(t)
                .build();

   vec.fit();

      2、ELMO

    ELMO取至Embeddings from Language Model的首写字母,论文地址:https://arxiv.org/abs/1802.05365

   Embeddings 是从语言模型中得到的。在讲ELMO之前,先来说说word2vec有什么问题,word2vec固然可以表示词与词之间的语义以及相互之间的关系,但是word2vec是一个完全静态的,也就是把所有信息都压缩到一个固定维度的向量里。那么对于一词多意,是表现力是比较有限的。请看下面的例子,

    在 “欲信大义于天下”中  ,“信”是动词,“伸张”的意思

    在 “信义著于四海"中,“信”是名词,“信用”的意思

    如果“信”字压缩成一个100维的向量,将很难区分这两种意思的差别,那么这就需要Contextualized Word Embedding,根据不同的语境,对词进行编码,于是ELMO来了。

    EMLO的结构很简单,用了双向的LSTM来训练一个语言模型。如下图(图片来至于台大李宏毅的ppt)

    

    模型training的过程很简单,读入一个词,一词下一个词,反向读一个词,预测上一个词,以此训练下去,直到收敛。中间红框处的蓝色和橙色的向量就是Embedding的向量,最后接起来就是我们所要的向量了,当然这个bi-lstm也可以叠很多层。每一层都得到一个Embedding向量。

    

    那么,使用的时候怎么用这个编码值呢?这取决于下游任务,比方说可以把每一层的Embedding向量求和取平均,或者加权求和等等,这个权重可以跟着任务一起train出来。

    3、GPT

    ELMO实现了对word进行动态编码,但是他用了LSTM,LSTM并不能记住很长的信息,且不利于并行计算。GPT用self attention改变这一结果,当然这一切得益于google神作《Attention Is All You Need》论文地址:https://arxiv.org/pdf/1706.03762.pdf

    GPT是怎么样的运作流程呢?其实就是用self attention训练一个语言模型,请看下图:

    

    每个词之和前面的词做attention,预测下一个词,例如读入开始标记BOS,然后自己和自己做attention,预测“潮水”,读入BOS、潮水,然后和BOS、潮水做attention,预测“退了”,类推下去,直到结束。在很多语料上train下去,就得到了一个非常强大的语言模型,可以动态的进行编码。使用的时候可以固定住这些attention层的参数,然后训练其他的下游任务,例如做情感分类问题,可以把这些attention层放在几个全连接层前面,固定参数,只训练后面的全连接层,通过softmax或者sigmoid进行分类。

    4、Bidirectional Encoder Representations from Transformers (BERT)

    GPT有个缺陷,就是编码只依赖上文信息,没有加入下文信息,那么BERT很好的解决了这个问题。BERT其实是transformer的encoder部分,如下图

    

    train BERT有两种方法,Masked LM和Next Sentence Prediction,Masked LM是随机掩盖住一些词,让BERT猜测盖住的词什么。Next Sentence Prediction是让BERT推断两个句子是不是有上下文关系。

    BERT充分考虑了上下文,对word进行编码,于是很好的体现语义和上下文的关系,在很多比赛中遥遥领先。

四、总结

    自然语言处理从原始的布尔模型,到向量空间模型,再到word2vec,再到ELMO,再到GPT,再到BERT,一路走来,技术的更替。目前为止,BERT依然是比较领先的word Embedding方法,在大部分自然语言处理任务中,作为预训练任务,是我们首先应该尝试的办法。也许,用不了多久,又会有新的技术出来,刷新成绩,我们拭目以待。但即便是现在为止,机器是否真的理解了人类的语言,这还是一个尚待论证的问题。路漫漫其修远兮,吾将上下而求索。

 

快乐源于分享。

   此博客乃作者原创, 转载请注明出处

P(1 ,每

© 著作权归作者所有

粉丝 113
博文 51
码字总数 62504
作品 0
杭州
程序员
私信 提问
加载中

评论(5)

d
dwcz
为什么要从词开始分解句子呢,人明明是从短语开始分解句子。
冷血狂魔 博主
你回想你刚刚学语文的场景,老师是不是先从字、词开始教起,充分理解了字、词之后,才开始懂短语,懂阅读理解,炉火纯青之后,才能一眼看清句法结构,那么,所有的基础便是字和词
d
dwcz
不对,认字识词,是为了熟悉结构。有些字词,如名词、数词、代词可以讲解意思,有些词是不能单独讲解的,只能在短语中,如动词、形容词、介词、连词。是理解了短语,才能阅读理解。最简单例子就是文言文,文言文中每个字词,都是知道意思,但不一定能理解每个句子。
yong9981
yong9981
狗脑里没有这些算法, 很奇怪为什么没人研究狗是怎么理解语言的。
jingshishengxu
jingshishengxu
👍
Perseus-BERT——业内性能极致优化的BERT训练方案

【作者】 笋江(林立翔) 驭策(龚志刚) 蜚廉(王志明) 昀龙(游亮) 一,背景——横空出世的BERT全面超越人类 2018年在自然语言处理(NLP)领域最具爆炸性的一朵“蘑菇云”莫过于Google ...

阿里云云栖社区
02/25
175
0
(九)再谈embedding——bert详解(实战)上

写这篇文章的时候,跳过了两个专题,因为BERT的确太火了,也比较实用吧,就拿最近的阅读理解比赛来说,几乎霸榜了,比如下面这个图: 之所以NLP这么多任务都会被刷新纪录,是因为BERT做的工作...

天生smile
2018/12/07
0
0
2019年上半年收集到的人工智能自然语言处理方向干货文章

2019年上半年收集到的人工智能自然语言处理方向干货文章 自然语言(NLP)发展史及相关体系 读了这篇文字,做年薪百万的NLP工程师 聚焦机器“读、写、说、译”,探寻NLP未来之路 NLP接下来黄金...

城市中迷途小书童
06/28
0
0
五分钟搭建一个基于BERT的NER模型

BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义。预训练的(pre-train)的语言模型通过无监督的学习掌握了很多自然...

王鹏你妹
03/06
0
0
BERT来袭:燃爆AI——iDeepWise

     近日,谷歌AI团队发布的BERT模型已经刷屏各大技术平台与博客,燃爆AI的同时,也激起了“iDeepWise”的好奇心。BERT模型的全称是Bidirectional Encoder Representations from Transf...

深思考人工智能
2018/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

移动端的弹窗滚动禁止body滚动

本文转载于:专业的前端网站➼移动端的弹窗滚动禁止body滚动 前言 最近一个需求是弹窗展示列表,显然是需要一个滚动条的,而滚动到底部就会穿透到body滚动,而阻止默认行为是不行的,这样两个...

前端老手
17分钟前
2
0
设计模式 建造者模式和模板方法模式扩展篇

建造者模式和模板方法模式扩展篇 UML 与抽象工厂模式比较 本模式可以看出与抽象工厂非常类似,都是产生不同的产品,怎么区分这两种设计的使用场景呢 - 建造者模式关注的是基本方法的调...

木本本
21分钟前
3
0
CPU 读取cache、内存、磁盘性能

google 工程师Jeff Dean 首先在他关于分布式系统的ppt文档列出来的,到处被引用的很多。 1秒=10^3毫秒=10^6微妙=10^9纳秒=10^12皮秒 读 cache ns 级,读内存100 ns,从内存顺序读1MB 0.25ms,...

SibylY
29分钟前
2
0
在windows virtualbox上安装LEDE

按照 官方指南 安装时遇到若干问题,做一下总结。 一、官方指南链接中的镜像文件安装后报错 snapshots/targets/x86/64 中的 lede-x86-64-combined-squashfs.img 文件安装后,进行网络配置报错...

元谷
38分钟前
3
0
《老子》_安身尘世间,做个明白人

1、无为而无不为 出自《道德经·第四十八章》。【译文】处于无为的境界之中,没有什么不能做到的。 2、知者不言,言者不知。 出自《道德经·第五十六章》。【译文】言语无法表达“道”的真意...

庭前云落
41分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部