品玩知科技丨这个有点酷的搜索引擎叫Magi( 五 )


+ 元” 等关系即能提取出关键信息;很多时候此类产品的候选实体 {A B C … 都是有预设库的 , 而且还能对数字等信号用正则表达式特别处理 。 对于各种细分领域的行业应用 , 这么做能在满足需求的前提下将问题的复杂性大大降低 。 但我们认为 , 上述方案仅仅是凑合够用 。 往大了想 , 假如一个医疗领域的 AI 在阅读文献资料时 , 同时还看了各个健康论坛和问答平台中网友的讨论 , 它一定能利用更多的背景信息给出更好的建议;一个金融信息抽取模型 , 如果同时读过各个产业的业界新闻 , 一定能避免大量的常识错误 。 往小了说 , 一个现实又残酷的问题是:细分行业的结构化训练数据太少了 , 而 curation 非常昂贵缓慢 , 其专业性导致难以仿照图像分类那样进行众包标注 , 两个标注者之间的理解差异或是单纯的语言习惯不同都可能导致训练不收敛或干脆学呲了 。 Magi 希望通过提高信息的利用率以带来改变 。 具体来说 , Magi 不再依赖于预设的规则和领域 , “不带着问题” 地去学习和理解互联网上的文本信息 , 同时尽可能找出全部信息 (exhaustive) 而非挑选唯一最佳 (most promising) 。 对于我们人类来说 , 面对一篇陌生的文章时 , 即使把大量专有名词和术语遮住 , 也仍能利用语法和语言习惯来根据上下文判断出被遮蔽内容之间的大致逻辑关系 。 同理 , Magi 通过一系列预训练任务淡化了具体实体或领域相关的概念 , 转而学习 “人们可能会关注内容中的哪些信息?” 。 我们为 Magi 设计了专门的特征表达、网络模型、训练任务、系统平台(下面都会讲到) , 并投入大量精力逐渐构建了 proprietary 的专用训练/预训练数据 。 Magi 通过终身学习持续聚合和纠错 , 为人类用户和其他人工智能提供可解析、可检索、可溯源的知识体系 。 普通用户可以随时体验公众版的 magi.com , 以文本的形式检索和查看知识 , 而程序则可以选择通过 DSL 或向量化的形式访问 Magi 更为广阔的结构化网络 。 与此同时 , 我们还做到了不再使用 HTML 标签特征 , 直接处理纯文本 。 众所周知 , HTML 的标签信息能提供额外的语义信号 , 让信息提取变得清晰 。 Crestan et al. (2011) 的调查显示大约 75% 的页面带有 table , 排除用于导航和排版的 , 仍有 12% 的 table 是有语义价值的 , 可见仅通过 HTML Table Mining 就能获得很多有意义的数据 。 但是该研究也显示了互联网上便于处理的信息仅仅是沧海之一粟 , 事实上大部分信息都不是以半结构化的形式存在的 , 比如很多企业的内部文稿、论文正文、社交平台内容 。 Magi 想要提升信息的利用率则注定要走出 HTML 的舒适圈 , 该能力是我们推出 Magi for Enterprise 服务的通用性前提 。 在 magi.com 搜索 “系统性红斑狼疮” , 可以看到我们在同一来源中学习到了多级的派生(见“标签”部分)和重叠的三元关系(见“属性”部分 , 可点击省略号展开) 。 而且各个来源网页中均无有意义的表格等可利用的 HTML 标签 , 证明我们是完全以纯文本作为模型的输入内容 。 需要指出的是 , Magi 的学习是持续自动进行的 , 有的知识可能会被系统判定为不可靠而被淘汰掉 , 也会有新的知识(或噪音)被学到 , 所以我们不敢保证在您尝试搜索时看到的结果是否还能作为证据 。 以下屏幕截图拍摄于 2019年9月6日11:38 , 上述例子是随便选的一个整体质量中庸的(红黄绿的颜色代表 Magi 给出的可信评分级别) , 我们绝不会为展示做任何人工干预: \n 覆盖率和时效性 本节主要介绍以下两点: 3. 配合自家 web 搜索引擎以评估来源质量 , 信息源和领域不设白名单;4. 大幅提升实时性 , 热点新闻发布后几分钟内 , 就可以搜到结构化知识了; 用户最终所能触及的信息 = 模型对信息的利用率 x 输入信息的覆盖率 。 上文所述的通用性是提取模型和算法层面的属性 , 而若要真正提供有价值的服务 , 还需要数据方面的支持 。 公众版的 magi.com 致力于从互联网信息中寻找有价值的数据 , 让原本被埋没于字里行间的知识有机会走入到各种知识图谱中 , 同时作为背景知识来迁移学习增强垂直领域的定制化服务 。 然而 , 互联网语料质量参差不齐 , 抄袭拼接、自动生成、恶意篡改等行为会造成大量事实性错误 , 甚至可能让模型在持续的学习调整过程中越来越差 。 对于这类问题 , 最简单也是最常用的方案就是设置可信来源的白名单机制 , 例如仅学习权威媒体和专业提供者的内容 , 而无视类似于社交平台或自媒体的 UGC 来源 。 白名单机制确实能避免很多麻烦 , 但也同时损失了大量的有价值的信息 , 尤其体现在一些边缘性的、亚文化的、无权威概念的领域 。 Magi 最重要的目标之一就是规模化 , 所以白名单机制是不可接受的 。 为此我们投入了大量时间和精力从零研发了一套 web 搜索引擎(未使用任何开源方案 , 另见 面向硬核用户的问题与解答) , 一方面是为了作为 magi.com 的补充呈现 , 更重要的是为 Magi 提供所需的统计信息 。 对于任何知识 , Magi 会综合多种不同的信号来作出评估 , 主要包括: Clarity:信息在来源文本中表达的清晰度和客观程度 。 清晰度既包含文本自身语义层面的准确 , 也包含 Magi 提取模型认知的激活强度(可近似理解成 AI 认为正确的概率) 。 语义层面 , 一般关注语气是否中立平和、上下文是不是在否定、文本是不是类似于习题的疑问句等等 , 加上更多难以明确描述的但模型(可能)已经掌握的信号 , 比如整个文章是不是 troll 。 提取模型的激活强度可直观理解成 Magi 对自己读到的信息有几成把握没理解错 。 当然 , AI 都会犯错 , Magi 自然也不例外 。 通常来说 , 上下文长而复杂、表达隐晦、主语和指代不清等情况下 Magi 更容易犯错 , 会产生一些 false positive 。 好在 , 学习的过程是持续进行的 , 这些错误会在 Magi 从别处学到更可靠的信息时被过滤或修复 。 Credibility:可交叉验证的来源的数量、质量、关联 。 学术领域 , 一篇论文的引用越多 , 可认为其影响力越大;web 搜索中 , 一个 URL 的 backlink 越多 , 可认为其重要性越高 。 对于知识 , 我们认为某一事实在越多的上下文中被表达 , 则可认为其正确性和流传度更强 。 值得注意的是 , 网络中有大量转载、抄袭、复读机 , 所以我们进一步定义为:对于某一事实 , 有越多高质量的来源用不同的上下文和表达方式去提及 , 则可认为其越可靠 。 我们采用类似 Gy?ngyi et al. (2004) 的 TrustRank 机制去追踪各个来源自身的质量 , 信誉优秀的作者的文字和牛皮癣广告页上的内容不会被一概而论 。 而不同的上下文和表达方式体现了内容是经过思考和再提炼的 , 在 magi.com 展开的来源卡片中 , 我们的用词是 “%d组上下文” , 正是因为我们会把过于相似的来源聚合 , 且这种相似不只是字面上的重复 , 而是上下文表达方式的接近 。 Catholicity:信息的普适性 , 例如随着时间推移的变化情况 , 以及是否含有恶意或非法内容等方面 。 做过搜索引擎或爬虫的人一定知道 , 互联网上是没有可信的日期的 , 你只能确定某内容一定出现在本次抓取之前 , 但页面上写的 “发布于一小时前” 很可能是骗你的 。 于是 , Magi 不仅会尝试从内容中探测信息产生的时间 , 还会对有多种可能性的知识去追踪起止时间和热点区间(例如职务变更和总统换届) , 并依此过滤一些噪音 。 普适性自然也包括信息是否适宜被展示 。 AI 由于本身几乎没有前置的常识和法律知识 , 在面对互联网上鱼龙混杂的信息时 , 有小概率提取到与预期差距较大的信息 , 甚至获取到有害信息 。 Magi 积累数据的速度之快和领域之广导致我们难以进行人工审核 。 目前 , 我们综合多种方法降低可能带来不良信息的内容来源被用作学习的可能性 , 并将持续改进以保证 Magi 在其运营地区能配合相关部门 , 在相关法律法规框架下 , 合规地为用户提供服务 。 以上三个 “C” 是 Magi 权衡知识工程的规模化和准确性难题的量化标准 , 是提升信息覆盖率的基石 。 当然 , 只有覆盖率还不够 , 时效性同样重要 。 一方面 , 时效性体现在上文提到的对既有知识的时间线追踪 。 另一方面 , Magi 必须能保持持续学习 , 用尽可能少的时间掌握新产生的知识和数据 。 为了在尽可能低的成本内实现这个目标 , 我们不使用臃肿的 headless 浏览器 , 而是(又双叒叕)从头研发了可弹性伸缩的 stream-based 的分布式抓取系统 , 在最小程度支持 JavaScript 的同时避免了大量无意义性能开销和安全风险 , 显著降低 TCO 。 这套系统作为共享的数据池 , 同时服务于 Magi 的知识提取、web 搜索、数据统计等组件 。 终于 , Magi 做到了不再周期性触发 batch 更新 , 整个系统持续在线上学习、聚合、更新、纠错 , 每秒都在变 。 事实上 , 热点新闻中的信息 Magi 一般在 5 分钟之内就能学到 。 下面这个例子是 小米 MIX Alpha 发布会时的几张截图 , 这次小米保密做的还不错 , 一直没有剧透价格 , 所以比较适合作为时效性的例子:第一张截图是手机发布后 , Magi 从一篇速报中学到了我们期待的知识;第二张截图是又过了 10 分钟 , 可以看到已经积累了更多的来源上下文 , 该信息的可信度进一步提升;第三张截图是在当天晚上 , Magi 掌握了小米 MIX Alpha 的众多信息 , 我们关注的价格一项已经具有一定的可信度(绿了!) 。 \n \n \n 可塑性和国际化 本节主要介绍以下两点: 5. 没有前置 NER 和 dependency parsing 等环节 , 减少母文本信息的损失;6. 技术栈完全 language-independent , 可以实现低资源和跨语言 transfer 。 若要让程序实现 Magi 这种能力 , 大家的第一反应可能是借助 dependency parsing 等方法 , 或者抽象为 sequence labeling 然后具体问题具体分析 。 早先 , 我们也不例外地选择过类似的方案 , 但在上了一定规模后 , 很多问题开始显现出来 , 究其根本原因在于环节增加在提升抽象能力的同时损失了有效信息 。 先别着急往 ResNet 那边想 , 这里我说的 “环节” 要更具象一些:举个最浅显的例子 , 在面对复杂任务时 , 经典的做法是把分词、嵌入、NER、SRL、依存分析等等方法串联 , 形成一个越来越窄的 “沙漏” , 其中越后面的环节越接近最终需求 。 这带来了三个问题:第一 , 最明显的就是错误的不可逆放大 , 后置环节永远无法弥补前置环节的错误 , 比如分词一旦错了 , 再好的依存分析算法也无力回天;第二 , 比错误放大更隐蔽的是母文本信息的丢失 , 例如在 Magi 面对的任务中 , 上下文中的每个字都可能同时扮演多种角色 , 而每一种角色的概率则要看与其他角色共同构成的关系是否成立 , 过早分环节会丧失提取全部有效信息的机会;第三 , 就是越靠后的环节的训练数据越少 , 收集整理的成本越高 , 难以定制并服务垂直领域 。 当然 , 随着芝麻街小伙伴们(ELMo BERT ERNIE)的火爆 , 各种端到端的自然语言处理方案浮出水面 , 但实际上 “环节” 这个概念仍然没有消失 。 ”环节“ 被特征表达、训练目标、网络内部结构等因素整体稀释到了各层参数中 。 我们为 Magi 的提取模型设计了专用的 Attention 网络结构以及数个配套的预训练任务 。 具体来说 , 网络结构主要解决了复杂依赖关系和搜索空间爆炸的问题 , 让长文本下高效的 exhaustive 的知识提取成为可能 。 预训练任务则是对上述 “环节” 问题的新尝试 , 主要目标是淡化实体、predicate、领域的约束 , 充分利用多种不同的训练数据 , 并且降低线上持续学习修正过程中模型更新的开销 。 同时 , 模型的迁移能力也是我们关注的重点 , 具体包括跨语言和 low resource 两种情况 。 由于技术栈本身已经完全 language-independent , 我们在设计预训练任务时 , 会专门 “引导” 并期望模型能在较浅层对语言有足够的抽象能力 。 为了验证这一设计 , 我们曾经测试过 zero resource 的情况:使用多语言语料对部分网络进行预训练后锁定权重 , 将输出作为 feature 结合中文样本训练最终的提取任务 。 这个中文单语言模型在英日韩语的小规模 benchmark 中仍然获得了较高的 precision 和差强人意的 recall , 值得指出的是日语虽然和中文共享部分 grapheme , 但语序显著不同(中文是主谓宾 , 日语是主宾谓) 。 事实上 , magi.com 上能搜到的来自外语网页的结构化知识 , 都可以理解为这种触类旁通 。 \n 对于结构化样本稀缺的细分行业应用 , 配合我们提供的图形化桌面软件 Ireul Studio , 企业用户可方便地标注和训练特定需求的模型 。 该工具的界面类似 AutoML 的实体识别训练界面 , 非常直观易用 , 只需留意标注的目标不只是实体 , 而是完整的关系 。 训练时 Magi 会同时使用 magi.com 积累的海量知识和 proprietary 的预训练数据 , 因此仅需少量样本进行 fine-tuning 即可服务某一细分垂直领域 。 不足与展望 我们不能只谈优点 , 上述改变其实也带来了新麻烦 , 甚至有的比以前更棘手 。 一个典型的例子就是消歧义: 每组被提取出的信息都有一个 context 向量 , 现阶段我们仅是把足够相似的 context 下的信息合并 。 很明显这种方法不够理想 , 但考虑到持续学习的场景 , 就需要格外的谨慎 。 持续学习的过程中模型会更新 , 错的和旧的数据会被淘汰 , 数据库中沉淀的数据和新学的数据不断融合 , 容易导致一致性问题 , 最终影响系统持续运转的能力 。 消歧义弄的太严会产生大量割裂的版本 , 太松又会混作一团 。 老用户可能发现多级查询没有继续提供了 , 正是因为精准的消歧义是其前置条件 , 我们正在努力改进这部分功能 。 另一方面 , 我们自认为模型和任务设计较为精巧 , 但工程上还不太满意 。 最明显的是尚无法在计算图的框架内实现我们需要的几个中间环节 , 一个宏观概念上可部署的 “模型” 要分开训练 3~4 个 graph(当然好处是能部分复用) , 其中 2 个在 freeze 和 quantize 时能拼起来 , 剩下的 runtime 连接 , 所以 inference 时有很多 context switch 和拷贝 overhead 。 诸多原因最终导致这玩意比较贵 , 又吃 CPU 又吃 GPU , 最小部署上线 inference 也需要 6 张 Tesla T4 , 在速度和成本方面还有提升空间 。 当然 , 是 AI 就会犯错 , 尤其是咱们 “实验室里的人工智能 , 现实生活中的人工智障”—— NLP 领域的 。 在开发过程中我们遇到了太多错的想笑的结果 , 有的甚至充满了禅意: \n 最后 , 我们会继续追求规模化和准确度上的突破 , 让 Magi 有资格作为知识的 ImageNet 来直接或间接地帮助更多人(和其他 AI) , 甚至在通向可解释人工智能的道路上发挥自己的微薄之力 。 “品玩知科技”系知乎和 PingWest品玩 联合出品的精品栏目 , 知科技是知乎科技数码领域的官方机构号 。 针对科技热点新闻和好玩儿的数码体验 , 第一时间为用户带来可信赖的解读 。 \n \n

推荐阅读