Milvus 向量搜索引擎開源半年以來,全球已經有過百家企業或組織用戶。小米做爲一家專一於智能硬件和電子產品研發的全球化移動互聯網企業,也是 Milvus 的重要用戶。git
隨着信息技術和互聯網行業的發展,信息過載成了人們處理信息的挑戰。對於用戶而言,如何在以指數增加的資源中快速、準確地定位到本身須要的內容是一個很是重要的事情。對於平臺而言,如何把恰當的內容及時呈現給用戶,從而促進點擊量和閱讀量,也是一件頗具難度的事情。github
當你打開小米手機上的瀏覽器,後臺系統會向用戶推薦其感興趣的優質文章和熱點內容等。使用 Milvus 來加速其類似文章的檢索速率。算法
資訊類推薦系統中的核心是從海量的文章庫中挑選合適的文章最終展現給用戶。因爲庫中數量大,所以常見的推薦系統通常分爲兩個階段,即召回階段和排序階段。召回階段主要是從全量的庫中獲得用戶可能感興趣的一小部分候選集,排序階段則是將召回階段獲得的候選集按必定的指標進行精準排序,推薦給用戶。瀏覽器
召回階段,根據用戶的興趣和點擊等信息,從幾十萬的文章底庫中召回幾千篇最適合用戶的文章,再對這幾千篇文章進行個性化的排序,最後進行展示處理,推薦給客戶端。用戶在客戶端進行點擊操做時,可以根據用戶的線上行爲實時反饋,快速跟蹤用戶的偏好,對用戶進行新的推薦。網絡
在資訊類文章的推薦場景下,召回一般還須要知足時新性。因此在此類場景中,召回模型要知足以下幾點:架構
(1) 高效性:要在很短的響應時間內完成文章的召回;(2) 相關性:要儘量召回那些匹配用戶興趣的文章;(3) 時新性:新上線的文章,也要能被召回,以確保最新的內容也有曝光的機會;app
在用戶的具體場景中,其信息流的類似文章召回階段中,除了召回用戶感興趣的文章以外,還用於肯定新的熱點文章推廣範圍,將新的熱點文章與庫中的歷史文章作類似度檢索,獲取與之類似度最高的 K 篇歷史文章,而後根據 K 篇類似文章的點擊率,判斷新的文章的熱度,肯定給用戶的推薦範圍。框架
Milvus分佈式
Milvus向量類似度搜索引擎能夠對接包括圖片識別,視頻處理,聲音識別,天然語言處理等深度學習模型,爲向量化後的非結構數據提供搜索分析服務。經過深度學習模型將非結構化數據轉化爲特徵向量導入Milvus庫,Milvus對特徵向量進行存儲並創建索引,而後在Milvus中進行搜索,Milvus將返回檢索向量的類似結果。性能
BERT
BERT 模型是一個新的語言表達模型(language representation model),全稱是 Bidirectional Encoder Representation Transformers,即雙向Transformer的Encoder。能夠理解爲這是一個通用的 NLU (Natural Language Understanding) 模型,爲不一樣的 NLP 任務提供支持。模型的主要特色:
BERT的網絡架構使用的是多層 Transformer 結構,其最大的特色是拋棄了傳統的 RNN 和 CNN,經過 Attention 機制將任意位置的兩個單詞的距離轉換成1,有效的解決了 NLP 中棘手的長期依賴問題。
Transformer 的網絡架構如圖所示,由 Multi-Head Attention 和一個全鏈接組成,用於將輸入語料轉化成特徵向量。
BERT 的網絡結構以下圖,該圖中的一個 'trm' 對應上圖的 Transformer 的網絡架構。
BERT 提供了簡單和複雜兩個模型,對應的超參數分別以下:BERT BASE: L=12,H=768,A=12,參數總量110M;BERT LARGE: L=24,H=1024,A=16,參數總量340M;
在上面的超參數中,L 表示網絡的層數(即 Transformer blocks 的數量),A 表示 Multi-Head Attention 中 self-Attention 的數量,filter 的尺寸是 4H。
在小米瀏覽器首頁推薦系統中實現的文章召回系統可分爲三個模塊:向量化服務, ANN 服務、ID Mapping 服務這三部分:
向量化服務:經過深度學習模型將文章標題轉化爲通用句向量。這裏採用的是基於 BERT 調整的 SimBert 模型。SimBert,跟 BERT 模型一致,12層模型,hidden size爲768。simbert 是使用基於模型 chinese_L-12_H-768_A-12 進行繼續訓練,訓練任務爲「度量學習+UniLM」,以 Adam 優化器(學習率2e-6,批大小128)在單個 TITAN RTX 上訓練了117萬步。簡單來講,這就是一個優化過的 BERT 模型。
ANN 服務:將文章標題的特徵向量插入 Milvus 的 collection 中(這裏的 collection 至關於結構化數據裏的表),而後用 Milvus 作向量類似度檢索,獲得類似文章的 ID。
ID Mapping 服務:經過 Milvus 檢索結果獲得的 ID,獲取對應文章的曝光度、點擊量等相關信息。
召回系統總體架構圖以下:
目前的使用場景中有數十萬的文章底庫,因爲天天都會產生新的文章數據,過期的數據也須要刪除,因此在該系統中,選擇了將 T-1 天的數據作全量更新,第 T 天的數據增量更新。全量更新也就是上圖中所示的離線更新,天天凌晨刪除掉舊的 collection,而後將已處理好的前 T-1 天的數據插入新的 collection 中。增量更新是上圖所表示的實時更新,這裏是對當天產生的新的數據實時插入的過程。數據插入完成後,在 Milvus 進行類似度檢索,而後將檢索出來的類似的文章按點擊率再一次進行排序,召回這些類似文章中高點擊率的文章。得益於 Milvus 數據快速插入和高性能檢索,在這種頻繁更新數據的場景,可以極大的提升庫中文章的更新速度,以及高點擊率文章的召回速率。
目前在推薦系統中應用最爲普遍的召回技術是將商品和用戶等信息向量化,而後經過計算向量間的類似度來實現召回,而這一技術的推廣應用很大程度上受益於基於 ANNS(近似最近鄰搜索)算法的向量類似度搜索引擎的出現,大大提升了向量類似度計算的效率。相較其餘相似產品,Milvus 集成了數據存儲功能,有更豐富的 SDK,並提供了分佈式部署的解決方案,大大下降了召回層架構搭建的工做量;同時具備更好的社區活躍度和項目支持力度,這也是小米選擇 Milvus 做爲向量類似度檢索產品的重要緣由。
但願 Milvus 在非結構化數據處理的道路上走得更遠,爲企業帶去更多的價值。同時也但願更多志同道合的夥伴加入 Milvus 開源社區,一塊兒參與、見證 Milvus 的成長。
http://github.com/milvus-io/milvus | 源碼
http://milvus.io | 官網
http://milvusio.slack.com | Slack 社區
http://zhihu.com/org/zilliz-11| 知乎
http://zilliz.blog.csdn.net | CSDN 博客