最近學習相關序列模型的一點記錄

以前看了一個用rnn做詩、寫文章比較典型的例子:https://github.com/hzy46/Char-RNN-TensorFlow 其訓練過程:git

假設batchsize=2,序列長度爲5,原文章:12345642985718041937...github

輸入x:[[1 2 3 4 5],[6 4 2 9 8]],尺寸2x5 輸出y:[[2 3 4 5 1],[4 2 9 8 6]],尺寸2x5, 後一個字是前一個字的輸出,最後一個字的輸出用第一個字替換(也能夠用結束符)測試

分別one-hot表示: x:[[0100000000, 00100..., 00010..., 000010...., 000001....],[..., ..., ..., ..., ...]] ,尺寸2 x 5 x n_class y:[[00100...., 00010..., 000010...., 000001....,0100000000],[..., ..., ..., ..., ...]],尺寸2 x 5 x n_class翻譯

輸入x到RNN: x_out, x_state = RNN(x), x_out:(分別對應序列中每一個字符的輸出),尺寸:2 x 5 x h_size x_state:(序列最後狀態向量),尺寸:2 x h_sizecode

增長輸出層: logits = tf.matmul(x_out, w) + b 尺寸w:(h_size x n_class), b:(n_class) logits: 2 x 5 x n_classget

訓練損失最小: loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y) # y尺寸=logits尺寸it

測試階段: 給定一個初始字符,產生logits,通過softmax獲得n_class個機率,輸出機率最大的對應的字符,將該字符又做爲輸入產生第二個logits獲得下一個字符,持續下去,將獲得相似於訓練佯本的文章。class

注意: 上面方法只能用 x_out信息與y一一對應來訓練,而不是用x_state;而在機器翻譯encode-decode模型時用x_state來產生序列,這是一個不一樣點。方法

再舉一個匹配模型的例子:類似問題對訓練。 訓練過程:di

假設batchsize=2,序列長度最大爲5,樣例:q1:12345 q2: 64298 y:1; q1:57180 q2:41937 y:0 ; ...

輸入q1:[[1 2 3 4 5],[5 7 1 8 0]],尺寸2x5 輸入q2:[[6 4 2 9 8],[4 1 9 3 7]],尺寸2x5 輸出y:[1,0]

分別embedding表示: q1:[[[0.5 0.2 0.6...], [0.1 2.1...], [0.6...], [-1.2....], [2.0....]],[[...], [...], [...], [...], [...]]] ,尺寸2 x 5 x embedsize q2:[[[0.2 0.1 0.6...], [1.1 2.2...], [0.7...], [-0.2....], [3.0....]],[[...], [...], [...], [...], [...]]],尺寸2 x 5 x embedsize

輸入q1,q2到RNN: q1_out, q1_state = RNN(q1), q2_out, q2_state = RNN(q2), out:(分別對應序列中每一個字符的輸出),尺寸:2 x 5 x h_size state:(序列最後狀態向量),尺寸:2 x h_size

特徵選擇: 能夠是state,也能夠是out,能夠是pooling(out) 還能夠是tf.matmul(out, w) + b 最後獲得feature1,feature2 兩個向量的關係logits = f(feature1,feature2),尺寸batchsizex 1

訓練損失最小: loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits )

測試階段: 給定q1,q2,產生logits,通過sigmoid獲得類似度,來判斷是不是0或1。

相關文章
相關標籤/搜索