rwthlm源码分析(六)之输入层以及训练框架

这篇介绍rwthlm输入层的结构,以及整个网络训练的框架。对于rwthlm的rnn结构部分在隐层我觉的还是比较常见的实现方式了,如果在训练rwthlm时指定了用rnn来训练,那么输入层的结构也会带有循环部分,关于这一点,在代码中我会说明。仍然是如果有任何错误,欢迎看到的朋友指出,再次谢过~

输入层的实现在tablelookup.cc里面,在第一次看这个包时,看文件名大概就知道哪些文件属于神经网络的哪些部分了,比如lstm.cc, output.cc,找了很久没找到输入层,后面才知道输入层就是这个tablelookup, 至于为啥叫tablelookup, 我想应该是输入层的word作为输入时需要对应的映射实数向量,而这个映射的实数向量在一个矩阵里面,就相当于查表一样。这里的实现方式和Bengio在其03年那篇文章里面是一致的,输入的编码并未使用1-of-V的方式。先看一下头文件的一些变量吧:

<span style="font-family:Microsoft YaHei;">  //is_feedforward这个含义在后面具体解释,其值不同就是训练算法的不同
  const bool is_feedforward_;
  
  //order_指定训练的历史数,这里并不是语言模型的阶数,而是语言模型的阶数减1
  //word_dimension_是指一个word映射为实数向量的维度
  const size_t order_, word_dimension_;
  //histories_存放着网络的输入信息
  std::vector<std::vector<int>> histories_;
  Real *b_, *b_t_, *delta_, *delta_t_, *weights_, *bias_;
  //输入层的循环结构部分
  RecurrencyPointer recurrency_; </span>

先解析一下容器histories_是如何作为网络的输入的,histories_容器的更新实现代码如下:

<span style="font-family:Microsoft YaHei;">void TableLookup::UpdateHistories(const size_t size, const Real x[]) {
 // std::cout << "This is UpdateHistories\n";
  if (histories_.empty()) {
    for (size_t i = 0; i < size; ++i)
      //std::vector<int>(order_, static_cast<int>(x[i]))
      //的含义是构造order_个值为x[i]的元素,放入容器
      histories_.push_back(std::vector<int>(order_, static_cast<int>(x[i])));
  //  std::cout << "push into empty:\n";
  //  PrintHistories();
  } else {
    for (size_t i = 0; i < size; ++i) {
      std::vector<int> &history(histories_[i]);
      //新来的数加入到第一个位置上
      history.insert(history.begin(), static_cast<int>(x[i]));
      //删除最后一个元素
      history.pop_back();
    }
 //   PrintHistories();
  }
}</span>

先不看其他实现部分,举一个例子,看下histories_的工作方式,这样在看下面的代码时就能非常快的明白了。比如现在需要处理的batch是下面这样的:



实际上在data容器中是不会直接存储字符串的,而是字符串对应的索引,如下:



那么假设现在整个网络运作起来了,它的输入历史数假设是3,根据上面histories_更新的实现代码,知道初始化的内容为<sb>。

第一次更新histories_:

3     3     3

3     3     3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值