问题对语义相似度计算-参赛总结

  • 时间段:2018.06.10~2018.07.20
  • 问题对语义相似度计算(从0到0.5+)

    • 短短一个多月的时间,我学到了很多很多东西,从一个呆头小白初长成人。
    • 首先,必须感谢我的导师能给我这个机会从头到尾完整地参加这次比赛,至始至终地为我们出谋划策,和我们探讨问题并答疑解惑,而且提供了各种宝贵的学习资料和服务器资源。
    • 另外,也要特别感谢我的师兄一路无微不至的提点和帮助,和我一起找方法、看论文、搭模型、改代码,其实我们是从同一个起跑线开始的,到最后被师兄甩了好几条街 T_T。
    • 虽然,比赛期间遇到了很多挫折,刚开始我们真的是一头雾水、无从下手,面对参加同样比赛的其他优秀选手(“老油条”)心里还是蛮慌的,好在勤能补拙,有团队配合,能够齐心协力、互相帮助,最终比赛的结果还算令人满意。

    一、相关比赛

    1
    2
    3
    任务:语句匹配问题、语义等价判别、语义等价判定、等价;(语句的意图匹配)
    输入:一个语句对
    输出:一个数值(0-1之间),表明该语句对的相似程度
    • 第三届魔镜杯大赛 问题相似度算法设计
    • 2018 全国知识图谱与语义计算大会 任务三:微众银行智能客服问句匹配大赛
      • 比赛平台:CCKS 2018 微众银行智能客服问句匹配大赛
    • ATEC蚂蚁开发者大赛 金融大脑-金融智能NLP服务 博客分享

    二、数据形式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    魔镜杯:脱敏数据,所有原始文本信息都被编码成单字ID序列和词语ID序列。
    label,q1,q2
    1,Q397345,Q538594
    0,Q193805,Q699273
    0,Q085471,Q676160
    ... ...

    CCKS:中文的真实客服语料。
    用微信都6年,微信没有微粒贷功能 4。 号码来微粒贷 0
    微信消费算吗 还有多少钱没还 0
    交易密码忘记了找回密码绑定的手机卡也掉了 怎么最近安全老是要改密码呢好麻烦 0
    ... ...

    蚂蚁:蚂蚁金服金融大脑的实际应用场景。
    1 怎么更改花呗手机号码 我的花呗是以前的手机号码,怎么更改成现在的支付宝的号码手机号 1
    2 也开不了花呗,就这样了?完事了 真的嘛?就是花呗付款 0
    3 花呗冻结以后还能开通吗 我的条件可以开通花呗借款吗 0
    ... ...

    三、解决方案

    (1)问题分析

    • 预测问题对的相似程度,即判别问题对是属于类别1还是类别0,很明显这是一个NLP领域的分类问题,然而区别于传统的文本分类问题:
    区别传统文本分类问题对相似度计算
    输入只有一个输入有两个输入
    句子长度文本较长句子长短不一、且较简短
    特征文本特征语义特征
    。。。。。。。。。

    (2)数据分析

    • 1、正负样本比例接近于 1:1;
    • 2、相似的句子之间一般都会含有公共词/字符;也会出现包含很多公共词/字符,但句子主语不一样导致两个句子不相似的情况;
    • 3、比赛的数据是没有经过预处理的(去停用词、繁体转简体、清洗);另外数据中也存在很多脏数据(标注有误、错别字、漏字、简写),也很容易导致分词错误;
    • 4、预训练的词向量数据(除非比赛方提供,否则还需要跟领域相关的语料来进行训练);

    (3)分类模型

    其实我们之前是没有接触过这种类型的比赛的,也没有很多参赛的经验,而是刚刚从零学起,一步一步地摸索,沿着前人的脚步再延伸。

    • 1、比赛方(魔镜杯)Demo:两个句子拼成一个文本,空格连接,以 tfidf 为特征,做逻辑回归;(研究官方Demo时发现代码里有bug:最后提交的是预测为0的概率,实际应该是1)
    • 2、借鉴官方Demo,两个句子拼接,使用传统CNN做文本分类,准确率 80% 左右;经测试q1和q2两个句子分开单独处理后再合并做分类效果是明显好于q1和q2先合并再处理后做分类的;
    q1、q2 分开单独处理共享卷积层不共享卷积层
    log_loss0.2589950.28949
    • 3、微软发表的一篇论文[1]:DSSM模型(把条目映射成低维向量、计算查询和文档的cosine相似度,即一个查询语句对应多个文档,所以这个模型不太适用这个比赛)
      • DSSM深度结构化语义模型原理
      • 深度语义匹配模型-DSSM 及其变种
      • 深度学习解决 NLP 问题:语义相似度计算
      • PaperWeekly 第37期 | 论文盘点:检索式问答系统的语义匹配模型(神经网络篇)
    • 4、Quora Semantic Question Matching with Deep Learning 三个LSTM模型,可以作为以下介绍的模型的baseline,进本是基于LSTM和Attention展开。
    • 5、The Stanford Natural Language Inference (SNLI) Corpus 一大堆模型及特征提取方法,很多都是用了模型融合。
    • 6、MatchZoo 12个模型,可能这个工具包是针对QuoraQP数据已经调好了参数,在移植到我们这个比赛的时候效果不是很佳,但可以借鉴。
    • 7、相关博客(句子对匹配方法)
      • 使用深度双向LSTM模型构造社区问答系统 重现后,效果不是很好
      • 深度学习笔记——基于双向RNN(LSTM、GRU)和Attention Model的句子对匹配方法 4个模型,其中 Soft Attention Model 实现后效果较好。
      • CNN在NLP领域的应用(2) 文本语义相似度计算 类似方法2
      • LSTM 句子相似度分析 LSTM 简化版
    • 8、Siamese Network 孪生网络
      • Siamese network 孪生神经网络—一个简单神奇的结构
      • 用于文本相似的Siamese Network
      • Siamese Network理解(附代码)
      • Siamese Network原理
    • 9、ESIM (这个模型是所有模型里面实现后效果最好的,但也有改动,对于脱敏数据是不能实现TreeLSTM的)
      • 源代码:ESIM_keras
      • Kaggle Competition: Quora Question Pairs Problem a single model - ESIM
    • 10、论文[2]里的4个模型:SSE、PWIM、DecAtt、ESIM
      • 论文开源代码
    • 11、论文[3]:BiMPM模型 github源码
      论文[4]:DR-BiLSTM模型
    • 12、gensim 相似度查询
      • Gensim官方教程翻译(四)——相似度查询(Similarity Queries)
      • gensim 相似度查询(Similarity Queries)(三)
      • nltk-比较中文文档相似度-完整实例
      • nltk-比较中文文档相似度-完整实例
    • 13、传统模型工具:xgboost(xgb)、lightgbm(lgb)、随机森林random forest(rf)、极端随机树 Extremely randomized trees(ET或Extra-Trees)
    • 14、前10选手用到的模型

    最终单模型的最好效果:log_loss = 0.205189

    比赛期间,我实现或者在实现的基础上改进前前后后大概搭建了20多个模型,其实很多模型都还有很大的提升空间,局限于比赛的时间和自己的知识能力,而且在模型的细微之处、参数的初始化以及调参方面自己都没有什么经验,以致自己实现的模型的效果都没有师兄的好 (;へ:)。
    虽然我们没能进入拍拍贷“魔镜杯”比赛的决赛,但在导师的帮助和特殊关系下,我们也有幸了参加了 top10 选手精彩的决赛答辩(2018-7-24 09:00),真的受益匪浅。

    (4)模型调参

    • 1、拍拍贷一同比赛的某位优秀选手(初赛第16名, 复赛第12名)分享的博客 智能客服问题相似度算法设计——第三届魔镜杯大赛第12名解决方案
      • 队伍:moka_tree 团队
      • 代码分享
    • 2、其实,很多参数我自己设置的都是默认参数,具体没有做很多的微调:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      embedding_dim = 300         # 词向量的维度
      seq_length = 25 # 文本的最大长度
      filter_sizes = [3] # 卷积核尺寸列表
      num_classes = 2 # 类别数

      is_pre_train = True # 是否为训练好的词向量
      is_trainable = True # 动态/静态词向量

      num_filters = 300 # 卷积核数目
      rnn_num_layers = 2 # LSTM 隐藏层的个数
      attention_size = 300 # Attention 层的大小
      rnn_hidden_size = 300 # LSTM 隐藏层的大小
      dropout_keep_prob = 0.5 # dropout 保留比例
      learning_rate = 1e-3 # 学习率(设置自动衰减)
      batch_size = 128 # 每批训练的大小
    • 3、参数初始化:跟上面博客里分享的一样,TensorFlow里面参数初始化不同,对结果的影响非常大,师兄推荐也是使用 Xavier 初始化;原本想用keras再实现一遍的,一方面不太熟悉,另一方面由于时间紧迫未能完成。

    • 4、决赛答辩里,我们了解到很多选手并没有使用官方给定词级和字符级的词向量(不知道训练方法、参数、模型等),都自己训练了两种词向量(word2vec、glove);另外也有用 w_vector * w_tfidf 作为 w 的词向量。
    • 5、重点关注字向量:由于中文分词难度较大,特别是不同领域内的领域分词没有很好的解决方案(比赛数据为金融领域数据源),而且实验的效果也表明词级别是好于字级别的。
    • 6、BatchNormalization + Spatial Dropout 1D

    (5)特征工程

    1、人工设计特征这部分是我们团队中来也公司的几个小伙伴做的, 他们参考并设计了很多有趣的特征。

    • 统计特征:句长、公共词、fuzzywuzzy、stat_feature、cosine 欧式 明氏 切氏等距离、多项式 拉普拉斯 sigmod等核函数、重叠词、重叠字等特征;
      • XGB_handcrafted_leaky
    • 主题特征:powerful words、tfidf matrix、PCA、NMF、NLP feature;
      • is_that_a_duplicate_quora_question
    • 图特征
      • kaggle-quora-question-pairs

    2、其他选手

    • 计算QA pair的几种相似度:编辑距离、马氏距离、闵可夫斯基距离、WMD
    • 使用 SVD、NMF对句中词向量降维
    • 根据共现图,统计节点的degree,得到了两个比较强的特征:coo_q1_q2_degree_diff(问题1和问题2的degree的差异)、coo_max_degree(问题对最大的degree,进一步离散化做1-hot又得到3个特征)
    • 问题对公共邻居的数量/比例
    • 第一名:提取问题出入度、pagerank等特征;问题出现的次数以及频繁程度特征;将所有已知的问题构建同义问题集。问题集的构建不参与训练,只用于数据增强;

    3、数据增强

    • 第一名的方法
      1
      2
      3
      4
      5
      6
      假设 Q1 在所有样本里出现2次,分别是
      1,Q1,Q2
      1,Q3,Q1
      模型无法正确学习Q1与Q2/Q3的相同,而是会认为只要input里有Q1即为正样本。
      需要通过数据处理引导模型进行“比较”,而不是“拟合”。
      解决方案:通过构建一部分补充集(负例),对冲所有不平衡的问题。

    4、后处理

    • 传递关系
      • 相似:(AB=1,AC=1)—> BC=1
      • 不相似:(AB=1,AC=0)—> BC=0
    • 第一名的方法:infer机制:除了判断test集的每个样本得分以外,还会通过已知同义问题集的其他样本比对进行加权;融合时轻微降低得分过高的模型权重,补偿正样本过多的影响;将已知确认的样本修正为0/1。

    比别人差的一个重要原因:传递关系没有考虑到闭包!我们大概推了1253条,然而别人正例推了12568个样本,负例推了5129个样本。 ╥﹏╥

    (6)模型融合

    • 1、多模型的融合最常用的一个方法就是求平均,我使用这个方法后 logloss 有很大的提升(加权平均的几个结果都是线上提交后 logloss 在 0.205189~0.209739 之间)。
    求平均的数量24789
    线上提交 logloss0.1878450.1853290.1826130.1798080.179063
    • 2、同一个模型提升效果的常用方法就是多折交叉验证求平均,由于我们组内 GPU 服务器有限,这个就由模型效果比较好的师兄来完成了,而且提升也是非常明显的。
    • 3、另外,也用了堆叠和混合(stacking与blending)。
      • 每个模型 word level(官方词向量)
      • 每个模型 word level(word2vec)
      • 每个模型 word level(glove)
      • 每个模型 char level(官方字向量)
      • 每个模型 char level(word2vec)
      • 每个模型 char level(glove)
    • 4、kaggle比赛集成指南
    • 5、模型微调(Finetune)
      • 第一名的方法:gensim训练词向量;模型使用non_trainable词向量进行训练;将除了embedding的layer全部freeze,用低学习率finetune词向量层。
    小 trick贡献度
    多模型的预测结果求平均logloss 降低 2.6 个百分点
    同一个模型10折交叉验证logloss 降低 2 个 百分点
    传递关系推导logloss 降低 3.1 个千分点

    四、比赛总结

    • 1、比赛成绩(logloss / F1)
    拍拍贷初赛成绩(359只队伍)复赛成绩(95只队伍)
    我们0.166100(第22名)0.162495(第21名)
    moka_tree0.163249(第16名)0.151729(第12名)
    SKY0.141329(第1名)0.142658(第1名)
    CCKS初赛成绩(138只队伍)复赛成绩(50只队伍)
    我们0.85142(第24名)0.84586(第4名)
    ThunderUp0.86485(第1名)0.85131(第1名)
    • 2、经验体会
      • 刚开始,我们都是尝试各种模型,不知道哪一个好,在这个上面花了不少时间,其实从平时就应该开始积累,关注最新研究、最新模型,多看一下论坛、kaggle、quora、github、和NLP相关的公众号等。
      • 一定要从数据本身上做探索,研究各种特征,因为到比赛后期模型基本都相似了,很难再有更大的提升;从决赛答辩来看,前10的选手在数据特征上都下了非常大的功夫,比如图特征等。
      • 一定要做交叉验证,求平均。比赛方提供的训练集如果只用了 0.9 的数据来训练模型,那么模型很大程度会丢失剩下的 0.1 的信息,如果做了交叉验证的话,就可以兼顾到所有训练集的特征信息。
      • 从比赛角度讲,深度学习框架 keras 是好于 TensorFlow 的,因为 keras 一般在参数调试、参数初始化以及模型搭建上面都整合的非常好;从科研角度讲,Tensorflow 具有清晰的流程,可以帮助你更好的理解深度学习的完整过程。
      • 到了比赛后期,多模型的融合一定会有帮助,因为这样可以结合不同的模型的优缺点;模型融合最简单的方法是就是求平均,再复杂点就是对不同的模型依据效果的好坏赋予不同的权重在加权求和。
      • 之前一直很纳闷人工设计的传统特征是怎样可以和深度学习模型相结合的,通过这次比赛,我也学习到了很多传统的NLP模型(xgboost、lightgbm、随机森林、极端随机树等),设计的特征可以加入到最后一层MLP层进行训练。
      • 一定要有团队配合,“三个臭皮匠,顶个诸葛亮”,“1+1>2”,真的真的可以从别人身上学习到很多很多的东西。
      • 一定要多看论文、多写代码,多请教师兄、导师,“纸上得来终觉浅,绝知此事要躬行。”,“冰冻三尺,非一日之寒。”,调参经验、模型的搭建很多都是来自平时的积累、练习。
      • 作为一个小白,一定要比别人花更多的时间和努力,才能笨鸟先飞、勤能补拙。
      • 再忙再累也要多运动、多锻炼,身体是革命的本钱,一定要爱惜身体,督促自己,实验室固然安逸,但整天坐着身体的机能肯定会下降,发际线正在颤抖。
      • “路漫漫其修远兮,我将上下而求索。”

    五、参考文献

    • [1] Huang P S, He X, Gao J, et al. Learning deep structured semantic models for web search using clickthrough data[C]// ACM International Conference on Conference on Information & Knowledge Management. ACM, 2013:2333-2338.
    • [2] Lan W, Xu W. Neural Network Models for Paraphrase Identification, Semantic Textual Similarity, Natural Language Inference, and Question Answering[J]. 2018.
    • [3] Wang Z, Hamza W, Florian R. Bilateral Multi-Perspective Matching for Natural Language Sentences[J]. 2017.
    • [4] Ghaeini R, Hasan S A, Datla V, et al. DR-BiLSTM: Dependent Reading Bidirectional LSTM for Natural Language Inference[J]. 2018.

    其他比赛选手总结

    • https://kexue.fm/archives/5743?from=timeline&isappinstalled=0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后BERT时代:15个预训练模型对比分析与关键点探究

