這里是「王喆的機器學(xué)習(xí)筆記」的第三十二篇文章。今天的文章內(nèi)容來源于一次跟網(wǎng)友的討論,同行網(wǎng)友的問題是這樣的:
為什么在Google的Wide&Deep模型中,要使用帶L1正則化項的FTRL作為wide部分的優(yōu)化方法,而使用AdaGrad作為deep部分的優(yōu)化方法?
論文原文的描述是這樣的:
In the experiments, we used Follow- the-regularized-leader (FTRL) algorithm with L1 regularization as the optimizer for the wide part of the model, and AdaGrad for the deep part.
這個問題是一個很有意思的問題,因為原文中一帶而過,所以很多同學(xué)也沒有注意到這一點。但深究起來,這又是一個關(guān)鍵的問題,它涉及到不同訓(xùn)練方法的區(qū)別聯(lián)系,涉及到模型的稀疏性,甚至涉及到特征選擇和業(yè)務(wù)理解。
我們這篇文章就深入到Wide&Deep模型中去,從FTRL和AdaGrad出發(fā),再剖析一次Wide&Deep模型(簡稱W&D)。
一句話概括W&D
由于W&D被剖析過太多次,也被應(yīng)用過太多次,所以原理上這里不再贅述,一句話概括:
W&D由淺層(或單層)的Wide部分神經(jīng)網(wǎng)絡(luò)和深層的Deep部分多層神經(jīng)網(wǎng)絡(luò)組成,輸出層采用softmax或logistics regression綜合Wide和Deep部分的輸出。

一句話概括此結(jié)構(gòu)的優(yōu)點:
Wide部分有利于增強模型的“記憶能力”,Deep部分有利于增強模型的“泛化能力”。
相信大家對這些知識點都已經(jīng)駕輕就熟,那就直接進入這篇文章的主要切入點,為什么Wide部分要用FTRL訓(xùn)練?
為什么Wide部分要用L1 FTRL訓(xùn)練?
這個問題是一個很有意思的問題,可能近幾年畢業(yè)的同學(xué)都不大清楚FTRL是什么了。四五年前FTRL曾風(fēng)靡全部互聯(lián)網(wǎng)頭部公司,成為線性模型在線訓(xùn)練的主要方法。
徹底解釋清楚FTRL并不是一件容易的事情,可能要花上10-20頁左右的篇幅,感興趣的同學(xué)可以參考馮揚當(dāng)時的著名文章“在線最優(yōu)化求解”。
這里簡要介紹一下,你可以把FTRL當(dāng)作一個稀疏性很好,精度又不錯的隨機梯度下降方法。由于是隨機梯度下降,當(dāng)然可以做到來一個樣本就訓(xùn)練一次,進而實現(xiàn)模型的在線更新。所以在四五年前,大部分公司還是線性模型為主的時代,F(xiàn)TRL憑借非常好的在線學(xué)習(xí)能力成為主流。
說完了FTRL,再說L1正則化,參加過算法崗面試的同學(xué)可能都碰到過那個經(jīng)典面試題“為什么L1正則化比L2正則化更容易產(chǎn)生稀疏解?”。問題的答案現(xiàn)在當(dāng)然已經(jīng)是顯學(xué)了,但這里“稀疏”這個性質(zhì)又冒出來了。也就是說FTRL with L1非常注重模型的稀疏性。這也就是問題的答案,W&D采用L1 FTRL是想讓W(xué)ide部分變得更加稀疏。
再白話一點就是,L1 FTRL會讓W(xué)ide部分的大部分權(quán)重都為0,我們準(zhǔn)備特征的時候就不用準(zhǔn)備那么多0權(quán)重的特征了,這大大壓縮了模型權(quán)重,也壓縮了特征向量的維度。
Wide部分的稀疏性為什么這么關(guān)鍵?
稀疏性不見得一直是一個好東西,它不管怎樣都會讓模型的精度有一定的損傷??隙ㄊ翘卣飨蛄烤S度過高導(dǎo)致“稀疏性”成為了關(guān)鍵的考量。這就涉及到Google Wide部分的特征選取了,到底Google選了什么特征需要這么注重稀疏性。我們回到他的業(yè)務(wù)場景中來。

