论文|万物皆可Vector之语言模型:从N-Gram到NNLM、RNNLM

Word2vec的出现改变了OneHot的高维稀疏的困境,自此之后各种xxx2vec如雨后春笋般冒了出来,用来解决各种嵌入式编码,包括后来的各种Embedding方式其实很多本质上都是Word2vec的延伸和优化。在本公众号「搜索与推荐Wiki」上也发布了不少Embedding相关的文章,后续也会持续的发布相关文章,欢迎关注。

万物皆可Embedding系列会结合论文和实践经验进行介绍,前期主要集中在论文中,后期会加入实践经验和案例,目前已更新:

后续会持续更新Embedding相关的文章,欢迎持续关注「搜索与推荐Wiki


1.1、基础知识

a)定义

语言模型(Language model)是自然语言处理的重要技术,自然语言处理中最常见的是文本数据,我们可以把一段自然语言文本看作是一段离散的时间序列,假设一段长度为 T T T的文本中的词依次是 w 1 , w 2 , . . . , w T w_1, w_2, ..., w_T w1,w2,...,wT,语言模型就是计算他的概率:
P ( w 1 , w 2 , . . . , w T ) P(w_1, w_2,..., w_T) P(w1,w2,...,wT)
也就是说语言模型是对语句的概率分布的建模。

语言模型可以分为:统计语言模型和神经网络语言模型。

b)概率表示

假设 S S S 表示一个有意义的句子,eg:今天天气晴朗,适合户外爬山,可以将这个句子表示为: S = w 1 , w 2 , . . . , w n S = w_1, w_2, ..., w_n S=w1,w2,...,wn,换成例子中的句子: w 1 = 今 天 , w 2 = 天 气 , w 3 = 晴 朗 , w 4 = 适 合 , w 5 = 户 外 , w 6 = 爬 山 w_1=今天, w_2=天气, w_3=晴朗, w_4=适合, w_5=户外, w_6=爬山 w1=,w2=,w3=,w4=,w5=,w6=

P ( S ) P(S) P(S) 表示这个句子出现的概率,展开为:
P ( S ) = P ( w 1 , w 2 , . . . , w n ) P(S)=P(w_1, w_2, ..., w_n) P(S)=P(w1,w2,...,wn)
利用条件概率可以转化为:
P ( S ) = P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) . . . P ( w n ∣ w 1 , w 2 , . . . , w n − 1 ) P(S) = P(w_1, w_2, ..., w_n) = P(w_1) P(w_2|w_1)P(w_3|w_1,w_2) ... P(w_n|w_1, w_2,...,w_{n-1}) P(S)=P(w1,w2,...,wn)=P(w1)P(w2w1)P(w3w1,w2)...P(wnw1,w2,...,wn1)
其中 P ( w 1 ) P(w_1) P(w1) 表示第一个词出现的概率,即「今天」在整个语料库中出现的概率, P ( w 2 ∣ w 1 ) P(w_2|w_1) P(w2w1) 表示在给定第一个词的情况下,第二个词出现的概率,即在整个语料库中给定「今天」这个词,「天气」这个词也出现的概率,后边的依次类推。

其中的 P ( w 1 ) P(w_1) P(w1) P ( w 2 ∣ w 1 ) P(w_2|w_1) P(w2w1)很容易计算得到,但是 P ( w 3 ∣ w 1 , w 2 ) P(w_3|w_1,w_2) P(w3w1,w2)及以后涉及变量较多,计算的复杂度也会变得更加复杂。

1.2、统计语言模型——N-gram模型

a)马尔可夫假设

为了解决上面的过于复杂难以计算的问题,需要引入马尔可夫假设,马尔科夫假设中很重要的一点是有限视野假设,即每一个状态只与它前面的 n − 1 n-1 n1个状态有关,这被称为 n n n 阶马尔可夫链

b)n-gram

