cs231n筆記:線性分類器


cs231n線性分類器學習筆記,非完全翻譯,根據自己的學習情況總結出的內容:

線性分類

  本節介紹線性分類器,該方法可以自然延伸到神經網絡和卷積神經網絡中,這類方法主要有兩部分組成,一個是評分函數(score function):是原始數據和類別分值的映射,另一個是損失函數:它是用來衡量預測標簽和真是標簽的一致性程度。我們將這類問題轉化為優化問題,通過修改參數來最小化損失函數。

  首先定義一個評分函數,這個函數將輸入樣本映射為各個分類類別的得分,得分的高低代表該樣本屬於該類別可能性的高低。現在假設有一個訓練集,每個樣本都有一個對應的分類標簽yi,這里i=1,2....N,並且y∈ 1K,這里,N代表樣本個數,樣本的維度為D,共有K個類別。定義評分函數:,該函數是原始樣本到分類分值的一個映射。

  線性分類器:先介紹最簡單的線性映射:,在公式中,每一個輸入樣本都被拉成一個長度為D的列向量,其中W和b都是參數,參數W被稱為權重(weights)大小為K x D 和,參數b為偏置向量(bias vector)大小K x 1,它影響輸出結果,但是並不和原始樣本產生關聯。卷積神經網絡樣本到分類分值的方法和上面一樣,但是映射函數f(x)將更加的復雜,參數也更多。

解釋線性分類器

  線性分類器各維度的值與權重相乘,從而得到分類分值。如下圖:首先將這張貓咪的圖片拉伸成一個列向量,與矩陣W相乘,然后得到各個分類的值,可以看出得

到的評分中,貓的評分很低,則這個矩陣W並不好。我們還可以將樣本看做高維空間中的一個樣本點,整個數據集就是一個空間點的集合,每個點都有一個標簽,則每個分類類別的分值就是這個空間中一條線性函數的函數值

偏置和權重的合並技巧:分類的評分函數為,分開處理參數W、b有點麻煩,一般常用方法是將W和b合並到同一個矩陣中,同時xi這個向量要增加一個維度,數值為1。具體見下圖:

左邊是先做矩陣乘法然后做加法,右邊是權重矩陣增加一個偏置列,輸入向量維度增加1,然后做矩陣乘法。這樣的好處是只用學習到一個權重矩陣。

損失函數 loss function

   評分函數的參數是矩陣W,數據(xi,yi)是給定的不能修改,我們可以通過修改參數矩陣W來調整,來使評分函數與真實的類別一致,即:真實類別的評分應該是最高的。我們使用損失函數(loss function)來衡量對結果的不滿意程度。當評分函數與真實結果相差越大時,損失函數的值也就越大。

 多類別支持向量機損失(Muliticlass SVM Loss)

  損失函數的類別有很多種,首先介紹多類別SVM損失函數,SVM的損失函數要SVM在正確類別上的得分要比不正確類別上的得分高出一個Δ,針對第i個樣本的損失函數為:

