CS231n課程筆記二 SVM softmax

線性分類

在上一節我們介紹了圖像分類和KNN但是他有很多缺點:分類器必須記住所有的訓練數據并且存儲下來以備未來的比較,這一塊是非常低效的并且容易造成內存爆炸,計算效率低。
現在我們用一種更加有力的方式來做圖像分類,然后我們將進一步展開神經網絡和卷積神經網絡的介紹,在這個部分我們有兩個地方值得介紹,一個score function 一個loss function。我們將用score function的參數來最優化loss function 并以此來解決最優化問題。

從圖像到標簽分數的參數化映射

該方法的第一個組成部分是定義將圖像的像素值映射到每個類的置信度得分的分數函數。我們將以具體的例子開發這種方法。像以前一樣,我們假設一個圖像xi∈RDxi∈RD的訓練數據集,每個都與標簽yiyi相關聯。這里i = 1 ... Ni = 1 ... N和yi∈1...Kyi∈1... K。也就是說,我們有N個例子(每個都有維度D)和K個不同的類別。例如,在CIFAR-10中,我們有一組訓練集N = 50,000圖像,每個D = 32 x 32 x 3 = 3072像素,K = 10,因為有10個不同的類(狗,貓,汽車等) )。我們現在將定義分數函數f:RD?RKf:RD?RK,將原始圖像像素映射到類分數。
線性分類器,在這塊我們將用最簡單的函數來做:
$f(x_i,W,b)=Wx_i+b$
在上述等式中,我們假設圖像$x_i$將其所有像素平坦化為單個[Vx]形列列向量。矩陣W(尺寸[K×D])和向量b(尺寸[K×1])是函數的參數。在CIFAR-10中,$x_i$將第i個圖像中的所有像素均勻化為單個[3072×1]列,W為[10 x 3072],b為[10 x 1],因此3072個數字進入該函數原始像素值)和10個數字(類分數)。 W中的參數通常稱為權重,b稱為偏置向量,因為它影響輸出分數,但不與實際數據$x_i$進行交互。但是,您經常會聽到人們可以互換使用術語權重和參數。
首先$Wx_i$可以有效的評估十個類別的得分,每個都是W的一行;其次輸入的數據是固定的,我們必須控制參數;在學習的時候我們需要用到train的set但是學完了之后就可以把訓練集丟掉了;最后分類牽扯到矩陣的相乘和相加;

將圖像映射到類分數的示例。為了可視化,我們假設圖像只有4個像素(4個單色像素,我們在這個例子中不考慮色彩通道,以簡潔),我們有3個類(紅色(貓),綠色(狗),藍色(船)班)。 (說明:這里的顏色特別簡單地表示3個類,與RGB通道無關。)我們將圖像像素拉伸成一列,并執行矩陣乘法以得到每個類的分數。請注意,這個特定的一組權重W不是很好:權重分配我們的貓圖像是一個非常低的貓分數。特別是,這套重量似乎相信它正在看著一只狗。
圖像類似于高維點。由于圖像被拉伸成高維列向量,我們可以將每個圖像解釋為該空間中的單個點(例如,CIFAR-10中的每個圖像是32×32×3像素的3072維空間中的點)。類似地,整個數據集是一個(標記)的點集合。

由于我們將每個類的分數定義為所有圖像像素的加權和,所以每個類得分是該空間的線性函數。我們無法可視化3072維的空間,但是如果我們想像將所有這些維度壓縮到只有兩個維度,那么我們可以嘗試可視化分類器可能在做什么

損失函數

在上一節中,我們定義了從像素值到類得分的函數,由一組權重WW參數化。此外,我們看到我們無法控制數據($x_i$,$y_i$)($x_i$,$y_i$)(它是固定的和給定的),但是我們確實控制了這些權重,我們想設置它們,使得預測課程分數與訓練數據中的實地標簽一致。
例如,回到貓的示例圖像及其分類“貓”,“狗”和“船”的分數,我們看到這個例子中的特定權重集不是很好:我們喂在描繪一只貓的像素中,與其他類別(狗得分437.9和船分數61.95)相比,貓分數非常低(-96.8)。我們將用失敗函數(有時也被稱為成本函數或目標)來衡量我們對于不幸的結果。直觀地說,如果我們在對培訓數據進行分類工作方面做得不好,那么損失將會很高,如果我們做得很好,這將會很低。