当应用在语言模型中时,就是指每一个词的概率只与前边的 n − 1 n-1 n1 个词有关系,这就被称为 n n n 元语言模型,当 n = 2 n=2 n=2 时,被称为二元模型,此时上述公式展开为:
P ( S ) = P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 ) . . . P ( w n ∣ n 1 ) P(S) = P(w_1, w_2, ..., w_n) = P(w_1) P(w_2|w_1)P(w_3|w_2)...P(w_n|n_1) P(S)=P(w1,w2,...,wn)=P(w1)P(w2w1)P(w3w2)...P(wnn1)
经过马尔可夫假设的简化,计算 P ( S ) P(S) P(S)的概率也会变得容易很多,当然随着 n n n的增加,相应的计算复杂度也会增加,而 n n n 越大,越逼近数据的真实分布, n n n 通常取值为2、3、4、5。

c)概率估计

通过上面的描述,可以明确的是:

  • 每一个句子都可以拆分成不同的词的全排列
  • 每一个句子都可以通过条件概率公式计算得到一个表示该句子的合理性概率
  • 通过引入马尔可夫假设,简化句子的计算概率

以二元模型为例,如何计算 P ( w i ∣ w i − 1 ) P(w_i|w_{i-1}) P(wiwi1)?从概率统计中可知:
P ( w i ∣ w i − 1 ) = P ( w i , w i − 1 ) P ( w i ) P(w_i|w_{i-1}) = \frac{P(w_i, w_{i-1})}{ P(w_i) } P(wiwi1)=P(wi)P(wi,wi1)
在大语料的情况下,基于大数定理,词语 < w i , w i − 1 > <w_i, w_{i-1}> <wi,wi1>的共同出现次数除以 w i w_i wi的出现次数可以近似等于 P ( w i ∣ w i − 1 ) P(w_i|w_{i-1}) P(wiwi1),所以有:
P ( w i ∣ w i − 1 ) = P ( w i , w i − 1 ) P ( w i ) = N ( w i , w i − 1 ) N ( w i ) P(w_i|w_{i-1}) = \frac{P(w_i, w_{i-1})}{ P(w_i) } = \frac{N(w_i, w_{i-1})}{ N(w_i)} P(wiwi1)=P(wi)P(wi,wi1)=N(wi)N(wi,wi1)

所以一般情况下,统计语言模型都要求语料足够大,这样得到的结果相对会准确一些。但这里边也存在一个问题,如果 N ( w i , w i − 1 ) = N ( w i ) = 1 N(w_i, w_{i-1}) = N(w_i) = 1 N(wi,wi1)=N(wi)=1 或者都等于0的话,计算出来得结果显然是不合理的。因此引入了平滑技术。

d)n-gram模型中的平滑技术

平滑技术就是为了解决 c)中描述的次数统计比值不合理的情况。常见的平滑技术有(这里不展开描述,感兴趣的可以自行搜索了解):

  • 加法平滑
  • 古德-图灵(Good-Turing)估计法
  • Katz平滑方法
  • Jelinek-Mercer平滑方法
  • Witten-Bell平滑方法
  • 绝对减值法
  • Kneser-Ney平滑方法

e)n-gram 语言模型的优缺点

优点:

  • (1) 采用极大似然估计,参数易训练
  • (2) 完全包含了前 n-1 个词的全部信息
  • (3) 可解释性强,直观易理解。

缺点:

  • (1) 缺乏长期依赖,只能建模到前 n-1 个词
  • (2) 随着 n 的增大,参数空间呈指数增长
  • (3) 数据稀疏,难免会出现OOV的问题
  • (4) 单纯的基于统计频次,泛化能力差。

1.3、神经网络语言模型——NNLM

NNLM论文:《A Neural Probabilistic Language Model》

下载链接:http://www.ai.mit.edu/projects/jmlr/papers/volume3/bengio03a/bengio03a.pdf

NNLM模型的网络是一个三层的网络结构图,如下所示:
NNLM模型

其中最下层为输出词前 n − 1 n-1 n1 个词,NNLM模型的目标是急于这 n − 1 n-1 n1 个词计算 第 t t t 个词 w t w_t wt 的概率。

