系列前言
参考文献:
  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?(点此阅读)
上一篇是介绍成员变量的大概含义,这一篇是介绍一些成员函数的功能,仍然是大体了解一下个别函数的功能,在第三篇才正式写实现分析。这一篇稍短,里面大部分是代码,因为很多涉及变量相关的在上一篇注释过了,所以这篇就没注释那么详细。如下:


 //构造函数,这里进行很多变量的初始化    
CRnnLM()        //constructor initializes variables    
{    
    //这里的很多变量在前面都前一篇都有详细的介绍  
    //这里的初始值只要初始是为非0的可以留意一下  
    version=10;    
    filetype=TEXT;    
        
    use_lmprob=0;    
    lambda=0.75;    
    gradient_cutoff=15;    
    dynamic=0;    
        
    train_file[0]=0;    
    valid_file[0]=0;    
    test_file[0]=0;    
    rnnlm_file[0]=0;    
        
    alpha_set=0;    
    train_file_set=0;    
        
    alpha=0.1;    
    beta=0.0000001;    
    //beta=0.00000;    
    alpha_divide=0;    
    logp=0;    
    llogp=-100000000;    
    iter=0;    
        
    min_improvement=1.003;    
        
    train_words=0;    
    train_cur_pos=0;    
    vocab_max_size=100;    
    vocab_size=0;    
        
    vocab=(struct vocab_word *)calloc(vocab_max_size, sizeof(struct vocab_word));    
        
    layer1_size=30;    
        
    direct_size=0;    
    direct_order=0;    
        
    bptt=0;    
    bptt_block=10;    
    bptt_history=NULL;    
    bptt_hidden=NULL;    
    bptt_syn0=NULL;    
        
    gen=0;    
        
    independent=0;    
        
    neu0=NULL;    
    neu1=NULL;    
    neuc=NULL;    
    neu2=NULL;    
        
    syn0=NULL;    
    syn1=NULL;    
    sync=NULL;    
    syn_d=NULL;    
    syn_db=NULL;    
    //backup    
    neu0b=NULL;    
    neu1b=NULL;    
    neucb=NULL;    
    neu2b=NULL;    
        
    neu1b2=NULL;    
        
    syn0b=NULL;    
    syn1b=NULL;    
    syncb=NULL;    
    //    
        
    rand_seed=1;    
        
    class_size=100;    
    old_classes=0;    
        
    one_iter=0;    
    maxIter=0;    
        
    debug_mode=1;    
    srand(rand_seed);    
        
    //word映射为哈希的值小于100000000    
    vocab_hash_size=100000000;          
        
    //动态分配内存,calloc会自动将申请的内存初始化为0,但这里奇怪申请这么大空间,这里没对vocab_hash做检查    
    vocab_hash=(int *)calloc(vocab_hash_size, sizeof(int));    
}    
    
//析构函数,释放申请的空间    
~CRnnLM()       //destructor, deallocates memory    
{    
    int i;    
        
    if (neu0!=NULL) {    
        free(neu0);    
        free(neu1);    
        if (neuc!=NULL) free(neuc);    
        free(neu2);    
            
        free(syn0);    
        free(syn1);    
        if (sync!=NULL) free(sync);    
            
        if (syn_d!=NULL) free(syn_d);    
            
        if (syn_db!=NULL) free(syn_db);    
            
        //    
        free(neu0b);    
        free(neu1b);    
        if (neucb!=NULL) free(neucb);    
        free(neu2b);    
            
        free(neu1b2);    
            
        free(syn0b);    
        free(syn1b);    
        if (syncb!=NULL) free(syncb);    
        //    
            
        for (i=0; i<class_size; i++) free(class_words[i]);    
        free(class_max_cn);    
        free(class_cn);    
        free(class_words);    
            
        free(vocab);    
        free(vocab_hash);    
            
        if (bptt_history!=NULL) free(bptt_history);    
        if (bptt_hidden!=NULL) free(bptt_hidden);    
        if (bptt_syn0!=NULL) free(bptt_syn0);    
            
        //todo: free bptt variables too    
    }    
}                      
    
//返回值类型为real且范围在[min, max]的数    
real random(real min, real max);    
    
