曾几何时,我们炼的不是丹,是特征
對于煉丹師來說,特別是面對海量特征,還要從中挖掘出交叉特征"喂"給模型,是十分痛苦的。不得不說,人都是"懶惰"的,我們煉丹師當然希望有個厲害的深度學習模型,只需要對最原始的特征做預處理后,扔給模型,讓它自己學習交叉特征。
希望模型像"奶牛"吃草,擠得是"牛奶",那么我們必須保證"喂"的是草。并不是所有的交叉特征與推薦系統的最終優化目標都是相關的,盲目的"喂"特征只會帶來更多的噪聲和系統準確率的下降。《Detecting Beneficial Feature Interactions for Recommender Systems》這篇論文就提出了用GNN去自動檢測對推薦系統有利的交叉特征。
首先一個數據集定義如下:
其中ck表示類目特征,xk標志特征的值,J是所有特征的索引。
定義1: 有益的pairwise交互特征
這個定義其實比較簡單,就是有一系列特征,所有特征兩兩組合,成一個大的集合,我們希望從中能找到一個交叉特征子集,它在驗證集上的準確率優于其他子集。
定義2:pairwise statistical interaction
這個定義是這樣,有x1~xk一共k個特征(特征是向量同理),F(X)能表示成兩個分別不依賴xi和xj特征的函數之和,那么我們認為這兩個特征間沒有pairwise statistical interation,如下式:
L0-SIGN模型的輸入是沒有邊信息的圖,特征是nodes,特征交互是邊,如果兩個特征nodes之間存在邊,代表這兩個特征的交互特征對模型有益。
L0-SIGN有兩個模塊,第一個是L0邊預估模塊,就是預估邊應不應該存在。然后是圖分類SIGN模塊,SIGN模塊如下圖所示:
首先有初始化embedding后的nodes,通過邊進行交互,然后nodes的表達開始不斷更新,最后更新完的所有nodes的表達產出最終預估。整體的預估函數如下:
L0 邊預估模塊:
這里我們使用基于矩陣分解的模型對邊進行預估。矩陣分解通過對圖的鄰接矩陣進行分解,能夠非常高效的對邊進行建模,而且把所有node轉成稠密向量。但在L0-SIGN中,我們并不知道該圖的鄰接矩陣真實應該是什么樣,所以無法進行梯度更新。所以每條邊的值,我們通過一個邊預估函數:
輸入兩個節點embedding,輸出0/1,表示node間是否有邊,我們知道無向圖鄰接矩陣是對稱的,所有fep也是對稱的:
在這篇論文中,fep的輸入是兩個node向量的element-wise product,fep是多層感知器。在訓練的時候,L0就像正則化一樣最小化探測邊的數量。
SIGN邊預估模塊:
如果兩個節點之間邊是1,那么這兩個節點之間的交互特征用一個非加法的函數映射:
通過該函數映射后的embedding zij就是交互特征。和fep類似,h(ui, uj)函數同樣要是對稱的。接下來每個節點就可以開始更新過程,每個節點的更新用一個線性aggregation方程:
最后所有節點的embedding都會通過一個線性方程g轉變成標量,所有的標量再通過一個線性方程轉變成SIGN的輸出,如下所示:
SIGN總體的預估函數如下:
總結完所有模塊,L0-SIGN的預估方程就如下所示:
為了確保模型能夠成功的找到有益的交互特征,損失函數定義如下:
一共3項,第一項就是正常預估偏差,第二項是所有邊為1的概率和,第三項是l2正則項。
從實驗中,我們可以看到無論對比各種FM模型,還是圖模型,L0-SIGN都表現最優。
更多干貨,請關注:煉丹筆記曾幾何時,我們都是煉的不是丹,是特征!總結
以上是生活随笔為你收集整理的曾几何时,我们炼的不是丹,是特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动化Debias框架,一键去除推荐系统
- 下一篇: 用预训练GNN预估点击率有奇效?