zoukankan      html  css  js  c++  java
  • NLP之词向量

    1.对词用独热编码进行表示的缺点

    向量的维度会随着句子中词的类型的增大而增大,最后可能会造成维度灾难2、任意两个词之间都是孤立的,仅仅将词符号化,不包含任何语义信息,根本无法表示出在语义层面上词与词之间的相关信息,而这一点是致命的。

    2.用向量代表词的好处

    3.词嵌入的由来

    在上文中提过,one-hot 表示法具有维度过大的缺点,那么现在将 vector 做一些改进:

    1、将 vector 每一个元素由整形改为浮点型,变为整个实数范围的表示;

    2、将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。这也是词向量又名词嵌入的缘由了。

    4.传统的Embedding技术

    最早的分布式词向量是作为副产物产出的。在https://www.cnblogs.com/dyl222/p/11005948.html中的神经网络语言模型中有详细的介绍。

    5.Word2vec

    为了克服传统的Embedding技术中参数过多的问题,大名鼎鼎的Word2vec对神经网络语言模型进行了改进。

    Word2vec有两种训练模式CBOW以及skip-gram,有两种优化方法,层次化的softmax以及负采样。其中速度最快的组合是CBOW+负采样,在下文的Word2vec的详细解析中会介绍为什么,同时这也是通过gensim包中的Word2vec训练词向量的默认方法。

    优点:

    通过Word2vec获得的词向量是在低维空间的分布式表示(何为分布式表示:分布式表示(distributed representation)描述的是把信息分布式地存储在向量的各个维度中),其中包含丰富的语法和语义信息。

    缺点:

    1)词向量的解释性太差。

    2)对于CBOW模型,在训练阶段中心词的词向量是把窗口大小内上下文的词向量相加作为输入,显然这忽略了文本的序列信息。

    3)无法获得文本的情感信息,例如好,坏这两个词其使用的语境基本相同,训练出的这两个词向量会十分相似,但是其表示的情感意思却完全的相反。要获得情感信息需要大量标注好的语料。需要包含词不同情感得分的句子作为训练语料以获得这个词的词向量,需要大量的相关语料。

    4)其最主要的问题是无法获得语境信息从而无法解决一词多义的问题,因为通过Word2vec所训练出的词向量是静态的,对于一个词无论其所处的语言环境如何最终都用相同的词向量表示。

    Word2vec的详细解析(参考https://www.cnblogs.com/pinard/category/894695.html,个人从他的博客中学到了很多知识)

    1)CBOW+层次化的softmax

    整体结构图如下:

    该结构所创建的语言模型是根据中心词汇窗口大小内的词预测该词。具体过程如下:

    随机初始化所有词的词向量,根据训练样本结合词频建立霍夫曼树,设定一个滑动窗口,每次以一个窗口内的文本作为训练样本,树的叶子节点代表一个个词,训练样本中有多少不同的词就有多少个叶子节点。每次训练树的树根是训练样本中心词其窗口大小内上下文词其词向量的均值,从树根往下每次都是一个通过Logistic进行二分类的过程,正类的霍夫曼编码为0,负类的霍夫曼编码为1,每个训练样本的学习策略是使得从树根到中心词这个叶子节点的概率值最大,具体为使得一次次Logistic回归其值的乘积最大,以对数似然函数作为损失函数,通过梯度下降法对每次Logistic回归中的参数进行更新,同时以路径上所有梯度之和对窗口大小内的上下文词向量进行更新(注意并不是对中心词的值进行更新),非叶子节点代表的是参数,对于相同的训练样本参数是相同的。

    2)Skip_gram+层次softmax

    它和CBOW+层次softmax非常相似,都是对中心词窗口大小内的词向量进行更新,只不过这里的输入(根节点)是中心词的词向量,目标节点是上下文窗口大小内的词,因此相对于CBOW+层次softmax它多了一个外层的循环,循环的把上下文窗口大小内的词其词向量作为目标节点。它和CBOW都是对上下文窗口大小内的词向量进行更新,所以说CBOW是对输入进行更新,它是对输出进行更新。

    由于多个外层循环使得skip-gram的速度慢于CBOW。

    注意:由于层次softmax优化方法是根据词频建立霍夫曼树,词频小的词离根节点更远,使得训练时到中心词所经历的路径会过长,解决这一问题可以通过负采样。

    先介绍一下使用负采样选取neg个负例词的方法

    假定训练样本中共有I个词,把长度为1的线段分成I份,这里并不是等分的,词频越高的词其所占长度相对越大。然后再把该线段等分为M份,注意M远大于V,从M中随机的选取neg个,这neg个M所对应的词作为负例词。

    3)CBOW+负采样

    每一次以一个中心词作为正例(其词向量是上下文窗口大小内的词其词向量的均值),随机选取neg个中心词作为负例,以和logistic相同的思想最大化条件概率为学习策略,以对数似然函数做为损失函数,通过梯度上升算法进行优化。最后也是对上下文窗口大小内的词的词向量进行更新。

    4)Skip_gram+负采样

    每次循环的以上下文窗口大小内的某一个词作为正例,随机选取neg个中心词作为负例,以和logistic相同的思想最大化条件概率为学习策略,以对数似然函数做为损失函数,通过梯度上升算法进行优化。最后对该词的词向量进行更新。

    6.FastText

    具体可参考:https://blog.csdn.net/qq_16633405/article/details/80578431

    FastText在用于类别种类数比较多且训练语料比较大的文本分类中效果很好,但是通过这种方法也能获得词向量。

    fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。

    FastText每次以文本的所有词词向量的均值以及字符级文本的ngram作为输入,使得其相比于Word2vec能够获得语序信息。所预测的是类别标签。

    FastText词向量与word2vec对比:

    1)模型的输出层:word2vec的输出层,对应的是每一个token,计算某token的概率最大;而fasttext的输出层对应的是分类的label。

    2)模型的输入层:word2vec的输入层,是窗口大小内上下文词向量的均值;而fasttext 对应的是整个具体的内容,包括词,也包括 n-gram的内容; 两者本质的不同,体现在 h-softmax的使用。Word2vec的目的是得到词向量,该词向量 最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)。

    7.Glove

    word2vector不同,GloVe更倾向于前后语境之间的共现关系进行分析,通过共现关系抽象出词向量,相比于word2vector它能获得语料中的统计信息。该论文明确指出它是充分利用统计信息使用词共现矩阵中频率非零的元素来训练模型。

    详细解析:

    https://blog.csdn.net/u014665013/article/details/79642083

    论文和源码的详细解析

    https://blog.csdn.net/Mr_tyting/article/details/80180780

    8.Doc2vec

    Doc2Vecdm默认为1是PV-DM类似于Word2vec中的CBOW,选择0则使用的为PV-DBOW,类似于Word2vec中的skip-gram,也有hs默认0为负采样)Word2vec类似,它是每次从一句话中滑动采样固定长度的词,取其中一个词作预测词,其他的作输入词。输入词对应的词向量word vector和本句话对应的句子向量Paragraph vector作为输入层的输入,将本句话的向量和本次采样的词向量相加求平均或者累加构成一个新的向量X,进而使用这个向量X预测此次窗口内的预测词。

    Doc2vec相对于word2vec不同之处在于,在输入层,增添了一个新句子向量Paragraph vectorParagraph vector可以被看作是另一个词向量,它扮演了一个记忆,词袋模型中,因为每次训练只会截取句子中一小部分词训练,而忽略了除了本次训练词以外该句子中的其他词,这样仅仅训练出来每个词的向量表达,句子只是每个词的向量累加在一起表达的。正如上文所说的词袋模型的缺点,忽略了文本的词序问题。而Doc2vec中的Paragraph vector则弥补了这方面的不足,它每次训练也是滑动截取句子中一小部分词来训练,Paragraph Vector在同一个句子的若干次训练中是共享的,所以同一句话会有多次训练,每次训练中输入都包含Paragraph vector。它可以被看作是句子的主旨,有了它,该句子的主旨每次都会被放入作为输入的一部分来训练。这样每次训练过程中,不光是训练了词,得到了词向量。同时随着一句话每次滑动取若干词训练的过程中,作为每次训练的输入层一部分的共享Paragraph vector,该向量表达的主旨会越来越准确Doc2vec中PV-DM模型具体的训练过程和word2vec中的CBOW模型训练方式相同,训练完了以后,就会得到训练样本中所有的词向量和每句话对应的句子向量。

    9.ELMO

    相比于前面几种方法所获得的词向量通过ELMO所获得的词向量能够富含语境信息,也就是能够一定程度上解决一词多义问题。

    ELMO属于一种预训练方法,采用了典型的两阶段过程,第一阶段是预训练一个语言模型(它所创建的为自回归类的语言模型,具体而言既有通过上文来预测当前词也有通过下文来预测当前词,网络结构一般采用双层双向的LSTM);第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding进行线性组合作为新特征补充到下游任务中(也可直接作为下游任务的输入)。

    具体流程

    先用训练语料通过多层双向的LSTM网络(论文中使用的是两层)来训练一个语言模型,属于预训练阶段。关于BI-LSTM的双向输入问题,语言模型训练的任务目标是根据单词的上下文去正确预测单词,它之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外的上文Context-before;右端的逆向双层LSTM代表反方向编码器,输入的是从右到左的逆序的句子下文Context-after(也就是说这里并不是输入的整个句子)。

    在解决下游的具体任务时,把当前任务的训练语料输入到网络模型中,此时参数都是训练好的,句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。这三层的向量可以结合下游具体任务的训练语料学习得到相应的权重,根据各自权重进行线性求和,将三个Embedding整合成一个从而得到ELMO向量。这个ELMO向量富含语境信息。对于下游的NLP任务,在词向量的基础上拼接上ELMO向量,其总体作为新的词向量进行训练,这样的词向量不仅富含语法和语义信息也富含语境信息,正因为拼接的ELMO向量的不同,所以说词向量是不断改变的,从而解决了Word2vec最大的缺陷,无法处理多义词的问题。

    10、词向量的评估

    词向量评估分为内在评估和外在评估

    外在评估需要把词向量放到各种下游任务中去看实际效果,具体方法参考提出Text-CNN的那篇论文

    内在评估

    1)可以通过直观的语义类别问题评估

    寻找x满足“a is to b,as x is to y”  求(b-a+x)的向量和那个向量最近作为y

    2)可以直接就简单的通过词向量进行聚类观察效果

     

  • 相关阅读:
    PhpStorm如何连接外部服务器

    hello,bokeyuan
    pyspark SparkSession及dataframe基本操作
    spark2.2 中文文档
    广告推荐加入图像特征
    docker教程
    DSSM算法-计算文本相似度
    navivate 下载
    save——model模块保存和载入使用简单例子
  • 原文地址:https://www.cnblogs.com/dyl222/p/11031724.html
Copyright © 2011-2022 走看看