神经网络建模的一些感悟;

2016/10/6
1: 用自定义的weighted loss来看, 10000个batch仍然没有收敛;
2:仍然使用sigmoid cross entropy loss, 7 epoches 左右仍然收敛,对于7w数据;
3:改动loss, 避免nan loss的出现;
 
2016/12/6
1: 用lstm做classfication, 思路是将问题和答案各自转换成一个1000维向量,softmax作为1000个主题的概率,然后算点积和,最大化点积和的情况是两个属于同一个主题的概率最大;failed.
2: 用weighted lstm,思想是不用lstm的最终向量,而是用每个词的output向量,根据单词的weight来做加权平均作为最终的向量; failed. 
     结果证明同时训练单词的weight和用weighted average lstm中间向量,结果还不如直接用lstm的最终output;
     NAN loss极有可能是分母为0所导致的;
 
2017/1/12 
1: 用normalize的方法将word embedding正规化,
     一般而言,tf提供了两种主流的方法,一种是L2的方法,就是将每个维度的数平方加起来等于1, 一种是local normalize的方法,分别搜索tf.nn.l2_normalize 和tf.nn.local_response_normalization。
     另外,tf提供了很多的算矩的方法,可以根据矩(均值和方差)来做normalize,见tf.nn.moments
 
2: 对于lstm output用cnn的思考
     2.1:lstm output的话,对于一个句子,output的向量维度是[batch size, sentence length, rnn dimension, 2]
     (最后的一个2是因为采用的是bi-directional rnn,所以有两个值),
      所用的convolution方法是在sentence length的维度上取三个单词,在rnn dimension上取所有的长度,然后取256个channels,
     这样输出的向量就是[batch size, sentence length, 1, 256]. 然后relu处理(对所有的点取max(x, 0)),最后在sentence length的维度上maxpool;
     2.2 : 这里主要有几个问题
          1: sentence length取得是150, 但是其中包含了大量的填充,可能真实句子就只有15个词汇,剩下135全是填充词汇;
          2: rnn dimension上的不同维度代表不同的相对意义,但是线性的结合起来是否不合理?
 
3: 因为实际的训练数据可能存在一定的bad case;因此每次训练一个batch,抛出top 5%最高的的loss;
 
2017/1/23
 经过两天的训练,发现lstm_cnn模型最后收敛到了0.693147,这个数值代表所有的预测概率值都是0.5,有时候真的不是模型复杂最后结果好的;总结一句就是数据简单就上简单模型,数据复杂就试试增大模型体量,增加层数和参数数量;
 
 
posted @ 2017-03-16 20:33  LarryGates  阅读(2053)  评论(0编辑  收藏  举报