N N L M NNLM NNLM的训练目标是:
f ( w t , . . . , w t − n + 1 ) = P ( w t ∣ w 1 t − 1 ) f(w_t, ..., w_{t-n+1}) = P(w_t|w_1^{t-1}) f(wt,...,wtn+1)=P(wtw1t1)
其中 w t w_t wt 表示第 t t t 个单词, w 1 t − 1 w_1^{t-1} w1t1 表示从第1个单词到第 t − 1 t-1 t1 个词组成的子序列,模型需要满足的约束条件是:

  • f ( w t , . . . , w t − n + 1 ) > 0 f(w_t, ..., w_{t-n+1}) > 0 f(wt,...,wtn+1)>0
  • ∑ 1 ∣ V ∣ f ( w t , . . . , w t − n + 1 ) = 1 \sum_{1}^{|V|}f(w_t, ..., w_{t-n+1}) = 1 1Vf(wt,...,wtn+1)=1

上面模型的意思是当给定一段序列时,由其前面的 t − 1 t-1 t1个词预测第 n n n个词的概率。

  • 限制条件一:即是通过网络得到的每个概率值都要大于0。
  • 而对于第二个限制条件:因为我们的神经网络模型最终得到的输出是针对每 t − 1 t-1 t1个词的输入来预测下一个,也即是第 t t t个词是什么。因此模型的实际输出是一个向量,该向量的每一个分量依次对应下一个词为词典中某个词的概率。所以 ∣ v ∣ |v| v维的概率值中必定有一个最大的概率,而其他的概率较小。

N N L M NNLM NNLM 模型的训练目标可以分解为两部分:

  • 1、特征映射:即将 V V V 中的第 i i i个单词映射成一个 m m m维的向量 C ( i ) C(i) C(i),这里的映射可以是 O n e H o t OneHot OneHot(可以是初始化的词向量,因为要同模型一起进行训练),然后将通过特征映射得到的 C ( w t − n + 1 ) , . . . , C ( w t − 1 ) C(w_{t-n+1}), ...,C(w_{t-1}) C(wtn+1),...,C(wt1)进行拼接合并成一个 m ( n − 1 ) m(n-1) m(n1)维的向量。也可以说是:一个从词汇表 V V V到实数向量空间的映射 C C C。通过这个映射得到每个单词的向量表示。
  • 2、计算条件概率分布:通过一个函数 g g g 将输入的词向量序列 ( C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) (C(w_{t-n+1}), ...,C(w_{t-1})) (C(wtn+1),...,C(wt1)) 转化为一个概率分布 y ∈ R ∣ V ∣ y \in R^{|V|} yRV,所以这里的输出是 ∣ V ∣ |V| V维的,和词典的维度是相同的, y y y 中第 i i i个词表示词序列中第 n n n个词是 V i V_i Vi的概率,即: f ( i , w t − 1 , . . . , w t − n + 1 ) = g ( i , C ( w t − 1 ) , . . . , C ( w t − n + 1 ) ) f(i, w_{t-1}, ..., w_{t-n+1}) = g(i, C(w_{t-1}), ..., C(w_{t-n+1})) f(i,wt1,...,wtn+1)=g(i,C(wt1),...,C(wtn+1))

N N L M NNLM NNLM 模型的输出为一个 s o f t m a x softmax softmax 函数,形式如下:
P ( w t ∣ w t − 1 , . . . , w t − n + 1 ) = e y w t ∑ i e y w t P(w_t|w_{t-1}, ... ,w_{t-n+1}) = \frac{e^{y_{w_t}}}{ \sum_{i} e^{y_{w_t}} } P(wtwt1,...,wtn+1)=ieywteywt
其中 y i y_i yi 表示的是第 i i i 个单词没有进行归一化的概率,其计算公式为:
y = b + W x + U   t a n h ( d + H x ) y = b+W_x + U \, tanh( d + H_x) y=b+Wx+Utanh(d+Hx)
其中模型参数为: θ = ( b , d , W , U , H , C ) \theta = (b, d, W, U, H, C) θ=(b,d,W,U,H,C)

  • x x x 表示的神经网络的输入矩阵: x = ( C ( w t − 1 ) , . . . , C ( w t − n + 1 ) ) x = (C(w_{t-1}), ... , C(w_{t-n+1})) x=(C(wt1),...,C(wtn+1))
  • h h h 表示隐藏层神经元个数
  • d d d 表示隐藏层的偏置参数
  • m m m 表示每个单词对应的向量维度
  • W W W 是可选参数,如果输入层和输出层之间没有直接相连,可令 W = 0 W=0 W=0
  • H H H 表示的是输入层到隐藏层的权重矩阵
  • U U U 表示的时隐藏层到输出层的权重矩阵