大家可以看到紅圈內(nèi)的Wide部分采用了什么特征,它居然采用了兩個id類特征的乘積,這兩個id類特征是:
User Installed App?和?Impression App
這篇文章是Google的應(yīng)用商店團隊Google Play發(fā)表的,我們不難猜測Google的工程師使用這個組合特征的意圖,他們是想發(fā)現(xiàn)當(dāng)前曝光app和用戶安裝app的關(guān)聯(lián)關(guān)系,以此來直接影響最終的得分。
但是兩個id類特征向量進行組合,在維度爆炸的同時,會讓原本已經(jīng)非常稀疏的multihot特征向量,變得更加稀疏。正因如此,wide部分的權(quán)重數(shù)量其實是海量的。為了不把數(shù)量如此之巨的權(quán)重都搬到線上進行model serving,采用FTRL過濾掉哪些稀疏特征無疑是非常好的工程經(jīng)驗。
為什么Deep部分不特別考慮稀疏性的問題?
大家注意觀察可以發(fā)現(xiàn)Deep部分的輸入,要么是Age,#App Installs這些數(shù)值類特征,要么是已經(jīng)降維并稠密化的Embedding向量,工程師們不會也不敢把過度稀疏的特征向量直接輸入到Deep網(wǎng)絡(luò)中。所以Deep部分不存在嚴(yán)重的特征稀疏問題,自然可以使用精度更好,更適用于深度學(xué)習(xí)訓(xùn)練的AdaGrad去訓(xùn)練。
再說回模型的泛化能力和記憶能力
我想到這應(yīng)該把文首的問題回答清楚了。最后我想再說回所謂wide部分的“記憶能力”。其實大家可以看到,所謂的“記憶能力”,可以簡單理解為發(fā)現(xiàn)“直接的”、“暴力的”、“顯然的”關(guān)聯(lián)規(guī)則的能力。比如該問題中,Google W&D期望在wide部分發(fā)現(xiàn)這樣的規(guī)則:
用戶安裝了應(yīng)用A,此時曝光應(yīng)用B,用戶安裝的B概率大。
而Deep部分就更黑盒一些,它把能想到的所有特征扔進這個黑盒去做函數(shù)的擬合,顯然這樣的過程會“模糊”一些直接的因果關(guān)系,泛化成一些間接的,可能的相關(guān)性。
從這個角度來說,所謂“泛化能力”和“記憶能力”就更容易被直觀的理解了。
最后,感謝當(dāng)初網(wǎng)友的提問,注重細節(jié),見微知著我想永遠是一個算法工程師可貴的能力。
按慣例的討論問題:
在模型結(jié)構(gòu)日漸復(fù)雜的今天,你認為wide部分存在的意義還大嗎?在你的模型中還保留這wide部分這種簡單暴力的結(jié)構(gòu),還是已經(jīng)用更復(fù)雜的結(jié)構(gòu)來代替?
能把Wide部分和Deep部分分開訓(xùn)練嗎?能讓FTRL在線學(xué)習(xí),而深度部分batch訓(xùn)練嗎?
這里是「王喆的機器學(xué)習(xí)筆記」?的第三十二篇文章。
認為文章有價值的同學(xué),歡迎關(guān)注同名微信公眾號:王喆的機器學(xué)習(xí)筆記(wangzhenotes),跟蹤計算廣告、推薦系統(tǒng)、個性化搜索等機器學(xué)習(xí)領(lǐng)域前沿。
關(guān)于W&D的細節(jié)討論亦收錄在我的新書「深度學(xué)習(xí)推薦系統(tǒng)」中,這本書系統(tǒng)性地整理、介紹了專欄中所有的重點內(nèi)容,如果您曾在「王喆的機器學(xué)習(xí)筆記」中受益,歡迎購買。