滕 腾,潘海为,张可佳,牟雪莲,张锡明,陈伟鹏
(哈尔滨工程大学计算机科学与技术学院,哈尔滨 150001)
随着智慧医疗高速发展,在线客服变得更人性化,人们会优先通过在线客服咨询健康问题。在线网站会安排专业医生回答用户的问题,但是考虑到大多数人问题类似,医生会回答重复问题,用户花费无意义等待时间,导致医生和用户使用体验差。为了减少时间浪费,基于问答匹配的智能客服应运而生,根据答案从提前设计好的问题库匹配相应答案返回给用户。
早期算力约束导致问答系统都是基于规则和传统机器学习方法。20 世纪60 年代,人们建立依靠专家预设规则去回答用户问题的智能问答系统,一旦出现效果不佳,很难处理同时触发的多条规则,维护成本过高。在20 世纪70 至80年代,大量研究考虑通过计算语言技术去更容易构建智能问答系统。20 世纪80 年代后,人们开始用传统机器学习和深度学习方法解决问答匹配,例如字匹配、词匹配、双向长短时记忆(Bi-directional Long Short-Term Memory,BiLSTM)循环神经网络等。以上方法,更多适合英文,并未考虑中文具有一些特殊语言特征,不能直接套用英文问答匹配方案。
考虑到语言差异,解决中文问答问题时人们先用jieba、ICTCLAS(Institute of Computing Technology,Chinese Lexical Analysis System)等分词工具将中文语句做分词,再将词做词嵌入,获得词嵌入后再使用英文问答匹配解决方案。在语句分词做词嵌入后,Wang 等提出计算单词词向量的相似度去衡量问题和答案之间相似性。在音乐领域,Li 等将一个问题翻译成SPARQL 查询语句后在预设数据库中查询最可能的答案。通用中文问答匹配往往需要分词才能执行后续操作,然而中文医疗领域中分词工具对希望不被分割的专业医疗词汇分割成几个词这种结果很敏感,例如,“葡萄糖注射液”就会被分词工具切分成“葡萄”“糖”“注射液”,而导致信息受损致使后续任务效果显著下降。虽然可以通过设置专门的中文医疗词典缓解问题,但是词典的设计繁琐、维护成本过高以及即使有词典仍然可能出现低频医疗词组分词的错误。
Wang 等研究指出,基于字的模型优于基于词的模型。受此启发:对于中文医疗专业等领域,对字做处理可以避免分词工具分词不正确导致的信息损伤。从2017 年开始,Zhang 等提出基于字嵌入的多尺度卷积神经网络(Multiple Convolutional Neural Networks,Multi-CNNs)模型,通过多个单层CNN 学习问题和答案,将得到的语义信息拼接在一起。2018 年,Zhang 等提出栈卷积神经网络(Stack CNN,Stack-CNN)模型、多层CNN 分别学习问题和答案的语义信息。但是,以上工作都是对问题和答案分开建模,并未考虑问题和答案间词汇的互相影响,不符合人们平时处理两个相关句子时靠其中一个句子去理解另外一个句子的习惯。
为了解决以上问题,本文提出了一种基于注意力机制的栈卷积神经网络(Attention mechanism based Stack CNN,Att-StackCNN)模型。首先,该模型使用字嵌入分别对问题、正确答案和错误答案进行编码得到各自的字嵌入矩阵;然后,通过构造注意力矩阵得到特征注意力映射矩阵;接着,利用Stack-CNN 同时对上述矩阵进行学习,分别得到问题、正确答案和错误答案各自的语义表示;最后,对问题和答案的语义表示进行相似度计算,根据得到的两个相似度去计算最大边际(Max-margin)损失,根据损失函数更新网络参数。
i
个词出现在文本中概率最大,context(e
)为中心词e
的周边词,所以此时训练目标是最大化p
(e
|context(e
)),采用最大似然估计优化以下目标:图1 word2vec做词嵌入的实例1Fig.1 Example 1 of using word2vec to character embedding
除了对中文的细粒度不同,字嵌入的处理方式和词嵌入几乎一致。word2vec 做字嵌入的实例2 如图2 所示。
图2 word2vec做字嵌入的实例2Fig.2 Example 2 of using word2vec to character embedding
N
-Gram 算法。图3为Stack-CNN 的一个实例。图3 Stack-CNN的实例Fig.3 Example of Stack-CNN
给定一个句子的字嵌入编码序列S
=(e
,e
,…,e
),其中:e
为句中第i
个字的字向量,字向量维数为d
,n
为句中字的个数。第一层的卷积神经网络对S
做卷积得到输出O
,第二层对O
做卷积得到输出O
,重复以上操作得到第n
层的输出O
,O
经过最大池化得到最终S
的语义表示S
。Q
和A
,再分别与注意力矩阵(Attention Matrix,AM)相乘,得到各自的特征注意力映射矩阵F
和F
;AM
为注意力矩阵。H
和H
分别为问题和答案对应的注意力权重矩阵,Q
和A
为由字嵌入矩阵和特征注意力映射矩阵堆叠得到的三阶张量,同层的Stack-CNN 颜色相同有相同参数;F
和F
与Q
和A
一起作为卷积层的输入,进入Stack-CNN 得到各自语义的表示Q
和A
;最后通过相似度计算判断答案是否最符合用户的问题。图4 Att-StackCNN模型的整体框架Fig.4 Overall framework of Att-StackCNN model
AM
和Stack-CNN 网络共同组成本文模型Att-StackCNN。Att-StackCNN 模型利用AM
来影响卷积运算,将问题和答案之间关联部分赋予更高权重以提升整体效果。Q
和答案编码序列A
得到注意力矩阵AM
,借助问题去匹配正确答案。AM
的元素AM
定义如下:其中:注意力权重矩阵H
、H
∈R,都是模型训练时需要学习的参数。AM
的元素AM
由问题的第j
个字开始的句子和答案的第k
个字开始的句子对应的字向量运算得到,这意味着利用问题的第j
个字开始的部分句子去辅助理解答案的第k
个字开始的部分句子,关联程度由H
和H
体现。通过AM
改变问题和答案字嵌入矩阵的分布得到各自特征注意力映射矩阵,特征注意力映射矩阵和原来的字嵌入矩阵构成双通道,特征注意力映射矩阵并未改变数据中特征的分布仅改变数据的分布,进而增加后续网络可学习信息,效果随之提升。在得到表示问题和答案的F
和F
后,F
、Q
堆叠得到三阶张量Q
,F
和A
堆叠得到三阶张量A
,并将其分别送入后续神经网络中进行卷积运算。图5 cMedQA数据集部分问题答案对Fig.5 Some question-answer pairs of cMedQA dataset
利用Q
和A
得到注意力矩阵AM
,用AM
分别与H
和H
相乘得到F
和F
。F
、Q
堆叠得到张量Q
,F
、A
堆叠得到张量A
,并将其分别送入Stack-CNN 神经网络中进行卷积运算。对问题、正确答案和错误答案做卷积的部分具有相同参数,卷积核尺度分别为c
,c
,…,c
,则对问题编码序列卷积运算公式如下:其中:ReLU(·)为激活函数;W
⊙Q
表示W
和Q
中对应元素相乘;b
为偏置项。卷积核尺度选择为2、3、4,卷积核的选择见后文实验对比,卷积的特征映射数为800 或者1 000 皆可。由式(4)得到,O
后经过最大池化得到问题的最终语义表示Q
;用相同的部分对A
做卷积得到正确答案的语义表示A
。同理通过上述过程,利用Q
和A
得到错误答案的语义表示A
。Q
和A
+的相似度度量函数公式如下:同理,通过相似度度量函数得到问题和不相关答案的相似度m
=sim(Q
,A
),利用m
和m
计算损失函数。此时训练的目的是希望m
越大越好,m
越小越好,因此本文采用Max-margin 损失作为损失函数,其定义式如下:其中:M
为超参数,本文设定M
=0.5。优化器采用随机梯度下降(Stochastic Gradient Descent,SGD)算法或者自适应矩估计(Adaptive moment estimation,Adam);学习率为0.01,学习轮数100;错误答案和正确答案与AM
运算时使用的H
和H
相同,H
、H
、W
、b
采用随机初始化,通过Max-margin 损失更新H
、H
、W
、b
。由于中文医疗问答对匹配没有统一的公开数据集,本文采用文献[7]通过爬虫主流医疗网站制作的开源数据集cMedQA(https://github.com/zhangsheng93/cMedQA)。表1 为cMedQA 的统计信息,将该数据集划分为三部分:训练集、开发集和测试集。
表1 cMedQA数据集的统计信息Tab 1 Statistics of cMedQA dataset
由于问题和答案匹配和信息检索任务相似,都是从候选池里选择可能正确的答案,所以将信息检索任务中常用的评价标准Top-K
(ACC
@k
)作为评价本文中文医疗问答的标准,ACC
@k
的定义如下:3.1.1 传统方法基准模型
1)随机选择:随机从候选答案池里选择答案。
2)字匹配:统计问题与答案中相同字的数量。
3)词匹配:统计问题与答案中相同词语的数量。
4)BM25:该模型的公式定义如下:
其中:IDF
(w
)为问句中字(或者词)w
的逆文档频率匹配;|a
|为答案a
的长度;|a
|为答案a
的平均长度;g
(w
,a
)为a
中w
的频率;k
和b
是需要设定的参数,在本文中,设定k
=2.0,b
=0.75。3.1.2 深度学习方法基准模型
1)Multi-CNNs:由多个有不同卷积核的单层CNN 对句子进行卷积操作,将得到的不同语义表示拼接在一起作为最后得到的语义表示。问题和答案做卷积操作时,拥有相同卷积核的CNN 具有相同参数。
2)Stack-CNN:由多个单层CNN 组成,除却第一层直接学习问题和答案,其他层都是对上层输出做卷积,最后一层得到的信息为最终语义信息。问题和答案做卷积时,同层CNN具有相同卷积核和参数。
本文实验采用Pytorch 框架,使用genism 训练字向量。为避免分词工具对结果的影响,分词工具采用常见的jieba和ICTCLAS。对比实验将从传统方法和深度学习方法比较,使用不同嵌入方式的方法进行比较。
3.2.1 传统方法对比结果
表2 为传统基准模型方法对比结果,分别基于不同嵌入方式进行比较。
表2 传统基准模型正确率的比较Tab 2 Accuracy comparison of traditional baseline models
表2第1行的随机选择由于随机性太强,几乎很难选中正确的回答,正确率仅为0.10%;由第2~4 行可知,词匹配在jieba 和ICTCLAS 两次分词工具分词下的结果都要比字匹配略高或者接近;由第5~7行可知,使用BM25算法时,使用字的结果很明显高于使用分词结果得到的词的结果,因为BM25算法会对较短字段赋予更大的权重;第8~13行展示的是基于嵌入的结果。在嵌入方式相同的情况下,字嵌入要优于词嵌入,中文医疗文本用分词工具的结果会导致专业词汇被切割导致信息损失。而模型一致情况下,嵌入匹配要优于平均嵌入。
综上所述,传统机器学习方法中正确率最高的为BM25,其正确率为45.40%。可能是传统方法学习能力有限,因此本文考虑在中文医疗问答匹配中引入深度学习。
3.2.2 深度学习方法比较结果
表3 为使用jieba 作为分词工具的词嵌入方式的深度学习方法。在该情况下,Att-StackCNN 和Stack-CNN 的效果要差于Multi-CNNs,可能是因为分词结果不准确导致语义信息受损。同时Att-StackCNN 和Stack-CNN 除了第一层的CNN外,其他层的CNN 学习的都不是原始分词得到的语义,卷积运算过程中导致了一部分语义改变,致使Att-StackCNN 和Stack-CNN 正确率比Multi-CNNs 低2.0 个百分点。
表3 基于word(jieba)深度学习方法正确率比较 单位:%Tab.3 Accuracy comparison of deep learning methods based on word(jieba) unit:%
表4 为使用ICTCLAS 作为分词工具的词嵌入方式的深度学习方法。此时,3 个模型结果接近。在模型一致的情况下,ICTCLAS 做为分词工具的结果要优于jieba,因为ICTCLAS 做分词采用了层叠隐马尔可夫模型,而jieba 做分词是使用基于统计词频,分词正确率要低于ICTCLAS。ICTCLAS 分词正确率高,不会导致类似于jieba 分词那样较多语义信息损失,Att-StackCNN、Stack-CNN 的结果和Multi-CNNs 的结果基本接近,而不是出现使用jieba 分词时出现差2.0 个百分点的情况。
表4 基于word(ICTCLAS)深度学习方法正确率比较 单位:%Tab 4 Accuracy comparison of deep learning methods based on word(ICTCLAS) unit:%
表5 为使用字嵌入方式的深度学习方法的正确率对比结果。在使用字嵌入的情况下,Stack-CNN 比Multi-CNNs 的正确率低0.7 个百分点左右,这可能是Stack-CNN 除了第一层处理的语义信息都不是原始信息,在做卷积的时候出现信息丢失,导致结果稍差。而Att-StackCNN 在Stack-CNN 的基础上考虑了问答对词汇之间的互相影响,引入了注意力矩阵,因此Att-StackCNN 的结果要比Stack-CNN 高1.0个百分点以上。同时注意力矩阵也弥补了Stack-CNN 做卷积时信息丢失的问题,比Multi-CNNs 高0.5 个百分点以上。
表5 基于字嵌入的深度学习方法正确率比较 单位:%Tab 5 Comparison of correct rate of deep learning methods based on character embedding unit:%
表6 为Att-StackCNN 不同卷积核对比实验。由于自然语言处理任务中,CNN 处理中文文本卷积核尺度一般选择2~4,因此本文的卷积核尺度对比实验分为4 组,卷积核尺度范围为2~4。由表6 可以看出卷积核尺度为2、3、4 效果最好,可能原因是因为中文2~4 个字的词语较多,Att-StackCNN可以充分学习中文医疗文本中的语义信息。
表6 Att-StackCNN的不同卷积核正确率比较 单位:%Tab 6 Accuracy comparison of different convolution kernels in Att-StackCNN unit:%
深度学习方法在中文医疗问答匹配问题中效果要比传统方法好,在算力允许时,使用深度学习方法效果更佳,同时深度学习不需要花费过多人力手动提取特征。
对中文医学文本使用词嵌入时会出现分词不正确对后续任务的影响,即便通过引入医学词典可以缓解此问题,词典的维护和建立成本高,因此采用字嵌入处理中文医学文本。本文在Stack-CNN 的基础上在问题和答案之间引入了注意力矩阵,提出了本文的模型Att-StackCNN,利用注意力矩阵学习问题和答案词汇间的关系,通过训练调整问题和答案各自的注意力权重矩阵,将相关字设置高权重,不相关字设置低权重后得到特征注意力映射矩阵。特征注意力映射矩阵相较于字嵌入矩阵仅数据分布改变,特征分布并未改变,与嵌入矩阵堆叠得到三阶张量送入后续网络,使后续网络可学习信息增加。使用字嵌入时,Att-StackCNN 模型结果高Stack-CNN接近1个百分点,高Multi-CNNs接近0.5个百分点。
目前公开广泛使用的中文医疗问答数据集不多,接下来,可以考虑制作其他大的中文医疗问答数据集以增加其他评价标准。同时,由于目前并未有类似于英文开源的医疗字和词向量,中文医疗领域研究的瓶颈之一在于通用领域词向量并不能完全揭示医疗领域词汇间关系,接下来将考虑改进训练中文医学词向量方式,以得到高质量中文医疗词向量。