先放一张NNLM的模型结构图
神经网络语言模型简单来说就是用一句话的前n个词来预测最后一个词,如果n为2就是2-gram模型,依此类推。
先简单分析一下上面的模型结构,首先第一层是输入层,这一层先要将词对应的id经过一层voc_size x m形状的参数矩阵转换成对应的词向量,voc_size是词表大小,m是词向量的维度。
第二次是隐藏层,神经单元数目可以自己设置,词向量在第一次经过拼接通过一层全连接层,值通过激活函数激活输出。
最后一层是输出层,形状是voc_size * 1可以在这一次选择使用softmax函数进行激活输出。
从上面可以看出NNLM模型简单来说就是一个词表大小的分类器。
现在上另一张图
首先如上图先将词对应的id装换成one-hot编码经过C层权重层转换成对应的词向量拼接后输入模型,后面两层是全连接层。
数学公式总结
输入向量x,输出结果y的概率分布。公式解释如下:其中w代表词向量,v代表词到词嵌入的映射,LM是一个多层感知机
下面是代码实现
整个模型训练分词数据,模型,损失函数,优化器,迭代训练五个部分
import torch
import torch.nn as nn
import torch.optim as optim
sentences = ['我 喜欢 狗', '我 讨厌 牛奶', '我 做 自然语言处理', '我 看 电影']
word_list = ' '.join(sentences).split()
word_list = list(set(word_list))
word2id = {
w: i for i, w in enumera