第十四節過擬合解決手段L1和L2正則
第十三節中,我們講解了過擬合的情形,也就是過度的去擬合訓練集上的結果了,反倒讓你的模型太複雜。為了去解決這種現象,我們提出用L1,L2正則去解決這種問題。
怎麼把正則應用進去?我們重新審視目標函式,以前我們可以理解目標函式和損失函式是一個東西。而有正則的含義之後,目標函式就不再是損失函式了,而是損失函式加懲罰項。而這個懲罰項聽起來好像是一個Optionally,一個可選項,但並不是,通常一定要加懲罰項,否則你訓練出來模型極有可能是過擬合的。所以通常懲罰項是一定要加的,以前總講線性迴歸一定要回歸,一定要把損失函式降到最低,到今天你應該深刻地烙印在腦子裡,它要降到最低的不光是損失函式,而是目標函式。
首先我們回憶機器學習的流程,先建立一個目標函式(線上性迴歸裡面怎麼建立的目標函式? 最大似然),然後找到使目標函式最小的一組W,就是我們要求的W。這一節以後我們目標函式變一變之前我們們說的線性迴歸的目標函式是:
其實這並不是完整版的目標函式,我們實際優化的也不光是它,而是變成了兩項,損失項加上λ的正則項,
這個λ跟剛才學習率λ是兩個不同的超引數。我們損失項的意義是要讓訓練集上的誤差儘量小,而正則項的意義是讓模型儘量簡單,防止過擬合。目標函式其實就是損失函式和正則項線性相加,之前講的目標函式只講了損失項,損失項指的是什麼?指的是我們的損失函式,雖然到目前為止我們只講了一個MSE損失函式,但實際上你應該舉一反三,雖然你不知道其它損失函式長什麼樣,但你知道會有各種各樣的損失函式,只要這個損失函式降到最低了,我們這會兒運算出來的模型,就是我這個演算法得到的最終結果。接下來介紹什麼叫正則項,我剛才說的防止它一味的去追求損失函式最低而導致模型變複雜了,我們看目標函式的這麼一個形式,,雖然這麼花裡胡哨,但最終還是要把它交給SGD的演算法去最優化。我機器還是傻乎乎的,你讓我最優化損失函式,我就最優化損失函式,你不想讓我光追求最優化損失函式,那你交給我點其他的東西,我也會一起幫你優化。我們最終是想讓損失函式相對較小的時候,模型也相對簡單,所以我們就看著Ω(θ)它應該具有一個什麼樣的特徵?模型越複雜的時候Ω(θ)會越大,模型也簡單的時候Ω(θ)就越小。舉個例子來理解相對概念,比如當損失項函式的最小值是0.18,結果當0.18的那組θ帶到模型評估的函式Ω(θ)裡面,發現Ω(θ)值是20,此時是不是模型太複雜了? 當你損失函式上升了一點,上升到0.19的時候,θ雖然它已經不是最優解了,但此時發現這組θ帶入到Ω(θ)裡面,20直接降到了5,此時機器會選擇哪種模型?第一組θ還是第二組θ?應該是第二組θ,因為它達到了一個在損失函式儘量小的同時,你要讓我的模型儘量的簡單。
λ是幹嘛的?λ是評估你到底多看重模型的簡單性的。假如剛才這個例子,λ設成0.0000001,對它來說你雖然從20減到了5,但是你乘的係數很少,你的簡單在它眼裡看起來它並不在乎,比如你在公司你自我陶醉一般的做了很多工作,老闆可能並不在乎。這就是說你這個模型到底有多看重模型複雜程度的懲罰的。為什麼管它叫懲罰項,正則項也叫懲罰項,它是一個懲罰係數,你追求到了損失函式是0.18,但是你把這個模型搞複雜了,我就要懲罰你一下,給你加上一個懲罰項Ω(θ)為20,假如你損失函式是0.19了,你的懲罰性Ω(θ)就變小了,總體的效果會變好,也就是說正則項實際上是達到了一個為了追求損失函式最小而把模型搞複雜了去懲罰的這種情況。 這種情況發生了,我就要懲罰你,我讓你損失函式不再是最優的了,就不會最後出現模型給你選出來一個損失函式是最低的,但是複雜度一下上升了好多的這種情況。
怎麼樣評估這個模型復不復雜?我們回憶下引數型模型的本質是什麼?是不是就那一組W,所以也只能從這一組W上來評估,沒別的東西了。所以我們現在來探索評判模型的複雜度的Ω(θ)到底是什麼?其實它非常簡單,對於線性模型如何評估複雜程度,通常通過L0範數L1範數和L2範數,範數的值越大,該模型越複雜。
我們們講一下什麼叫L0範數,L1範數和L2範數?L0範數,所有引數W中非零元素的個數。比如100個維度裡邊有80個沒有用,它是怎麼判定沒用的?是不是直接把W調成0了? 那W裡邊的零越多,這個模型就越簡單,所以非零元素的個數越多,代表模型越複雜,因此L0範數可以作為我剛才Ω(θ)的一個候選人。假如Ω(θ)是L0的話,你有一個W是0.1,你直接給它減成0了,發現損失函式就上升了一點點,但是你就直接少考慮了一個維度,所以能一定程度上阻止你的過擬合,因為這個維度,我徹底不考慮了,這個是L0範數的作用,但是L0範數不可導,不能求導有什麼麻煩?梯度下降沒法工作。你要想做梯度下降,老得求負梯度,你一求負梯度就發現這個傢伙求不了。梯度下降這個東西你用不上了,所以通常我們不用L0範數作為Ω(θ)項。
因此Ω(θ)我們改為用L1範數,L1範數是所有引數的絕對值之和(也稱L0的最佳凸近似)。,這個話理解成它是L0的方便計算的替代品,它能達到跟L0差不多的效果,讓大多數沒什麼用的這些W變為零,但是它又可導,能交給梯度下降來做。 假如損失函式是MSE,加上L1正則後|,你再去優化交給SGD的東西,就不再是原來的MSE函式了,而是MSE+0.1*Σ|W讓它一起去做優化,優化出來的結果會是什麼樣的? 優化出來的結果會有相當一部分的W變為了0。所以通常分類任務也好,迴歸任務也好,我們說特徵太多,這些特徵好麻煩,我也不知道哪個有用,哪個沒用,你就可以,你直接給他加一個L1範數跑一下,哪些W是零了,那些特徵就直接去掉。能夠篩選掉那些W為0的特徵,一定是沒有它也不會引起損失函式巨大上升的那些特徵。比如我剛才舉那個例子,張三家關沒關窗戶,對於下雨的影響,它一定本身不大。 你加了一把L1正則訓練出來模型之後,就會發現張三家關沒關窗戶這一列的屬性的權重變為了零,如果加了L1正則它還不是零,說明從資料集上來看,這一列就是對下雨影響很大。但是可能發生嗎這種事?明顯不可能,說明什麼?說明你收集的資料絕對不夠多。或者你收集的資料不是全部的資料,是張三給你的資料,他一收集就老要開啟窗戶看下雨,經常會有這種荒唐的事發生。比如你發現你怎麼跑模型? 這個模型效果都不好,很可能是你收集上的這些資料本身就已經被篩選過了。比如你拿你使用者資料的時候,你發現有一列的值只有安卓手機能提供給你,iPhone提供不了,所以你的資料就是一個有偏斜的資料,經過一次預篩選了,像我剛才講的故事,張三一看下雨他就把窗戶開啟了,因果反制,所以你收集的資料只收集到了他們家開窗戶的時候的資料,資料本身是有問題的。因此我們加上L1正則後,發現一些明顯跟你的最終結果不應該有關係的資料還有了關係,那說明這個資料本身有問題。這也是一個檢驗資料的一種方式。所以通常L1範數是用來做特徵選擇的。
我們對比下L0和L1:L0和L1都可以使引數稀疏。所謂稀疏化就是0比1多,假如你給了我200個數,我發現裡邊只有三個數不為零,你接記下這三個數的大小和三個數的位置就可以存下來了,而不用真把這200個數存下來,這其實是一個稀疏向量。所以使引數稀疏化,也就讓不重要的那些維度的引數歸為0,重要的會更偏向為1。L1範數比L0範數有一個優點,它是可微可導的,功能又類似,所以只選擇L1範數,而基本沒有見過用L0範數的,L1想做的事是儘量的讓沒用的特徵變成零,因此L1的意義是特徵選擇,與此同時增強了模型的解釋性,模型解釋性是非常重要的一個事兒。 比如有一個業務場景,有一天銀行來找到你了,說我們想訓練一個模型,做一個客戶還款能力的預測,丟給你一堆資料,你最後確實做出來一個模型,我問你這個東西好用不好用,你心裡也沒底,你去交活的時候,你說我們這400多個特徵全用上了,連客戶今天穿沒穿花衣服都有,你能跟客戶交差,說你這模型真有用嗎?不能夠的,你一定要把引數的量減下來,給她去解釋,為什麼這個東西在裡面,你看這個模型確實讓人更放心,讓客戶也有信心,你權重是高是低還好,你最終八竿子打不著的東西都抄進來了,明顯這個模型是有問題的,是有缺陷的。所以模型的解釋性不是一個沒有意義的事兒,他一定要能解釋得通這個東西才敢上線去生產,一定不能跟你的常識都是違背的,如果你發現跟你常識違背的模型,你一定要去經過實驗來看看是不是真的有用,如果真有用了,這個東西叫知識發現,代表你發現了一個新的相關的指數,代表你有一個新的知識發現,但大部分情況下八竿子打不著的那些特徵,通常一定是沒有用的,一定是哪裡有錯了。你應該去考慮,所以L1有特徵選擇和增強模型解釋性的功能。如果有些維度被你訓練的時候,機器給它加了很大權重,但是隻能讓損失函式降低一點點,那麼很有可能會產生了過擬合現象,因此我們要懲罰那些帶不來什麼提高又浪費了好多資源的這種權重。舉個例子,比如你們家本來吃飯空間就有限,一哥們不幹活,天天還在你們家吃飯,佔用了大量的資源,但最後他也沒說沒貢獻,他每個月貢獻給你一毛錢,你覺得這個容忍你還要嗎?,你為了掙這一毛錢還不夠我給你收拾碗筷的。這個也一樣,你為了提升那一點點損失函式,還不夠你給我模型增加複雜度的帶來的過擬合風險,所以我選擇不要這個維度了。
我們再來討論下L2正則,定義是L2範數的平方。什麼叫L2範數?假如有a,b,它倆的L2範數就是。假如你有一組W,W的L2範數就是 ,這個東西定義為L2範數,通常寫作,這個就像一個運算子一樣,代表了這種運算。那麼L2範數的平方是我們的L2正則,因為又一次平凡,所以就把L2範數的根號給去掉,你就會看到,它實際上是把所有的W的平方給加合起來。也就是L2正規表示式:,什麼情況下這個值會大? W普遍比較大的時候,這個情況會大,或者說W的絕對值比較大的時候,這個情況會大。 當模型把好多的權重都認為比較重要的時候,這個東西是不是會變大?而且會越重要,大的越厲害,懲罰的越厲害。因此,把L2正則加上又會發生什麼?它會想做到儘量的把W給壓縮小一點,但是它不是每種W都壓縮,它會優先壓縮那些特別大的W優先,因為這些W對正則項帶來的提升是越好的,讓正則項變得越小,所以會優先壓縮那些最大的W,然後真正特別重要的W,它權重也會很大,這種東西也被壓縮了。 這是我們想要的結果嗎?明顯不是。你會發現我優化的時候不是單獨用一個正則項,在前面還加著損失項,所以它一定會壓縮那些又大又沒什麼用的那些W。所謂有用沒用怎麼評估?就是你W變一變損失函式根本沒發生什麼改變的情況下,這種W是不是又大又沒用?他會優先的把這些又大又沒用的W給儘量壓小,防止模型去過擬合。因此L2正則。預設一定是要帶上的,很明顯不帶任何懲罰項的損失函式根本就不能用。 它光追追求訓練集上發熱損失函式最小了,因為一絲不苟地只追求最小,它無論付出多大的代價,都要最小,因此一定會過擬合。所以在實際情況中一定會帶上L2正則。因此我們的目標函式obj裡面永遠是兩項,第一項是loss,第二項是L2,這個是防止過擬合的。我們總結下L2範數的作用,它是會使所有的W的絕對值都相對變小,而不會變到零,讓大家都小一些,特別重要的權重小的比較少,不太重要的權重往下減的多一點,它的作用就是抵抗過擬合。如果訓練出來的權重代表這一個特徵對最終結果影響的重要性,由於我們觀察到的特徵一定不是完備的,“強迫”演算法用並不完備的觀察特徵盡全力去擬合訓練集,一定會將一些訓練集中的巧合作為規律習得,然而這些巧合並不一定在未來預測時也會出現,因此這就是過擬合現象。我們要把這種現象去掉或者減少,就是通過正則去抵抗過擬合。
下一節中我們討論L1正則和L2正則的區別。