# CS231N (2017) Lec 03 課程筆記
###### tags: `CV`
🔷 Multi-class SVM Classifier - Loss function & Optimization
📌 Recall from last time: Linear Classifier
(1) 「輸出」各類別預測分數 (此例非 "機率值" 而是 "分數")
➡️ 目標: 正確的類別 具有 最高的分數、
視覺上最相似的類別 具有 次高的分數、
視覺上第二相似的類別 具有 第三高的分數、
(2) KNN: 根據 distance metric 找最近鄰居,基於「所有資料點」
(3) Linear Classifier: 參數型分類器,基於從所有資料點提取出的「權重 (參數) 矩陣」
📌 Steps of determining the weight
(1) Loss function (損失函數)
定義一個函數
用於量化「損失」: 估計值 (輸出向量的「得分」) 和實際值 (「標籤」) 的差異
// 損失: 即「殘差」(residual)
(2) Optimization (最佳化)
定義一種方法
用於找尋使損失函數最小化的權重 (參數, W)
📌 Loss function of Linear Classifier
(1) usage
可以告訴我們目前分類器的好壞
(2) functional form
給定一個資料集如下
{ ( x_i, y_i ) }_i = 1 to N
其中 x_i 是影像 (像素強度矩陣)
其中 y_i 是標籤 (整數)
則,損失函數可定義為:
➡️ L = 1/N Σ_i Li ( f ( x_i, W), y_i )
上述是一種非常龐統 (general) 的表示
即: 所有類別各自損失值的平均
➡️ Li ( f ( x_i, W), y_i )
= 第 i 個樣本的損失
= Li (估計值 , 實際值)
= 將 估計值: f ( x_i, W) 和 實際值: y_i 間的差異
以損失函數量化,所得到的數值
➡️ 1/N Σ_i
對所有樣本的 損失 取平均
其中 N 為資料集的樣本數
📌 Loss function of Multi-class SVM Classifier (Multi-class SVM loss)
給定一個資料集如下
{ ( x_i, y_i ) }_i = 1 to N
其中 x_i 是影像 (像素強度矩陣)
其中 y_i 是標籤 (整數)
並用一個符號 s 表示得分,定義: s = f (x_i, W)
SVM 損失具有以下形式:
➡️ Li = Σ_( j ≠ y_i )
{ 0 if s_( y_i ) >= s_( j ) + 1
s_( j ) - s_( y_i ) + 1 otherwise }
= max ( 0 , s_( j ) - s_( y_i ) + 1 )
解釋:
(1)
j 為 第 j 個標籤,與資料所屬的 "真實類別標籤" 相異
---------------------------------------------------------------
若「預測正確」:真實標籤: s_( y_i ) 的得分較高 => 令損失值為 0
反之,若「預測錯誤」 => 令損失值為「一個移項後的正值」
(2)
「預測正確」情況下: s_( j ) - s_( y_i ) + 1 <= 0,會得到一個負值或 0
因此 max ( 0 , s_( j ) - s_( y_i ) + 1 ) 必為 0
反之,「預測錯誤」情況下: s_( j ) - s_( y_i ) + 1 > 0,會得到一個正值
因此 max ( 0 , s_( j ) - s_( y_i ) + 1 ) 必為 s_( j ) - s_( y_i ) + 1
原本的 條件式賦值 就可改寫為第二條等式的 最大值函數
(3)
「s_( y_i ) >= s_( j ) + 1 」中的 "1"
有關「"真實類別標籤" s_( y_i ) 『明顯』大於 "其它類別標籤" s_( j )」的陳述
若只以 >= 串接兩者,「明顯」的描述不夠明確
因此 "1" 可看作一個安全係數,確保兩者差異足夠明顯
➡️ 圖形: Hinge (鉸鏈,合頁)
Multi-class SVM loss 的圖形長得像門的合頁,故又稱 Hinge Loss
Case1: s_( y_i ) >= s_( j ) + 1 → Multi-class SVM loss = 0
「"真實類別標籤" s_( y_i ) 『明顯』大於 "其它類別標籤" s_( j )」
會使
「損失值為 0」
Case2: s_( y_i ) < s_( j ) + 1 → Multi-class SVM loss = s_( j ) - s_( y_i ) + 1
「"真實類別標籤" s_( y_i ) 『無明顯』大於 "其它類別標籤" s_( j )」
會使
「損失值為 一條直線」
➡️ 計算範例:
(1) Q: { 貓咪、車子、青蛙 } Multi-class SVM 分類器的預測得分分別是 (3.2, 5.1, -1.7)
若正確類別為貓,計算此分類器在貓咪類的 loss
A:
(步驟:
定義: 總更新量 ← 0
對所有其它錯誤類別:
定義: 更新量 ← "錯誤類別的得分 - 真實類別的得分 + 1"
更新量 ← max ( 0, 更新量 )
總更新量 ← 總更新量 + 更新量
特定類別的損失值 ← 總更新量
)
------------------------------------------------------------------------------------
loss (cat) = max ( 0, 5.1 - 3.2 + 1 ) + max ( 0, (-1.7) - 3.2 + 1 ) = 2.9
(2) Q: { 貓咪、車子、青蛙 } Multi-class SVM 分類器的預測得分分別是 (1.3, 4.9, 2.0)
若正確類別為車,計算此分類器在車子類的 loss
A: loss (car) = max ( 0, 1.3 - 4.9 + 1 ) + max ( 0, 2 - 4.9 + 1 ) = 0
// 或另一種方法: 正確類別標籤的分數最高,故 loss = 0
(3) Q: { 貓咪、車子、青蛙 } Multi-class SVM 分類器的預測得分分別是 (2.2, 2.5, -3.1)
若正確類別為青蛙,計算此分類器在青蛙類的 loss
A: loss (frog) = max ( 0, 2.2 - (-3.1) + 1 ) + max ( 0, 2.5 - (-3.1) + 1 ) = 12.9
(3) Q: { 貓咪、車子、青蛙 } 承 (1) ~ (3),計算此分類器的 loss
A: loss = ( loss (cat) + loss (car) + loss (frog)) / 3
= (2.9+0+12.9)/3 ~= 5.27
➡️ Q & A
(1) Q: 計算範例 2 中,若車子的得分因為稍微搖晃 (jiggle) 而改變,loss (car) 會有何影響?
A: 若車子的得分變動不大
邊界 (margin) 仍會保持不變 (=1)
---------------------------------------------------------
補充 - 1:
margin = 1,令新值 X,當 2-X+1 > 0 (X < 3) 存在「非零 loss」
// 計算範例 2 中,「得分較高的錯誤類別」為 青蛙類,其「得分為 2」
// 且已知「邊界為 1」
// 故「正確類別的得分需 >= 3」
---------------------------------------------------------
補充 - 2:
> faintly 微弱的
(2) Q: Multi-class SVM 的 L_i 之最小值和最大值為何?
A: ➡️ (1) loss 最小值為 0
---------------------------------------------------------
➡️ 由 hinge loss 圖形可看出,即右側 = 0 的平坦函數值
➡️ 另一種方法:
當:「正確類別的得分最高」
會使: L_i = 0 x (n-1) = 0
➡️ (2) loss 最大值為 ∞
---------------------------------------------------------
➡️ 由 hinge loss 圖形可看出,即左側無限延伸
➡️ 另一種方法:
已知 L_i = Σ_( j ≠ y_i ) [ max ( 0 , s_( j ) - s_( y_i ) + 1 ) ]
假設: 正確類別的得分 s_( y_i ) = -∞
// 得分的數值範圍理論上沒有限制
↓
s_( j ) - s_( y_i ) + 1 = (有限實數集內 的 某個值) - (-∞) + 1 = ∞
↓
max ( 0 , ∞ ) = ∞
↓
Σ_( j ≠ y_i ) [ ∞ ] = (n-1) x ∞ = ∞
↓
L_i = ∞
(3) Q: 訓練初期,初始權重設定值通常是 ~= 0 的一批很小的隨機數值
請問期望的 loss 為何?
A: 已知 s_( j ) ~= s_( y_i ) ~= 0
故得 L_i = Σ_( j ≠ y_i ) [ max ( 0 , s_( j ) - s_( y_i ) + 1 ) ]
= Σ_( j ≠ y_i ) [ max( 0, 0 - 0 + 1) ]
= (n - 1) x 1
= n - 1 // 錯誤類別的數量
---------------------------------------------------------
補充 - 1:
➡️ 如果訓練初期,你的 loss 非 n-1 (n: 類別數量),
可能代表你的程式有問題,go check
(4) Q: 承 (3),若 總和 (即 L_i 的總和: Σ_( j ≠ y_i )) 涵蓋所有類別,會怎樣?
(包括 j = y_i)
A: total loss 會比原始定義的 total loss 多 1
---------------------------------------------------------
補充 - 1:
n ( Σ_( j = y_i ) [ max ( 0 , s_( j ) - s_( y_i ) + 1 ) ] )
= n ( Σ_( j ≠ y_i ) [ max ( 0 , s_( j ) - s_( y_i ) + 1 ) ] ) +
(score of correct class - score of correct class + 1)
= n ( Σ_( j ≠ y_i ) [ max ( 0 , s_( j ) - s_( y_i ) + 1 ) ] ) + 1
// n : number
---------------------------------------------------------
補充 - 2:
loss of zero (loss = 0) 的解釋是 not lossing at all
所以在單一類別的損失值 (L_i) 計算中
通常只會考慮那些「錯誤類別」 (不是 image 之對應 class 的其它所有 classes)
換句話說,是針對「所有非給定 label 的其它 labels」
逐一計算殘差:當每一個「錯誤類別標籤的得分」遠大於「正確類別」,
則:懲罰一個非零值 loss ≠ 0
(希望「權重的數值」往正確的方向修正);
反之,
則:更新一個 loss = 0,代表不用做任何修正
(保持不變)
另一方面,
「將『正確類別的得分』列入『L_i (單一類別的 loss)』的計算」到底有無意義?
回到 L_i 的理解
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
L_i 代表「與正確類別間差異的度量」:
(a) 當「錯誤類別的得分大」並且「遠大於 (- margin) +正確類別的得分」
(預測值 嚴重偏離 實際值)
→ 希望 L_i 大一點,使得修正的程度 (更新量) 較大
(b) 當「錯誤類別的得分小」但仍舊「大於 (- margin) +正確類別的得分」
(預測值 稍微偏離 實際值)
→ 希望 L_i 小一點,使得修正的程度 (更新量) 較小
(c) 只有當「錯誤類別的得分」小於或等於「(- margin) +正確類別的得分」
(預測值 符合期待,足夠合理;
不等式的右側,
以「減去一個正實數 margin」確保「錯誤類別的得分『足夠小』」)
→ 希望 L_i = 0,不需做修正
---------------------------------------------------------
由上述說明可看出
基本上「正確類別」在 L_i 的度量上,只扮演一個「被比較的對象」
而且確保錯誤類別的得分足夠小的方法是調整 margin
(margin 越大,對錯誤類別得分的容忍度越低)
將「正確類別得分」納入 L_i 考量的實際作用並不大,沒必要特別這麼做
(5) Q: 若 L_i = Σ_( j ≠ y_i ) [ max ( 0 , s_( j ) - s_( y_i ) + 1 ) ] 其中的 Σ (總和) 改成 平均
會有何影響?
A: Doesn't change (分類結果沒差)
---------------------------------------------------------
補充 -1
L_i 中的 Σ 改成 平均,即: 「令 L_i ' = L_i / number of classes」
考慮「同一個 dataset」的 number of classes 是一個「固定」常數:
number of classes 的影響,會隨著訓練次數增加而被洗掉 (wash out)
另外,通常損失值只關注相對數值 (衡量錯誤類的分數是否「相對小」) 而非絕對數值
---------------------------------------------------------
若以圖形來表示的話
類似: 分類結果不變 (原本若為線性分類,調整後仍是線性分類)
只有尺度改變 (根據 number of classes 對不同資料集做不同程度的尺度縮放)
仍可視為同一個分類問題
---------------------------------------------------------
補充 -2
loss 乘以或除以一個數,都會被學習過程裡乘以一個數或除以一個數抵銷
➡️ 詳見 Batch Normalization 或 Exponential weight decay
(6) Q: 若 L_i = Σ_( j ≠ y_i ) [ max ( 0 , s_( j ) - s_( y_i ) + 1 ) ]
改成 L_i = Σ_( j ≠ y_i ) { [ max ( 0 , s_( j ) - s_( y_i ) + 1 ) ] ^ 2 }
會有何影響?
A: Different (分類結果會有不同)
---------------------------------------------------------
補充 -1
這種調整,會帶來災難性的影響 (劇變)
對於「錯誤類別的得分過高」的懲罰,會從「常數倍」變成「平方倍」
是否應該制定這樣的 (平方倍的) 損失函數,取決於你應用 (應是指資料分佈)
---------------------------------------------------------
補充 -2
每一個介於兩種相異類別間的「決策邊界 (Decision boundary)」,
(=> 可看作 the trade-offs between the goodness and badness)
若原本是「線性函數」,調整後會變成「非線性函數」。
(=> 以圖形表示,原本由「一條直線」作為「區分不同種類資料的漸進線或擬合線」
若線性函數加上平方,
則類似以「一條拋物線」作為「區分不同種類資料的漸進線或擬合線」)
(6) Q: 假設存在一個 W 使得 L = 0,這個 W 是唯一的嗎?
A: No, 2W is also has L = 0.
---------------------------------------------------------
補充 -1
📌 Multi-class SVM Loss: Example Code
def L_i_vectorized (X, Y_i, W):
scores = W.dot(X)
// ∀_( j ∈ class labels: [ 0,1,2 ] ) [ s_( j ) ]
// i.e., [ 3.2 5.1 -1.7 ] when i = 0
// [ 1.3 4.9 2.0 ] when i = 1
// [ 2.2 2.5 -3.1 ] when i = 2
margins = np.maximum(0, scores - scores[Y_i] + 1)
// ∀_( j ) [ max ( 0, s_( j ) - s_( y_i ) + 1 ) ]
// i.e., [ max(0, 3.2-3.2+1) max(0, 5.1-3.2+1) max(0, -1.7-3.2+1) ]
// = [ 1 2.9 0 ] when i = 0
// [ max(0, 1.3-4.9+1) max(0, 4.9-4.9+1) max(0, 2.0-4.9+1) ]
// = [ 0 1 0 ] when i = 1
// [ max(0, 2.2-(-3.1)+1) max(0, 2.5-(-3.1)+1) max(0, -3.1-(-3.1)+1) ]
// = [ 6.3 6.6 1 ] when i = 2
margins[Y_i] = 0
// ∀_( j ≠ y_i ) [ s_( j ) - s_( y_i ) + 1 ]
// i.e., [ 1 2.9 0 ] → [ 0 2.9 0 ] when i = 0
// [ 0 1 0 ] → [ 0 0 0 ] when i = 1
// [ 6.3 6.6 1 ] → [ 6.3 6.6 0 ] when i = 2
loss_i = np.sum(margins)
// i.e., sum( [ 0 2.9 0 ] ) = 2.9 when i = 0
// sum( [ 0 0 0 ] ) = 0 when i = 1
// sum( [ 6.3 6.6 0 ] ) = 12.9 when i = 2
return loss_i
// i.e., 2.9 when i = 0
// 0 when i = 1
// 12.9 when i = 2
📌 Overfiting & Regularization
➡️ 快速回顧: 機器學習的原理
損失函數:
L ( W ) = 1/N Σ_i to N [ Li ( f ( x_i, W), y_i ) ]
\\ //
資料損失 (Data loss)
模型預測結果
應該要與訓練資料匹配
(1)
We only told our classifier: it should try to find a W that fits data.
But really in practice, we don't actually care that much about fitting the training data.
我們只告訴我們的分類器:它應該嘗試找到適合數據的 W
但實務上我們並不太關心擬合訓練數據
// 最基本的 ML 架構,在 performance of fitting 上,並沒有設計太多處理機制
// => 這邊是想引導出潛在的 overfiting 問題
// 以及,導入 regularization 的必要性
(2)
The whole point of Machine Learning,
is we use the training data to find a classifier,
and we apply that thing to test data.
機器學習的全部意義在於:
我們利用訓練數據找到一個分類器,然後將其應用於測試數據
🔘 快速回顧: 機器學習的原理
🔘 損失函數:
L ( W ) = 1/N Σ_i to N [ Li ( f ( x_i, W), y_i ) ] + λ R ( W )
\\ // \\ //
資料損失 (Data loss) 正規化 (Regularization)
模型預測結果 模型應該儘量「簡單」
應該要與訓練資料匹配 不會過度學習訓練集特徵
因此加上它通常在測試集上會表現更好
➡️ R : 正規化懲罰 (Regularization Penalty)
➡️ λ : 正規化強度 (Regularization Strength)
是一種超參數 (Hyper-parameter)
➡️ 考慮一個多項式迴歸問題
用來最佳化的目標函數加入正規化項後
可以 誘導(encourage)模型
選擇較低維度的擬合線(漸進線)
而不至於:過度擬合訓練集,而在測試集失準
🔘 概念: 取決於任務和模型
🔘 奧卡姆剃刀 (Occam's Razor)
"Among competing hypotheses, the simplest is the best." --- William of Ockham, 1285 - 1317
解釋 ➡️ 根據某些實驗資料的觀察(observation)而做出多個相互比較優劣的假設之中,
通常應該選擇相對簡單的假設,並將其推廣到未來較新的觀察上
🔘 何謂正規化「懲罰」
類似: 軟邊界、軟約束(soft constraint)
「懲罰」代表:資料點必須超過(overcome)這個這個「軟約束」才會被模型判斷為另一類
🔘 正規化懲罰的種類
▫️ L2 : R(W) = Σ_( k) Σ_( l ) W^2_( k, l )
最常見的形式
L2 正規化僅是在懲罰權重向量 W 在歐式距離內的向量長度
L2 regularization is just penalizing the Euclidean norm of this weight vector W
其它變型:
-權重下降(weight decay)
-乘以 1/2
▫️ L1 : R(W) = Σ_( k) Σ_( l ) | W_( k, l ) |
跟稀疏性(Sparsity)有關
▫️ Elastic Net ( L1 + L2 ) : R(W) = Σ_( k) Σ_( l ) [ β W^2_( k, l ) + | W_( k, l ) | ]
▫️ Max norm regularization
▫️ Dropout
▫️ Fancier: Batch Normalization
Stochastic Depth
🔘 延伸問題: L1 和 L2 正規化如何衡量(measure)模型的複雜度
example:
X = [ 1 1 1 1 ]
W_1 = [ 1 0 0 0 ]
W_2 = [ 0.25 0.25 0.25 0.25 ]
X dot W_1 = X dot W_2 = 1
------------------------------------------
# L2 正規化如何衡量(measure)模型的複雜度
=> L2 ( W_1) = 1, L2 ( W_2 ) = 1/16 * 4 = 0.25
=> In terms of W_1 and W_2,
L2 regularization prefer W_2 because it has smaller norm.
L2 正規化對於模型的複雜度,主要以上述這種比較粗略的方式看待
L2 正規化的想法主要是:
(1) 它主要以「資料密集(density)程度」作為複雜性的衡量 🌟
即:資料點的分佈「越密集」,對 L2 正規化而言模型「複雜度越低」
(可視為:歐幾里得空間中,以原點 (0,0) 為平均的離差平方和)
它偏好選擇對於 輸入資料 X 中的每個 value (or entry)
都有一定程度影響的 權重 W
(2) 這可能會使模型具有更高的 強固性 (robustness)
因為 W 的最終數值更傾向於: 取決於整個 X,而非取決於 X 的一小部分
------------------------------------------
# L1 正規化如何衡量(measure)模型的複雜度
=> In terms of W_1 and W_2,
L1 regularization prefer W_1 because it has smaller norm.
L1 正規化的想法主要是:
它主要以「資料稀疏(sparsity)程度」作為複雜性的衡量 🌟
即:資料點的分佈「0s 的數量越少」,對 L2 正規化而言模型「複雜度越低」
🔷 Softmax Classifier (Multinomial Logistic Regression)
📌 介紹
🔘 Softmax Classifier,等同「多項式邏吉斯回歸」(Multinomial Logistic Regression)
🔘 Softmax Classifier 的 loss function 對於 輸出分數(scores)的「可解釋性」較佳
// 〈比較〉
// Multi-class SVM 的 loss function 對於 輸出分數 的「可解釋性」較差
// => 只能得知: 希望「正確類別的得分」大於「錯誤類別的得分」
// => 但「得分」本身沒有太多意義或解釋
🔘 Softmax Classifier 的 loss function
➡️ 得分 = 未正規化 的 類別機率值 取對數,符號: s
➡️ Softmax 函數
P ( Y = k | X = x_i ) = ( e_( s ) * k ) / ( Σ_( j ) e_( s ) * j )
where
s = f ( x_i ; W )
-----------------------
解釋:
(1) 取自然指數
針對: 輸入資料 x_i 、類別 k 的「得分」 s 計算其自然指數 e_( s )
s 可能為正數有負數,而 e_( s ) 為正數
(2) 正規化
將 e_( s ) x k 除以 Σ_( j ) e_( s ) x j ,
即 Softmax 對單一類別的輸出機率值 P ( Y = k | X = x_i ),其值介於 [ 0,1 ]
➡️ Softmax 分類器的 loss function
L_i = - log P ( Y = y_i | X = x_i )
= - log P ( e_( s ) * y_i ) / ( Σ_( j ) e_( s ) * j )
// L_i : loss function,負對數的估計機率值
// P ( Y = y_i | X = x_i ) : 正確類別的估計機率值
-----------------------
解釋:
(1) 上述 L_i 為針對特定單一類別所「計算出的機率分佈」,是一個「估計量」
(2) 與「真實的機率分佈」(目標)兩者的差值即是「殘差」
(3) 我們希望「計算出的機率分佈」匹配/接近(match / close to)「真實的機率分佈」
// 真實機率分佈
// 只有 正確類別 的機率值是 1,其它類別的機率值都是 0
// 衡量計算出的機率分佈和真實機率分佈的計算方法
// 計算方式-1: 介於兩分佈間的「KL 散度」(KL divergence)
// 計算方式-2: 最大概似估計 (MLE, Maximum Likelihood Estimation)
(4) 在 估計機率值 前面加上 - log 的用意
因為 log 函數是一個簡單遞增函數 (monotonic function)
「最大化: log (估計機率值)」會比針對「最大化: 估計機率值」容易
所以設計為加上 log
---------------------------------
更進一步,因為 loss function 通常定義為「最小化: 殘差」
所以會再把 log 前面加上一個負號
即:「最大化: log (估計機率值)」轉為「最小化: - log (估計機率值)」
📌 Q&A
🔘 Q1: L_i 的理論最大/理論最小值為何?
🔘 A1: 理論最大值 = + inf (當正確類別的機率值 P = 0: -log( 0 ) = log( 1 / 0 ) = + inf)
理論最小值 = 0 (當正確類別的機率值 P = 1: -log( 1 ) = log( 1 ) = 0)
🔘 Q2: 訓練初期, 因為 W 初始隨機值接近 0,因此所有類別的得分 s ~ = 0,
那麼訓練初期的 loss 應該為何?
🔘 A2: - log ( 1 / C ) = log ( C )
其中 C 代表類別數量
➡️ 可作為測試的方法: 若訓練初期印出的 loss 值不是 log ( C ), go check
🔘 Q3: 試比較 Multi-class SVM 和 Softmax 分類器,在正確類別得分最高時,兩者有何差異
🔘 A3: Multi-class SVM 分類器
當滿足: 正確類別的得分大於一個代表「遠大於錯誤類別的得分」的特定值
停止對某資料點的最佳化
否則,持續對某資料點最佳化
Softmax 分類器
在指定次數下,無止盡地逼近「真實機率分佈」
即: 正確類別的機率值 = 1,其它所有錯誤類別機率值 = 0
🔷 最佳化 (Optimization)
📌 Components
🔘 prediction function, F
🔘 loss function
🔘 regularizer
📌 最佳化策略 - 1: Random Search
🔘 最蠢的第一種策略
▫️ 步驟
1. 隨機取 n 組值作為不同的 W (權重) 的參數
2. 對每個 W 值: 都利用 L (X, Y, W) 計算此 W 對應的 loss 值
3. 若 loss 值比最佳 loss 更小: 則更新 最佳 loss,並記錄 W 作為最佳 W
▫️ 實驗結果
CIFAR-10 的 10 種類別,各類別的 準確率 期望值 = 10%
實驗結果: Random Search 準確率 = 15%
📌最佳化策略 - 2: Follow the Slope
🔘 一維(單變量,如: f(x)): 函數的導數(derivative),即: 函數 f 在 x 點附近的變化率
🔘 多維(多變量,如: f(x, y)): 函數的梯度,即: 沿每個維度的偏導數(partial derivatives)向量
🔘 在任何方向上的斜率 = 「方向(某方向上的單位向量)」和「梯度」的點積(dot product)
🔘 「負梯度方向」
將「最陡峭下降的方向」(某函數中: 「減少的值最大」的方向)定義為「負梯度」
🔘 啟發: 此方法提供對於某函數的「線性一階近似」(linear, first-order approximation)
🔘 權重向量 W 的實際運算流程
深度學習套件 ➡️ 不斷地計算給定函數的梯度 ➡️ 不斷地更新 W
📌 評估梯度
🔘 一種天真的方法 --- 有限差分法(Finite Differences)
▫️ 意義
提供一種「數值型梯度」
▫️ 步驟
1. 梯度的極限定義: 增加一個很小的值 h 之下,loss 的變化量
2. 根據 (1) 對每個 W 中的每個參數計算梯度
▫️ 建議
1. 實際程式中,不要採用此方法,因為太慢、計算量龐大
P.S. 在某些大型、複雜的 DL 模型,
權重向量的參數數量可能不只此範例的 10 個,而是數千萬、數億個
2. 可做為檢查是否正確的 debugging tool
🔘 牛頓-萊布尼茲法
▫️ 意義
提供一種「分析型梯度」
▫️ 建議
可在實際程式中用來評估梯度,此方法準確且快速
📌 梯度下降法
🔘 步驟
1. 使用隨機值,初始化 W (權重)
2. 不斷地:
(a) 計算 loss 和梯度
(b) 根據步長(step size)和梯度,更新 W
➡️ 步長是一個超參數,定義: 朝梯度的方向走多遠,又稱: 學習率(learning rate)
🔘 種類
▫️ 一般梯度下降法 (Gradient Descent)
▫️ 一般梯度下降法 + Momentum
▫️ Adam Optimizer
▫️ 隨機梯度下降法 (Stochastic Gradient Descent)
Mini Batch: 從訓練集中抽樣出一個較小的集合
為了縮減每一輪訓練的所需時間
// 樣本數 通常是 2 的倍數 (32/64/128)
📌 影像特徵
🔘 影像分類流程
▫️ 方法 1: 使用 線性分類器,並直接餵原始像素(feed raw pixels)訓練資料
➡️ 將每個「像素強度」直接平坦化後直接轉交給線性分類器
⭕: 「線性可分」(linear separability)的資料或許可以這樣做
❌: 「多模態」(multi-modality)資料結果可能很糟
▫️ 方法 2: 特徵萃取 → 使用 線性分類器,並使用具有代表性的特徵(features)訓練資料
➡️ 蒐集影像
→ 計算影像的各種特徵表示(feature representations,如: 各方面描述外觀的量化資料)
並得到不同的特徵向量(feature vectors)
→ 串接(concatenate)不同的特徵向量
→ 放入分類器訓練
▫️ 方法 3: 卷積神經網路(下一章 Lec 04 會提到)
🔘 例: 顏色直方圖(Color Histogram)
➡️ 步驟
1. 由可見光的光譜將顏色切分為固定數量的若干個桶子
2. 對每個像素: 依據色彩數值(如: RGB)累加對應桶子的計數
3. 最終得到描述影像「顏色分佈」的直方圖
🔘 例: 梯度直方圖(Histogram of Gradient, HoG)
➡️ Hubel & Wiesel: 方向的邊緣(oriented edge)在人類視覺系統中很重要
➡️ 步驟
1. 由可見光的光譜將顏色切分為固定數量的若干個桶子
2. 對每個像素: 依據色彩數值(如: RGB)累加對應桶子的計數
3. 最終得到描述影像「顏色分佈」的直方圖
🔘 例: 視覺詞袋(Visual Bag of Words)
➡️ 每個視覺單詞(Visual word)在影像中的出現次數
➡️ 視覺外觀