前言在小夕之前写过的《NLP的游戏规则从此改写?从word2vec, ELMo到BERT》一文中,介绍了从word2vec到ELMo再到BERT的发展路径。而在BERT出现之后的这大半年的时间里,模型预训练的方法又被Google、Facebook、微软、百度、OpenAI等极少数几个玩得…

技术论坛 | 10月22日在微软:“行业知识图谱+ ”论坛通知

大数据创新学习中心 《国务院新一代人工智能发展规划》的“跨媒体分析推理技术”强调“重点突破跨媒体统一表征、关联理解与知识挖掘、知识图谱构建与学习、知识演化与推理、智能描述与生成等技术”,为进一步了解知识图谱技术的应用场景,2017年10月22日在…

【Java】StringBuilder类、包装类

1 StringBuilder类 1.1 String的劣势 String类中字符串是常量,创建后不能更改 //底层是final修饰的数组 private final byte[] value;字符串相加,内存中会存在多个字符串,占用空间多,效率低下 1.2 StringBuilder的优势 Strin…

从贪心选择到探索决策:基于强化学习的多样性排序

本文主要介绍发表在SIGIR2018上的论文From Greedy Selection to Exploratory Decision-Making: Diverse Ranking with Policy-Value Networks​www.bigdatalab.ac.cn这篇论文利用强化学习来解决多样性排序问题,整体思路和AlphaGo类似。Motivation在信息检索领域一个…