## 多類支持向量機損失

有幾種方法來定義損失函數的細節。作為第一個例子,我們將首先開發一種稱為多類支持向量機(SVM)損失的常用損失。 SVM損失被設置為使得SVM“想要”每個圖像的正確類別具有高于不正確類別的分數一定的固定邊際Δ。請注意,如上所述,有時有助于擬合損失函數:SVM“想要”某種結果,意味著結果將產生較低的損失(這是好的)。現在我們來更準確回想一下,對于第i個例子,我們給出了圖像xixi的像素和指定正確類的索引的標簽yiyi。分數函數采用像素并計算類分數的向量f(xi,W)f(xi,W),我們將縮寫為ss(縮寫為分數)。
這里寫圖片描述

我們應該選擇更小的權重這樣使得過擬合的現象更加不明顯,另一點很重要的是我們永遠無法達到0損失,一般我們會給w加正則項而不會給b加。

def L_i(x, y, W):
  """
  unvectorized version. Compute the multiclass svm loss for a single example (x,y)
  - x is a column vector representing an image (e.g. 3073 x 1 in CIFAR-10)
    with an appended bias dimension in the 3073-rd position (i.e. bias trick)
  - y is an integer giving index of correct class (e.g. between 0 and 9 in CIFAR-10)
  - W is the weight matrix (e.g. 10 x 3073 in CIFAR-10)
  """
  delta = 1.0 # see notes about delta later in this section
  scores = W.dot(x) # scores becomes of size 10 x 1, the scores for each class
  correct_class_score = scores[y]
  D = W.shape[0] # number of classes, e.g. 10
  loss_i = 0.0
  for j in xrange(D): # iterate over all wrong classes
    if j == y:
      # skip for the true class to only loop over incorrect classes
      continue
    # accumulate loss for the i-th example
    loss_i += max(0, scores[j] - correct_class_score + delta)
  return loss_i

def L_i_vectorized(x, y, W):
  """
  A faster half-vectorized implementation. half-vectorized
  refers to the fact that for a single example the implementation contains
  no for loops, but there is still one loop over the examples (outside this function)
  """
  delta = 1.0
  scores = W.dot(x)
  # compute the margins for all classes in one vector operation
  margins = np.maximum(0, scores - scores[y] + delta)
  # on y-th position scores[y] - scores[y] canceled and gave delta. We want
  # to ignore the y-th position and only consider margin on max wrong class
  margins[y] = 0
  loss_i = np.sum(margins)
  return loss_i

實際應用

Delta的設定:Δ=1.0 實際上在任何情況下都是安全的設定,Δ與$\lambda$ 是兩個不同的參數但是他們都控制同樣的tradeoff,(正則損失和準確率的損失)。理解他的要點是W的量級對于score的效果有著直接的影響,當我們縮小W的時候,score也會降低,因此score的絕對值不重要,重要的是相對值。因此應該做差。

二元支持向量機,有以下的表達方法:
$L_i = C \max(0, 1 - y_i w^Tx_i) + R(W),y_i \in { -1,1 }$
此時有:$C \propto \frac{1}{\lambda}$

原始優化。如果你以前知道SVM來到這個課程,你可能還聽說過內核,雙重,SMO算法等。(和Neural Networks的情況一樣),我們將一直與優化目標在其無約束的原始形式。這些目標中的許多在技術上是不可區分的(例如,max(x,y)函數不是因為當x = y時具有扭結),但實際上這不是問題,并且常見的是使用子梯形圖。

