0
最近,谷歌推出了一种新的方法来进行搜索并决定你看到的结果。这种方法基于流行的开源 transformer BERT,使用语言理解来获取搜索背后的含义,而传统的关键字方法无法做到这一点。
我们构建 NBoost 是为了让非 Google 用户也能方便地使用高级搜索排名模型,在这个过程中,我们开发了 TinyBERT,这就是我在本文中要介绍的内容。
尤其是对于更长的、更具会话性的查询,或是在「for」和「to」等介词对词义非常重要的情况下进行的搜索,将能够理解查询中单词的上下文。你可以用一种你觉得很自然的方式去查找。
——Pandu Nayak,谷歌搜索副总裁
使 BERT 更小但更快
BERT 已经被证明可以改进搜索结果,但有一个缺点:运行这些查询理解模型需要大量的算力。当在面临速度很重要并且需要处理数以百万计的搜索时,这一点尤其关键。这一挑战如此艰巨,以至于谷歌甚至建立了自己的硬件——云 TPU 来运行这些模型。他们用来在生产中运行这些 TPU 的代码是私有的,所以任何想运行它的人就不那么走运了。
为了在标准硬件上运行这些模型,我们使用知识蒸馏,即使用一个较大的教师网络来训练一个较小的学生网络的过程,该网络保持了准确性,但使用的层数较少,因此通常较小,可以变得更小、更快。
图片来源:https://nervanasystems.github.io/distiller/knowledge_distillation.html
TinyBERT 架构
我们使用此 repo 中的代码进行知识蒸馏,并对其进行了修改,以便在 MS-Marco 数据集上进行训练和评估。我们最初在 Pythorch 训练了一个教师网络,设置了 Marco 训练数据集。然后我们用它作为老师来训练一个只有 4 个隐藏层的更小的学生 BERT 网络,这个学生网络不是标准的 12 层。另外,这些层中的每一层的大小只有 312 而不是 768,这使得模型更加轻巧。我们在 BERT 的末尾使用一个前馈二值分类层来产生搜索排名的分数。
搜索分数对(问题,答案)或(搜索,搜索结果),然后根据这些分数对结果进行排序
下面是我们使用的 tinyBERT 架构的 bert_config.json 示例,与标准的 bert_config 有显著的区别。
{
“attention_probs_dropout_prob”: 0.1,
“cell”: {},
“emb_size”: 312,
“hidden_act”: “gelu”,
“hidden_dropout_prob”: 0.1,
“hidden_size”: 312,
“initializer_range”: 0.02,
“intermediate_size”: 1200,
“max_position_embeddings”: 512,
“num_attention_heads”: 12,
“num_hidden_layers”: 4,
“pre_trained”: “”,
“structure”: [],
“type_vocab_size”: 2,
“vocab_size”: 30522
}
模型评估
[1] MRR 重排前 50 名的结果来自 BM25
MS Marco 是现实世界中最大的公开搜索引擎使用数据来源,是评估搜索和问答模型的理想选择。它显示了真实世界的 Bing 结果和用户最终点击的信息。当 BERT-Base 首次用于 MSMarco 时,它以 0.05mrr的速度大大超过了最先进的技术。基于 BERT 的解决方案仍然位居榜首。我们的目标是找到一种方法,从一个足够快的模型来实现这一推动作用,以便在现实世界中使用。
开始使用 TinyBERT 吧!虽然没有 BERT-Base 对重新评分有效,但我们的实验表明,它保留了 BERT-Base 的 MRR 评分的 90%,同时使模型快了约 10 倍,小了约 20 倍。然而,基于像 MS Marco 这样的学术基准的研究结果往往缺乏现实世界的概括性,因此应该谨慎对待。
via:https://towardsdatascience.com/tinybert-for-search-10x-faster-and-20x-smaller-than-bert-74cd1b6b5aec
雷锋网雷锋网雷锋网
雷峰网版权文章,未经授权禁止转载。详情见转载须知。