計算機視覺歷史回顧和介紹
現代互聯網85%都是圖片,如何處理?計算機視覺十分必要。
哈佛大學放圖片對貓的腦部視覺區脈衝檢測,50%都在處理眼睛的信息,發現切換圖片的時候纔有感覺,所以視覺的前期是對圖片邊緣和形狀的識別。
Block world論文,一個東西不同角度,邊緣決定形狀和結構,可以通過邊緣和形狀來識別東西。
1966年MIT建立了第一個AI實驗室,在那個夏天研究了計算機視覺。
David Marr提出視覺是分層的。
- 從簡單的形狀開始處理
- 建立一個分層的模型,第一層應該是邊緣
早期的計算機視覺,70年代,其一認爲物體都是由基本的形狀構成的,比如說圓柱形,其二,由基本的組件構成,比如說鼻子等,可以容許形變。3D建模。
80年代處理彩色圖像,以及圖像分割,或者說normalized cut,和感知分組。實時人臉檢測和特徵。
從70到80,從3D建模到識別,從計算機視覺到人工智能。
數據驅動的圖像分類方式:K近鄰和線性分類器
難度:比如說貓圖片的分類,形狀不一、種類不同、有遮蓋、光線不好的圖片都能夠分類出來
K近鄰
數據集:CIFAR-10,其中有50000張訓練圖片和10000張測試圖片,10中標籤,圖片大小爲32*32*3
方法:對於一張圖片,和訓練圖片依次比較,找到距離最近的一張圖片,該圖片的標籤就是我們需要分類的圖片的標籤。對於k>1的情況,在訓練集中找到前k個距離最近的圖片,然後投票表決。
距離定義:
- L1距離(manhattan distance)
圖片大小相同,對應元素依次相減取絕對值,得到一個相同大小的矩陣,將該矩陣的元素求和最後得到的值就是這兩張圖的L1距離。
2. L2距離(Euclidean distance)
問題:
- 因爲每個圖片的分類都要依次和訓練集比較,因此算法複雜度隨着訓練集規模的擴大成線性增長
- 效果不好,實際中很少使用,比如說對於同一張圖片,要是有一點偏移或者色調發生了變化,距離就會變化很大
主要超參數:
1. k,和幾個圖片進行比較
2. distance,使用L1距離還似乎L2距離
可以看到隨着k的增加,對異常點的處理越好,可以增加模型的泛化能力。
如果數據量比較小,可以通過交叉驗證來得到模型分類能力的評估。5折交叉驗證,把數據集分成5份,依次挑選其中的1份作爲驗證集,剩下的作爲訓練集,最後在驗證集上分別得到5個分數,取平均就是該參數下模型的分數。
優點和缺點:
- 算法簡單易於實現
- 訓練不需要時間,但是預測耗時長,對實際使用不利
- 在圖像分類問題上效果不好,肉眼不可見的平移顏色等,都會導致距離變得很大
線性分類器
總覽:一個分類模型由兩個函數和一個方法組成,第一是通過輸入數據得到各個分類的得分,第二是通過模型預測和實際值得到損失,方法是通過調整第一個函數的權值來減少第二個函數輸出的損失。
參數方法和非參數方法
- 參數方法,比如說線性分類器,通過學習訓練集,來改變模型的參數w和
b - 非參數方法,比如說k近鄰,沒有需要學習的參數
Score Function
首先定義線性分類器的第一個函數,通過輸入數據來得到分類的得分。
其中
對三個通道的顏色值進行加權求和,再加上偏置,返回一個向量,每個值表示各個標籤的得分。
可以把一張圖片中的3072(三通道乘上每個像素點)看成是3072維的數據,擬合了3條“直線”,對3個標籤計算得分。
每一行的W都是一個分類器。
去均值化:
- 對於前面的k近鄰來說,不需要去均值,因爲圖片的像素是在同一個尺度,或者說同一個量綱下
- 而對於如上的線性分類器來說,如果去均值,就可以在參數中去掉偏置b
Loss Function
損失函數是用來量化模型輸出預測和實際值的差距,用來衡量模型預測能力的好壞,在如上的模型中,就是爲了評估分類器(權重W)的好壞。
多分類SVM損失(hinge loss)
給定一個樣本(
最後得到SVM損失,對於一個樣本的loss:
例子:
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 |
整個訓練集的損失爲:
在這個例子中,L=(2.9+0+10.9)/3=4.6
正則化
對於一個數據集,如果存在一組權重W,能使損失爲0,那麼一定也存在很多W,能使損失爲0,比如說正比例的W。那麼如何能從這個解空間中挑出比較好的W,就需要正則化操作。使用了正則化項,可以提高模型的泛化能力,也就是提高模型在測試集上的性能。
通常有如下的正則化項:
名稱 | R(W) |
---|---|
L2正則化 | |
L1正則化 | |
彈性網絡(Elastic Net) | |
最大範數正則化(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分類器,又稱爲多分類邏輯斯特迴歸,是二分類中邏輯斯特迴歸的一般形式。
把分數認爲是各個類沒有標準化的對數概率,那麼作爲各個類的概率如下:
最大化對數似然,或者最小化錯誤的對數似然。
總結一下:
例子:
score(未經標準化的對數概率) | 未經標準化的概率 | 概率 | |
---|---|---|---|
cat | 3.2 | 24.5 | 0.13 |
car | 5.1 | 164.0 | 0.87 |
frog | -1.7 | 0.18 | 0.00 |
- 由於e的指數,數據增長太快,所以實際使用的時候可以減去分數的最大值,從而保證計算的穩定。
hinge loss & corss-entropy loss
- hinge loss關注那些得分比實際類別得分高,或者接近的點,但是對於那些得分和實際類別低很多的點就不去管了
- corss-entropy loss會對所有的點都進行考量
最優化
設J爲損失,那麼我們的任務就是找到最優的權重W,能夠使得損失J最小。
使用梯度下降法來進行這個最優化。每次迭代,把W往負梯度方向調整,就可以減小損失J。
- 使用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/