稱為合頁損失函數(hinge loss),其中:為第j個類別的得分,yi是正確類別的標簽。舉例:假設有3個類別,s=[13,-7,11]。其中第一個類別是正確類別,假設Δ的值為10,損失函數(為兩部分的和:

第一部分的值為0,第二部分的值為8。SVM的損失函數想要正確分類類別yi的分數要比不正確分類的分數高,而且至少要高一個Δ(可以這樣寫sj+Δ <=syi),如果不滿足這一點,就需要計算損失值。更加形象化的如圖所示

“SVM的損失函數想要正確分類類別yi的分數要比不正確分類的分數高,而且至少要高一個Δ”,如果其他類別分數進入紅色區域,甚至更高,那么就需要計算損失,否則損失為0。我們的目標是找到一些權重,它們既能夠這樣的要求,又能讓損失值盡可能的小。

 正則化(Regularization):上面損失函數有一個問題,假設一組數據和權重W能夠對每個樣本正確分類,即:對所有i都有Li=0;問題在於這個W並不唯一,例如W能使損失值都為0,當λ>1時,任何λW都能使損失值為0。所以我們希望向特定的權重W添加某些偏好,來消除不確定性,可以通過添加正則化懲罰(regularization penalty)來完成,常用的正則化項是L2范式,它通過對所有參數進行逐元素平方懲罰來抑制較大的權重:

上面式子僅包含權重W,不包含樣本,將W所有元素平方求和。給出完整的多分類SVM的損失函數,包含兩部分:數據損失,即所有樣本的平均損失和正則化損失:

展開

其中N代表訓練樣本的個數,λ表示正則化項的權重,它的確定需要動過cross-validation。

  L2的一個最大的性質是對大數值權重的懲罰,提升泛化能力,這就消除了某一個維度對整體分值影響過大的影響。eg:輸入向量x=[1,1,1,1],有兩個權重向量w1=[1,0,0,0],w2=[0.25,0.25,0.25,0.25],那么w1Tx = w2Tx = 1,兩個權重向量得到相同的分值1,根據L2懲罰來看W2更好,因為它的正則化損失值更小。W2懲罰傾向於更小更分散的的權重向量,這樣就能鼓勵分類器將所有維度上的特征都使用起來。通常只對權重w 進行正則化,而不正則化偏置b。

代碼:無正則化部分的損失函數,非向量化和半向量化損失的代碼實現

def hinge_unvectorized(x,y,W):
    """
    實現hinge loss function,非向量化
    -x 樣本,是一個列向量
    -y 樣本的類別的標簽
    -W 權重矩陣
    返回第i條樣本的損失值
    """
    delta = 1.0
    scores = W.dot(x)#每一個類別的得分,N x 1
    correct_class_score = scores[y]#正確類別的得分
    N = W.shape[0] #類別的個數
    loss_i = 0.0 #第i個樣本的loss值
    for j in range(N):
        if j == y:
            continue#跳過正確的類別,循環其他incorrect classes
        loss_i += max(0,scores[j] - correct_class_score + delta)
    return loss_i

 

半向量化實現方式

def hinge_halfVectorized(x,y,W):
    """
    半向量化的實現方式
    """
    delta = 1.0
    scores = W.dot(x)
    #使用向量方法計算出各個類別的margins
    margins = np.maximum(0,scores - scores[y] + delta)#maximum
    margins[y] = 0 #減去yi的score
    loss_i = np.sum(margins)#求和
    return loss_i

 

超參數delat和λ對損失函數中的數據損失正則化損失之間權衡,權重W的大小對於分類分值有着直接的影響,對w進行縮小,那么分類之間的差值也會變小,反之亦然。權重的大小就能控制差異的變大或縮小,因此delta 為1或100是沒有意義的。因此真正的權衡是我們允許權重變大到何種程度(λ來進行控制)。

 softmax分類器

  softmax可以理解為邏輯回歸泛化到多分類問題中,SVM分類器輸出f(xi,w)作為每個分類的評分(未標准化的,可能難以理解)。與SVM不同的是softmax輸出的是歸一化后的概率,更加的直觀,可以從概率上給出解釋。在softmax分類器中映射函數保持不變,但將這些評分值看做每一類別未歸一化的對數概率,損失函數為,fj代表評分向量f中第j個元素的值。為softmax函數,它的作用是對評分值進行壓縮到[0,1]范圍。

注意事項:數值穩定。編程實現softmax的時候,計算時候數值可能非常的大,歸一化的時候除以大數值會存在數值不穩定。做法是分子分母同時乘以常熟C,並變換到求和之中,得到下面公式

C的值可以自由選擇,通常設置logC=-max(fi)。這樣將向量f中的數值進行平移,能提高計算的數值穩定性,例子如下:

f = np.array([123,456,789])#3個類別對應的分值,都比較大   
p = np.exp(f) / np.sum(np.exp(f))#溢出:結果array([  0.,   0.,  nan])
#將f中的值平移,令最大值為0
f -= np.max(f) #向量f減去max(f) f:array([-666, -333,    0])
p = np.exp(f) / np.sum(np.exp(f))#OK,結果正確

 

 關於命名規則:SVM分類器使用的是合頁損失函數(hinge loss),有時又被稱為最大邊界損失(max-margin loss)。softmax分類器使用的是交叉熵損失(cross-entropy loss),softmax分類器的命名是從softmax函數那里得來,softmax函數將原始分類評分歸一化到[0,1],這樣處理后才能應用到交叉熵。從技術熵說“softmax損失”是沒有意義的。

SVM和softmax的對比

下圖有助於理解SVM和softmax處理步驟的不同

這個圖舉例說明了SVM和softmax在處理一個樣本點的方式不同。兩個分類器都是通過矩陣相乘的方式計算得到相同的分值向量f,不同之處在於對分值的解釋:SVM將它看做是分類的評分,它的損失函數鼓勵正確分類的分值比其他分類至少高出一個邊界值(delta)。softmax分類器將這些分值看做是每個分類沒有歸一化的對數概率值,希望正確分類的歸一化對數概率值最高,其他的低。

  softmax分類器計算出的結果為eg:[0.9,0.09,0.01],這樣就能得出所有分類標簽的“可能性”,代表不同類別的自信程度。為什么要在“可能性”上面打上引號,這是因為可能性的集中(eg:[1,0,0])或離散程度([0.33,0.33,0.33])是由正則化參數λ決定,λ是我們能夠直接控制的輸入參數。舉個栗子:

假設三個分類的原始分數是[1,-2,0],softmax計算結果如下:

如果正則化參數λ變大,那么權重W就會被懲罰的更多,各個維度的權重數值會變小,softmax計算結果如下:

從例子可以看出,概率的分布變得更加分散了,如果隨着λ的變大,權重W值會越來越小,最后輸出的概率分布就接近均勻分布。這也就是說,softmax分類器得到的概率值的相對大小是對某種類別的自信程度。

舉例對比SVM和softmax:與softmax相比,SVM更加的“local objective”,假設評分值為[10,-2,3]類別1為正確類別,SVM得到的損失函數為0,如果分數是[10, 9, 9] 甚至是 [10, -100, -100],對於SVM來說只要滿足邊界值(margin or delta)大於等於1,損失值都為0.對於softmax,[10,9,9]計算出的損失值遠遠大於[10, -100, -100],它希望正確分類值盡可能的大,錯誤分類值盡可能小,損失值盡可能的小。SVM只要求邊界值被滿足就可以了,不會去限制具體的分數。打比方來說:汽車分類器應該把精力花在如何分辨小轎車和大卡車上,而不應被青蛙樣本所影響。因為青蛙的評分已經夠低的了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM