(点击放大图像)
softmax_w = tf.get_variable("softmax_w", [size, vocab_size], dtype=data_type()) softmax_b = tf.get_variable("softmax_b", [vocab_size], dtype=data_type()) logits = tf.matmul(output, softmax_w) + softmax_b Loss值 loss = tf.contrib.legacy_seq2seq.sequence_loss_by_example([logits], [tf.reshape(input_.targets, [-1])], [tf.ones([batch_size * num_steps], dtype=data_type())]) 定义梯度及优化操作 cost = tf.reduce_sum(loss) / batch_size tvars = tf.trainable_variables() grads, _ = tf.clip_by_global_norm(tf.gradients(cost, tvars), config.max_grad_norm) optimizer = tf.train.GradientDescentOptimizer(self._lr) 单词困惑度eloss perplexity = np.exp(costs / iters) TensorFlow语言翻译模型本节主要讲解使用TensorFlow实现RNN、LSTM的语言翻译模型。基础的sequence-to-sequence模型主要包含两个RNN网络,一个RNN网络用于编码Sequence的输入,另一个RNN网络用于产生Sequence的输出。基础架构如下图所示
(点击放大图像)
上图中的每个方框表示RNN中的一个Cell。在上图的模型中,每个输入会被编码成固定长度的状态向量,然后传递给解码器。2014年,Bahdanau在论文“Neural Machine Translation by Jointly Learning to Align and Translate”中引入了Attention机制。Attention机制允许解码器在每一步输出时参与到原文的不同部分,让模型根据输入的句子以及已经产生的内容来影响翻译结果。一个加入attention机制的多层LSTM sequence-to-sequence网络结构如下图所示:
(点击放大图像)
针对上述sequence-to-sequence模型,TensorFlow封装成了可以直接调用的函数API,只需要几百行的代码就能实现一个初级的翻译模型。tf.nn.seq2seq文件共实现了5个seq2seq函数:
basic_rnn_seq2seq:输入和输出都是embedding的形式;encoder和decoder用相同的RNN cell,但不共享权值参数;
tied_rnn_seq2seq:同basic_rnn_seq2seq,但encoder和decoder共享权值参数;
embedding_rnn_seq2seq:同basic_rnn_seq2seq,但输入和输出改为id的形式,函数会在内部创建分别用于encoder和decoder的embedding矩阵;
embedding_tied_rnn_seq2seq:同tied_rnn_seq2seq,但输入和输出改为id形式,函数会在内部创建分别用于encoder和decoder的embedding矩阵;
embedding_attention_seq2seq:同embedding_rnn_seq2seq,但多了attention机制;
embedding_rnn_seq2seq函数接口使用说明如下:
encoder_inputs:encoder的输入
decoder_inputs:decoder的输入
cell:RNN_Cell的实例
num_encoder_symbols,num_decoder_symbols:分别是编码和解码的大小
embedding_size:词向量的维度
output_projection:decoder的output向量投影到词表空间时,用到的投影矩阵和偏置项