幻风的AI之路
什么是语言模型
语言模型是一个单词序列上的概率分布,对于一个给定长度为m的序列,它可以为整个序列产生一个概率 P(w_1,w_2,…,w_m) 。其实就是想办法找到一个概率分布,它可以表示任意一个句子或序列出现的概率。语言模型的简单来说就是判断一句话是正常的概率是多少?那么如何计算一句话的概率呢?我们可以使用下面的公式:
以上就是一个文本的概率,我们可以对齐进行分解,变成一句话中每个单词的预测,那么现在的问题就变成我们如何预测一个词的概率
在语言模型中常用的方式n-gram方法,它的计算方法如下图所示
这是一种基于词统计的语言模型,我们可以通过语料数据的统计从而算出来P,语料越大效果越好,但是n-gram有一些问题使得它很难处理一些问题。
n-gram的问题
问题一:不可以解决长期依赖的问题
它上程序课,然后它需要电脑,programming和computer之间是相互依赖的,但是距离比较远,所以这个解决不了长期依赖的问题
问题二:相同的词不能共享权重
bought和purchased具有相同的上下文,但是n-gram不能让二者共享权重,所以这也是n-gram的问题
问题三:中心词不能作为上下文的条件
n-gram可以使用前面的词预测后面的词,但是不可以使用中心词预测上下文的词
解决问题三
假如现在给定上下文为giving a然后预测后面的单词的概率,其中b表示偏置项(每个词的先验可能),然后w1,a表示在a条件下,每一个词的可能性,w2,giving表示在giving的条件下,每一个词的可能性,然后加起来就是在giving a条件下后一个词的可能性,加起来就使得giving a绑定在了一起,这样可以使得giving a共同的发挥作用,我们可以看到可能的就是gift,我们可以把它变成网络的形式,如下所示
giving下面的蓝色向量(可以看作是特征),对应于w2,giving,a下面的蓝色向量(可以看作是特征),对应于w1,giving。
相对于n-gram基于统计的方式,这里使用特征的方式,特征化模型的计算概率用不同的办法,它们会计算上下文的特征,并基于特征来计算概率,对于n-gram来说Dr.jane和Dr Gertrude完全是两个不同的东西,而基于特征的方式,可以大限度的使得二者的scores相近,这样就当Dr.Gertrude Smith和Dr .jane Gertrude之间共享。
问题二
上面的模型是线性模型,我们知道线性模型没有特征组合,所以上面的模型没有办法解决问题二,那么如何才能解决问题二呢?那么我们可以使用非线性的方式,从而完成特征组合
我们将giving和a通过并列连接,然后通过非线性激活,从而得到紫色的特征组合,然后完成终的分类,此时就可以解决问题二了,这样的方式就会出现下面的情况:
当我们使用这个模型的时候,就会出现相近的词具有相同的词编码,这是因为我们并没有将二者加起来,而是连起来了,这样然后预测的下一个词相同,这就会导致相近的词会有相同的词向量编码。
这是n-gram所不能处理的,原因是:bought和purchased 是意思相同的词,然后car和bicyle是类型相同的词,但是n-gram仅仅进行表面的统计,所以bought和purchased没有共享任何的参数,这个意思就是说二者的意思相近,但是n-gram却把它当成了完全不同的东西,而使用这样的模型可以使得相近的词具有相同的向量
算法模型搭建
import torch
from torch import nn
from collections import defaultdict
import math
import random
class My_net(nn.Module):
def __init__(self,nwords,emb_size,hid_size,num_hist):
super(My_net,self).__init__()
self.embedding=nn.Embedding(nwords,emb_size)
self.fnn=nn.Sequential(
nn.Linear(num_hist*emb_size,hid_size),
nn.Dropout(True),
nn.Linear(hid_size,nwords)
)