有监督相似性学习:基于相似问题数据的对称关系学习

简介: 本文简单介绍基于相似问题数据的对称关系学习,通过在Quora数据集和StackExchange语料库上应用孪生卷积神经网络的结果表明,对称网络能够较大幅度地提高检测精度。

首发地址:https://yq.aliyun.com/articles/79584


更多深度文章,请关注:https://yq.aliyun.com/cloud

基于文本对分类的监督模型,可以根据它们之间的某些关系创建一个软件,该软件为这两个文本分配标签。当这种关系是对称的,将该约束并入模型是有用的。本文将展示孪生卷积神经网络是如何在两个重复的问题数据集上执行的效果,演示结果见此

检测重复内容这一任务会在许多不同的平台上发生,可以github网站Explosion AI资源库下的SpaCy问题跟踪器看到同样的问题被反复询问。幸运的是,现在有两个大型社区问答站点标有数据集——Quora数据集和来自墨尔本大学的研究人员编译的StackExchange语料库

8d69e9df5c41014a81a151ca0faa98905bdcf958

try the demo

为了比较,演示中包含了一个无监督的基线,该基线使用来自GloVe通用Crawl模型的向量来计算一个简单的字矢量平均值。有监督的模型从这种无监督的基线学习了非常不同的相似性定义,它大致表示文档之间主题的重叠。有监督使用了标签数据,这通常被认为是其缺点然而,这也是一个关键的优势:它允许使用标记数据自定义被分类的关系没有监督就会陷入任何无监督算法恢复默认关系

用于对称分类的孪生网络
         Quora和StackExchange数据集根据两个问题是否重复进行标记这种关系既可交换也可传递的。对于is_dup(A, B) 和 is_dup(B, A)两个同样的问题而言希望得到两种计算不同的结果——因为该模型应该把这两种问题看作一样。同样,如果知道is_dup(A, B)is_dup(B, C)应该得到结论is_dup(A, C)
         可以通过使用“孪生”架构来学习遵守这些约束的函数,之前讨论的非对称模型的架构差异很小。如前所述,首先对句子进行编码,使用距离函数来产生预测而不是任意的非线性。下面简述孪生网络

孪生网络框架

def Siamese(text2vec, similarity_metric):
    def forward(text1, text2):
        vec1, bp_vec1 = text2vec(text1)
        vec2, bp_vec2 = text2vec(text2)
        # If we were doing an asymmetric model, we'd have:
        # sim, bp_sim = multi_layer_perceptron(concatenate(vec1, vec2))
        # cat(vec1, vec2) differs from cat(vec2, vec1) -- hence the asymmetry.
        sim, bp_sim = similarity_metric(vec1, vec2)

        def backward(d_sim, optimize):
            d_vec1, d_vec2 = bp_sim(d_sim, optimize)
            d_text1 = bp_vec1(d_vec1, optimize)
            d_text2 = bp_vec2(d_vec2, optimize)
            return d_text1, d_text2
        return sim, backward
    return forward

上述Siamese函数调用了两个函数——text2vecsimilarity_metric使用text2vec函数对输入中的每个文本进行单独编码,然后使用similarity_metric进行比较。假设每个函数返回一个回调以完成其反传过程。鉴于此,孪生网络的反向传播逻辑非常简单。每个回调返回相对于原始函数输入的梯度,给定原始函数输出的梯度。对于相似性度量,一直在使用Chen(2013)的距离函数(推荐阅读该硕士论文)Cauchy Similarity介绍如下

Cauchy Similarity

