NLP学习(2)

关于NLP的词向量对比

1.bag-of-words

BOW是词袋模型,文本中各个词之间的顺序,语义,位置信息不予考虑,将文本看作若干个词的组合,这些词都是独立的,不依赖其他词,常用的有one-hot,tf-idf,textrank等。

2.主题模型

LSA(潜在语义分析模型,主要解决文档中的一词多义和一义多词问题,主要将高维空间映射到低维空间(也叫潜在语义空间),主要通过SVD(奇异值矩阵分解)。latent semantic analysis)

LDA(Latent Dirichlet Allocation),还有个机器学习领域的LDA(Linear Discriminant Analysis,线性判别分析),LDA是用来预测文档主题的模型,将文档集中的各个文档主题以概率分布的形式给出,从而分析一些文档得出他们的主题分类,用来文档分类或者文档主题聚类。

3.基于词向量的固定表示

(1)Word2vec

2013年由Google提出来的,包含两种模型,skip-gram,continuous bag-of-words(CBOW),还有两种高效的训练方式:负采样(negative  sampling),层次softmax(hierarchical softmax)。

CBOW

CBOW,输入是连续的上下文,输出是当前单词的预测,是一个三层的神经网络模型,如下图所示:

其中学习的是最大化对数似然函数:

其中w是语料库C中的任何一个单词,接下来是一张更详细的图:

解释如下:

输入层是one-hot编码,其中C代表上下文单词的个数,V是向量单词的维度,输入的权重矩阵是V*Ndim,与输入的(V*1)转置,得到1*Ndim的中间结果,相加求平均得到隐层向量;

隐层向量与输出的权重矩阵W‘得到向量{1*V},激活函数处理得到输出的概率分布,每一维代表一个单词,概率最大的index表示的单词就是输出的target word,值得一提的是N是自己设定的,loss function一般是交叉熵代价函数。

从数学的角度来看,CBOW是等价于词袋模型的向量乘以一个embedding矩阵,得到一个连续的embedding向量。

Skip-Gram

Skip-Gram:(名称来源于该model会对上下文的word进行采样)跟CBOW刚好相反的因果,输入是当前词语,输出是上下文。

skip-gram的前向计算公式如下:

其中是

negative sampling

负采样,概念是相对于正采样(正确的样本)而言的。

为什么要有负采样?负采样对于减少模型的权重更新量(每个样本都会影响神经网络中的权重)很有帮助,举个例子,假如神经网络的输出层是300*10000维度的权重矩阵,我们现在只需要一个正确样本的权重,以及5个错误样本的权重(即负样本)(论文里说选择5-20个单词对于较小的样本比较合适,而大样本可以悬着2-5个单词),所以总共是6个样本(输出神经单元),参数变为6*300=1800个参数,和原来的相比,大大减少更新的参数量。

负采样过程中单词的随机选择是有一定的概率的,单词出现的频率越高,越有可能被选择(频率越高,价值越高,去掉停用词后)

负采样的思想来源于NEC算法(Noise-Contrastive Estimation, Mnih, A., & Kavukcuoglu, K. (2013). Learning word embeddings efficiently with noise-contrastive estimation, 2265–2273.),原本是为了解决那些无法归一化的概率模型的参数预估问题,与改造模型的输出概率不同的是,NCE算法改造的是似然函数。

hierarchical softmax

最早由Bengio在05年引入语言模型中,实际上是一颗带权路径最小的哈夫曼树,让高频词的搜索路径变小,基本思想是:将复杂的归一化概率分解为一系列的条件概率乘积:

每一层的条件概率对应一个二分类问题,可以通过一个简单的逻辑回归函数去拟合,如此将V个概率归一化问题,转为对logV个词的概率拟合问题。

层次softmax是相对于一般的softmax而言的,从隐藏层到输出的softmax层,要计算所有词的softmax概率,再去找最大的概率值,

图中的树形结构就是hierarchical softmax。

(2) fastText

fastText是Facebook在2016年开源的一个词向量计算和文本分类的工具,它在学术上没有多大创新,但他有着它的优点,比如在文本分类上,fastText(浅层网络)能表现的和深度网络相媲美的精度,而且训练时间远远低于dp,举个例子:在标准的多核CPU上,能训练10亿词级别语料库的词向量在10min之内,能够分类有着30多万类别的50多多万句子在1min之内。

