參考
https://tech.meituan.com/2018/06/21/deep-learning-doc.html
背景
我最近在做query suggestion,根據前綴去推薦問題。
文本匹配在很多信息檢索相關場景都用到,比如
1、搜索:Query-Doc
2、廣告:Query-Ad
3、搜索Suggestion:Query前綴-Query
我現在只會用前綴樹和布爾模型(匹配到了幾個字是一樣的,然后用log頻率做一個排序)。但是后面肯定要去做優化的,你只停留在1970年不行啊。
其中一個難題就是設計模型如何充分考慮語義。因為中文的多義詞、同義詞非常普遍,它們在不同的語境中表達的含義是不一樣的。比如蘋果多少錢一台?蘋果多少錢一斤?
語義表示匹配模型演進歷程:
1. 向量空間
對文本“麗江的酒店價格”分詞去除停用詞后,得到麗江、酒店、價格,詞出現次數是1,查表IDF得到這句文本的表示:[0, 1.5, 2.1, 0, 0, …, 0, 4.1]。其中權重使用的是TF×IDF,TF是Term在文本里的頻次,IDF是逆文檔頻次(查表)。
文檔有了向量表示,那么如何計算相似度?
度量的公式有Jaccard、Cosine、Euclidean distance、BM25等,其中BM25是衡量文檔匹配相似度非常經典的方法,公式如下
2. 矩陣分解
向量空間模型的高維度對語義信息刻畫不好,文檔集合會表示成高維稀疏大矩陣。1990年左右,有人研究通過矩陣分解的方法,把高維稀疏矩陣分解成兩小矩陣,而這兩個低維矩陣包含了語義信息,這個過程即潛在語義分析。
假設有N篇文檔,共有V個詞,用TF-IDF的向量空間表示一個N×V的稀疏矩陣X,
3. 主題模型
2000~2015年,以概率圖模型為基礎的主題模型掀起了一股熱潮,那么究竟這種模型有什么吸引大家的優勢呢?
pLSA(Probabilistic Latent Semantic Analysis)
假設每篇文章都由若干主題構成,每個主題的概率是p(z|d),在給定主題的條件下,每個詞都以一定的概率p(w|z)產生。這樣,文檔和詞的共現可以用一種產生式的方式來描述:
可以通過EM算法把p(z|d)和p(w|z)作為參數來學習,具體算法參考Thomas Hofmann的pLSA論文。需要學習的p(z|d)參數數目是主題數和文檔數乘的關系,p(w|z)是詞表數乘主題數的關系,參數空間很大,容易過擬合。因而我們引入多項式分布的共軛分布來做貝葉斯建模,即LDA使用的方法。
4. 深度學習
在2003年,Yoshua Bengio使用神經網絡來訓練語言模型比N-Gram的效果好很多,網絡結構如圖9所示。輸入是N-Gram的詞,預測下一個詞。前n個詞通過詞向量矩陣Matrix C(維度:n*emb_size)查出該詞的稠密向量C(w(t-1)),C(w(t-2));再分別連接到隱含層(Hidden Layer)做非線性變換;再和輸出層連接做Softmax預測下一個詞的概率;訓練時根據最外層誤差反向傳播以調節網絡權重。可以看出,該模型的訓練復雜度為O(n×emb_size + n×emb_size×hidden_size + hidden_size×output_size),其中n為5~10,emb_size為64~1024,hidden_size為64~1023,output_size是詞表大小,比如為10^7。因為Softmax在概率歸一化時,需要所有詞的值,所以復雜度主要體現在最后一層。從此以后,提出了很多優化算法,比如Hierarchical Softmax、噪聲對比估計(Noise Contrastive Estimation)等。