一、模型原理概述
此处先插一个对我这种长期纠结于【各种向量矩阵维数到底是多少】(就是坚持不懈地要弄清俩矩阵到底能不能乘)的人来说在理解模型细节方面有巨大帮助的链接:理解nnlm.
word embedding提出后nlp的发展发生了质的飞跃。nnlm即一种基于n-gram文法、词向量表示和DNN结构的语言模型,该模型对语料库中每个单词在当前输入序列的情况下作为下一个单词出现的概率进行预测。n-gram文法、词向量表示和DNN结构不再赘述。
二、模型结构详解
模型的总体结构如下所示。
变量声明:
win_size: 输入序列的单词个数
vocab_size: 词表的大小
hidden_num: 隐藏层的神经元个数
word_dim: 稠密词向量的维度
nnlm用到的神经网络结构是蛮简单的一个结构,隐藏层的层数也不多,主要分为输入层、隐藏层、输出层三个部分。下面对每个部分涉及到的输入输出、参数和一些需要提到的点进行分别说明。
1. 输入层
输入:输入序列的one-hot向量,即win_size个1*vocab_size大小的向量
由于vocabulary通常是一个很大很大的分词库,因此每个单词对应的one-hot向量都非常非常稀疏,对模型的训练开销和参数精度调整都会有较大的影响,不利于后续的模型训练。所以这里设置了一个[vocab_size, word_dim]大小的look-up表,这个表的具体作用即:将原始输入的高维稀疏one-hot向量转化为[1,word_dim]大小的低维稠密向量,以便于进行后续的模型训练。然后将这win_size个[1,word_dim]大小的词向量拼接为一个向量,构成一个word_dim*win_size大小的一维向量,作为输入层的输出向量。
输出:word_dim*win_size大小的一维向量
2. 隐藏层
输入:word_dim×win_size大小的一维向量
激活函数:
其中X即word_dim*win_size大小的一维向量。H为隐藏层的权重矩阵,大小为[word_dim×win_size, hidden_num]. b1为隐藏层的bias,是维度为hidden_num的一维向量。XH+b1后经过tanh激活函数,输出为大小为[1,hidden_num]的向量。
输出:[1,hidden_num]的向量
3. 输出层
输入:[1,hidden_num]的向量
激活函数:
输出层首先对隐藏层的输出计算y(wi),然后通过softmax函数计算语料库中各词在当前输入序列的情况下作为下个单词出现的概率,概率最大的词向量所对应的词即模型预测到的当前输入序列下最有可能出现的单词。
三、训练实战
大部分是大作业给定的架构代码,需要自己完成的部分很少。放在github上,上交作业之后会设为公开。nlp_nnlm模型的实现(含中英文训练文本及训练后的词向量结果)