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,有時候真的不是模型復雜最后結果好的;總結一句就是數據簡單就上簡單模型,數據復雜就試試增大模型體量,增加層數和參數數量;