在機器翻譯、圖檔描述、語義蘊涵、語音識别和文本摘要中,序列到序列的問題已經有太多大牛研究了,也取得了很多突破。谷歌的Attention is all you need[1],舍棄并超越了主流的rnn與cnn序列模組化架構,刷出了新的state of the art,這種大膽創新的精神值得我們學習。後面相信會有更多的attention變體甚至和rnn/cnn結合的電路圖湧現,當然我們更期待的不是這些,我們更向往大道至簡。我們在follow的同時,也期望自己的每一個新的想法,新的嘗試能夠彙入深度學習的大浪,為人類的未來貢獻自己的一份力量。
在電子商務搜尋中,query作為表達使用者意圖的載體起到了非常重要的作用。如何根據使用者的曆史行為序列給使用者推薦一個query,吸引使用者發生搜尋以及後續的成交是非常有意義的,比如淘寶的底紋推薦。如下圖是一個在iphone上的引導圖,歡迎大家多多使用底紋。

在技術方案這部分,我們首先介紹一下整體思路,然後重點讨論一下序列embedding.
總的來說,思路主要有兩種:1)編碼解碼直接生成query;2)把user向量和query向量映射到同樣的向量空間裡,然後通過向量相似召回來擷取query,候選query是日志中已經存在的。下面分别介紹下:
大體來說,這種思路一般是首先把source sequence通過一個encoder map成一個vector,然後用這個vector作為context向量去通過另一個decoder進行翻譯得出output.後面有很多同行在這個基本思路上做了很多改進,我們嘗試最基本的一種,沒有把網絡搞的很複雜。如下圖所示,首先擷取使用者的行為序列,然後 encode成user-embedding向量,然後這個向量作為context向量來解碼query,每一步解碼一個詞/字。在預測的階段一般采取beam search搜尋政策來擷取最可能的topK個候選query的詞序列。
我們訓練一個網絡,讓user-embedding和query-embedding映射到同一個向量空間裡。user-embedding同上,query-embedding一般采取lstm或者cnn或者dnn都行。如下圖所示:query word 表示為w1,w2,...wm.
在預測階段,采取向量相似召回的政策,首先我們對候選query聚類成K個簇,然後采用二級查找的方式(首先查找topM相似的簇,然後再周遊topM相似簇中的query),擷取每一個使用者向量的topk相似query作為推薦結果。
第一種是RNN,解決序列問題的标配。 我們假設一個使用者的一個時間序列向量是u1,u2...ut,其中下标i代表第i個時間步。每一個時間步的特征輸入主要三類:1) 文本特征:使用者點選的标題/搜尋的query;2)行為特征:停留時間,是否點選/加購/收藏/購買等;3)使用者tag:性别,年齡,購買力等。如下圖所示,我們首先把每一個時間步對應的特征分别向量化然後concat然後再過一層全連輸入到lstm中,一般采用lstm最後一步的輸出作為decoder的context向量,當然還有更有效的方式,比如再加上attention機制。
先簡單說一下背景,神經網絡在word embedding上的成功激起了大夥研究長文本embedding的熱情,比如句子和段落都可以embedding,lstm似乎等到了最美的春天。但是,令人驚訝的是,Wieting等人[4]表示,這些複雜的方法被一些超級簡單的方法超越了,這些簡單的方法包括對word embedding進行輕度重新訓練和基本的邏輯回歸。
我們是從A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SENTENCE EMBEDDINGS[3]中得到啟發,可以用一種簡單有效的方法來擷取文本向量,作者在論文中證明:在維基百科上的非标簽語料庫中使用流行的方法訓練word embedding,将句子用詞向量權重平均,然後使用PCA/SVD修改一下 。 這種權重在文本相似性任務中将效果提高了約10%至30%,并且擊敗了複雜的監督方法,包括RNN和LSTM, 它甚至可以改善Wieting等人[4]的embeddings.
作者稱他的算法是WR,由于我們在權重裡面加入了時間因素,是以暫且稱之為WRT吧。算法非常簡潔,作者也對他的算法做出了有力的理論解釋。主要分2步:
W:就是詞向量權重平均的時候的權重。
R: 使用PCA/SVD remove掉向量中的common部分。
下面是算法流程圖:
上面的vw前面的系數a/a+p(w)代表詞w的權重,我們在使用的時候會加上時間衰減因數,即f(tw)*a/a+p(w),其中f(tw)是時間衰減因子。然後對應的|s|我們也根據f(tw)進行了scale.
在上面的第一種方法中我們定義時間衰減為簡單的單調函數,但是行為的時間不一定越遠越不重要,比如每個類目的複購周期都是不一樣的,是以我們想用下面的方法學習一下時間函數,這裡把時間函數定義成多項式函數,因為多項式可以拟合任何函數。和上面直接在詞次元上不一樣的是,這裡我們假設每一個時間步的ut已經按照WR方法embedding好了。
我們把時間函數定義為下式,裡面的ti表示第i時間步距離目前的時間,時間的參數是m維:
為了求解a,我們配置一個網絡求解,首先我們把u進行一個t變換
然後再配置一個fake-conv來求取a(圖中的fake-conv雖然用卷積實作,但是其實和卷積關系不大,就是為了友善求取a參數。)
我們在底紋資料集上進行了嘗試,訓練樣本的格式是<使用底紋query之前的行為序列,使用底紋的query>.
在encode部分我們分别嘗試了DNN和lstm,結果顯示效果差别不大,用bleu名額對比:dnn_encoder:0.003,lstm_encoder:0.0025,dnn還稍微好一些。
在bleu的基礎上,我們另外定義了召回率名額:用生成的topN和真實的topM比較,假設完全比對topM中的K個(可帶權重),定義召回率為(topN,topM,K/topM);如果召回率高,代表學到了真實資料的分布,同時新生成query品質也比較好,在底紋測試集上的召回率是(10,5,0.69).
由于底紋的log在一些中長尾類目上比較少,後面我們還嘗試了先用全量點選訓練,再用底紋資料fine tune,結果顯示收斂更快,在中長尾類目上泛化表現更好:
我們在搜尋資料集上進行了嘗試,訓練樣本的格式是<使用者搜尋query前的行為序列,搜尋query>,根據搜尋query之後的表現區分正例和負例。網絡裡面的标題是用doc2vec預測好的,沒有更新标題對應的詞向量,query向量用其點選的商品集合用doc2vec向量化。
最開始我們用女裝類目資料訓練,在預測集合上的cosin平均相似度是0.951,感覺還是非常高的。
後面擴充到全類目資料訓練,抽查case發現預測的有些有些天馬星空了。分析原因可能是用的目前搜尋的query可能和前面的序列之間的意圖跳躍比較大。後面做了2個改動:1)目标由"query"更改為"query點選的第一個寶貝"; 2)切分點由"30分鐘"更改為"query預測的二檔類目沒有重合",然後再看,效果就好了不少。
這次我們依照比較直接的方式在底紋上進行嘗試,值得一提的是,這個方法性能問題可以忽略不計。
我們按照類目次元給每個user根據其行為序列(隻考慮點過的标題和搜尋query的文本)向量化,然後通過向量相似召回top10個最相似的query作為推薦,bts結果顯示相關業務名額有比較大的提升。
目前僅僅是考慮了内容相似度,後續如果上面加上一層gbdt融合其他特征排序後再推薦,預計還有很大潛力。
query生成/推薦基本是Sequence to sequence和向量相似召回兩個思路,主流的RNN/CNN方法當時還是因為性能問題在應用上有點阻礙,是以我們嘗試了一些在效果上不輸于lstm但是非常簡潔的方法,這些方法在性能上也非常給力,便于快速嘗試擷取結果。比較遺憾的是,user向量我們目前主要關注了文本内容特征,而使用者的行為特征和使用者tag特征并沒有進行應用,也是後續需要改進的方向。
query生成我們後續可能會更關注于生成一些風格輕盈的自然語言,比如“微微一胖很傾城”,“露出一點小性感”,希望能讓大家在購物的時候感受到一種美好的心情,順便也能買到心儀的寶貝。
除了query生成這個主題,其實更重要的是怎麼樣利用好已有的其他候選,是以後續我們計劃把學習到user序列向量和query向量的相似度作為特征參與query推薦的排序,這個預計會有更大的收益。
參考文獻
[1] A Vaswani, N Shazeer, N Parmar, J Uszkoreit, L Jones ,... Attention Is All You Need
[2] I Sutskever, O Vinyals, QV Le. Sequence to sequence learning with neural networks
[3] Sanjeev Arora, Yingyu Liang, Tengyu Ma. A Simple but Tough-to-Beat Baseline for Sentence Embeddings
[4] John Wieting, Mohit Bansal, Kevin Gimpel, and Karen Livescu. Towards universal paraphrastic sentence embeddings.