本文来自CSDN博客,转载请注明出处:http://blog.csdn.net/a635661820/article/details/44730507
参考文献: A Neural Probabilistic Language Model
参照我另一篇
NNLM学习介绍的博客, 这一篇是对NNLM的简要实现, 自己简化了一些,输入层到输出层没有连接(加上直连边的真在原论文中没有明显的提高),并且没有并行算法。下面贴上自己的一些核心代码。总体来说,我用了c++面向对象来设计该算法,大概分为6个类,如下:
- CLex类:用来处理文本的一个类
- CInput类:输入层类, 包含相关量
- CHidden类:隐层类,包含相关量
- COutput类:输出层类,包含相关变量
- CAlgothrim类:算法类,涉及前向算法以及反向更新算法,将前面3个类串起来
- CForeCast类:测试类,训练好模型后对模型进行测试的相关操作
关于网络中的各个手动设定的参数在macroDefinition.h,包括隐层神经元个数、特征向量维度等。这里的附带的代码只贴出了核心相关代码,即CInput, CHidden, COutput, CAlgothrim的核心代码
网络手动设定的参数在macroDefinition.h里面,定义为宏,初始设置是按照论文中设置的:
//以下是各个变量的宏定义,留做接口,方便调试
#define M 100 //一个单词对应的向量的维度数为M
#define N 3 //输入层的单词个数,第N+1个是预测单词
#define HN 60 //Hidden Number隐层神经元的个数
#define EPSILON 0.001 //神经网络的学习率
#define CONVERGE_THRESHOLD -4 //手动设定的累加对数概率收敛值
#define FOREWORD_NUM 5 //模型预测时的输出概率最高的前5个词语
#define M 100 //一个单词对应的向量的维度数为M
#define N 3 //输入层的单词个数,第N+1个是预测单词
#define HN 60 //Hidden Number隐层神经元的个数
#define EPSILON 0.001 //神经网络的学习率
#define CONVERGE_THRESHOLD -4 //手动设定的累加对数概率收敛值
#define FOREWORD_NUM 5 //模型预测时的输出概率最高的前5个词语
在Input.h文件里面,类的结构:
//输入层的结构定义
class CInput
{
public :
bool LoadCorpusfile( char *corpusfile); //将语料库文件读入
bool Computex( int k); //计算一个句子输入单词的x向量
string GetWordByID(unsigned long id); //根据ID返回单词
unsigned long GetIDByWord(string word); //根据单词返回其ID
bool NextSentence( int i); //从语料库文件中读入下一个句子
CInput(); //生成词典、二维矩阵
virtual ~CInput(); //释放单词映射矩阵,释放词典
class CInput
{
public :
bool LoadCorpusfile( char *corpusfile); //将语料库文件读入
bool Computex( int k); //计算一个句子输入单词的x向量
string GetWordByID(unsigned long id); //根据ID返回单词
unsigned long GetIDByWord(string word); //根据单词返回其ID
bool NextSentence( int i); //从语料库文件中读入下一个句子
CInput(); //生成词典、二维矩阵
virtual ~CInput(); //释放单词映射矩阵,释放词典