def ChenCauchy(length):
    '''Create a trainable similarity function, that will return the similarity
    and a callback to compute the backward pass given the gradient.

    An optimizer can be passed to the callback to update the weights, e.g.
    Adam, SGD momentum, etc.
    '''
    weights = numpy.ones((1, length,))

    def forward(x1, x2):
        diff = x1-x2
        dist_vec = diff**2
        weighted_dist = weights.dot(l1_vector)
        weighted_dist *= weighted_dist > 0
        sim = 1. / (1+weighted_dist)

        def backward(d_sim, optimize):
            d_weighted_dist = d_sim * (-1 / (weighted_dist+1)**2)
            d_weighted_dist *= weighted_dist > 0
            d_weights  = d_weighted_dist * dist_vec
            d_dist_vec = d_weighted_dist * weights
            d_diff = 2 * d_dist_vec * diff
            d_x1 = d_diff
            d_x2 = -d_diff
            optimize(weights, d_weights)
            return d_x1, d_x2
        return sim, backward
    return forward

对于text2vec函数一直使用之前发布的博客——Maxout Window Encoding引入的卷积层。MWE层与BiLSTM具有相同的目标:提取更好的特征。它会根据周围的上下文重写每个单词的向量。这是有用的,因为它绕过了字矢量的主要限制。我们知道像duck这样的词可以有多个含义(鸭子、躲避、人名等),我们想要一个反映上下文意义的向量。

3c5cb5d9f3d1398270ea34d32cbff033f9278b62

将鼠标悬停在向量上以查看哪些单词用于计算:悬停在单词上,看看它们影响的向量去原文尝试
        上图显示了单个MWE块如何重写每个单词的向量。可以将输出视为三角形向量——它们基于三字窗口中的信息构建每一层越深接收域加宽下面是完整的模型定义,使用的是SpaCy 2.0的神经网络模型开发库Thinc

模型定义

 
def build_siamese_network(width, depth):
    embed = StaticVectors('en', width)
    pooling = concatenate(mean_pool, max_pool)
    mwe_encode = chain(ExtractWindow(nW=1), Maxout(width))

    # Define a little DSL for block, for convenience.
    with Model.define_operators({'>>': chain, '**': clone}):
        sent2vec = (
            get_word_ids(Model.ops)
            >> flatten_add_lengths
            >> with_getitem(0, embed >> mwe_encode ** depth)
            >> pooling
        )
    model = Siamese(sent2vec, CauchySimilarity(Model.ops, width*2))
    return model

在MWE层之后,获得两个矩阵,每个文本对应其中的一个。矩阵可以具有不同的长度,并且需要输出单个相似性得分。下一步是模型中最弱的部分:为了比较这些矩阵,通过采用它们的元素均值及其元素最大值来将矩阵减少为两个向量。在这两个操作中,最大趋向于具有更多信息——但是使用两者往往比仅使用最大更好。
结果和显著例子
       下表显示了Quora和StackExchange数据的开发集精度。既然没有一个指定的训练/验证/测试拆分语料库,因此我一直将数据集随机分成对应的10%30%、60%三部分下表仍然是初步结果,并且模型的超参数还没有得到很好的调整。

9468aa5b61ffd4941f938ea26a5181579568ae56

尽管有这些附加说明,但对称网络的准确性得到提高是非常一致的。在Quora数据中,准确度提高了2.3%——比我之前看到任何改变的进步都大。最大窗口编码层也似乎有帮助,虽然结果的不一致使得这点难以确定。
比较两个模型的输出是有趣的,特别是与分配给每个单词的GloVe向量的简单未加权平均值相比较。在交互演示中,看看下面的例子:

2a9c9ae0eb7c6e0ab556ef1ac8137c01cedef33f

在尝试的大多数示例中,默认的相似度模型(其采用简单的向量平均)偏高。Quora和StackExchange模型的输出差异大部分可以通过培训文本的不同领域来解释。另外还可以看到协调策略的效果,因为它控制重复项的定义。例如在Quora数据中,细节不同的问题(例如地点)被视为重复问题,因此该模型学习注意单个命名实体。

