seq2seq
1 | ''' |
seq2seq
1 | ''' |
encoder + decoder
training model + inference model
tf.train.AdamOptimizer()
1 | # ---------- 定义OP---------- |
1 | input1 = tf.placeholder(tf.float32) |
1 | # prediction为之前基于x(placeholder),已定义的预测输出 |
1 |
|
1 | keep_prob = tf.placeholder(tf.float32) |
随机初始化
tf.Variable(tf.truncated_normal(shape, stddev=0.1))
tf.Variable(tf.zeros(shape) + 0.1)
note:好的初始化系数、优化器等设置,可以在迭代次数一定的情形下,更好的逼近最优解,从而提升模型性能
1 | correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1)) # tf.argmax返回最大值下标 |
1 | with tf.name_scope('input'): |
tensorboard --logdir=dir
模型保存1
2
3saver = tf.train.Saver()
# ...
saver.save(sess, 'file_path/file_name')
模型读取1
2
3saver = tf.train.Saver()
# ...
saver.restore(sess, 'file_path/file_name')
word2vec: skip gram
构造一个预测(或者映射)模型,输入一个词context(one-hot),预测对应到另一个词target(one-hot)
目标是通过训练这个映射关系,学习到embedding matrix $E = [e_{1}, e_{2}, e_{3}, …]$
词汇表较大时,skip gram中的softmax,分母求和,会有计算的大的问题
negative sampling
构造一个预测(或者映射)模型,输入一个词context(one-hot),预测对于一个词target是否存在对应(每个target一个二分类问题)
encoder(序列迭代输入) + decoder(迭代输出序列)
翻译模型,选择最可能的句子
考虑输入$x$由encoder进行encoding,给入decoder
第一迭代,输出的$\hat{y}^{\langle 1 \rangle}$;第二迭代,输出的$\hat{y}^{\langle 2 \rangle}$…
为了得到全局最佳的句子输出,优化是不应将$\hat{y}^{\langle 1 \rangle}$、$\hat{y}^{\langle 2 \rangle}$、…分开单独考虑,而应该全局考虑。即优化使得given $x$,能得到最优句子$P(\hat{y}^{\langle 1 \rangle},\hat{y}^{\langle 2 \rangle},…|x)$
为此,使用beam search做最优化的选择,流程如下:
beam search的目标函数
为避免各个P过小,造成误差和无法表示(过小溢出),对P取log
但上述目标函数倾向于使用更短的输出句子,对此使用length normalization($\alpha$为超参数)
误差分析:RNN还是beam search有问题
对于同一输入句子,输出:
human-level:$y^{h}$
model:$\hat{y}$
将$y^{h}$依次输入decoder,能够最终计算出$P(y^{h}|x)$
(若使用了length normalization,则对比length normalization之后的P)
汇总所有labeled data的对比结果,看看RNN还是beam search有问题
若RNN有问题,则进一步bias variance分析;若beam search有问题,考虑增大$B$
对于seq2seq模型,
encoder由$a^{\langle 0 \rangle} = 0$初始化,每次用$a^{\langle t’-1 \rangle}$、$x^{\langle t’ \rangle}$计算$a^{\langle t’ \rangle}$,最终将$a^{\langle T_{x} \rangle}$传给decoder
decoder由$a^{\langle T_{x} \rangle}$初始化,每次用$a^{\langle t-1 \rangle}$、$\hat{y}^{\langle t-1 \rangle}$计算$\hat{y}^{\langle t \rangle}$
当输入序列过长时,decoder性能下降(记不住这么长的输入)
attention模型试图在decoder生成$\hat{y}^{\langle t \rangle}$时,引入encoder不同$t’$的$a^{\langle t’ \rangle}$的考量
具体来讲,使用$s^{\langle t \rangle}$表示decoder的输出,以区分encoder的activation
$s^{\langle t \rangle}$的计算,除了输入$s^{\langle t-1 \rangle}$、$\hat{y}^{\langle t-1 \rangle}$,还增加了一个context $c^{\langle t \rangle} = \sum_{t’} \alpha^{\langle t, t’ \rangle} a^{\langle t’ \rangle}$,即对key各项的加权求和,并且这组权重对于不同的query($s^{\langle t - 1 \rangle}$)是不同的