首发地址:https://yq.aliyun.com/articles/79584
更多深度文章,请关注:https://yq.aliyun.com/cloud
基于文本对分类的监督模型,可以根据它们之间的某些关系创建一个软件,该软件为这两个文本分配标签。当这种关系是对称的,将该约束并入模型是有用的。本文将展示孪生卷积神经网络是如何在两个重复的问题数据集上执行的效果,演示结果见此。
检测重复内容这一任务会在许多不同的平台上发生,可以从github网站Explosion AI资源库下的SpaCy问题跟踪器看到同样的问题被反复询问。幸运的是,现在有两个大型社区问答站点标有数据集——Quora数据集和来自墨尔本大学的研究人员编译的StackExchange语料库。
为了比较,演示中包含了一个无监督的基线,该基线使用来自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函数调用了两个函数——text2vec和similarity_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”这样的词可以有多个含义(鸭子、躲避、人名等),我们想要一个反映上下文意义的向量。
模型定义
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%三部分。下表仍然是初步结果,并且模型的超参数还没有得到很好的调整。
尽管有这些附加说明,但对称网络的准确性得到提高是非常一致的。在Quora数据集中,准确度提高了2.3%——比我之前看到任何改变的进步都大。最大窗口编码层也似乎有帮助,虽然结果的不一致使得这点难以确定。
比较两个模型的输出是有趣的,特别是与分配给每个单词的GloVe向量的简单未加权平均值相比较。在交互演示中,看看下面的例子:
在尝试的大多数示例中,默认的相似度模型(其采用简单的向量平均)偏高。Quora和StackExchange模型的输出差异大部分可以通过培训文本的不同领域来解释。另外还可以看到协调策略的效果,因为它控制重复项的定义。例如在Quora数据集中,细节不同的问题(例如地点)是从来不会被视为重复问题,因此该模型学习去注意单个命名实体。
这些模型中没有一个揭示他们正在分类的文本对的“真实”相似性,因为均值是多维的,以至于文本段在某些方面总是相似的,而在其他方面是不同的。因此,需要的标签将始终取决于那些对应用程序很重要关系。
如果尝试从相似性分数中获取一个意图标签,你可能想将两个句子视为相同的动词,但不同的类似对象——它们都将触发同一个函数。或者,如果尝试在产品评论中集中意见,则该对象可能是决定性的维度。使用示例数据,算法无法猜出你想要什么,除非你告诉它,这就是为什么监督的方法是如此有用。
作者信息
Matthew Honnibal:AI技术的领先专家,以其研究、软件和著作而闻名;他于2009年完成博士学位,并再度进行了长达5年的研究发表了最先进的自然语言理解系统;在2014年离开学术界,开发了SpaCy——用于工业级NLP的开源库。
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
文章为简译,更为详细的内容,请查看原文
翻译者: 海棠