用 TensorFlow.js 探索 BERT 在浏览器中的趣味实践

文 / 创意技术专家 Philip Bayer;软件工程师 Ping Yu 和开发技术推广工程师 Jason Mayes

在探索 BERT 针对语言的有益用例时,我们发现了许多令人兴奋的研究。我们想知道:如果我们可以让您更方便地在网络浏览器中使用 BERT,将会怎么样?这将实现哪些可能的有趣用例?

在 Google 中搜索提出类似于“自由女神像有多高?”的问题,并从网络中得到答案(305 英尺)很容易。但是,还没有办法可以轻松针对具体内容(例如,新闻报道、研究论文或文章)用自然语言提问。您或许可以尝试使用浏览器中的“在网页中查找”这一搜索功能 (CTRL + F),但此功能依赖于字词的直接匹配(通过搜索的关键字进行匹配)。那么,输入一个完整的问题而不是要查找的关键字,期待页面上能够突出显示答案,会不会更易实现?

为了探索这一想法,我们使用 MobileBERT 问答模型 制作了 Chrome 扩展程序的原型,可以在浏览网页时提出任何问题。通过 TensorFlow.js ,该扩展程序会根据页面内容返回答案。模型完全在设备端的浏览器会话中运行,因此,无需向服务器发送内容,这样可以保护隐私。

本文将介绍我们的早期试验,并分享我们的发现,阐述如何通过开源的 TensorFlow.js BERT 模型 来构建此类应用。探索示例很有帮助,在一些示例中,我们得到了所需的答案,而在一些示例中,我们没有得到所期待的结果。这让我们得以了解模型的潜力及其当前限制。我们希望这些示例可以帮助所有人都参与进来,并让每个人都能思考机器学习可以怎样为语言提供帮助。

△ 使用 Chrome 扩展程序,问一个有关文章的问题,并得到答案

我们的发现

以下是我们获得了有用答案的一些结果:

  • 介绍螃蟹 — 问题:“How do they move?” 答案:“Crabs typically walk sideways”
  • 某产品照明灯介绍页 — 问题:“Can it get wet?” 答案:“submersion in up to 1m of water for 30min”
  • 某汽车测评 — 问题:“Gas mileage” 答案:“19 miles per gallon in the city”
  • 介绍木质摩天楼 — 问题:“How tall is it” 答案:“280 feet in height”
  • 千层面配方介绍 — 问题:“How long in the oven” 答案:“25 minutes”

在一些示例中,模型没有返回我们期待的答案,但探索这些示例一样有趣。以下是我们找到的几个示例:

  • 某产品介绍页 — 问题:“What is the pitcher made of?” 返回的答案是 “Ice mode pulses at staggered intervals to uniformly crush a pitcher of ice in seconds”,而不是“BPA-free polycarbonate pitcher”
  • 某文章 — 问题:“Were the sharks real?” 返回的文字是“sharks! sharks”,但问到相关问题 “How did the sharks work?”时,给出的答案较为有用:“mechanical sharks often malfunctioned”

机器学习模型的工作原理

MobileBERT 问答模型 可用于构建一套可用自然语言来回答用户问题的系统。模型使用预训练的 BERT 模型创建,后者基于 SQuAD 1.1 (Stanford Question Answering Dataset) 进行了微调。这是一种预训练语言表征的新方法,语言表示可以在各种自然语言处理 (NLP) 任务中获取最前沿 (SOTA) 的结果。

我们很高兴地宣布,此模型现在可以在 TensorFlow.js 中 供您的用例使用。MobileBERT 模型是一个紧凑型 BERT 变体,可以部署到资源有限的设备上。

该模型将段落和问题作为输入,然后返回一段最有可能回答问题的段落。由于我们使用的是 TensorFlow.js,所有操作均在客户端的网络浏览器中进行。这意味着,用户隐私可以得到保护,不会将您的检索文本发送到服务器。

TensorFlow.js BERT API

该模型使用起来超级简单。请看下面的代码段:

<!-- Load TensorFlow.js. This is required to use the qna model. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"> </script>
<!-- Load the qna model. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/qna"> </script>

<!-- Place your code in the script tag below. You can also use an external .js file -->
<script>
  // Notice there is no 'import' statement. 'qna' and 'tf' is
  // available on the index-page because of the script tag above.
  // Load the model.
  qna.load().then(model => {
    model.findAnswers(question, passage).then(answers => {
      console.log('Answers: ', answers);
    });
  });
</script>

正如您看到的,前两行用于从托管脚本中加载 TensorFlow.js 库和 Q&A(问答)模型,因此,我们可以执行问答搜索。这只需要调用一次 - 模型位于内存中时,将保持加载状态。然后,我们可以重复调用 findAnswers(),向其传递两个字符串。第一个字符串是用户要提出的问题,第二个字符串是我们想要用来进行搜索的文字(例如,页面上的文字)。之后,我们将返回 results 对象,其结构如下所示:

[
  {
    text: string,
    score: number,
    startIndex: number,
    endIndex: number
  }
]

您将获得一组对象,表示可以最好地解答问题的段落的各个部分,同时还会获得一个分数,表示回答正确的置信度。另外,我们还会得到答案文字的索引,便于定位答案文字在上下文字符串中的位置。这就是全部内容!借助此数据,您现在可以突出显示找到的文字,返回一些较丰富的结果,或实现一些创造性的应用。

如果您想自己尝试 MobileBERT 问答模型,我们很高兴地告诉您,该模型现已开放源代码,您可以在我们的 GitHub 仓库 中找到它。如果您实现了一些有趣应用,请 与我们分享,我们期待看到有更多丰富的应用与创意!

image

原文:Exploring helpful uses for BERT in your browser with Tensorflow.js
中文:TensorFlow 公众号