rnnlm源码分析(一)

本文主要探讨RNNLM(循环神经网络语言模型)的基础知识,并提供了多个相关资源链接,包括RNNLM的工具包介绍、训练策略、神经网络语言模型的扩展以及长期依赖学习的挑战等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列前言
参考文献:
  1. RNNLM - Recurrent Neural Network  Language Modeling Toolkit(点此阅读)
  2. Recurrent neural network based language model(点此阅读)
  3. EXTENSIONS OF RECURRENT NEURAL NETWORK LANGUAGE MODEL(点此阅读)
  4. Strategies for Training Large Scale Neural Network  Language Models(点此阅读)
  5. STATISTICAL LANGUAGE MODELS BASED ON NEURAL  NETWORKS(点此阅读)
  6. A guide to recurrent neural networks and backpropagation(点此阅读)
  7. A Neural Probabilistic Language Model(点此阅读)
  8. Learning Long-Term Dependencies with Gradient Descent is Difficult(点此阅读)
  9. 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中神经元结构,两部分   
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值