一般的神经网络不需要对输入进行训练,但是在该模型中的输入 x x x是词向量,也是需要训练的参数,由此可见模型的权重参数和词向量是同时训练的,模型训练完成后同时得到网络的权重参数和词向量

N N L M NNLM NNLM 的训练目标是最大化似然函数,即:
L = 1 T ∑ i l o g f ( w t , w t − 1 , . . . , w t − n + 1 , ; θ ) + R ( θ ) L = \frac{1}{T} \sum_{i} log f (w_t, w_{t-1}, ..., w_{t-n+1},; \theta) + R(\theta) L=T1ilogf(wt,wt1,...,wtn+1,;θ)+R(θ)
其中 θ \theta θ为所有模型参数, R ( θ ) R(\theta) R(θ)为正则化项(在论文对应的实验中, R R R 表示的是权重衰减参数,仅适用于神经网络和单词对应的向量矩阵)。

然后使用梯度下降法更新参数:
θ ← θ + ϵ ϑ l o g p ( w t ∣ w t − 1 , . . . , w t − n + 1 ) ϑ θ \theta \leftarrow \theta + \epsilon \frac{ \vartheta log p(w_t|w_{t-1},...,w_{t-n+1}) }{\vartheta \theta} θθ+ϵϑθϑlogp(wtwt1,...,wtn+1)
其中 ϵ \epsilon ϵ为学习率(步长)。

基于Pytorch和Tf实现的代码参考:https://www.jianshu.com/p/be242ed3f314

1.4、神经网络语言模型——RNNLM

RNNLM 论文:《Recurrent neural network based language model》

下载连接:https://www.fit.vutbr.cz/research/groups/speech/publi/2010/mikolov_interspeech2010_IS100722.pdf

RNNLM模型的思想比较简单,主要改进的是NNLM中的前馈神经网络,其主要的结构图如下所示:

RNNLM

读者乍看可能不知道这个描述的是什么,不着急,先来补一下简单的RNN知识。

一个简答的RNN结构如下图所示:
RNN结构

其包含输入层、隐藏层和输出层, X X X 表示的是输入层的向量, U U U 表示输入层到隐藏层的权重矩阵, S S S 表示隐藏层的向量值, V V V 表示的是隐藏层到输出层的权重矩阵, O O O 表示的是输出层的向量值, w w w 表示隐藏层上一次的值。

将上面的图展开为:

RNN时间线展开图

现在看上去就比较清楚了,这个网络在 t t t时刻接收到输入 x t x_t xt 之后,隐藏层的值是 s t s_t st ,输出值是 o t o_t ot 。关键一点是, s t s_t st 的值不仅仅取决于 x t x_t xt ,还取决于 s t − 1 s_{t-1} st1

接着看RNNLM模型的结构图, I N P U T ( t ) INPUT(t) INPUT(t) 表示的就是 t t t时刻的输入 x t x_t xt C O N T E X T ( t ) CONTEXT(t) CONTEXT(t) 表示的就是 t t t时刻的隐藏层( s t s_t st), C O N T E X T ( t − 1 ) CONTEXT(t-1) CONTEXT(t1) 则表示 t − 1 t-1 t1时刻的隐藏层的值( s t − 1 s_{t-1} st1), O U T P U T ( t ) OUTPUT(t) OUTPUT(t) 表示的就是 t t t时刻的输出( o t o_t ot)。

其中:
x ( t ) = w ( t ) + s ( t − 1 ) s j ( t ) = f ( ∑ i x i ( t ) u j i ) y k ( t ) = g ( ∑ i s j ( t ) v k j ) x(t) = w(t) + s(t-1) \\ s_j(t) = f(\sum_{i} x_i(t)u_{ji}) \\ y_k(t) = g(\sum_{i}s_j(t)v_{kj}) x(t)=w(t)+s(t1)sj(t)=f(ixi(t)uji)yk(t)=g(isj(t)vkj)
其中 f ( z ) f(z) f(z) 表示的是 s i g m o i d sigmoid sigmoid 函数:
f ( z ) = 1 1 + e − z f(z) = \frac{1}{1+e^{-z}} f(z)=1+ez1

