最近在做CTR,剛好Google在KDD發了一篇文章,講了他們的一些嘗試,總結一下:
先是一些公式的符號說明:
一、優化算法
CTR中經常用Logistic regression進行訓練,一個常用的Loss Function為
Online gradient descent(OGD)是一個常用的優化方法,但是在加上L1正則化后,這種方法不能產生有效的稀疏模型。相比之下 Regularized Dual Averaging (RDA)擁有更好的稀疏性,但是精度不如OGD好。
FTRL-Proximal 方法可以同時得到稀疏性與精確性,不同於OGD的迭代步驟:
其中$\eta_t$是一個非增的學習率
FTRL-Proximal通過下式迭代:
其中參數 $\sigma_s$ 是學習率,一般我們有 $\sum_{s=1}^t\sigma_s=\frac{1}{\eta_t}$ 。
更新公式:
算法如下:
這里多個一個 $\lambda_2$ 是一個L2正則化參數。
二、學習率
$\displaystyle \eta_t=\frac{1}{\sqrt{t}}$
由於在求解時,這樣,對每一個坐標我們都使用了同樣的參數,這樣一些沒有使用的坐標的參數也會下降,顯然這不太合理。
一個近似最優的選擇是:
三、存儲空間
1.特征選擇
在CTR中,跟多特征僅僅出現了一次(In fact, in some of our models, half the unique features occur only once in the entire training set of billions of examples),這樣特征幾乎沒有什么用,但是存儲起來非常浪費空間。L1正則化雖然解決了一些問題,但是這樣降低了一些精度,因此另一個選擇是
probabilistic feature inclusion,這種方法中,一個特征第一次出現時,會以一定的概率被保存使用。關於這個概率Google嘗試了兩種方法:
Poisson Inclusion:以概率p增加特征,這樣一般特征被加入就需要出現1/p次
Bloom Filter Inclusion:用一系列的Bloom flters來檢測特征的前n次出現,一旦檢測到出現了n次(因為BF有沖突,所以實際可能少於n),就加入模型並用在后面的訓練中。
2.系數編碼
因為大部分系數都在-2和2之間,因此使用了定點的q2.13編碼,同時也保證了小數的一些精度。編碼包括一位的符號,2位的整數和13位的小數。
因此誤差可能在OGD算法中發散,因此使用了一個簡單的隨機取整策略:
3.多個相似模型的訓練
在測試一些超參數的影響時,同時訓練多個模型非常有用。觀察發現,有些數據可以被多個模型共用,但是另外一些(如系數)不能,如果把模型的系數存在一個HASH表里,就可以讓多個變體同時使用這些參數,比如學習率。
4.單值結構
有時我們想訓練一些模型,他們之間只是刪除或增加了一些特征。單值特征為每一個特征存了一個權重,權重被所有有該特征的模型共享,學習方法如下:
在OGD更新中,每個模型用他自己的的那部分特征計算一個Loss, 然后對每一個特征,每一個模型計算一個新的系數,最后把所有值平均后存為單值。該單值下一步被所有模型使用。
5.計數與梯度
假設所有事件包括統一特征的概率相同(一個粗糙但是有效的估計),其中出現了P次,沒有出現N次,那么出現的概率就是p=P/(N+P),那么在logistic regression中,正事件的導數是p-1,負事件p,梯度的平方和就是:
6.采樣訓練數據:
CTR中的負樣本遠高與正樣本,因此采樣的數據包括滿足所有的正樣本和部分負樣本:
在訓練中給正樣本1的權重,負樣本1/r的權重以避免模型結果出錯。權重乘如Loss Function對應項中。
四、模型評價1
1.進度驗證(Progressive Validation)
因為計算梯度的同時需要計算預測值,因此可以收集這些值。在線的loss反映了算法的表現---他度量了訓練一個數據前得到的預測結果。這樣也使得所有數據被同時作用訓練集和測試集使用。
2.可視化加強理解
上圖對query進行了切片后,將兩個模型與一個控制模型模型進行了比較。度量用顏色表示,每行是一個模型,每列是一個切片。
五、置信估計
六、預測矯正
兩個參數可以用Poisson regression在數據上訓練。











