因為帶l1正則化項的損失函式是不可微的,所以這裡我們單獨來討論一下l1正則化的求解方法,這裡我們可以直接turn to sklearn for help.
solver : str, , optional (default=』liblinear』).
algorithm to use in the optimization problem.
for small datasets, 『liblinear』 is a good choice, whereas 『sag』 and 『saga』 are faster for large ones.
for multiclass problems, only 『newton-cg』, 『sag』, 『saga』 and 『lbfgs』 handle multinomial loss; 『liblinear』
is limited to one-versus-rest schemes.
『newton-cg』, 『lbfgs』, 『sag』 and 『saga』 handle l2 or no penalty
『liblinear』 and 『saga』 also handle l1 penalty
『saga』 also supports 『elasticnet』 penalty
『liblinear』 does not handle no penalty
liblinear:使用了開源的liblinear庫實現,內部使用了座標軸下降法來迭代優化損失函式。
lbfgs:擬牛頓法的一種,利用損失函式二階導數矩陣即海森矩陣來迭代優化損失函式。
newton-cg:也是牛頓法家族的一種,利用損失函式二階導數矩陣即海森矩陣來迭代優化損失函式。
sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合於樣本資料多的時候。
saga:線性收斂的隨機優化演算法的的變種。
可以看到,sklearn中支援l1正則化的求解演算法有liblinear和saga,由於l1範數用的是絕對值之和,導致損失函式有不可導的點。
但是實際上如果要使用梯度下降法或者牛頓法之類的其實也是可以的,只不過在部分點上導數木有意義不需要考慮到梯度更新的過程中。
如果不連續,則不可導。因為初等函式在定義域區間通常都是連續可導的,所以要證明不可導的通常都是一些分段函式分界點,轉折點等。比如y=|x|中x=0這個轉折點。
只須判斷其左右導數是否相等。只有它們都存在且相等,在該點才可導。
函式的條件是在定義域內,必須是連續的.可導函式都是連續的,但是連續函式不一定是可導函式.例如,y=|x|,在x=0上不可導.即使這個函式是連續的,但是lim(x趨向0+)y'=1, lim(x趨向0-)y'=-1,兩個值不相等,所以不是可導函式。也就是說在每乙個點上導數的左右極限都相等的函式是可導函式,反之不是
首先判斷函式在這個點x0是否有定義,即f(x0)是否存在;首先看一下l1正則化的損失函式:其次判斷f(x0)是否連續,即f(x0-), f(x0+), f(x0)三者是否相等;
再次判斷函式在x0的左右導數是否存在且相等,即f『(x0-)=f'(x0+)
只有以上都滿足了,則函式在x0處才可導。
則關於引數theta求導可得:
關於絕對值的導數可以用sgn(x)函式來表示,具體可見:
其中對於二元邏輯回歸,h表示sigmoid(w*x)
我們先實現一下常規的梯度下降求解lr:
import numpy
def sigmoid(inx):#定義sigmoid函式
return 1.0/(1+exp(-inx))
sgn = lambda x: 1 if x > 0 else -1 if x < 0 else 0 #定義sgn函式
#這裡我們需要將單函式進行函式向量化
sgn_vec=np.vectorizer(sgn)
def gradascent(datamatin, classlabels):
datamatrix = mat(datamatin) #
labelmat = mat(classlabels).transpose() #這兩行不用太在意,和演算法沒關係就是格式轉換而已
#labelmat是0-1標籤值,datamatrix是特徵矩陣
m,n = shape(datamatrix)
alpha = 0.001 #學習率,用於調整梯度下降的步幅
lambda=0.01 #正則化係數
maxcycles = 500 #最大迭代次數,因為這裡直接使用的是批梯度下降法(bgd),所以這裡的迭代次數
#就是使用全部資料計算全部樣本的損失函式的值的並進行統一的梯度更新 這個過程重複多少次
weights = np.ones((n,1)) #權重和偏置統一放在一起變成乙個大權重,這樣計算方便的多
#這裡使用的是全1初始化,lr對於初始化並不敏感
for k in range(maxcycles):
h = sigmoid(datamatrix*weights) #
error = h-labelmat #這句就是根據上面求的梯度更新量的那個公式得到的
b_weight=weights[:,0]
weights = alpha*weights - alpha * datamatrix.transpose()* error - lambda*(np.sum(alpha*sgn_vec(weights))-weights.tolist[0])
#可以看到,無論是l1還是l2都不對偏置進行約束,並且二者都是在公共的權重更新公式上又減去某乙個數,l1相對原始的lr來說就是增加了後面的
#sgn這一項,並且需要注意把偏置分離開,偏置和正則化之間是沒有交集的要注意分開處理
weights[:,0]=b_weight - alpha * datamatrix[:,0].transpose()* error[:,0]
return weights
可以看到,相對於原始的邏輯回歸不帶正則的推導出來的梯度更新式,l2正則化每次都是
將原來的weights按照一定比例縮小為原來的一部分,並且縮小的量也會隨著weights變得越小而改變的越小,所以l2只能將係數壓縮到趨近於0的小數字但是無法為0。
而l1正則化每次都是:
減去某個數字,和weights的大小基本無關,只要weights>0就是1,<0就是-1,所以明顯這種方式能夠導致部分weights變成0
有空再寫座標軸下降法
座標下降法和梯度下降法的損失函式是一樣的,不同的是座標下降法是每次固定n-1個引數,去單獨優化剩下的乙個引數
下面為具體的更新過程。
(1)選取初始引數
這裡的theta就是邏輯回歸的權重係數
(2)針對當前得到的引數進行迭代,假設已經求出第k-1輪的引數,現在由求,其中,則:
(3)通過以上步驟即可以得到每輪的迭代結果,如果相對於的變化很小,則停止迭代,否則,重複步驟(2).
通過以上迭代過程可以看出
1. 座標軸下降法進行引數更新時,每次總是固定另外m-1個值,求另外乙個的區域性最優值,這樣也避免了lasso回歸的損失函式不可導的問題。
2. 座標軸下降法每輪迭代都需要o(mn)的計算。(和梯度下降演算法相同)
動態正則化權重係數 正則化處理
過擬合 過擬合本質上是模型太過複雜,複雜到消弱了模型的泛化能力。由於訓練資料時有限的,因此總可以通過增加引數的的方式來提公升模型的複雜度,降低訓練誤差。可正如你學習的領域越專精,可應用的範圍可能越窄,則在模型訓練中就是指過擬合。過擬合如圖所示的紅色曲線就是過擬合。正則化正則化是用於抑制過擬合方法的統...
邏輯回歸 正則化 感知機
為避免過擬合,增強模型的泛化能力,可以使用正則化的方法。lasso回歸 l1正則化 j theta frac mathtt x theta y t mathtt x theta y alpha lvert theta rvert 1 alpha 為常數係數,需要進行調優,lvert theta rv...
深度學習(正則化的線性回歸和邏輯回歸)
clear clc 載入資料 x load ex5linx.dat y load ex5liny.dat 顯示原始資料 plot x,y,o markeredgecolor b marke cecolor r markersize 10 將特徵值變成訓練樣本矩陣 x ones length x 1 ...