• ELMO语言模型


    ELMO
        ELMO提出背景:解决一词多义问题。
        模型结构:双层双向的LSTM,字符卷积,第一层lstm表示更多的句法特征,第二层lstm表示更多的语义特征
        从ELMO开始以后学的语言模型都是预训练语言模型。
        预训练模型:
            1.预训练阶段:需要大量数据和高配置(一般都是下载别人训练的模型)
            2.微调阶段
                下游任务:用训练好的模型继续之后的任务
                E=r(S1*E1(词特征)+S2*E2(句特征)+S3*E3(语义特征))
        总结ELMO的优缺点:
            优点:
    
            1.使用lstm有了隐状态的概念,编码每个词可以根据上下文的信息去编码当前词,
                    动态的基于上下文的调整向量,而不在是使用静态固定的向量,解决了一次多义问题
            2.使用了双向多层的LSTM可以提取到不同的,更多的句子或者单词的信息
            3.在多个NLP的任务当中,得到了或多或少的提升
            4.适用面比较广泛,可以用于多个NLP的任务
            缺点:
            1.特征提取方面使用到的是LSTM而不是transformer,transformer的特征提取能力远强于LSTM
            2.这种直接采用拼接的方式,融合双向的信息,并不是最好的方式,目前理论上是这样,但是还没有事实的证明出来这一点。
    
    
        双层双向LSTM:
            512维*2=1024维

    ELMO

    在2013年提出的word2vec和2014年提出的Glove中,每个词都对应一个确定的固定的vector,这样就无法解决一词多意的问题,ELMO,提出了相应的解决方案,不同以往的方式,不在是每个词对应一个固定的向量,而在ELMO中,预训练好的模型也不再只是单词到向量之间的对应关系,而是训练好一个模型,在使用的时候将一句话或者一段话输入进去,模型会根据上下文的语义信息,来得到某个词的词向量。这样做的好处之一就是可以解决一词多义的问题。

    比如能够很好的区分,苹果这个词说的到底是公司还是水果。

    先了解一下单向的LSTM语言模型

    给定一个字符串长度为N的词条(t1,t2,t3........tN),前向语言模型会根据历史的t1.....tN-1对tN进行建模,如图:

     

    那么它的输入和输出是什么,具体的流程又是什么?

    以“The cat sat on the mat”这句话为例,在某一个时刻k时,输入为The,输出cat的概率。过程是这里面包含了几步:

    1. 将 The 转换成word embedding:所谓word embedding就是一个n * 1维的列向量,在ELMo中用的是cnn-big-lstm生成的word embedding,其实跟word2vec等也差不多,就是提前单独训练好的模型,模型喂入单词就能得到单词的word embedding。总之,在这第一步里,就是简单将单词转换成了n * 1的列向量,而这个列向量,对应于我们普通LSTM中的输入xt

       

      1. 将上一时刻的隐状态和当前这步的word embedding共同输入到LSTM当中,并得到当前时刻的隐状态的输出ht,其中隐状态是一个m * 1的列向量。
      2. 将LSTM的隐状态乘以w权重矩阵进行输出,即w * ht 得到一个列向量,再将这个向量softmax归一化,其中假定数据集有V个单词,那么这个w就是V * m的矩阵,ht是一个m * 1的一个矩阵,于是就会得到一个V * 1的向量,再把这个向量经过softmax激活函数,归一化,就可以得到每个单词输出的一个概率了。

      从上边的三步就是LSTM的大概流程了,和神经网络语言模型或者RNN语言模型差不多。

      接着来看一下ELMO的结构,它内部是含有两层双向的LSTM,注意:有两个改进:1.增加了多层的LSTM,2.增加了后向的语言模型。

      模型结构:

       

      前向的LSTM负责从前往后提取信息,后向的LSTM负责从后往前提取信息。

      也正是因为在这个模型中是双向的模型,因此代价函数也稍微有所不同,如下图所示:

       

      其中的Θx是映射层的参数,Θlstm是lstm中的参数,Θs是输出层也就是说上边的w的参数,这三个参数在其中都是共享的。同时Θx和Θs在前向和反向中也是共享的。

      ELMO对于每一个token,都会通过L层的biLstm计算出来2L + 1个表示,+1是最初是的embedding。

       

       

      在实际的应用当中就是将R这里边的多个向量压缩成一个单个的向量,就可以得到一个词的向量了,那么如何使用或者得到这个向量呢,最简单的一种方式就是,获取最后一层的隐藏层的输出,但是这样并不是最好的一种方法,而我们最常用的方法就是:

       

      在其中的s是通过softmax获取到的L层向量中,每一层向量的权重值,而r是一个缩放因子,在论文中提到,r的作用比s的作用要大。同时我们也可以将L层中的多个向量进行相加求平均等等的操作,但是实验证明,学习出来的s和r要比其他方式好很多。同时在不同的下游任务当中,不同的s和r也会有很大的影响。

      ELMO的主要思想就是:事先通过语言模型,训练好一个固定的单词的embedding,此时的向量还不具备区分一词多意的能力,但是此时的它已经具备了上下文的信息。这个时候我们再去根据上下文的语义信息去调整这个embedding,自然也就解决了一词多意的问题,所以,

      ELMO本身就是一个根据上下文对embedding动态调整的思路。

      ELMO的使用:

      ELMO 采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练;第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的 Word Embedding 作为新特征补充到下游任务中。

      第一阶段:预训练,它的网络结构采用了双层双向 LSTM,目前语言模型训练的任务目标是根据单词 wi 的上下文去正确预测单词 wi , wi 之前的单词序列 Context-before 称为上文,之后的单词序列 Context-after 称为下文。图中左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外 wi 的上文 Context-before;右端的逆向双层 LSTM 代表反方向编码器,输入的是从右到左的逆序的句子下文 Context-after;每个编码器的深度都是两层 LSTM 叠加。这个网络结构其实在 NLP 中是很常用的

      使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子Snew,句子中每个单词都能得到对应的三个Embedding:最底层是单词的 Word Embedding,往上走是第一层双向LSTM中对应单词位置的 Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的 Embedding,这层编码单词的语义信息更多一些。也就是说,ELMO 的预训练过程不仅仅学会单词的 Word Embedding,还学会了一个双层双向的LSTM网络结构,而这两者后面都有用。

      第二阶段:微调,比如我们的下游任务仍然是 QA 问题,此时对于问句 X,我们可以先将句子 X 作为预训练好的 ELMO 网络的输入,这样句子 X 中每个单词在 ELMO 网络中都能获得对应的三个 Embedding,之后给予这三个 Embedding 中的每一个 Embedding 一个权重s,这个权重可以学习得来,根据各自权重累加求和,将三个 Embedding 整合成一个。

      然后将整合后的这个 Embedding 作为 X 句在自己任务的那个网络结构中对应单词的输入,以此作为补充的新特征给下游任务使用。对于上图所示下游任务 QA 中的回答句子 Y 来说也是如此处理。

      因为 ELMO给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。至于为何这么做能够达到区分多义词的效果,你可以想一想,其实比较容易想明白原因。

      总结ELMO的优缺点:

      优点:

      1. 动态的基于上下文的调整向量,而不在是使用静态固定的向量,解决了一次多义问题
      2. 使用了双向多层的LSTM可以提取到不同的,更多的句子或者单词的信息
      3. 在多个NLP的任务当中,得到了或多或少的提升
      4. 适用面比较广泛,可以用于多个NLP的任务

      缺点:

      1. 特征提取方面使用到的是LSTM而不是transformer,transformer的特征提取能力远强于LSTM
      2. 这种直接采用拼接的方式,融合双向的信息,并不是最好的方式,目前理论上是这样,但是还没有事实的证明出来这一点。

      评估:

       

      同时论文中还证明了,正则项λ的值会影响到结果,并且λ为0.001的时候要比λ为1的时候效果要好,因为λ大的时候效果类似于取到L层就直接平均的向量了,而λ小的时候就类似于对层与层之间的权重不会有大的变化,那么也就是说不会影响到每一层中不同的加权值:

       

      论文阅读总结:

      注:在论文中提到,高层的LSTM可以更好的提取到语义信息,而底层的LSTM可以更高的提取到句法的信息,没有哪个好哪个坏,高层的包含语义信息,我们可以做单词消除歧义,但是底层的提取到了更多的句法结构我们可以做词性标注等。

      在3000万的数据集合上进行训练的

      模型结构,512维的向量,4096个单元,两层双向的LSTM等

      微调调整的是r,s值

      ELMo 是一种动态词向量算法,在大型的语料库里训练一个 biLSTM (双向LSTM模型)。下游任务需要获取单词词向量的时候,将整个句子输入 biLSTM,利用 biLSTM 的输出作为单词的词向量,包含了上下文信息。可以理解成,biLSTM 是一个函数,函数的输入是一个句子,输出是句子中单词的词向量。

      ELMO的流程:


      使用词向量:

       


      作者提出了两种使用的方法:

       

       

  • 相关阅读:
    DDD之落地实践
    QCC51XX---ADK Application Framework编程指南
    深度学习中的epoch, batch 和 iteration
    【Qt】QPalette
    CMake中foreach的使用
    Android 双向滑动
    职场:“工作”的理解
    戴尔科技集团通过多云数据保护和安全创新增强网络弹性
    基于孤立森林的信用卡欺诈 Python 实战案例,最佳参数选择、可视化等
    python flask_restful “message“: “Failed to decode JSON object: None“
  • 原文地址:https://blog.csdn.net/m0_67084346/article/details/128138129