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