这些模型中没有一个揭示他们正在分类的文本对的“真实”相似性因为均值是多维的,以至于文本段在某些方面总是相似的,而在其他方面是不同的。因此,需要的标签将始终取决于些对应用程序很重要关系。
         如果尝试相似性分数中获取一个意图标签,可能将两个句子视为相同的动词但不同的类似对象——它们都将触发同一个函数。或者,如果尝试在产品评论中集中意见,则该对象可能是决定性的维度。使用示例数据算法无法猜出你想要什么,除非你告诉它,这就是为什么监督的方法是如此有用。

作者信息

Matthew HonnibalAI技术的领先专家,以其研究、软件和著作而闻名;他于2009年完成博士学位,并再度进行了长达5年的研究发表了最先进的自然语言理解系统;在2014年离开学术界,开发了SpaCy——用于工业级NLP的开源库。

Email:matt@explosion.ai

twitter:https://twitter.com/honnibal

github:https://github.com/honnibal

scholar:https://www.semanticscholar.org/search?q=Matthew%20Honnibal

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《Supervised similarity: Learning symmetric relations from duplicate question data》,作者Matthew Honnibal,译者:海棠,审阅:

附件为原文的pdf

文章为简译,更为详细的内容,请查看原文

翻译者: 海棠 

Wechat:269970760 

Email:duanzhch@tju.edu.cn

微信公众号:AI科技时讯

157f33dddfc596ede3681e0a2a0e7068dc288cc1

目录
相关文章
|
6月前
|
机器学习/深度学习 运维 算法
大模型开发:解释监督学习和非监督学习之间的区别。
监督学习与非监督学习是机器学习的两大分支。监督学习使用带标签的训练数据来学习预测模型,如线性回归、SVM,常用于分类和回归问题。非监督学习则从无标签数据中挖掘模式和结构,如聚类、PCA,适用于市场细分和异常检测。关键在于根据任务和数据选择合适的方法。
268 1
|
机器学习/深度学习 算法 Python
K最近邻算法:简单高效的分类和回归方法(三)
K最近邻算法:简单高效的分类和回归方法(三)
|
3月前
|
机器学习/深度学习 运维 算法
监督算法和无监督算法之间的区别
【8月更文挑战第23天】
91 0
|
5月前
|
机器学习/深度学习 分布式计算 算法
在机器学习项目中,选择算法涉及问题类型识别(如回归、分类、聚类、强化学习)
【6月更文挑战第28天】在机器学习项目中,选择算法涉及问题类型识别(如回归、分类、聚类、强化学习)、数据规模与特性(大数据可能适合分布式算法或深度学习)、性能需求(准确性、速度、可解释性)、资源限制(计算与内存)、领域知识应用以及实验验证(交叉验证、模型比较)。迭代过程包括数据探索、模型构建、评估和优化,结合业务需求进行决策。
57 0
|
数据采集 存储 运维
K最近邻算法:简单高效的分类和回归方法
K最近邻算法:简单高效的分类和回归方法
|
机器学习/深度学习 数据采集 并行计算
K最近邻算法:简单高效的分类和回归方法(二)
K最近邻算法:简单高效的分类和回归方法(二)
|
数据挖掘 索引 Python
Python实现固定效应回归模型实现因果关系推断(二)
Python实现固定效应回归模型实现因果关系推断(二)
923 1
Python实现固定效应回归模型实现因果关系推断(二)
|
Python
Python实现固定效应回归模型实现因果关系推断(一)
Python实现固定效应回归模型实现因果关系推断(一)
838 0
Python实现固定效应回归模型实现因果关系推断(一)
|
机器学习/深度学习 算法 数据挖掘
自组织特征映射神经网络-2| 学习笔记
快速学习自组织特征映射神经网络-2。
自组织特征映射神经网络-2| 学习笔记
|
算法 知识图谱
InfoGraph:基于互信息最大化的无监督和半监督图表示学习
InfoGraph:基于互信息最大化的无监督和半监督图表示学习
433 0
InfoGraph:基于互信息最大化的无监督和半监督图表示学习