//设置训练数据的文件名    
void setTrainFile(char *str);    
    
//设置验证数据集的文件名    
void setValidFile(char *str);    
    
//设置测试集的文件名    
void setTestFile(char *str);    
    
//设置模型保存文件,即该文件用来存储模型的信息,以及各类参数    
void setRnnLMFile(char *str);    
    
    
//下面的函数没写注释,{}里面有语句,变量的含义可以看前篇    
//就不再一一注释了,这些参数都是从main主函数里面传来的,具体来说  
//这些参数就是来自shell命令里面的,这里可以看看我的一篇rnnlm toolkit命令参数介绍          
void setLMProbFile(char *str) {strcpy(lmprob_file, str);}    
    
void setFileType(int newt) {filetype=newt;}    
    
void setClassSize(int newSize) {class_size=newSize;}    
void setOldClasses(int newVal) {old_classes=newVal;}    
void setLambda(real newLambda) {lambda=newLambda;}    
void setGradientCutoff(real newGradient) {gradient_cutoff=newGradient;}    
void setDynamic(real newD) {dynamic=newD;}    
void setGen(real newGen) {gen=newGen;}    
void setIndependent(int newVal) {independent=newVal;}    
    
void setLearningRate(real newAlpha) {alpha=newAlpha;}    
void setRegularization(real newBeta) {beta=newBeta;}    
void setMinImprovement(real newMinImprovement) {min_improvement=newMinImprovement;}    
void setHiddenLayerSize(int newsize) {layer1_size=newsize;}    
void setCompressionLayerSize(int newsize) {layerc_size=newsize;}    
void setDirectSize(long long newsize) {direct_size=newsize;}    
void setDirectOrder(int newsize) {direct_order=newsize;}    
void setBPTT(int newval) {bptt=newval;}    
void setBPTTBlock(int newval) {bptt_block=newval;}    
void setRandSeed(int newSeed) {rand_seed=newSeed; srand(rand_seed);}    
void setDebugMode(int newDebug) {debug_mode=newDebug;}    
void setAntiKasparek(int newAnti) {anti_k=newAnti;}    
void setOneIter(int newOneIter) {one_iter=newOneIter;}    
void setMaxIter(int newMaxIter) {maxIter=newMaxIter;}    
    
//返回单词的哈希值    
int getWordHash(char *word);    
    
//从文件中读取一个单词到word    
void readWord(char *word, FILE *fin);    
    
//查找word,找到返回word在vocab中的索引,没找到返回-1    
int searchVocab(char *word);    
    
//读取当前文件指针所指的单词,并返回该单词在vocab中的索引    
int readWordIndex(FILE *fin);    
    
//将word添加到vocab中,并且返回刚添加word在vocab中的索引    
int addWordToVocab(char *word);    
    
//从train_file中读数据,相关数据会装入vocab,vocab_hash    
//这里假设vocab是空的    
void learnVocabFromTrainFile();     //train_file will be used to construct vocabulary    
    
//保存当前的权值,以及神经元信息值    
void saveWeights();         //saves current weights and unit activations    
    
//上面是暂存当前权值及神经元值,这里是从前面存下的数据中恢复    
void restoreWeights();      //restores current weights and unit activations from backup copy    
//void saveWeights2();      //allows 2. copy to be stored, useful for dynamic rescoring of nbest lists    
//void restoreWeights2();           
    
//保存隐层神经元的ac值    
void saveContext();    
    
//恢复隐层神经元的ac值    
void restoreContext();    
    
//保存隐层神经元的ac值    
void saveContext2();    
    
//恢复隐层神经元的ac值    
void restoreContext2();    
    
//初始化网络    
void initNet();    
    
//保存网络的所有信息到rnnlm_file    
void saveNet();    
    
//从文件流中读取一个字符使其ascii等于delim    
//随后文件指针指向delim的下一个    
void goToDelimiter(int delim, FILE *fi);    
    
//从rnnlm_file中读取网络的所有信息    
void restoreNet();    
    
//清除神经元的ac,er值    
void netFlush();    
    
