机器阅读理解很有可能成为人机问答中的主力技术,目前FAQ大多使用的是语义匹配模型,该模型需要进行很多的人工标注,成本较高。与语义匹配模型相比,机器阅读理解可以减少人工标注的数量,降低成本。同时可以对未知问题自动寻找QA对。减少人工寻找答案的困难。
本文的机器阅读理解模型主要包含以下5个步骤:
1、根据F1-score寻找相关段落:
通过计算query和候选段落的F1-score的匹配程度。在一篇文档中找出最相关的三个段落。
2、根据F1-score寻找答案模块:
根据F1-score在最相关的三个段落中寻找F1-score最大的答案,作为fake_answer。供下一步模型进行训练。
3、特征预计算模块:
加载bert模型和词典,将query和候选段落,通过词典转换为[cls]query[sep]候选段落[sep]的格式,供下一步输入到模型中。
4、深度模型训练模块:
使用bert模型在阅读理解任务上,进行训练,池化层后接一个线性模型,预测答案的起始位置,和结束位置,使用交叉熵作为损失函数。
5、答案生成模块:
使用上一步预测出来的起始位置和结束位置的概率,根据当前候选段落,找到概率最大位置对应的文字片段,截取作为答案。
(1)、根据F1-score寻找相关段落:
该模块,主要包含6个方法,find_fake_answer,find_best_question_match,matrix_max_over_ground_truth,f1_score,recall,presicion_recall_f1.寻找fake_answer作为要预测的答案,供下一步进行训练.
计算两段文本的精确率,召回率和f1.
精确率:两段文本相同的部分,占预测文本的百分比.
召回率:两段文本相同的部分,占原始文本的百分比.
F1: (2*精确率*召回率)/(精确率+召回率)
find_fake_answer: 输入参数,sample,即dureader格式的问题和文章合集。
在候选段落种寻找和问题的f1值最高的作为fake_answer。
find_best_question_match: 输入参数doc,dureader格式的问题和文章集合
输入参数question, string 格式用户问的问题
在候选段落中找到和问题最相关的段落。
maxtrix_max_over_ground_truth:输入。metric_fn: 数据类型 函数句柄
prediction: 数据类型。string段落文本。
ground_truths: 数据类型 string用户问的问题。
f1_score: prediction 数据类型。string段落文本
ground_truths 数据类型 string用户问的问题
recall: param prediction:数据类型 string段落文本
param ground_truths: 数据类型 string 用户问的问题
(2) 根据F1-score寻找答案模块:
根据F1-score在最相关的三个段落中寻找F1-score最大的答案,作为fake_answer。供下一步模型进行训练。
包含了三个方法,compute_paragraph_score, dup_remove , paragraph_selection 用例计算候选段落和问题的F1-score . 去除段落中的重复内容,并且增加paragraphs字段 , 将和问题最相关的 (F1-score 最高的)前5个段落 通过“.”句号拼接在一起,成为一个字符串. 供下一步深度模型进行训练.
compute_paragraph_socre: 输入param sample:数据类型 dureader格式的问题和文章集合
步骤:根据F1-score寻找相关段落模块
dup_remove: 输入: param doc: 数据类型 dureader格式的问题和文章集合
输出: 是否有文本片段被删除
步骤:去除段落中的重复内容
paragraph_selection:
输入: param sample : 数据类型 dureader 格式的问题和文章集合
输出: 增加paragraphs 字段,将和问题最相关的(F1-score最高的) 前5个段落,通过“.” 句号拼接在一起,成为一个字符串.
(3) 特征预计算模块:
加载bert模型和词典,将query和候选段落,通过词典转换为[cls]query[sep]候选段落[sep]的格式,供下一步输入到模型中。
该模块包含了两个方法,convert_examples_to_features, read_squad_examples
读取dureader 格式的训练和验证数据, 对于每一个用户问题, 找到最相关文档的,最相关段落的fake_answer, 当F1-score 大于0.8的时候,将这条问题和fake_answer 作为训练数据.
加载预训练的bert模型和词典,将上面读取好的文本和答案,还有最相关的段落通过词典,转变为[cls]query[sep]候选段落[sep]的格式.
convert_examples_to_features:
输入
param examples :数据类型 dureader格式的问题和文章集合.
param tokenizer: 数据类型 bert 预训练模型提供的词典
param max_seq_length : 数据类型 段落的最大长度
param max_query_length: 数据类型 问题的最大长度
输出:
文本和段落的编码,文本和段落的位置编码,答案在段落中的开始位置和结束位置.
read_squad_examples
输入:
param zhidao_input_file 数据类型 string dureader 格式的问题和文章集合
param search_imput_file 数据类型 string dureader 格式的问题和文章集合
param is_training : 数据类型 boolean 是否是训练过程
输出:问题id, 问题的文本,问题的类型,段落文本,答案开始位置,答案结束位置
train: 训练模块,加载预训练bert,准备优化器,准备数据,计算loss, 更新梯度, 在验证集上进行验证,将模型保存到model_dir 文件夹下
训练完后到结果如下所示:
最后附上链接地址:
🔗 https://github.com/weizhenzhao/bert-mrc-server.githttps://github.com/weizhenzhao/bert-mrc-server.git