no1 計算機視覺歷史 & k近鄰線性分類器 & 損失函數和最優化

計算機視覺歷史回顧和介紹

現代互聯網85%都是圖片,如何處理?計算機視覺十分必要。

哈佛大學放圖片對貓的腦部視覺區脈衝檢測,50%都在處理眼睛的信息,發現切換圖片的時候纔有感覺,所以視覺的前期是對圖片邊緣和形狀的識別

Block world論文,一個東西不同角度,邊緣決定形狀和結構,可以通過邊緣和形狀來識別東西。

1966年MIT建立了第一個AI實驗室,在那個夏天研究了計算機視覺。

David Marr提出視覺是分層的

  1. 從簡單的形狀開始處理
  2. 建立一個分層的模型,第一層應該是邊緣

早期的計算機視覺,70年代,其一認爲物體都是由基本的形狀構成的,比如說圓柱形,其二,由基本的組件構成,比如說鼻子等,可以容許形變。3D建模。

80年代處理彩色圖像,以及圖像分割,或者說normalized cut,和感知分組。實時人臉檢測和特徵。

從70到80,從3D建模到識別,從計算機視覺到人工智能。

數據驅動的圖像分類方式:K近鄰和線性分類器

難度:比如說貓圖片的分類,形狀不一、種類不同、有遮蓋、光線不好的圖片都能夠分類出來

K近鄰

數據集:CIFAR-10,其中有50000張訓練圖片和10000張測試圖片,10中標籤,圖片大小爲32*32*3

方法:對於一張圖片,和訓練圖片依次比較,找到距離最近的一張圖片,該圖片的標籤就是我們需要分類的圖片的標籤。對於k>1的情況,在訓練集中找到前k個距離最近的圖片,然後投票表決。

距離定義

  1. L1距離(manhattan distance)

d1(I1,I2)=P|IP1IP2|

圖片大小相同,對應元素依次相減取絕對值,得到一個相同大小的矩陣,將該矩陣的元素求和最後得到的值就是這兩張圖的L1距離。
2. L2距離(Euclidean distance)

d2(I1,I2)=P(IP1IP2)2

問題

  1. 因爲每個圖片的分類都要依次和訓練集比較,因此算法複雜度隨着訓練集規模的擴大成線性增長
  2. 效果不好,實際中很少使用,比如說對於同一張圖片,要是有一點偏移或者色調發生了變化,距離就會變化很大

主要超參數
1. k,和幾個圖片進行比較
2. distance,使用L1距離還似乎L2距離

knn中k對數據分類的影響

可以看到隨着k的增加,對異常點的處理越好,可以增加模型的泛化能力。

如果數據量比較小,可以通過交叉驗證來得到模型分類能力的評估。5折交叉驗證,把數據集分成5份,依次挑選其中的1份作爲驗證集,剩下的作爲訓練集,最後在驗證集上分別得到5個分數,取平均就是該參數下模型的分數。

交叉驗證

優點和缺點

  1. 算法簡單易於實現
  2. 訓練不需要時間,但是預測耗時長,對實際使用不利
  3. 在圖像分類問題上效果不好,肉眼不可見的平移顏色等,都會導致距離變得很大

線性分類器

總覽:一個分類模型由兩個函數和一個方法組成,第一是通過輸入數據得到各個分類的得分,第二是通過模型預測和實際值得到損失,方法是通過調整第一個函數的權值來減少第二個函數輸出的損失。

參數方法和非參數方法

  • 參數方法,比如說線性分類器,通過學習訓練集,來改變模型的參數w和
    b
  • 非參數方法,比如說k近鄰,沒有需要學習的參數

Score Function

首先定義線性分類器的第一個函數,通過輸入數據來得到分類的得分。

f(xi,W,b)=Wxi+b

其中xi 是(D,1)的向量,代表輸入數據的一個樣本,D是特徵數,W是(K,D)的矩陣,代表權重其中K是分類數,b是偏置向量,輸出y是一個(K,1)的向量,代表該樣本在各個類上的得分。

對三個通道的顏色值進行加權求和,再加上偏置,返回一個向量,每個值表示各個標籤的得分。

可以把一張圖片中的3072(三通道乘上每個像素點)看成是3072維的數據,擬合了3條“直線”,對3個標籤計算得分。

Interpreting a linear classifier

每一行的W都是一個分類器。

去均值化

  1. 對於前面的k近鄰來說,不需要去均值,因爲圖片的像素是在同一個尺度,或者說同一個量綱下
  2. 而對於如上的線性分類器來說,如果去均值,就可以在參數中去掉偏置b

