DSSM雙塔模型在2013年被微軟在論文Learning Deep Structured Semantic Models for Web Search using Clickthrough Data中提出,其應用途徑由最初的文本匹配和搜索逐漸推廣到了推薦搜索、計算廣告、信息流推薦以及機器翻譯等等。
一、DSSM介紹
DSSM在搜索推薦中的原理也比較簡單:
- 1、獲取搜索引擎中的用戶搜索query和曝光doc數據,
- 2、訓練過程中,首先分別構建query和doc的embedding,
- 3、其次用深度學習復雜網絡構建模型的語義表示表示層,
- 4、模型的輸出一般是計算query和doc的cos距離來計算語言相似度,最終獲得語義模型,
- 4、線上infer階段,首先緩存doc側所有的embedding,然后實時query通過query測計算embedding,再與計算好的doc的embedding 計算相似度召回。
簡化論文中的模型結構,我們可以把DSSM模型總共分成三層:輸入層,表示層和匹配層,分別對應到上面的 2,3,4 三點。
根據表示層的不同,近年發展出了一系列DNN-DSSM,LSTM—DSSM等等,當然你也可以使用其他諸如CNN和Transformer等作為表示層網絡。
在計算廣告領域,query層往往還包括了用戶的其他特征,屬於另一種模型的變異,可以參見1
二、DSSM實踐
DSSM模型結構比較簡單,實現上常常用正負樣本分類的方式訓練模型,通常有二分類和多分類的方式,需要注意的是采用多分類時,doc側網絡需要公用網絡層。
# 定義網絡層
embedding_layer = Embedding(embedding_look_up, 128, input_length=item_len_query,
embeddings_initializer='random_uniform')
# query tower
input_query = Input(shape=(pad,), name='input_query')
embedding_query = embedding_layer(input_query)
inception_query = TextCNN()(embedding_query)
# item tower
input_item = Input(shape=(item_len_query,), name="item_input")
embedding_item = embedding_layer(input_item)
inception_item = TextCNN()(embedding_item)
# cosine sore
cosine_scores = Lambda(cosine_distance, output_shape=cos_dist_output_shape)([inception_query, inception_item])
prob = Dense(1, activation='sigmoid')(cosine_scores)
model = Model(inputs=[input_query, input_item], outputs=prob)
model.compile(
optimizer="adam",
loss="binary_crossentropy",
metrics=['accuracy'])
model.summary()
筆者也嘗試過基於Transformer的多塔模型,限於篇幅,代碼就不提供了,結構如下,其效果明顯優於基於TextCNN-DSSM模型。
三、DSSM的優缺點
3.1、優點
- 相比於LSA、LDA、Autoencoder等方法等語義模型存在字典爆炸問題,DSSM在計算上花銷更少
- 使用有監督的方法,優化語義embedding的映射問題
- 省去大量的人工特征
3.2、缺點
- 采用詞袋模型時沒有考慮詞的位置關系,對語義理解存在損失。(不過如果采用LSTM或者Transformer作為網絡結構可以解決這個問題)
- 采用弱監督和端到端的這種方式,模型預測結果不可控。
四、總結
對於電商商品召回來說,DSSM不可以不說是一個非常快速有效有方法,Google、百度和阿里等都有類似的實踐。若需要更精確的召回,還可以在模型輸入層加上其他特征,比如商品的品牌,類別等,甚至可以用上attention,參見蘇寧的實踐方案2。