encoder步骤:Encoder:input_sequences ----> (RNN) ----> C(Cell State)
decoder步骤:Decoder:C + 结合时刻i的target ----> (RNN) ----> 预测时刻i+1的target
重点:训练过程decoder部分的输入是target
预测过程区别:decoder的输入是上一时刻的输出
chatbot模型流程:
因为是对话,每个词是离散的,所以需要将每个词embedding后,喂给模型,得到的decoder结果一般需要连接一个全连接层(Dense)+softmax来选择输出概率最大的词作为最终结果。只要对输入输出做一个embedding处理就好,源码还用了beam_search算法来解码,也就是先选择几个概率比较大的输出,接着他们解码最后看联合概率,选择输出序列。
还有处理不定长的情况,一般策略是选出最大长度,其他padding为0。
encoder构建
1.预处理
把所有文字存到字典(非常用的用<UNKNOW>表示,并添加<GO>,<EOS>,<PAD>用作启示休止填充符),并构建文字和编号的一一映射;假设问题最多10个词,如果某句话只有8个词,需要补2个<PAD>,答案前后需要添加<GO>和<EOS>指示,假设最多20个词。
拿一个batch(32)来说,inputs的维度是(32,10),targets为(32,20)
2. encoder构建
encoder比较简单,就是一个RNN构建,最后拿出来最后一个cell state作为decoder的初始cell state就行
3. decoder构建
对于decoder,需要分训练过程和预测过程考虑,处理细节上有一定区别。
decoder构建一般需要三个函数:
helper:帮助给decoder在training和inferring不同的过程总提供输入和初始化;
这里主要是训练过程需要的TrainingHelper和预测过程的GreedyEmbeddingHelper
BasicDecoder:实现decoder的一步训练过程
dynamic_decoder:实现整个过程
1.tf.contrib.seq2seq.TrainingHelperAPI
2. tf.contrib.seq2seq.BasicDecoder
3. tf.contrib.seq2seq.dynamic_decode