//隐层神经元(论文中的状态层s(t))的ac值置1    
//s(t-1),即输入层layer1_size那部分的ac值置1    
//bptt+history清0    
void netReset();    //will erase just hidden layer state + bptt history + maxent history (called at end of sentences in the independent mode)    
    
//网络前向,计算概率分布    
void computeNet(int last_word, int word);    
    
//反传误差,更新网络权值    
void learnNet(int last_word, int word);    
    
将隐层神经元的ac值复制到输出层后layer1_size那部分    
void copyHiddenLayerToInput();    
    
//训练网络    
void trainNet();    
void useLMProb(int use) {use_lmprob=use;}    
    
//测试网络    
void testNet();    
    
//这两个我还没看~    
void testNbest();    
void testGen();    
    
//矩阵和向量相乘  
//1.type == 0时,计算的是神经元ac值,相当于计算srcmatrix × srcvec, 其中srcmatrix是(to-from)×(to2-from2)的矩阵 
//srcvec是(to2-from2)×1的列向量,得到的结果是(to-from)×1的列向量,该列向量的值存入dest中的ac值  
//2.type == 1, 计算神经元的er值,即(srcmatrix)^T × srcvec,T表示转置,转置后是(to2-from2)×(to-from),srcvec是(to-from)×1的列向量    
  
void matrixXvector(struct neuron *dest, struct neuron *srcvec, struct synapse *srcmatrix, int matrix_width, int from, int to, int from2, int to2, int type);

  

rnnlm源码分析(二)相关推荐

  1. rnnlm源码分析 二

    系列前言 参考文献: RNNLM - Recurrent Neural Network  Language Modeling Toolkit(点此阅读) Recurrent neural networ ...

  2. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  3. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  4. gSOAP 源码分析(二)

    gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...

  5. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

  6. 【投屏】Scrcpy源码分析二(Client篇-连接阶段)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  7. Nouveau源码分析(二):Nouveau结构体的基本框架

    Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...

  8. ENS最新合约源码分析二

    ENS(以太坊域名服务)智能合约源码分析二 0.简介 ​ 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...

  9. 【转】ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数必然已完成了执行 ...

最新文章

  1. 经验 | OpenCV图像旋转的原理与技巧
  2. centos设置java环境变量,CentOS设置环境变量
  3. Oracle的sql 函数
  4. Salesforce平台入门
  5. BloomFilter–大规模数据处理利器(转)
  6. IsPostBack原理
  7. gitblit无法安装windows服务或者启动服务失败:Failed creating java
  8. centos7安装nvidia驱动
  9. windows 卸载IE8还原IE7的方法
  10. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化
  11. SQL 必知必会·笔记14更新和删除数据
  12. python中的json结构_python数据挖掘_Json结构分析
  13. 历史上的今天:Vue 首次发布;搜狐成立;首个构思集成电路的人出生
  14. linux下看io等待时间,Linux下用iostat探测IO使用情况
  15. 各位学Python的要小心了!!!
  16. CentOS6 图形界面(gnome)安装(转)
  17. ASP.NET中防止刷新页面造成表单重复提交
  18. 手持式自动锁螺丝机怎么操作使用
  19. Oracle 同义词详解(synonym)
  20. 信息与计算机科学讲座,【创新创业 计科在行动】2015级信息与计算科学专业大学生创新讲座、专业教育讲座暨学术前沿讲座专题报道...

热门文章

  1. c语言逐行扫描打印图案,用逐行扫描法读取4X4键盘矩阵,不能扫描出第一列按键?...
  2. 西安交通大学计算机组成原理第三章,西安交通大学计算机组成原理专题实验(上)第三次实验报告.pdf...
  3. JavaSE——数字格式化、产生随机数字、生成验证码
  4. linux shell 命令之 uname
  5. 数学在计算机密码学中的运用,数学在密码学中的应用浅析
  6. Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View
  7. 六月情报!六月情报!IAC的终结,反波胆的没落,龙抬头的套路
  8. softlayer iso_从Go编程语言获取SoftLayer API的命令
  9. 理想的下午,西湖边群山傍侃侃谈书 ——启真读书会活动纪要
  10. seo网站优化,网站SEO优化方案