­

TinyBERT 搜索:比BERT快10倍,小20倍

  • 2020 年 2 月 21 日
  • 筆記

最近,Google推出了一種新的方法來進行搜索並決定你看到的結果。這種方法基於流行的開源 transformer BERT,使用語言理解來獲取搜索背後的含義,而傳統的關鍵字方法無法做到這一點。

我們構建 NBoost 是為了讓非 Google 用戶也能方便地使用高級搜索排名模型,在這個過程中,我們開發了 TinyBERT,這就是我在本文中要介紹的內容。

尤其是對於更長的、更具會話性的查詢,或是在「for」和「to」等介詞對詞義非常重要的情況下進行的搜索,將能夠理解查詢中單詞的上下文。你可以用一種你覺得很自然的方式去查找。 ——Pandu Nayak,Google搜索副總裁

使 BERT 更小但更快


BERT 已經被證明可以改進搜索結果,但有一個缺點:運行這些查詢理解模型需要大量的算力。當在面臨速度很重要並且需要處理數以百萬計的搜索時,這一點尤其關鍵。這一挑戰如此艱巨,以至於Google甚至建立了自己的硬體——雲 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