• 【自然语言处理】语言模型


    语言模型

    1. 什么是语言模型

    语言模型 就是估测一些词的序列的概率,即预测 p(w1, w2, w3 ... wn),

    一个应用就是句子的生成。

    2. 语言模型的种类

    • Ngram

                  ngram是一种统计的方法,它相当于固定了一个窗口,在这个窗口内的词是相关的,也就是第n个词和前n个词相关:P(s) = p(w1) p(w2|w1) p(w3| w1, w2) ... p(wn|w1, w2 ...wn-1)

                  所以要求这个概率P(s), 就得求所有的条件概率,这就要求数据要足够大,能包含所有的这些词,如果有的条件概率是0,要就行平滑处理

                  优点:考虑了词的顺序

    缺点:没法考察词向量之间关系,同时向量太稀疏

              与连续空间的词表示法语言学规则模型对比(例如word2vec构建出的词向量),N-gram语言模型还有以下的局限性:

    N-gram模型是根据相互之间没有任何遗传属性的离散单元词而构建,从而不具备连续空间中的词向量所满足的语义上的优势:相似意义的词语具有相似的词向量,从而当系统模型针对某一词语或词序列调整参数时,相似意义的词语和词序列也会发生改变。

    n-gram中平滑处理方法

    1、加1法

    2、加k法

     

    加法平滑,会给未出现的词语赋予一定的权重,这就使得之前出现的词语的频次与平滑后的相比变小了,有点劫富济贫的感觉

     

    3、Interpolation 插值算法

     

                        将所以小于等于n的gram进行线性累加,lambda如何选择与更新?

                        将训练集分为三类:训练集、验证集或叫hold out,测试集

                        在训练集上的lambda是自己设置的,然后在验证集上进行更新,更新的一种方法,以当前的lambda(自己设置的)为中心,上下选择一个范围,可以得到在这个范围里的lambda的一个组合,对于每个组合求其困惑度或者概率P,最优解就是其中使得困惑度最小或者概率最大的那对lambda,

                      4、backoff

                           

                       如果高阶模型计数结果为0,可以转向使用低阶模型代替

    • 基于神经网络的语言模型

    它对于每一部分相乘概率P(wi|wj)不是通过统计得来的,而是通过神经网络预测出来的

    如图所示,训练一个神经网络,它的功能就是根据前两个词预测下一个词,输入 ‘潮水’ 和 ‘退了’,输出 预测出 ‘就’ 的概率, 然后利用 优化交叉熵函数(为什么是交叉熵,应该是应为求得是分布,衡量两个分布用的是交叉熵)

    有了上述预测函数,就可以算句子的概率了,这里的每个条件概率都是通过神经网络进行预测出来的

     对每一个单词用 one-hot编码,然后放入网络会得到下一个词出现的概率,最后累乘得到句子的概率。

               

    •  基于RNN的语言模型

    可以看出上图中是基于 bigram 模型的,因为他的输入是有要求的,只能是有限的个数,如要要是基于 ngram,就要借助RNN的特点了

    第一步:输入 begin得到潮水的概率,P(潮水|begin)

    第二步:输入潮水得到退了的概率,P(退了|潮水)

    第三步:输入退了得到就得概率, P(就|退了,潮水)

    第四步:输入就得到知道的概率, P(知道|就,退了,潮水)

    连乘起来就是ngram的形式。

    3、为什么用NN

    1、数据不够,一些概率会为0,这就要求数据量很多,数据很多出现结果就是数据稀疏,解决方法平滑

    如上述例子,dog 是可以 jump的, cat也是可以 ran 的,但是语料中缺不存在,所以这个概率是一定的值的,通过smoothing赋予一个很小的概率,这种平滑很粗糙

     

    以bigram为例,统计每个单词下一个出现的概率,会出现数据稀疏问题

    矩阵分解解决数据稀疏问题:

    横轴代表历史,纵轴代表词汇,P(ran|dog) = 0.2, 在表中好多都是0,这是因为在原来的语料库中不存在。这个好比是推荐系统,横轴代表用户,纵轴代表物品,表示0的地方代表曾经用户没有购买过该产品,但并不表示以后都不购买

    所以,我们可以将历史表示成 h1, 将词汇表示成 v1, 概率值我们用n来表示,根据已有的数据,我们构造成下面的损失函数,优化该函数得到vi 和 hj

    通过上面的训练,我们可以得到vi, hj, 对于 p(jumped | cat) = 0.2, p(jumped | dog) = 0, 我们训练出来的cat 和 dog是有一定相似性的,因此可以预测出 p(jumped | dog)  = v2 h1

          

    总之,矩阵分解相当于平滑处理,只不过ngram 中是手动平滑,矩阵分解中是自动平滑。

    矩阵分解可以用神经网络方法来做

     第二次表示dog的历史h(dog),v(ran),v(cried)分别表示ran和cried的向量,h(dog)v(ran) = p(ran | dog), 通过与目标构造交叉熵损失函数

    其中cat dog都是通过 one-hot 进行编码得到。

    与ngram相比,参数减少了

    RNN

    输入 预测的是 P(W t+1 | W1, W2 ... Wt), 将w1放入网络,得到h1, 再放入w2得到h2 ... 最后得到ht, ht与vocabulary进行相乘,得到Wt+1

     

    参考:

    https://blog.csdn.net/w5688414/article/details/78012409 

     

  • 相关阅读:
    MySQL Binlog 权限
    木槿
    easyconnect for docker
    批量导出指定表的建表语句
    Linux 安装 mysql 5.7
    课程表插件(vue直接引入样式)timeTables
    springcloud+gateway微服务整合swagger
    Flutter+Android Stodio
    Mysql8 示例
    用Gzip数据压缩方式优化redis大对象缓存
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/9888405.html
Copyright © 2020-2023  润新知