选自OpenAI
作者:Jonathan Raiman
机器之心编译
参与:许迪、黄小天
本文通过让神经网络决策一个词是否属于 100 个自动发现的「类别」(非专属范畴)之一,从而建立了一个可以自动计算单词指称对象的神经网络。该方法在若干个实体消岐(entity disambiguation)数据集上实现了当前最优的提升。
通过让神经网络决策一个词是否属于 100 个自动发现的「类别」(非专属范畴)之一,我们已建立一个神经网络,可以自动计算一个词所指称的对象。比如对于语句「猎物看到美洲虎(Jaguar)穿过丛林(Jungle)」,系统会执行「20 个问题」来分析美洲虎属于哪个预分的类别,而不是去试图直接把美洲虎归类到车、动物或者其他类里。这一方法在若干个实体消岐(entity disambiguation)数据集上实现了当前最优的巨大提升。
在我们的训练数据中,jaguar 指称汽车的概率是 70%,指称动物的概率是 29%,余下 1% 的概率是飞行器。按照我们的类别,第一个实例的歧义不会改变很大,这个模型明显认可了这张图像是美洲虎(动物)跑在高速公路上——但是第二个实例中歧义改变很多,模型不认可图像是美洲虎(汽车)在丛林里穿梭。
我们在 CoNLL(YAGO) 上达到了 94.88% 的准确率(之前的最高是 91.5% 和 91.7%),并在 TAC KBP 2010 挑战赛中达到了 90.85%。先前方法使用分布式表征。类别几乎可以在这些任务上完成,完美的类别预测也只能达到 98.6%-99% 的准确率。
高阶综述
我们的系统采取以下步骤:
1. 提出每一个维基百科内部链接来确定对于每一个词所属的类别。举例,当在维基百科页面上遇到这个链接:[jaguar](https://en.wikipedia.org/wiki/Jaguar),我们可以总结 https://en.wikipedia.org/wiki/Jaguar 是 jaguar 的意思之一。
2. 用维基百科类别树来确定每一个实体属于的类别。举例,在 https://en.wikipedia.org/wiki/Jaguar_Cars 这个维基百科页面的底部是这些类别(它们有其专属类别,比如汽车)。
3. 选一个有 100 种类别的列表当作你的「类系统」,然后最大化这个分类从而使其可紧凑地表征任何实体。因为我们懂得映射实体与类别,所以给出一个类系统,我们可以表示每一个实体为一个 100 维度的矢量,这个矢量表示与每一类别的所属关系。
4. 使用每一个维基百科内部的链接及其内容,生产训练数据映射一个词+内容与那个 100 维度的对应相应类别的二进制表达式,然后训练一个神经网络来预测映射。这个系统连接起了之前的步骤:维基百科的链接联系起了一个词与一个实体,我们知道第二步里的每一个实体的类别,第三步在我们的种类里选择了类别。
5. 最后,给出一个词和附带的内容,我们的神经网络的输出就可以被理解成输入词所属于每一类别的概率。如果知道确切的每一类别的所属关系,我们会把类别范围缩小到一个(假设完美分类)。但是我们必须要问大约 20 个问题,才能用贝叶斯理论去计算这个词所属类别的概率。
更多实例
以下是我们系统的其他实例:
清洗数据
维基百科的知识图可转为训练数据源,从而把细粒度实体映射到类别。我们应用它的实例关系递归的去确定一个给定实例的类。举例,任何人类节点派生的节点都是人类类别。维基百科也可以通过它的类别链接提供实例到类别的映射。
维基百科内部链接统计提供了一个有关特定词组指称实体的概率的好的评估。但是,这个有噪声的,因为维基百科经常链接到一个具体的实物而不是连接到类别本身,代指:(国王--这个词被连接到 Charles I of England)或者链接有时候会链接到外号(转喻)。这会造成一次关联探索(比如国王这个词有 974 个关联实体)并且总有被扭曲的链接(举例:女王链接到女王乐队 4920 次,伊丽莎白二世 1430 次,还有 32 次君主)。
最简单的方法是删除少见的链接,但这会丢失信息。我们做的是用维基百科属性图来排序这些链接,如下图所示:
在这个过程之后,国王从 974 个降到了 14 个关联实体,同时女王到君主的链接数量从 32 增长到 3553 次。
学习一个好的类别系统
我们需要选择最佳的类别系统和参数,从而最大化消歧精确度。这里有大量的可能的类别集,所以让一个准确的答案变得很棘手。相反,我们通过启发式搜索或者随机优化(进化算法)选择一个类系统,然后借助剃度下降训练一个类别分类器来预测类系统的行为。
我们需要去选择有歧义的类别,(这样可以快速削减可能的实体集),同时轻松学习(所以周边的文字是用来让一个神经网络知道这里有这样一个类别)。我们通过两种启发法为我们的搜索提供信息:可学习性(预测分类器的训练结果的曲线面下平均面积数);预测正确性(如果我们能完美地预测所有类别,就可以完美地消除歧义)。
在给定语境窗口的情况下,我们训练一个二值分类器来预测我们数据库里 150000 个类别中的每一个的所属性。这个分类器的曲线下面积就变成了这一类的「可学习性分数」。高的曲线下面积意味着这一类是容易被从内容中预测的。表现差可能意味着我们的训练数据很少,或者词窗口几乎没有任何用处(这种情况一般对于非自然的类比如 ISBN 是正确的)。训练我们的整个模型需要数天,因次我们使用一个更小的模型作为我们的「可学习性分数」的代理,同时训练时间只需 2.5 秒。
我们现在可用这些可学习性分数和计数统计来估计给定类型子集的性能作为我们的类型系统。下面你可以跑交叉熵方法去发现你浏览器里的类别。注意改变取样大小和惩罚是如何影响解决方案的。
为了更好地可视化类别系统设计的哪一部分简单,哪一部分又比较难,我们希望你可以亲自试手设计。选择一个高级域名后,你可以开始查看歧义实例。有可能的回答别圈起来显示在顶端,正确答案是有颜色的圈(hover 以查看其名称)。最下面的一排包含了你可以用的类别。连接顶端与底端的线显示继承关系。选择你想要的关系。一旦你有了足够的关系去区分正确的答案,这个实例就是有歧义的。
神经类别系统
从我们的类系统优化中选用最好的答案,然后我们可以用类系统生产出来的标签来标注维基百科的数据。用这个数据(在我们的实验里有英语和法语的 400M 个标记),现在我们可以训练双向 LSTM 来独立地预测每个词的所有类别属性。在维基百科源文本中,我们只监督了内部的维基链接,但是这也足够训练出了一个在 F1 上预测类别准确率为超过 91% 的深度神经网络。
推理
预测文档中的实体通常依赖于不同实体之间的「一致性」度量,比如:在一个长度为 O(N^2) 的文档里,测量每一实体相互之间的契合程度。但我们的运行时间是 O(N),因为我们只需要在字典树(trie)中查找每个短语,将短语映射到其可能的含义。我们根据维基百科里的链接频率,排序所有可能的实体,接着按照这些链接是否仍属于该类而更精确地改变排序。可通过指定它们的类别归属(人、动物、国家、周期等)添加新实体。
下一步
在解决这一问题上,我们的方法与之前有很多不同。我们感兴趣的是分布式表征的端到端学习与这里开发的基于类别的推理相比表现如何。这里的类型系统是使用一个小的维基百科子集发现的,将其扩展到整个维基百科能够带来一个应用更广泛的类别系统。希望我们的代码对你有帮助!
原文链接:https://blog.openai.com/discovering-types-for-entity-disambiguation/
本文为机器之心编译,转载请联系本公众号获得授权。