导读:飞桨PaddlePaddle致力于让深度学习技术的创新与应用更简单。飞桨开源的百度自研SimNet-BOW-Pairwise语义匹配模型,在真实的FAQ问答场景中,比其他基于字面的相似度方法AUC提升了5%以上。在公开语义匹配数据集(LCQMC)进行评测准确率也达到了0.7532,性能超越同等复杂的CBOW基线模型。SimNet 显著改善了长冷 query 的搜索效果,提升了搜索智能化的水平,在百度搜索以及其它产品线广泛应用。
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
1.文本语义匹配
文本语义匹配是自然语言处理中一个重要的基础问题,NLP领域的很多任务都可以抽象为文本匹配任务。例如,信息检索可以归结为查询项和文档的匹配,问答系统可以归结为问题和候选答案的匹配,对话系统可以归结为对话和回复的匹配。如何提升文本匹配的准确度,是自然语言处理领域的一个重要挑战。
让我们来看一个简单的例子,比较各候选句子哪句和原句语义更相近
原句:“车头如何放置车牌”
-
比较句1:“前牌照怎么装”
-
比较句2:“如何办理北京车牌”
-
比较句3:“后牌照怎么装”
使用文本匹配(这里使用SimNet)分别计算原句与三个比较句的相似度,结果如下。
(1)比较句1与原句,虽然句式和语序等存在较大差异,但是所表述的含义几乎相同,所以SimNet给出了较高的相似度,为0.761517;
(2)比较句2与原句,虽然存在“如何” 、“车牌”等共现词,但是所表述的含义完全不同,所以SimNet给出了很低的相似度,为0.486205;
(3)比较句3与原句,二者讨论的都是如何放置车牌的问题,只不过一个是前牌照,另一个是后牌照。二者间存在一定的语义相关性,所以SimNet给出了介于比较句1和比较句2之间的相似度得分,为0.697181。
通过这个例子我们不难窥探出语义匹配的强大的能力,它在搜索优化、推荐系统、快速检索排序、智能客服上都有着极大的用武之地!
-
信息检索:在信息检索领域的很多应用中,都需要根据原文本来检索与其相似的其他文本,使用场景非常普遍。除纯文本检索外,SimNet还适用于通过标签来检索图片、视频等场景,大大提高检索效率。
-
新闻推荐:通过用户刚刚浏览过的新闻标题,自动检索出其他的相似新闻,个性化地为用户做推荐,从而增强用户粘性,提升产品体验。
-
智能客服:用户输入一个问题后,自动为用户检索出相似的问题和答案,节约人工客服的成本,提高效率。
2.SimNet表现出众
SimNet 在语义表示上沿袭了隐式连续向量表示的方式,但对语义匹配问题在深度学习框架下进行了 End-to-End 的建模,将词语的 Embedding 表示与句篇的语义表示、语义的向量表示与匹配度计算、文本对的匹配度计算与 pair-wise 的有监督学习全部统一在一个整体框架内。
在实际应用场景下,海量的用户点击行为数据可以转化大规模的弱标记数据,搭配我们研发的高效并行训练算法,大数据训练的 SimNet 显著超越了主题模型类算法的效果,并首次实现了可完全取代基于字面匹配的策略,而且可以直接建模非相似度类的匹配问题。在网页搜索任务上的初次使用即展现出极大威力,带来了相关性的明显提升。
我们基于百度海量搜索数据训练的SimNet-BOW-Pairwise语义匹配模型,在一些真实的FAQ问答场景中,比其他基于字面的相似度方法AUC提升了5%以上。
基于百度自建测试集(包含聊天、客服等数据集)和公开语义匹配数据集(LCQMC)进行评测,结果如下表所示。
其中,LCQMC数据集以Accuracy为评测指标,而pairwise模型的输出为相似度,因此采用0.958作为分类阈值。相比于基线模型中网络结构同等复杂的CBOW模型(准确率为0.737),SimNet-BOW-Pairwise模型将准确率提升到了0.7532。
总结来说,SimNet有三大特点:
-
算法效果好:百度搜索等海量用户数据为SimNet相似度算法提供了丰富的指导信息,模型效果优于已公开的主流算法。
-
语义级匹配:利用词向量技术解决关键词匹配失败的问题,可以有效得到同义词、近义词之间的相似度,泛化能力好。
-
深度学习技术:基于深度神经网络,对单词语义到短文本语义到组合过程进行建模,模型更强大,表达效果更好。
3.SimNet模型原理介绍
如下图所示,SimNet模型主要分为输入层、表示层和匹配层三个部分。
(1)输入层
该层通过 look up table 将文本词序列转换为 word embedding 序列。
(2)表示层
该层主要功能是由词到句的表示构建,或者说将序列的孤立的词语的 embedding 表示,转换为具有全局信息的一个或多个低维稠密的语义向量。最简单的是 Bag of Words(BOW)的累加方法,除此之外,我们还在 SimNet 框架下研发了对应的序列卷积网络(CNN)、循环神经网络(RNN)等多种表示技术。当然,在得到句子的表示向量后,也可以继续累加更多层全连接网络,进一步提升表示效果。
(3)匹配层
该层利用文本的表示向量进行交互计算,根据应用的场景不同,我们研发了Representation-based Match和Interaction-based Match两种匹配算法。
1)Representation-based Match
该方式下,更侧重对表示层的构建,尽可能充分地将待匹配的两端都转换到等长的语义表示向量里。然后在两端对应的两个语义表示向量基础上,进行匹配度计算,我们设计了两种计算方法:一种是通过固定的度量函数计算,实际中最常用的就是 cosine 函数,这种方式简单高效,并且得分区间可控意义明确;还有就是将两个向量再过一个多层感知器网络(MLP),通过数据训练拟合出一个匹配度得分,这种方式更加灵活拟合能力更强,但对训练的要求也更高。
2)Interaction-based Match
该方式更强调待匹配两端更充分的交互,以及交互基础上的匹配。所以不会在表示层将文本转换成唯一的一个整体表示向量,而一般会保留和词位置相对应的一组表示向量。下面介绍该方式下我们实际应用的一种的 SimNet 模型变体。
首先基于表示层采用双向 RNN 得到的文本中间位置表示,和词位置对应的每个向量体现了以本词语为核心的一定的全局信息;然后对两段文本按词对应交互,由此构建两段文本之间的 matching matrix(当然也可以构建多组 matrix,形成 tensor),这里面包括了更细致更局部的文本交互信息;基于该局部匹配特征矩阵,我们进一步使用卷积来提取高级的从单词到 N-Gram 多层次的匹配特征,再经过 pooling 和 MLP 得到最终匹配得分。
Interaction-based Match 匹配方法匹配建模更加细致、充分,一般来说效果更好一些,但计算成本会增加非常多,适合一些效果精度要求高但对计算性能要求不高的应用场景。大部分场景下我们都会选择更加简洁高效的 Representation-based 匹配方式。
训练阶段采用上图所示的 pair-wise RankingLoss框架,以网页搜索任务为例,假设搜索查询文本为 Q,相关的一篇文档为 D+,不相关的一篇文档为 D-,二者经过 SimNet 网络得到的和 Q 的匹配度得分分别为 S(Q,D+) 和 S(Q,D-),而训练的优化目标就是使得 S(Q,D+)>S(Q,D-)。实际中,我们一般采用 Max-Margin 的 Hinge Loss:max{0,margin-(S(Q,D+)-S(Q,D-))}
这种 loss 简洁、高效,还可以通过 margin 的不同设定,来调节模型得分的区分度。
4.1 克隆项目
使用git命令克隆工具集代码库到本地。
git clone https://github.com/PaddlePaddle/models.git
cd models/PaddleNLP/similarity_net
4.2 数据准备
下载经过预处理的数据。
wget--no-check-certificate https://baidu-nlp.bj.bcebos.com/simnet_dataset-1.0.0.tar.gz
tar xzf simnet_dataset-1.0.0.tar.gz
运行上述命令后,data目录下会生成训练集数据示例、测试集数据示例,以及对应词索引字典(term2id.dict)。
4.3 模型准备
我们开源了基于大规模数据训练好的pairwise模型(基于bow模型训练),并提供两种下载方式。
方式一:基于PaddleHub命令行工具(PaddleHub安装方式)
mkdir model_files
hub download simnet_bow_pairwise --output_path ./
tar xzf simnet_bow-pairwise-1.0.0.tar.gz-C ./model_files
方式二:直接下载
mkdir model_files
wget--no-check-certificate https://baidu-nlp.bj.bcebos.com/simnet_bow-pairwise-1.0.0.tar.gz
tar xzf simnet_bow-pairwise-1.0.0.tar.gz -C ./model_files
模型将保存在./model_files/simnet_bow_pairwise_pretrained_model/下。
4.4 模型评估
我们公开了自建的测试集,包括百度知道、ECOM、QQSIM和UNICOM四个数据集。
下面基于上面的预训练模型,来评估模型的效果。
首先进入evaluate目录。
cd evaluate
依次执行以下命令,获取测试集评估结果。
sh evaluate_ecom.sh
sh evaluate_qqsim.sh
sh evaluate_zhidao.sh
sh evaluate_unicom.sh
也可以指定./run.sh中的TEST_DATA_PATH的值,通过下列命令评估自己指定的测试集。
sh run.sh eval
4.5 模型推测
基于上面的预训练模型,运行下面的命令,进行推测并将推测结果保存到本地。
sh run.sh infer
4.6 训练自己的模型
可以基于示例数据构建训练集和开发集,重新训练自己的模型。命令如下:
sh run.sh train
开发者还可以指定run.sh中train函数里的INIT_CHECKPOINT的路径,载入开源的bow-pariwise模型进行热启动训练,适合某些场景下训练数据量较少的情况。赶快自己动手尝试下吧!
想与更多的深度学习开发者交流,请加入飞桨官方QQ群:796771754。
如果您想详细了解更多相关内容,请参阅以下文档。
-
官网地址:https://www.paddlepaddle.org.cn
-
项目地址:
https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleNLP/similarity_net
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
>> 访问 PaddlePaddle 官网,了解更多相关内容。