fastText的核心思想是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax分类,(涉及到字符集n-gram的特征引入和分层softmax)

fastText与Word2vec的CBOW模型很相似:

PS:此框架图没有词向量的训练过程,和CBOW一样,三层神经网络,输入层,隐藏层,输出层(hierarchical softmax,大大降低了训练时间),输入是多个经向量表示的词,输出是一个特定的target,隐藏层是对多个词向量的叠加平均,和CBOW的不同之处在于,CBOW的输入是单词的上下文,fastText的输入是多个单词及n-gram特征(字符级别的n-gram),这些特征用来表示单个文档;CBOW的输入单词经过one-hot编码,fastText的输入特征被embedding过,CBOW输出是target word,fastText输出是文档的类标。

(3) Glove

Glove (2014年)全称是Global vectors for word representation,一般与word2vec比较:word2vec是考虑两个词在一段上下文之间的相关度,而Glove是考虑两个词在全文的相关度。

skip-gram/CBOW都是一种基于local context window的方法,缺乏的是整体词与词的关系,而negative sampling的方式也会缺少词的关系信息,另外,直接训练skip-gram,容易使高曝光词得到更高的权重。(每次只使用一个窗口的信息更新词向量)

Glove融合了矩阵分解LSA(latent semantic analysis)的全局统计信息和local context window的优势,融入全局的先验统计信息(基于共现矩阵),可加快模型的训练速度,也可以控制词的相对权重(共现矩阵,多个窗口更新)

4.基于词向量的动态表示

(1)elmo

RNN

RNN(Recurrent Nerual Network),循环神经网络,它主要处理的是序列数据(比如语音,视频,等),重点在于它的参数共享,基本模块有输入层,隐藏层,输出层,核心在于隐藏层的循环。举个例子,X_i是输入的第i个样本,输入是{x1,x2,...xn}, h_i代表第i个状态下中间隐藏变量的输出,Y_i表示第i个状态下的输出,第i个状态下的h_i由此时的输入样本x_i和上个时态的h_{t-1}来决定,然后由h_t输出y_i:(RNN有着梯度消失/梯度爆炸,记忆饱和两个问题)(RNN的梯度消失/梯度爆炸问题:在前向计算或者后向计算过程中,权值矩阵W的幂值不断增大,在此过程中,W中幅值小于1的不断向0衰减,幅值大于1的不断发散,最后造成梯度消失/爆炸问题)

LSTM

LSTM(Long short-term memory)是RNN的变种,主要是为了解决RNN中长期记忆依赖的问题,主要是增添了门机制:

总共四套参数

出自《Deep Contextualized Word Representations》,18年,NNACL的best paper。

Elmo和word2vec,Golve的一个词对应一个向量的固定表示方法不一样,它会根据上下文推断每个词对应的词向量,结合语境对多义词建模。

Elmo使用了两个单向的LSTM模型,由一个前向模型和后向模型组成,目标函数是这两个方向语言模型的最大似然,Elmo不使用双向的LSTM模型的原因是,双向的LSTM在预训练任务中会提前看到上下文的表征信息而对预测结果产生影响。所以Elmo本质上还是单向的语言模型,只在一个方向进行编码,只不过将其拼接起来了。

Elmo中 LSTM层越高,越能捕捉语义信息,LSTM层越低,更能学到词法信息和句法信息。(缺点:Elmo的特征提取采用的是LSTM,而不是Transformer(17年))

(2)(Open AI )GPT

Attention

注意力机制和人类视觉的注意力类似,比如人们看某张图片或者关注某件事情的时候,不会每一个场景都看,而是会对某一个目标区域,投入更多的注意力资源,以获取更多的目标资源信息,从而抑制无用信息。

Attention的起源如下:

最早应用在视觉图像领域,在九几年就提出来了,真正火起来的是在2014年 google mind团队的这篇论文《Recurrent Models of Visual Attention》,在RNN模型上使用Attention机制来进行图片分类,之后第一次应用在NLP领域的是Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》,使用类似Attention机制在机器翻译上将翻译和对齐同时进行,然后CNN中使用Attention成为研究热点,《ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs》这篇论文是CNN中使用Attention比较早的探索,之后在2017年,由Google机器翻译团队在arxiv预发的《Attention is all you need》中大量使用Self-Attention,自此以后,自注意力机制成为研究热点。