Loss Function

損失函數是用來量化模型輸出預測和實際值的差距,用來衡量模型預測能力的好壞,在如上的模型中,就是爲了評估分類器(權重W)的好壞。

多分類SVM損失(hinge loss)

給定一個樣本(xi,yi ),其中x是一個圖片,y是一個標籤,然後使用s=f(xi,W) 來計算分數向量。

最後得到SVM損失,對於一個樣本的loss:Li=jyimax(0,sjsyi+Δ) ,其中Δ 可以是任意一個大於0的數,一般取1,因爲線性W可以成比例的調整。該值代表一段距離,不加這項,計算錯誤分類得分比實際分類分數高部分的損失,加上這個,計算那些錯誤分類得分比實際分類高的,以及接近實際分類分數的損失。

例子:

a cat image a car image a frog image
cat 3.2 1.3 2.2
car 5.1 4.9 2.5
frog -1.7 2.0 -3.1
Losses 2.9 0 10.9

L1==max(0,5.13.2+1)+max(0,1.73.2+1)max(0,2.9)+max(0,3.9)=2.9+0=2.9

整個訓練集的損失爲:L=1NNi=1Li

在這個例子中,L=(2.9+0+10.9)/3=4.6

正則化

對於一個數據集,如果存在一組權重W,能使損失爲0,那麼一定也存在很多W,能使損失爲0,比如說正比例的W。那麼如何能從這個解空間中挑出比較好的W,就需要正則化操作。使用了正則化項,可以提高模型的泛化能力,也就是提高模型在測試集上的性能。

L=1Nijyi[max(0,f(xi;W)jf(xi;W)yi+Δ)]+λklW2k,l

通常有如下的正則化項:

名稱 R(W)
L2正則化 ktW2,l
L1正則化 kl|Wk,l|
彈性網絡(Elastic Net) ktβW2,l+|Wk,l|
最大範數正則化(Max norm regularization)
Drop out

例子

x = [1,1,1,1]

w1 = [1,0,0,0], w2 = [0.25,0.25,0.25,0.25]

計算他們的損失函數的值都爲1,但是加上L2正則化後發現w2的損失比較小。從上可以看到L2正則化是挑選W能均勻展開,也就是能夠取到儘可能多的特徵的信息。L1能使W中出現很多0,實現特徵選擇。

softmax分類及corss-entropy loss

softmax分類器,又稱爲多分類邏輯斯特迴歸,是二分類中邏輯斯特迴歸的一般形式。

把分數認爲是各個類沒有標準化的對數概率,那麼作爲各個類的概率如下:

P(Y=k|X=xi)=eskjesj

最大化對數似然,或者最小化錯誤的對數似然。

Li=logP(Y=yi|X=xi)

總結一下:Li=log(eskjesj)

例子

score(未經標準化的對數概率) 未經標準化的概率 概率
cat 3.2 24.5 0.13
car 5.1 164.0 0.87
frog -1.7 0.18 0.00

Li=log(0.13)=0.89
  • 由於e的指數,數據增長太快,所以實際使用的時候可以減去分數的最大值,從而保證計算的穩定。

efyijefj=CefyiCjefj=efyi+logCjefj+logC

hinge loss & corss-entropy loss

hinge loss & corss-entropy loss

  • hinge loss關注那些得分比實際類別得分高,或者接近的點,但是對於那些得分和實際類別低很多的點就不去管了
  • corss-entropy loss會對所有的點都進行考量

最優化

設J爲損失,那麼我們的任務就是找到最優的權重W,能夠使得損失J最小。

minJ=L(W;x)

使用梯度下降法來進行這個最優化。每次迭代,把W往負梯度方向調整,就可以減小損失J。

Wi:=WiαJWi
  • 使用mini-batch可以減少計算負擔,一般使用2的次方作爲batch大小,因爲很多向量化運算如果輸入是2的次方,運算會更快。
  • 使用momentum、Adam等可以優化學習率從而更快得到更好的結果。
  • 計算導數有兩種方式,數值梯度和微積分,數值梯度是改變一個維度的權重(加上h),然後得到損失結果,用導數的定義來得到導數,代碼容易計算太慢,不過可以用這個方法來檢查程序是否正確。

參考資料

http://cs231n.github.io/classification/
http://cs231n.github.io/linear-classify/
http://cs231n.github.io/optimization-1/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章