感知機2 -- 隨機梯度下降算法
聲明:
1,本篇為個人對《2012.李航.統計學習方法.pdf》的學習總結。不得用作商用,歡迎轉載,但請註明出處(即:本帖地址)。
2,因為本人在學習初始時有非常多數學知識都已忘記。因此為了弄懂當中的內容查閱了非常多資料。所以裏面應該會有引用其它帖子的小部分內容,假設原作者看到能夠私信我。我會將您的帖子的地址付到以下。
3,假設有內容錯誤或不準確歡迎大家指正。
4,假設能幫到你,那真是太好了。
概述
隨意選取一超平面w0、b0,然後用隨機梯度下降算法不斷極小化L(w, b)。
Ps: 極小化的過程不是一次使M中的全部誤分類點的梯度下降,而是隨機選取一個誤分類點使其梯度下降。
過程概述
1,對於L(w, b) = -yi(w·xi+ b)。L(w, b)的梯度例如以下:
▽w L(w, b) = - yixi
▽b L(w, b) =- yi
2,隨機選取一個誤分類點(xi, yi),對w,b更新:
w= w + ηyixi
b= b + ηyi
(η為步長。在統計學習中又稱學習率)
這樣,通過叠代能夠期待L(w,b)不斷下降,直到為0。
算法的第一種形式(感知機算法的原始形式)
輸入:
訓練數據集 T={(x1,y1),(x2,y2),...,(xn,yn)},當中x1∈Rn,yi={+1,-1},i=1, 2, ..., n,學習率η(0 < η<= 1)
輸出:
w, b。感知機模型 f(x) = sign(w·x + b)
過程:
1, 選取初值w, b
2, 在訓練集中取數據(xi,yi)
3。 若 yi(w·xi+ b) <= 0 即分類不對。則:
w= w + ηyixi
b= b + ηyi
註:由於此時分類不正確,所以yi= -1
4, 轉至步驟2,直到訓練數據集中無誤分類點
總結:
直觀上解釋上面的過程就是:若一個實例點被誤分類,即:位於超平面的錯誤一側時,需調整w, b 的值,使分離超平面向該誤分類點的一側移動。以降低該誤分類點與超平面的距離。直至超平面越過該誤分類點使其被正確分類。
例:
輸入:
訓練數據集 x1= (3, 3)。x2 = (4, 3),為正實例點(被正確分類)。x3 = (1, 1)為負實例點
求:
f(x)= sign(w·x + b)
ps:這裏的w = (w(1),w(2)),x = (x(1), x(2))
解:
1。 令η=1,並取初值w0 = 0, b0= 0
2, 對x1= (3, 3)。yi(w·xi + b) = 0,未能被正確分類,因此更新w, b
w = w + ηy1x1 = (3, 3)
b= b + ηy1 = 1
獲得線性模型:w·x + b = 3x(1) + 3x(2) + 1
3, 檢查該線性模型:
對於x1和x2,∵正確分類,∴不改動w,b
對於x3= (1, 1)。∵y3(w·x3 + b) < 0。∴被誤分類,∴須要改動w, b
到此說明下: a。 上面出現的yi不是f(x) = w·x + b的f(x),而是代表某個點xi是否被正確分類的值: 正確分類 :yi = 1 不對分類:yi = -1 所以。y1 = 1, y2 = 1, y3 = -1 所以,在上面的第三步中 對x1 和 x2: yi(w·xi + b) = 1*(3xi(1) + 3xi(2) + 1) > 0,被正確分類 對x3: y3(w·x3 + b) = -1*(3x3(1) + 3x3(2) + 1) = -1*(3*1 + 3*1 + 1) < 0,未被正確分類 b。 既然yi不是f(x),那y坐標用什麽表示? 答案是: xi(1) 表示xi點的x坐標 xi(2) 表示xi點的y坐標 c。 w·x1為內積 於是對於w = (0, 0),x1 = (3, 3): w·x1 = 0*3 + 0*3 = 0 |
繼續第三步,更新w, b:
w = w + ηy3x3 = (3, 3) + -1 * (1, 1) = (2, 2)
b= b + ηy3 = 1 + -1 = 0
於是,線性模型更新為:
w·x + b = 2x(1)+ 2x(2)
4。 叠代上述過程,直到:
w = (1, 1),b = -3
即,線性模型為:
x(1)+ x(2) – 3
此時對全部的點均有yi(w·xi+ b) > 0。無誤分類點,於是損失函數達到最小。
終於求得:
分離超平面:x(1)+ x(2) – 3
感知機模型:f(x) =sign(x(1) + x(2) – 3)
附,叠代過程:
叠代次數 |
誤分類點 |
w |
b |
w·x + b |
0 |
|
0 |
0 |
0 |
1 |
x1 |
(3, 3) |
1 |
3x(1) + 3x(2) + 1 |
2 |
x3 |
(2, 2) |
0 |
2x(1) + 2x(2) |
3 |
x3 |
(1, 1) |
-1 |
x(1) + x(2) - 1 |
4 |
x3 |
(0, 0) |
-2 |
-2 |
5 |
x1 |
(3, 3) |
-1 |
3x(1) + 3x(2) - 1 |
6 |
x3 |
(2, 2) |
-2 |
2x(1) + 2x(2) - 2 |
7 |
x3 |
(1, 1) |
-3 |
x(1) + x(2) – 3 |
8 |
無(模型確定) |
(1, 1) |
-3 |
x(1) + x(2) – 3 |
註:
上述過程中誤分類點先後取:
x1,x3,x3,x3,x1,x3,x3
得到 w = (1, 1), b = -3
若誤分類點先後取:
x1,x3,x3。x3,x2,x3,x3,x3,x1,x3,x3
那w = (2, 1), b = -5
可見:
感知機學習算法假設採用不同的初值或叠代不同的誤分類點,那結果也不同。
感知機算法的收斂性
到這裏有個問題:
怎麽知道對一個數據集,我們可採用感知機學習策略?
答案就是:
在經過有限次搜索後。可找到將訓練數據全然正確分類的超平面,也就是說算法具有收斂性。
Ps1:算法收斂意味著訓練數據集線性可分
Ps2:線性支持向量機可解決上例有多個解的問題
算法的另外一種形式(感知機算法的對偶形式)
在原始形式中有公式:
w= w + ηyixi
b= b + ηyi
那麽如果一共改動了n次,則w,b關於(xi(1),xi(2))的增量分別為:
aiyixi和 aiyi (ai= niη)
即:
若η=1,則ai就是第i個點因為誤分類而進行更新的次數。即ai = ni。
ai越大 => 實例點更新次數越多 =>越難正確分類,換句話說:這種實例對學習結果影響更大!
然後,感知機算法的對偶形式的算法例如以下:
輸入:
線性可分數據集 T={(x1,y1),(x2,y2),...,(xn,yn)},當中x1∈Rn。yi={+1,-1},i=1, 2, ..., n。學習率η(0 < η<= 1)
輸出:
感知機模型 f(x) = sign( aiyixi·x + b)
過程:
1, 令a = 0。b = 0
2。 在訓練集中取數據(xi,yi)
3, 若
則:
ai= ai + η
b= b + ηyi
4。 轉至2直到無誤分類數據
而因為對偶形式的訓練實例僅以內積形式出現
所以我們預先將訓練集中實例間的內積計算出來並以矩陣形式存儲,即:產生Gram矩陣(格拉姆矩陣)
G = [ xi, yi ]n*n
樣例
輸入:
正樣本點x1= (3, 3)。x2 = (4,3)
負樣本點x3= (1, 1)
求:
感知機模型
解:
1, 令ai= 0。i = 1, 2, 3。b = 0,η=1
2, 計算Gram矩陣
x1·x1 x1·x2 x1·x3
G = x2·x1 x2·x2 x2·x3
x3·x1 x3·x2 x3·x3
3, 誤分條件
yi( aiyixi·x + b) <= 0
時。參數更新
ai = ai +1
b = b + yi
4, 開始叠代
由於這裏僅僅有3個點
所以:
= yi((a1y1x1·xi + a2y2x2·xi + a3y3x3·xi) + b)
= yi((a1x1·xi + a2x2·xi - a3x3·xi)+ b)
4.1,遍歷全部的點。然而在對點x1(第一次叠代)時
由於1*(0 + 0*0 – 0*0) = 0 誤分類
所以。
a1 = a1 +1 = 0 + 1 = 1
b = b + y1 = 0 + 1 =1
如今:
a1 = 1, a2= 0, a3 = 0, b = 1
4.2, 遍歷全部的點
對點x1
y1*(1 *x1·x1+ 0 – 0 + 1) = 1*(18 + 1) > 0 被正確分類
x2同理,也被正確分類
對點x3
y3*(1 * x1·x3 + 0 – 0 + 1) = -1 * (6 +1) < 0 誤分類
所以。
a3 = a3 +1 = 0 + 1 = 1
b = b + y3 = 1 - 1 =0
如今:
a1 = 1, a2= 0, a3 = 1, b = 0
4.3, 遍歷全部的點。這一步中x1和x2被正確分類,而x3
y3*(1 *x1·x3+ 0 – 0 * x3·x3 + 0) = -1 * (6 -2) < 0 誤分類
所以,
a3 = a3 +1 = 1 + 1 = 2
b = b + y3 = 0 - 1 =-1
如今:
a1 = 1, a2= 0, a3 = 2, b = -1
4.4, 同理,這一步中x1和x2被正確分類。而x3被誤分類
所以,
a3 = a3 +1 = 3
b = b + y3 = -2
如今:
a1 = 1, a2= 0, a3 = 3, b = -2
4.5, 這一步中剛遍歷到x1時就發現其被誤分類
所以,
a1 = a1 +1 = 1 + 1 = 2
b = b + y1 = -2 + 1 =-1
如今:
a1 = 2, a2= 0, a3 = 3, b = -1
4.6,同理,遍歷到x3時發現被誤分類
更新a3和b之後,如今:
a1 = 2, a2= 0, a3 = 4, b = -2
4.7,同理,遍歷到x3時發現被誤分類
更新a3和b之後。如今:
a1 = 2, a2= 0, a3 = 5, b = -3
4.8。全被正確分類
5,得出結果:
w = 2x1 + 0x2-5x3 = 2(3,3) – 5(1,1) = (1,1)
b = -3
所以超平面為:
x(1) + x(2)-3 = 0
所以感知機模型為:
f(x) = sign(x(1) + x(2)-3)
隨機梯度下降算法中感知機原始模式的代碼演示樣例
#-*-coding:utf-8-*- # LANG=en_US.UTF-8 # 梯度下降算法 -- 感知機原始模式 # 文件名稱:stochastic_gradient_descent.py _list = [ [1, 1, -1], [3, 3, 1], [4, 3, 1], ] w1 = w2 = 0 b = 0 n = 1 _len = len(_list) while [ 1 ]: num = 0 for i in _list: x1 = i[0] x2 = i[1] y = i[2] judge = y * (w1*x1 + w2*x2 + b) if judge <= 0: w1 = w1 + y*x1 w2 = w2 + y*x2 b = b + y else: num += 1 if num == _len: print("f(x) = sign( (%s,%s)*x + %s )" % (w1, w2, b) ) break
感知機2 -- 隨機梯度下降算法