系列前言
参考文献:
- RNNLM - Recurrent Neural Network Language Modeling Toolkit(点此阅读)
- Recurrent neural network based language model(点此阅读)
- EXTENSIONS OF RECURRENT NEURAL NETWORK LANGUAGE MODEL(点此阅读)
- Strategies for Training Large Scale Neural Network Language Models(点此阅读)
- STATISTICAL LANGUAGE MODELS BASED ON NEURAL NETWORKS(点此阅读)
- A guide to recurrent neural networks and backpropagation(点此阅读)
- A Neural Probabilistic Language Model(点此阅读)
- Learning Long-Term Dependencies with Gradient Descent is Difficult(点此阅读)
- Can Artificial Neural Networks Learn Language Models?(点此阅读)
最近学习完系列神经网络语言模型后,最好的更为深刻的理解方式就是阅读源码,看一看究竟怎么实现的,认真的分析过源码,并且画出内部的数据结构图之后,才觉的了解的更透彻,甚至感觉自己能换一种语言重写这个开源工具。而且从阅读源码的过程中学到了很多实现技巧。当然自己的理解很多地方是比较狭隘的,可能有许多错误,而且某些地方是感觉那么回事,也没太仔细的思考,可能很多就没想清楚。而有些地方只有几行代码,却无奈的坐在那里想了一个下午╮(╯▽╰)╭,连吃饭、走路的时候也在想,我想这是快走火入魔了吧,哈哈。由于我在代码中注释很多,几乎是每行一注释,很多想仔细说的也在源码注释里面,所以内容主要以代码注释为主,外加对源码内部数据结构的图解。并且原谅我喜欢把参考内容放到最上面,养成习惯了,上面的8篇文章一开始读的话最好读第5篇,其他的内容都会在第5篇中大概的提到。另外为了懒得跑到另一篇文章去看图解,所以图解可能会反复出现在每篇文章中。
前言完毕了,第一篇本来是想直接把rnnlmlib.h直接放上来,然后介绍整个网络轮廓,大概看一下相关接口函数功能,但是那样内容发现有点长了,看上去都容易打瞌睡。于是把rnnlmlib.h分成两部分,第一篇文章介绍其中的成员变量,因为理解这些成语变量才能清楚的知道rnnlm toolkit命令参数的具体含义;第二篇介绍其中的成员函数,不涉及具体实现(那是后续文章的事儿),只是大概知道函数什么功能即可,估计第二篇内容稍短。
我先把整个网络的图放上来,然后可以对应着看,下面的图是对应源代码所抽象出来的,我会把实际论文的模型图放上来做参照对比。
下面的图是论文中的图,可以很明显的注意到实现和模型图还是有点差别,实现的时候把w(t)和s(t-1)、y(t)和c(t)合并成一个层了.
这里的图的输出层是经过分解的,为了加速。我后面的文章会介绍到和未分解的图和分解的计算。第一篇的目的就在于大概的了解真个网络的结构,宏观的看一看。下面是rnnlmlib.h文件的内容,虽然直接把成员变量切出来让类不完整,但没办法,成员函数在第二篇中介绍。
rnnlmlib.h内容如下:
///
//
// Recurrent neural network based statistical language modeling toolkit
// Version 0.4a
// (c) 2010-2012 Tomas Mikolov (tmikolov@gmail.com)
// (c) 2013 Cantab Research Ltd (info@cantabResearch.com)
//
///
//这里的作用是防止rnnlmlib.h重复被include
//如果程序第一次包含rnnlmlib.h,将会把#ifndef到文件最后一行的#endif之间的内容都执行
//如果程序不是第一次包含rnnlmlib.h,则该文件的内容会被跳过
#ifndef _RNNLMLIB_H_
#define _RNNLMLIB_H_
//最大字符串的长度
#define MAX_STRING 100
//防止WEIGHTTYPE被重复定义
#ifndef WEIGHTTYPE
//权重类型,这里可以手动更改为float
#define WEIGHTTYPE double
#endif
//real用于rnn中神经元的激活值,误差值类型
typedef WEIGHTTYPE real; // NN weights
//direct_t表示最大熵模型中输入层到输出层权值类型
typedef WEIGHTTYPE direct_t; // ME weights
//rnn中神经元结构,两部分
///
//
// Recurrent neural network based statistical language modeling toolkit
// Version 0.4a
// (c) 2010-2012 Tomas Mikolov (tmikolov@gmail.com)
// (c) 2013 Cantab Research Ltd (info@cantabResearch.com)
//
///
//这里的作用是防止rnnlmlib.h重复被include
//如果程序第一次包含rnnlmlib.h,将会把#ifndef到文件最后一行的#endif之间的内容都执行
//如果程序不是第一次包含rnnlmlib.h,则该文件的内容会被跳过
#ifndef _RNNLMLIB_H_
#define _RNNLMLIB_H_
//最大字符串的长度
#define MAX_STRING 100
//防止WEIGHTTYPE被重复定义
#ifndef WEIGHTTYPE
//权重类型,这里可以手动更改为float
#define WEIGHTTYPE double
#endif
//real用于rnn中神经元的激活值,误差值类型
typedef WEIGHTTYPE real; // NN weights
//direct_t表示最大熵模型中输入层到输出层权值类型
typedef WEIGHTTYPE direct_t; // ME weights
//rnn中神经元结构,两部分