检索模型所使用的回复数据通常是预先存储且事先定义的数据,而不像生成式模型那样可以创造出未知的回复内容。准确来说,检索式模型的输入是一段上下文内容,和一个可能作为回复的候选答案,模型的输出是对这个候选答案的打分。寻找最合适的回复内容的过程是:先对一堆候选答案进行打分及排序,最后选出分值最高的那个作为最终回复。
直觉来说,一对问答对如果query和response中语义上相近的词越多,那query和response越可能是一对正确的问答对。这样的假设确实有一定的道理,但事实上query和response并不一定是语义上的相近,有时候query和response在语义向量上并没有什么相似性。
流程:
query和response都是讲过分词的,分词后将每个词映射成词向量的形式,之后词向量会被微调
分词和向量化后的query和response经过相同的RNN(Word by word)一个词一个词的输入,query和response按照批处理的那种形式输入到RNN中,比如普通的RNN在批处理时按照每一批处理处理数据,加假如批处理大小是2,原本应该是输入两个样本,在这里RNN把第二个样本换成query的回复response,这样构成一个完整样本的输入,RNN最终生成一个向量表示,捕捉了query和response之间的语义联系。
将向量c与一个矩阵M相乘,来预测一个可能的回复r’。如果c为一个256维的向量,M维256*256的矩阵,两者相乘的结果为另一个256维的向量,我们可以将其解释为[一个生成式的回复向量]。矩阵M是需要训练的参数。
(4) 通过点乘的方式来预测生成的回复r’和候选的回复r之间的相似程度,,点乘结果越大表示候选回复作为回复的可信度越高;之后通过sigmoid函数归一化,转成概率形式。图中把第(3)步和第(4)步结合在一起了。
首先要将给定数据处理成TensorFlow的tfrecord可以接受的格式,原始数据就是从Excel文件存储的地址中下载的对话对,通过这些对话对制作字典,处理后的数据的每个样本的格式如下:
每个实例包括如下几个字段:
Query:表示为一串词标号的序列,如[231, 2190, 737, 0, 912]; Query的长度; Response:同样是一串词标号的序列; Response的长度; Label; Distractor_[N]:表示负例干扰数据,仅在验证集和测试集中有,N的取值为0-8; Distractor_[N]的长度;