NNLM语言模型(原理、反向传播的推导以及python实现)

NNLM语言模型(原理、反向传播的推导以及python实现)

-1、写这篇博客的目的

  因为研究生选择了自然语言处理方向(NLP),之前对此没有过接触,所以在大四阶段准备对NLP方向的一些算法做一些了解。在阅读《文本数据挖掘》(宗成庆、夏睿、张家俊)这本书的时,发现上面介绍了文本数据挖掘方向的很多算法,但是并未具体的展开,进行详细的推导。

  由此,我萌生了将自己学习这本书的过程中对算法的理解、看法、问题以及源代码进行分享的想法。当然,如果我写的有什么问题或者有需要和我讨论的都可以私信联系我!!!

0、引言

  如何将文本用数学的方法表达出来,是文本挖掘的基础。我们很容易会想到,在文本的向量空间中可以很容易的实现本文的聚类、文档的聚类、近义词的查找、等等。对于一段话来说,将其进行数学表达的最有效的方法,应该是将其中的每一个词都映射到一个词向量空间当中————即将本文视作一个词的集合。但是,如何构建这个向量空间是很困难的一件事情。比如说,我爱你你爱我这两句话,他们当中的每个词都是一样的,但是词序的不同改变了整句话的意义。不难看出,构建词向量空间时不仅要考虑到每个词的词义,还要考虑到每个词在句子中的结构。

  这种掌握词的上下文信息的词语表达方法就是次分布表示。由这个思想,我们需要建立一个模型去得到词向量空间。这篇博客就主要介绍一个比较简单的词分布表示方法————神经网络语言模型(NNLM)。

1、NNLM(神经网络语言模型)

  2003年Bengio等人提出了神经网络语言模型。他的基本思想是已知前面n个词的情况下预测词典中所有次成为第n+1个词的概率,并以此为目标进行训练。

  这里提到一个词典(词袋)的概念,他就是包含这篇文章中可能出现的所有词。读者可能就会想,我怎么才能得到一个词袋呢,这里的解决方法就是将你自己要训练和测试的数据中出现的所有词做成一个词典(当然也可以将一个庞大的预料库中的的所有词预先保存下来作为词典)。

  如下图所示,NNLM模型每次将n个词组合成一个向量输入到模型当中(这个非常重要),这个模型的主体部分和BP神经网络大致相当,不同的是它使用的激活函数是tanh,输出采用了softmax函数进行归一化,并且目标函数是让第n+1个词对应的概率最大。

在这里插入图片描述

NNLM模型的具体流程如下:

1、 x = [ V [ w i ] V [ v i + 1 ] ⋯ V [ v i + n − 1 ] ] x = \left[ \begin{array}{c|c|c|c} V\left[ w_{i}\right] & V\left[ v_{i+1}\right] & \cdots & V\left[ v_{i+n-1}\right] \end{array} \right] x=[V[wi]V[vi+1]V[vi+n1]]

2、 h = t a n h ( U ∗ x + b 1 ) h={tanh(U*x+b^1)} h=tanh(Ux+b1)

3、 y = W ∗ h + b 2 y=W*h+b^2 y=Wh+b2

4、 p = exp ⁡ y ∑ i = 1 n exp ⁡ y i p=\frac{\exp y}{\sum_{i=1}^n{\exp y_i}} p=i=1nexpyiexpy

其中,公式1中的V表示向量空间,V[w_i]表示词w_i在向量空间中的表示,windows表示窗口数,整个公式1表示的是将windows个词向量拼接成一个列向量;公式4中的n表示词典中词的个数;U、 b 1 b^1 b1、W和 b 2 b^2 b2都是参数,需要随机初始化, b 1 b^1 b1 b 2 b^2 b2都是向量;读者可能会疑惑,V是从哪来的,这里说明一下,V一开始是我们按照词典的规模随机生成的,后续的反向传播过程中会对V空间进行更新。

  上述流程是对于一个窗口所截取的n+1个词最为输入得到的结果。但是整个NNML模型是对所有的文本进行训练,也就是说,窗口会从第一个词汇开始,往后滚动,每一次都会有一个输出p。而且之前也说过,该模型是以预测的第Window+1个词的概率最大为目的进行训练的。为了表示方便,这里结合窗口的第一个词的序号i表示该窗口下预测下一个词为 w i + w i n d o w w_{i+window} wi+window的概率:
P ( w i ) = p w i [ w i + w i n d o w ] P(w_i)=p_{wi}\lbrack wi+window\rbrack P(wi)=pwi[wi+window]

p w i [ w i + w i n d o w ] = exp ⁡ y w i + w i n d o w ∑ i = 1 n exp ⁡ y i p_{w_i}\lbrack wi+window\rbrack=\frac{\exp y_{w_{i+window}}}{\sum_{i=1}^n{\exp y_i}} pwi[wi+window]=i=1nexpyiexpywi+window

以预测的下一个字母的概率为目标,建立误差函数如下:

e = ∑ i M log ⁡ P ( w i ) e=\sum_{i}^{M}{\log{P(w_i)}} e=iMlogP(wi)

其中,M表示所可能的窗口数。该神经网络模型优化的目标是使e的值达到最大。

2、反向传播的推导

  前向传播过程中涉及一些需要更新的参数,例如W和b等;此外,向量空间V作为变量也是需要迭代更新的。通过最大似然的方法对参数进行更新,实质上就是求各个变量的偏导,在偏导方向上进行更新,我个人感觉和GD(最小二乘)差不多。


这里介绍一下对向量和矩阵求偏导
1、一个常数对一个向量求偏导

  令 x x x为常数, Y = ( y 1 , y 2 , ⋯   , y n ) Y=\left( y_1 , y_2 , \cdots , y_n \right) Y=

要使用Python实现NNLM模型,您可以使用深度学习框架如TensorFlow或PyTorch来构建神经网络模型。下面是一个用PyTorch实现NNLM模型的简单示例: 首先,导入所需的库: ```python import torch import torch.nn as nn import torch.optim as optim ``` 定义NNLM模型类: ```python class NNLM(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_dim): super(NNLM, self).__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.hidden_layer = nn.Linear(embedding_dim, hidden_dim) self.output_layer = nn.Linear(hidden_dim, vocab_size) def forward(self, inputs): embedded = self.embedding(inputs) hidden = torch.relu(self.hidden_layer(embedded)) output = torch.softmax(self.output_layer(hidden), dim=-1) return output ``` 创建模型实例并定义相关参数: ```python vocab_size = 10000 # 词汇表大小 embedding_dim = 100 # 词向量维度 hidden_dim = 200 # 隐层维度 model = NNLM(vocab_size, embedding_dim, hidden_dim) ``` 定义损失函数和优化器: ```python criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 进行训练: ```python # 假设有训练数据train_data和对应的标签train_labels for epoch in range(num_epochs): optimizer.zero_grad() outputs = model(train_data) loss = criterion(outputs, train_labels) loss.backward() optimizer.step() ``` 以上示例是基本的NNLM模型实现,您可以根据具体任务的需求进行修改和扩展。例如,可以添加更多隐藏层、使用更复杂的激活函数、调整学习率等。 希望对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值