g ( z ) g(z) g(z)表示的是 s o f t m a x softmax softmax函数:
g ( z m ) = e z m ∑ k e z k g(z_m) = \frac{e^{z_m}} {\sum_{k} e^{z_k}} g(zm)=kezkezm

其中有一些细节需要注意:

  • s ( 0 ) s(0) s(0) 通常设置为比较小的向量值,如0.1
  • 隐藏层单元数一般为30-500,因为输入的词库特别大
  • 权重使用带噪声的高斯函数进行初始化
  • 优化算法使用的是随机梯度下降
  • 学习率初始值设置为0.1,后续随着迭代的进行,如果没有明显改善,学习率修改为原先的一半
  • 通常在10-20次迭代之后开始收敛

每一epoch结束之后,向量的误差基于交叉熵准则进行计算:
e r r o r ( t ) = d e s i r e d ( t ) − y ( t ) error(t) = desired(t) - y(t) error(t)=desired(t)y(t)

其中 d e s i r e d ( t ) desired(t) desired(t) 表示预测值, y ( t ) y(t) y(t)为真实值。

最终单词出现概率计算公式为:
P ( w i ( t + 1 ) ∣ w i , s ( t − 1 ) ) = { y r a r e ( t ) C r a r e i f   w i ( t + 1 ) i s r a r e y i ( t ) o t h e r w i s e P(w_i(t+1) | w{i},s(t-1)) = \left\{\begin{matrix} \frac{y_{rare}(t)}{C_{rare}} & if \, w_i(t+1) is rare\\ y_i(t) & otherwise \end{matrix}\right. P(wi(t+1)wi,s(t1))={Crareyrare(t)yi(t)ifwi(t+1)israreotherwise

其中 C r a r e C_{rare} Crare 表示的是词汇表中单词出现次数小于阈值的单词数。文中提到在 B r o w n c o r p u s Brown corpus Browncorpus数据集中(有80万单词),阈值设置的为5,隐藏层单元数为100。

关于RNNLM代码实现可以参考:https://www.jianshu.com/p/f53f606944c6


【技术服务】详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

在这里插入图片描述
扫一扫关注「搜索与推荐Wiki」!号主「专注于搜索和推荐系统,以系列分享为主,持续打造精品内容!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
n-gram模型是一种用于自然语言处理的统计语言模型,用于预测一个词语在给定前文的情况下出现的概率。在R语言中,可以使用`quanteda`包来实现n-gram模型。 首先,需要安装`quanteda`包,可以使用以下命令进行安装: ```R install.packages("quanteda") ``` 安装完成后,可以使用以下代码创建n-gram模型: ```R library(quanteda) # 创建一个文本对象 text <- c("I love coding in R", "R is a powerful language") # 创建一个corpus对象 corpus <- corpus(text) # 创建一个token对象 tokens <- tokens(corpus) # 创建一个n-gram模型 ngram_model <- tokens_ngrams(tokens, n = 2) ``` 上述代码中,我们首先创建了一个文本对象`text`,然后将其转换为corpus对象`corpus`,再将corpus对象转换为token对象`tokens`。最后,使用`tokens_ngrams`函数创建了一个n-gram模型`ngram_model`,其中`n`参数指定了n-gram的大小。 创建完n-gram模型后,可以使用以下代码获取n-gram的频率信息: ```R # 获取n-gram的频率信息 ngram_freq <- textstat_frequency(ngram_model) ``` 上述代码中,我们使用`textstat_frequency`函数获取了n-gram模型中各个n-gram的频率信息。 除了获取频率信息外,还可以使用n-gram模型进行文本生成和预测。例如,可以使用以下代码生成一个新的文本: ```R # 使用n-gram模型生成新的文本 new_text <- generate(ngram_model, n = 10) ``` 上述代码中,我们使用`generate`函数根据n-gram模型生成了一个包含10个词语的新文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值