对话系统聊天机器人的设计艺术(上)

前言关于本文的阅读方式:这不是一篇学术综述,也不是单纯的科普文,而是试图从目标出发来渐进式的思考对话系统的设计,顺便科普。因此本文不适合跳读,也不适合5分钟式浏览,而是适合在夜深人静的时候一个人...…

鲍捷 | 知识表示——面向实战的介绍

本文转载自文因互联 2016 年 6 月份组织的第一期北京知识图谱学习小组 Wiki。 知识表示(Knowledge Representation,KR,也译为知识表现)是如何将结构化数据组织,以便于机器处理和人的理解的方法。从结构推导出新的结构&…

【Java】Collection集合和泛型

学习目标:会存取,掌握特性 学习方式:学习顶层接口/抽象类的共性方法,使用底层的子类创建对象使用 1 集合框架 集合类的继承体系: Collection接口: 1) List接口:有序、允许重复、有索引 1.1) Ar…

]搜索引擎的文档相关性计算和检索模型(BM25/TF-IDF)

搜索引擎的检索模型-查询与文档的相关度计算1. 检索模型概述搜索结果排序时搜索引擎最核心的部分,很大程度度上决定了搜索引擎的质量好坏及用户满意度。实际搜索结果排序的因子有很多,但最主要的两个因素是用户查询和网页内容的相关度,以及网…

对话系统(任务型、检索式、生成式对话论文与工具串讲)

Motivation 对话是一个很大的概念,有非常非常多的子问题,刚入坑的小伙伴很可能迷失在对话的一小块区域里无法自拔,本文就是为解决这一类问题的。希望读者在看完本文后,可以理清楚对话的每个概念为什么而存在,以及它在整…

综述 | 知识图谱向量化表示

本文作者:窦洪健,2016级研究生,目前研究方向为推荐系统、文本生成,来自中国人民大学大数据管理与分析方法研究北京市重点实验室。 本文收录于RUC AI Box专栏,为该专栏特供稿件(https://zhuanlan.zhihu.com/…

【LeetCode】4月2日打卡-Day18-矩阵操作

题1 生命游戏 描述 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即…

强化学习扫盲贴:从Q-learning到DQN

本文转载自知乎专栏「机器学习笔记」,原文作者「余帅」,链接https://zhuanlan.zhihu.com/p/358829371 本文学习目标1. 复习Q-Learning;2. 理解什么是值函数近似(Function Approximation);3. 理解什么是DQN&…

【LeetCode】4月1日打卡-Day17-括号匹配/嵌套深度

题1 有效括号的嵌套深度 题解 要求划分出使得最大嵌套深度最小的分组,我们首先得知道如何计算嵌套深度。我们可以通过栈实现括号匹配来计算: 维护一个栈 s,从左至右遍历括号字符串中的每一个字符: 如果当前字符是 (,…

肖仰华 | 基于知识图谱的可解释人工智能:机遇与挑战

本文转载自公众号知识工场,整理自 2017 年 10 月 13 日肖仰华教授在 CIIS2017 中国智能产业高峰论坛上所做的报告。 肖仰华:很高兴有机会跟大家一起分享《基于知识图谱的可解释人工智能:机遇与挑战》。 刚才刘总的报告中提到了机器和人类将来…

对话系统的设计艺术(完结)

Motivation对话是一个很大的概念,有非常非常多的子问题,刚入坑的小伙伴很可能迷失在对话的一小块区域里无法自拔,本文就是为解决这一类问题的。希望读者在看完本文后,可以理清楚对话的每个概念为什么而存在,以及它在整…

2018届校招面经精选

https://www.zhihu.com/question/23259302 牛客网​已认证的官方帐号819 人赞同了该回答最好的办法就是看看别人是怎么准备的,通过别人的面经来反思自己如何准备。针对应届生校招面试 “机器学习” 相关岗位的情况,牛妹为大家整理了一批面经&#xff0c…

【Java】列表、集合、哈希表和可变参数

1 List 1.1 List的特点 List接口继承自Collection接口List是有序集合,存取顺序一致允许存储重复元素 1.2 List的特有方法【带索引】 public void add(int index, E element);public E get(int index)public E remove(int index):返回移除元素public …

白硕 | 知识图谱,就是场景的骨架和灵魂

本文转载自公众号恒生技术之眼 知识图谱,目前已在全世界得到了重视和应用,成为当下人工智能热的一个重要组成部分。它究竟是怎样的一种技术?它的应用场景在哪里?未来国内企业该如何发展?让我们一起来聊聊。 从知识图谱…

您的DST大礼包请查收

本文转载自刘冲大佬(知乎id:呜呜哈)的知乎文章,链接:https://zhuanlan.zhihu.com/p/40988001除本文外,作者还写了很多对话相关的良心好文!做对话的小伙伴千万不要错过这位良心答主噢(&#xffe…