Blame view
src/lm/mikolov-rnnlm-lib.h
7.44 KB
8dcb6dfcb first commit |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |
// lm/mikolov-rnnlm-lib.h // Copyright 2015 Guoguo Chen Hainan Xu // 2010-2012 Tomas Mikolov // See ../../COPYING for clarification regarding multiple authors // // This file is based on version 0.3e of the RNNLM language modeling // toolkit by Tomas Mikolov. Changes made by authors other than // Tomas Mikolov are licensed under the Apache License, the short form // os which is below. The original code by Tomas Mikolov is licensed // under the BSD 3-clause license, whose text is further below. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED // WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, // MERCHANTABLITY OR NON-INFRINGEMENT. // See the Apache 2 License for the specific language governing permissions and // limitations under the License. // // // Original BSD 3-clause license text: // Copyright (c) 2010-2012 Tomas Mikolov // // All rights reserved. Redistribution and use in source and binary forms, with // or without modification, are permitted provided that the following conditions // are met: 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following // disclaimer. 2. Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. 3. Neither name of copyright holders nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. THIS SOFTWARE IS PROVIDED // BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef KALDI_LM_MIKOLOV_RNNLM_LIB_H_ #define KALDI_LM_MIKOLOV_RNNLM_LIB_H_ #include <string> #include <vector> #include "util/stl-utils.h" namespace rnnlm { #define MAX_STRING 100 #define MAX_FILENAME_STRING 300 typedef double real; // doubles for NN weights typedef double direct_t; // doubles for ME weights; struct neuron { real ac; // actual value stored in neuron real er; // error value in neuron, used by learning algorithm }; struct synapse { real weight; // weight of synapse }; struct vocab_word { int cn; char word[MAX_STRING]; real prob; int class_index; }; const unsigned int PRIMES[] = {108641969, 116049371, 125925907, 133333309, 145678979, 175308587, 197530793, 234567803, 251851741, 264197411, 330864029, 399999781, 407407183, 459258997, 479012069, 545678687, 560493491, 607407037, 629629243, 656789717, 716048933, 718518067, 725925469, 733332871, 753085943, 755555077, 782715551, 790122953, 812345159, 814814293, 893826581, 923456189, 940740127, 953085797, 985184539, 990122807}; const unsigned int PRIMES_SIZE = sizeof(PRIMES) / sizeof(PRIMES[0]); const int MAX_NGRAM_ORDER = 20; enum FileTypeEnum {TEXT, BINARY, COMPRESSED}; // COMPRESSED not yet implemented class CRnnLM { protected: char train_file[MAX_FILENAME_STRING]; char valid_file[MAX_FILENAME_STRING]; char test_file[MAX_FILENAME_STRING]; char rnnlm_file[MAX_FILENAME_STRING]; char lmprob_file[MAX_FILENAME_STRING]; int rand_seed; int version; int filetype; int use_lmprob; real gradient_cutoff; real dynamic; real alpha; real starting_alpha; int alpha_divide; double logp, llogp; float min_improvement; int iter; int vocab_max_size; int vocab_size; int train_words; int train_cur_pos; int counter; int anti_k; real beta; int class_size; int **class_words; int *class_cn; int *class_max_cn; int old_classes; struct vocab_word *vocab; void sortVocab(); int *vocab_hash; int vocab_hash_size; int layer0_size; int layer1_size; int layerc_size; int layer2_size; long long direct_size; int direct_order; int history[MAX_NGRAM_ORDER]; int bptt; int bptt_block; int *bptt_history; neuron *bptt_hidden; struct synapse *bptt_syn0; int gen; int independent; struct neuron *neu0; // neurons in input layer struct neuron *neu1; // neurons in hidden layer struct neuron *neuc; // neurons in hidden layer struct neuron *neu2; // neurons in output layer struct synapse *syn0; // weights between input and hidden layer struct synapse *syn1; // weights between hidden and output layer // (or hidden and compression if compression>0) struct synapse *sync; // weights between hidden and compression layer direct_t *syn_d; // direct parameters between input and output layer // (similar to Maximum Entropy model parameters) // backup used in training: struct neuron *neu0b; struct neuron *neu1b; struct neuron *neucb; struct neuron *neu2b; struct synapse *syn0b; struct synapse *syn1b; struct synapse *syncb; direct_t *syn_db; // backup used in n-bset rescoring: struct neuron *neu1b2; unordered_map<std::string, float> unk_penalty; std::string unk_sym; public: int alpha_set, train_file_set; CRnnLM(); ~CRnnLM(); real random(real min, real max); void setRnnLMFile(const std::string &str); int getHiddenLayerSize() const { return layer1_size; } void setRandSeed(int newSeed); int getWordHash(const char *word); void readWord(char *word, FILE *fin); int searchVocab(const char *word); void saveWeights(); // saves current weights and unit activations void initNet(); void goToDelimiter(int delim, FILE *fi); void restoreNet(); 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 copyHiddenLayerToInput(); void matrixXvector(struct neuron *dest, struct neuron *srcvec, struct synapse *srcmatrix, int matrix_width, int from, int to, int from2, int to2, int type); void restoreContextFromVector(const std::vector<float> &context_in); void saveContextToVector(std::vector<float> *context_out); float computeConditionalLogprob( std::string current_word, const std::vector<std::string> &history_words, const std::vector<float> &context_in, std::vector<float> *context_out); void setUnkSym(const std::string &unk); void setUnkPenalty(const std::string &filename); float getUnkPenalty(const std::string &word); bool isUnk(const std::string &word); }; } // namespace rnnlm #endif // KALDI_LM_MIKOLOV_RNNLM_LIB_H_ |