ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

从onehot到bert

2019-09-10 16:00:55  阅读:751  来源: 互联网

标签:bert RNN 模型 attention 语义 onehot 句子 向量


wordEmbedding:将一个词映射到语义空间(低维稠密空间)中的一个点,使得语义上比较相似的词,在空间上有比较相近的距离。比如word2vec 可以学到一些关系,如男人女人,时态关系,国家首都之间的关系等。学到的词向量可以用于下游任务。(如作为特征或作为初始的词向量Fine-Tuning)

语义是上下文相关的,假设某个词在语料库内有多种语义,这时候强行用一个向量来编码某个词语义的话,我们只能将两种语义都编码在一个向量里面,但是很显然,一个句子里,某个词只会有一种语义。

最开始我们用one-hot,后来用word2vec,glove等来生成词向量。

对于上下文的语义编码,我们借助RNN/LSTM/GRU来进行,这些序列的网络能够记忆之前的历史信息,记录一些相关的语义,但也存在某些问题。

我们可以用两个RNN组成seq2seq模型,用来解决翻译,摘要,问答和对话系统问题。seq2seq有encoder模型负责将数据进行编码,生成context向量,接着decoder模型将context向量进行解码,输出对应的目标。

对于seq2seq模型的改进我们有attention机制和transformer等。

以上监督学习的模型,存在这数据量不足的问题,无法学到完整的复杂的上下文表示。无监督的 contextual word embedding 应运而生。比如ELMO,OpenAI GPT,BERT等,用以生成词的向量表示,并同时考虑上下文信息。

 

One-Hot Encoding

one-hot词向量是一个高维稀疏的表示,由于具有正交性,one-hot词向量无法表达不同词之间的相似度。例如,任何一对词的one-hot向量的余弦相似度都为0。

Neural Network Language Model

神经网络语言模型做这样的工作:

给定一个句子S,包含k个词,可以按如下方式计算句子的概率:

P(S) = p(w_{1},...,w_{k}) = \prod_{k=1}^{K}(w_{k}|w_{k-1},...,w_{1})

在神经网络语言模型之前,主流的统计语言模型是N-gram,该方法基于词的历史(w_{1},...,w_{k-1})来预测当前的词w_{k}关于N-gram可以参考这里

他不能解决长距离依赖的问题。也不能共享上下文(如果训练预料里面未出现某词,或出现很少,尽管他在现领域中很重要,他的weight也会很低)。比如我们的语料是:1、我要去北京。2、我要去北京。3、北京和天津是中国的城市。4、北京和天津是大城市。那么训练出来后,返回我要去北京的概率就很大,我要去上海的概率就会很小,甚至没有。

神经网络模型基于当前的词(比如说["我","要","去"]),先将当前的词变成词向量,做向量拼接,接tanh 和一些线性层,最后通过softmax来判断出现第四个词(比如说["北京"])的概率。

神经网络模型如何解决泛化能力的问题?假设我们的语料是:1、我要去北京。2、我要去北京。3、北京和天津是中国的城市。4、北京和天津是大城市。假设我们的训练数据是["我","要","去"],output是北京。因为别的语料(3、4、5)上下文中有北京和天津类似的出现,那么在预测时,输入["我","要","去"],output是天津的概率也会比较大。

 

神经网络训练好之后,我们随之也得到了他的副产品,即我们的词向量。(刚开始训练的时候,神经网络的输入可以是随机的词向量,也可以是one-hot)

2013年,Google团队发表了word2vec工具。算法基于两个词的上下文相似,则他们的语义也相似-------这一假设(分布式假设)。

word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。值得一提的是,word2vec词向量可以较好地表达不同词之间的相似和类比关系。关于word2vec可以参考这里

Glove模型首先基于语料库构建词的共现矩阵,然后基于共现矩阵和GloVe模型学习词向量。关于Glove可以参考这里

正如前面提到的,词向量编码,会将词的所有语义编码进向量。而一个句子中,词的语义往往只有一个。这时候,有记忆能力的RNN模型大有可为。我们知道RNN容易造成梯度消失,由于梯度消失,很难学到长距离的依赖关系,LSTM通过门的机制来避免梯度消失。GRU在LSTM上作一些改进来提高效率。(把遗忘门和输入门合并成一个更新门)关于RNN可以参考这里

对于句子输入输出长度不一致的情况,一个RNN无法满足要求,我们需要seq2seq。比如机器翻译,文本摘要等。

model

然而试图用一个Encoder state向量来编码整个输入语义是很困难的。具体的细节,我们往往需要参考原来的信息,所以我们引入attention机制。关于attention可以参考这里

模åæ±æ»24 - 深度学习中Attention Mechanism详ç»ä»ç»ï¼åçãåç±»ååºç¨

如何解决单向信息流问题?

RNN有时序依赖,后面一个时刻必须基于前一个时刻进行训练,无法并行。所以一般训练都比较耗时。

另外我们编码一个词的语义的时候,其实是要考虑整个句子的上下文,光看前面(RNN)或者光看后面(逆向RNN)都是不全面的。

这个时候我们需要self-attention。Self-attention即K=V=Q,例如输入一个句子,那么里面的每个词都要和该句子中的所有词进行attention计算。目的是学习句子内部的词依赖关系,捕获句子的内部结构。

self-attention and transformer

 

参考这里

 

Bert

 

 

 

 

 

 

 

 

 

 

 

 

标签:bert,RNN,模型,attention,语义,onehot,句子,向量
来源: https://blog.csdn.net/b285795298/article/details/100697170

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有