Attention可以看做Target中的Query到Source中一系列的的 对齐(映射),如下图

再计算Attention时主要分为三个阶段,第一个阶段是Query与Key做一系列的相似性或相关性的运算计算方法可以有点积,感知机MLP,拼接等等;第二个阶段是对相似性计算结果(权重)进行类Softmax运算(归一化),得到结果a_i(权重),第三个阶段是将权重和Value值进行加权求和,得到最后的Attention。(目前NLP研究中,大部分的Key=Value,两者是往往是同一个)

《Attention is all you need》

这篇论文的主要亮点有如下三个:

1.不同于以往的机器翻译使用的RNN的encoder-decoder(seq2seq),该论文使用attention机制代替了RNN建立模型的框架;

2.在encoder-decoder阶段,大量运用多头注意力机制(Multi-Head Attention);

3.效果很好(在WMT2014语料的英德和英法任务上),训练速度很快;

论文模型的整体架构图如下:

在编码器的一个网络块中,由一个多头attention子层和一个前馈神经网络子层组成,整个编码器栈搭建了N个块,类似于编码器,解码器的网络块中多了一个多头attention子层。为了更好地优化深度网络,整个网络使用残差连接和对层进行规范化。

放缩点积attention(Scaled Dot-Product attention)就是常用的点积来进行相似度计算的attention,只是多除了一个为K的维度(d_k)起了调节作用,使得内积不是特别大。

多头Attention的结构如下图:

Query,Key,Value首先先进行一次线性变化,然后输入到缩放点积attention中,注意这里要做h次,也就是所谓的多头,每做一次算一个头。而且每次Q,K,V做线性变化时的参数W是不一样的,然后将这h次缩放点积attention的结果做拼接,在进行一次线性变化得到的值作为Multi-Head Attention的结果。可以看出,Google提出的多头Attention的不同之处在于,进行h次计算而非一次,论文中说这样做的好处是允许模型在不同的子空间中学到相关的信息,后面还会根据attention进行可视化验证。

那么在整个模型中是如何使用Attention的呢?如下图:

首先在编码器和解码器的地方运用多头attention进行连接,K,V,Q是编码器的输出(K=V)和解码器的多头attention的输入,其实和主流的机器翻译中的attention一样,利用解码器和编码器attention进行翻译对齐。在编码器和解码器中都使用了多头注意力self-attention机制来学习文本的表示,self-attention即(K=V=Q),例如输入一个句子,那么里面的每个词都要与该句子中所有的词进行attention计算。目的是学习句子内部的词依赖关系,捕获句子的内部结构。

对于为何要使用注意力机制的原因,论文主要从三个方面进行考虑,每一层的复杂度,是否可以并行,长距离依赖学习,并给出了RNN,CNN计算复杂度的比较:

可以看到,如果输入序列n小于表示维度d的时候,每一层的时间复杂度self-attention是比较有优势的,当n比较大的时候,作者也给出了一种解决方案,即self-attention(restricted),每个词不是都与所有的词做attention,而是只与限制的r个词做attention计算。

在并行方面,多头attention和CNN都不依赖前一时刻的计算,可以很好的并行,优于RNN。

在长距离依赖上,由于self-attention是每个词都与所有词做attention计算,所以不管他们中间有多长,最大的路径长度也都只是1,可以捕获长距离依赖关系。

在模型的超参实验中可以看到,多头attention的超参数h太小了不好,太大了也会下降。整体更大的模型比小模型更好,使用dropout可以降低过拟合。

Self-Ateention

Attention是发生在Target的元素Query与Source中所有元素之间的对齐。顾名思义Self-Attention就是发生在Target内部元素之间或Source内部元素之间的对齐。也可以理解为Target=Source这种特殊情况下的注意力机制。

Attention可视化验证:

可以从两张图看出,self-attention可以捕获同一个句子中单词的一些语法,比如第一张图学习到句子内部长距离依赖"making…….more difficult"这个短语,第二张图中,单头和双头的比较,单头的its只能学到law的依赖关系,而两个头的its不仅学到law,还学到application的关系,说明多头可以从不同的表示子空间中学习相关信息(h的合理性)。

(3)Bert

Continue····

你可能感兴趣的:(NLP学习(2))