標籤:

一種調loss控制特徵權重的方法

訓完了模型不是我想要的樣,我覺得重要的特徵權重低,咋整?調樣本,調特徵,調模型,調認知。

調樣本啊,費勁巴拉的;調特徵啊,我就要這個特徵,不想動它,那動其它特徵吧,好像也挺麻煩的;調模型啊,模型選型,loss,訓練方法,超參,可調的也太多了;調認知啊,我又不是啥數據沒看瞎拍的,不想調。這把咱來看看調loss的吧。

一個樸素粗暴的想法

考慮一個非常基礎的擬合方法,最小二乘法,它的loss可以表示成

L=sum_{i=1}^{N}(old{wx_i}-y_i)^2 ,求導,=0,解出來 old{hat{w}}=frac{old{X^Ty}}{old{X^TX}}

如果第k個特徵是個正向特徵(xk越大則score越大),它的權重wk覺得太小了,比如x從0變到1,score才從0.4變到0.6,但我想讓它的權重變大點,讓score能從0.4變到2.6,該咋整呢?簡單地想,我給wk加上一個數,原來是0.2,我給它+2,讓它變成2.2,這不就得了嘛。注意到對每個xk,score的期望值(0.4~2.6)和實際值(0.4~0.6)之差和x的值成正比,比率先記成c,這麼看來上面這個粗暴的思路好像還有點道理哈,只是咱不能等模型訓完了之後再手調,最好讓它直接學出來wk=2.2。那也不是沒有辦法,把loss中的w改一下就行了,改成這樣

L=sum_{i=1}^{N}(old{(w-c*onehot(k))x_i}-y_i)^2=sum_{i=1}^{N}(old{wx_i}-y_i)^2 ,還是求導,=0,解出來 old{hat{w}}=frac{old{X^Ty}}{old{X^TX}}Rightarrow old{hat{w}}=old{hat{w}}+old{c}*old{onehot(k)}

第k維權重增加了c,其它維權重沒動,是不是很機(齷)智(齪)。

可以證明,這個方法不光對最小二乘法有效,對其它常見的線性模型也都有效,比如LR,SVM,以及pairwise的ranksvm。

如果模型是樹呢

就以常見的梯度樹為例吧,讓這個特徵作用更大,要體現在兩個方面,一個是這個特徵會搶到更多的分裂點,一個是分裂完了之後葉結點的權重得更大。

假設,交叉熵loss,pointwise訓練,目標特徵是正向特徵。則梯度 -grad=1-sigma(hat{y})=1-sigma((hat{y}-cx))>1-sigma(hat{y})

假設樹的分裂已經完成,由葉結點上權重=平均負梯度,可知葉結點權重增大,且是x和c的增函數。葉結點權重是c的增函數說明c越大,區分度越大。

接下來看這種調法對樹分裂的影響。先想想極端情況,如果影響是讓樹不分裂了,那c再大也沒區分度;如果影響是讓樹分裂得更細了,一個x值對應一個結點,那區分度應該就達到最大了。我們自然是希望它能讓樹分裂得更細,更愛用特徵x分裂,那就可以先看看啥情況下特徵x的分裂收益會比較大。分裂收益是啥含義呢?衡量分裂之後混亂程度降低了多少,那怎樣降低得最多呢?分裂完了最有序,比如按x=x0分裂,左結點上全是x<=x0的樣本,右結點上全是x>x0的樣本,那理想情況就是左結點上全是負例,右結點上全是正例嘍。那我們就猜想吧,對於梯度樹來說,梯度相對於特徵值更有序,則樹更容易按這個特徵分裂,即分裂收益更大。

假設有n條樣本,按x排序,考察一個候選分裂點v,x1<x2<..xk<v<xk+1<..<xn,對應梯度的序中存在i<=k<j,使gi>gj,記gi-gj=d。如果交換gi和gj,則g更有序,分裂收益應該變大。來試試看,

egin{align} gain=frac{G_L^2}{n_L}+frac{G_R^2}{n_R}-frac{G^2}{n}=(frac{G_L}{n_L}-frac{G_R}{n_R})^2 end{align}

交換gi和gi之後

egin{align} gain=(frac{G_L+d}{n_L}-frac{G_R-d}{n_R})^2 end{align}

gain的變化

egin{align} Delta gain&=(frac{G_L-d}{n_L}-frac{G_R+d}{n_R})^2-(frac{G_L}{n_L}-frac{G_R}{n_R})^2\ &=G_L^2/n_L^2-2dG_L/n_L^2+d^2/n_L^2 +G_R^2/n_R^2+2dG_R/n_R^2+d^2/n_R^2\ &-2G_LG_R/n_Ln_R-2dG_L/n_Ln_R+2dG_R/n_Ln_R+2d^2/n_Ln_R\ &-G_L^2/n_L^2-G_R^2/n_R^2+2G_LG_R/n_Ln_R\ &=d^2(1/n_L+1/n_R)^2-2d(1/n_L+1/n_R)(G_L/n_L-G_R/n_R)=f(d) end{align}

由樹結構的對稱性,不妨假設左結點的平均梯度小於右結點,則

egin{align} &f(0)=0\ &f(d)=2d(1/n_L+1/n_R)-2(1/n_L+1/n_R)(G_l/n_L-G_R/n_R)>0\ Rightarrow &f(d)=Delta gain>0 end{align}

至此,我們證明了梯度相對於特徵值更有序,則分裂收益越大。接下來我們要看看這種調loss的方式會不會讓梯度相對於目標特徵更有序。比較兩條樣本s和t,特徵值xs<xt,我們希望gs<gt的概率更大,即

egin{align} &P(g_s>g_t)>P(g_s>g_t)\ Leftrightarrow&P(1-sigma(hat{y}_s-cx_s)lt 1-sigma(hat{y}_t-cx_t))>P(1-sigma(hat{y}_s)lt 1-sigma(hat{y}_t))\ Leftrightarrow&P(hat{y}_s-cx_sgt hat{y}_t-cx_t)>P(hat{y}_sgt hat{y}_t)\ &if hat{y}_sge hat{y}_t then (hat{y}_s-cx_s)-(hat{y}_t-cx_t)=(hat{y}_s-hat{y}_t)-c(x_s-x_t)gt 0\ &else let f(c)=(hat{y}_s-hat{y}_t)-c(x_s-x_t)\ &qquad if c>frac{hat{y}_s-hat{y}_t}{x_s-x_t} then f(c)>0\ Rightarrow&P(g_s>g_t)>P(g_s>g_t) end{align}

就是這麼個事兒。現在可以說了,這麼調loss可以讓目標特徵的分裂收益更大,從而更容易搶到分裂點。

總結一下,這麼調loss可以

1.讓目標特徵更容易搶到分裂點,原因在

a.它可以讓梯度相對目標特徵更有序,

b.梯度相對於目標特徵越有序,分裂收益越大。

2.讓目標特徵分裂之後權重更有區分度。

所以,這麼干有用。

第1條的a好像能用歸納法證,當已經有了n條數據的時候,來了一條比它們都大的數據n+1,對於任一左小右大的分法,把第n+1條數據放到右邊的收益大於放到左邊。。

第1條的b好像能用(ys-cxs)/(yt-cxt),當c=0時比值是ys/yt,然後單調趨向xs/xt。。

我他媽為啥整得這麼麻煩。。


推薦閱讀:

[貝葉斯五]之樸素貝葉斯
cs231n筆記1-用KNN演算法進行圖像分類
Python基礎_103.數據結構與演算法_查找
【最優化】無約束優化方法-阻尼牛頓法
Theano (1)

TAG:機器學習 |