多分類的支持向量機。值得提到的是本文提到的方式只是構造多分類的svm的一種方法,除此之外 one-vs-all也是一種常用方法,他是獨立對各個類構造SVM。我們的構造遵循Weston和Watkins 1999版本,這是一個比OVA更強大的版本(在這個意義上,您可以構建多版本的數據集,其中該版本可以實現零數據丟失,但是OVA不能)。您可能會看到最后一個表達式是一個結構化SVM,它可以最大限度地提高正確類的得分和最高評分不正確的亞軍類的得分。了解這些配方之間的差異超出了課堂的范圍。這些說明中提供的版本是在實踐中使用的一個安全的賭注,但可以說是最簡單的OVA策略也可能會起作用(Rikin等人2004年“一維全部分類防御”

Softmax分類器

事實證明,SVM是兩個常見的分類器之一。另一個受歡迎的選擇是Softmax分類器,它具有不同的損耗函數。如果您以前聽說過二進制邏輯回歸分類器,那么Softmax分類器就是將它推廣到多個類。不想SVM,softmax給了一些更加直觀的輸出液給了概率的輸出。$f(x_i; W) = W x_i$是保持不變的,但是我們現在用了非標準化的log概率形式代替了之前的cross-entropy 的損失:
$L_i = -\log\left(\frac{e^{f_{y_i}}}{ \sum_j e^{f_j} }\right) \hspace{0.5in} \text{or equivalently} \hspace{0.5in} L_i = -f_{y_i} + \log\sum_j e^{f_j}$
從信息論的角度,熵表示真實的分布和估計分布:$H(p,q) = - \sum_x p(x) \log q(x)$而softmax就是最小化熵增,也就是最小化真實分布與估計分布。
從穩定性來看,由于加了一個指數分布,分子和分母都會非常大,所以這個相除就會很不穩定,因此要用標準化的技巧,所以我們就在上面乘上一個常數C并且把它加進去,我們可以自由的決定C的大小,所以我們可以用C來控制函數的穩定性。
$\frac{e^{f_{y_i}}}{\sum_j e^{f_j}}
= \frac{Ce^{f_{y_i}}}{C\sum_j e^{f_j}}
= \frac{e^{f_{y_i} + \log C}}{\sum_j e^{f_j + \log C}}$
在代碼中:

f = np.array([123, 456, 789]) # example with 3 classes and each having large scores
p = np.exp(f) / np.sum(np.exp(f)) # Bad: Numeric problem, potential blowup

# instead: first shift the values of f so that the highest number is 0:
f -= np.max(f) # f becomes [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # safe to do, gives the correct answer

確切地說,SVM分類器使用鉸鏈損失,有時也稱為最大余量損失。 Softmax分類器使用交叉熵損失。 Softmax分類器從softmax函數獲取其名稱,該函數用于將原始分數壓縮為歸一化的正值,總和為1,從而可以應用交叉熵損失。特別要注意的是,從技術上來說,談論“softmax loss”是沒有意義的,因為softmax只是壓縮函數,但它是一個比較常用的簡寫。

二者不同

這里寫圖片描述

Softmax分類器為每個類提供“概率”。與計算未校準并且不容易解釋所有類的分數的SVM不同,Softmax分類器允許我們計算所有標簽的“概率”。例如,給定一個圖像,SVM分類器可能給你的類“cat”,“dog”和“ship”的分數[12.5,0.6,-23.0]。 softmax分類器可以將三個標簽的概率計算為[0.9,0.09,0.01],這使您能夠解釋其對每個類的信心。然而,我們將“概率”一詞引入引號的原因是,這些概率的高峰或擴散性將直接取決于您作為系統輸入的正則化強度λ。
SVM和softmax的差異一般很小,所以是可以做比較的。相比于softmax,SVM有一個更加local的目標函數,這是一個bug也是一個特點。

總結

  • 定義了一個score function,從pixel到scores
  • 不像knn,這種參數的方式是一丹我們學習了參數我們就可以丟棄掉訓練數據
  • 介紹了bias 的trick
  • 我們定義了一個損失函數(我們為線性分類器引入了兩個常用的損失:SVM和Softmax),它們測量給定參數集合與訓練數據集中的地面真值標簽的兼容性。我們還看到,損失函數的定義是對訓練數據做出很好的預測,相當于損失小。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容