上節介紹了影象分類中兩個重要的組成部分:
1、評價函式score function
2、損失函式loss function
線性函式f(xi,w)=wx,那麼svm的loss為:
l=1n∑i∑j≠yi[max(0,f(xi;w)j?f(xi;w)yi+1)]+αr(w)
現在介紹第三個重要組成部分:優化optimization。優化的過程是尋找引數w,是的loss函式的值最小。
鋪墊:一旦我們理解了這三個核心組成部分如果相互作用,我們將會重新再回顧評價函式,把它擴充套件比線性對映更複雜的形式。首先擴充套件到神經網路,之後神經網路。損失函式和優化不變。
loss函式一般都是高維的,難以視覺化。但是,我們可以在高維空間切一條線或乙個平面來獲取一些直觀的理解。例如,生成乙個矩陣w,它代表高維空間的乙個點。我們可以隨機生成乙個方向w!,沿著這個方向,用不同的α來計算l(w+αw1)的值,這時α可以當做x軸,而loss function可以當做y軸。也可以生成兩個方向,根據a,b變化計算l(w+aw1+bw2)的值,這時a,b可以分別代表x軸和y軸,loss函式的值可以用顏色來區分
上圖中是svm的loss,最左邊是一維空間。右邊兩個是2為空間,藍色代表低值,紅色代表高值。
可以看出svm的loss函式是分段的,svm的loss函式為:
li=∑j≠yi[max(0,wtjxi?wtyixi+1)]
svm的loss只對小於δ部分的差值起作用,對於大於δ的部分,它為零。因此是分段的。
svm的loss雖然是分段的,但是它是凸函式。優化這類問題,可以參考斯坦福的凸優化。
如果把評分函式拓展到神經網路,loss函式就不是凸函式了
不可導函式。因為max運算元,函式存在不可導的點。但是次梯度subgradient,本節接下來將交叉使用次梯度和梯度。
loss函式可以衡量權重w的好壞。優化的目的就是找到乙個w是的loss函式最小化。本節優化是以svm的loss函式為例,它是凸函式;但是我們最終的目的是優化神經網路,不能簡單使用由凸優化得到的方法。
因為可以很簡單的檢驗引數w的好壞。最簡單的想法是隨機找一些引數,記錄它們的loss,找到最好的。
使用隨機搜尋,得到的準確率為15.5%,比10%高一點。
你可能想到的是隨機找乙個方向,如果這個方向可以減小loss,那麼久向這個方向前進一步,更新權重。
使用這個策略,在測試集上的準確率為21.4%,比第乙個策略好一點,但是還是浪費計算資源。
在隨機本地搜尋中,目的是在梯度空間找到乙個方向,使得loss函式值減少。事實上,不用隨機找這個方向;可以計算出loss函式下降最快的方向。這個方向就是梯度的負方向。
在一維空間,梯度就是函式在某一點瞬時變化率。在多維空間,輸入變數是向量,梯度就是在各個變數方向的瞬時變化率組成的向量(梯度也叫作導數)。一維空間計算導數公式如下:
df(x)dx=limh→0f(x+h)?f(x)h
當函式輸入不是乙個數值,而是乙個向量是,我們把導數叫做偏導(partial derivatives),梯度就是各個維度上的偏導組成的向量。
有兩種方法計算梯度:一種緩慢逼近的方法是數值梯度(numerical gradient),另一種更快速準確但是容易出錯,需要使用微積分,是分析梯度(analytic gradient)
使用數值,逼近計算梯度,有兩個公式:
df(x)dx=limh→0f(x+h)?f(x)h
還有一種形式是中心差公式(centered difference formula),它效果更好
df(x)dx=limh→0f(x+h)?f(x?h)2h
詳細內容,可以參考wiki。
計算梯度,應該讓h盡可能小,一般使它在1e?5級別。
更新權重時,要注意,是使用梯度的負方向,因為梯度是函式增長最快的方向,其負方向才是下降最快的方向。
梯度只是告訴了我們方向,但是沒告訴我們一步走遠,這個引數是步長(也叫作學習率),它也是乙個超引數。
效率問題:計算梯度時,需要計算每乙個引數的梯度。在神經網路中,參數量巨大,計算每乙個引數的梯度,也給我們帶來了效率問題。可以找到更好的方法。
數值梯度求到的是近似梯度,因為h不能等於零。分析梯度需要使用微積分,它是計算得到真正的梯度,而且它非常快。但是分析梯度容易出錯;這也是為什麼在實踐中,經常使用分析梯度和數值梯度對比來驗證分析梯度。這叫做梯度檢驗gradien check。
以svm的loss為例,求某個點上的梯度:
li=∑j≠yi[max(0,wtjxi?wtyixi+δ)]
對權重wyi求導
?wyili=???∑j≠yi1(wtjxi?wtyixi+δ>0)??xi
上式中,1()是指示函式,如果後面括號條件為true,那麼值為1,否則值為零。需要注意一點,計算梯度,只需要計算分類錯誤對應權重w那些行的梯度,正確分類的不用計算。例如正確標籤為syj,那麼梯度是:
?wjli=1(wtjxi?wtyixi+δ>0)xi
計算好梯度後,就可以用梯度更新權重引數,這叫做梯度下降。
最簡單的使用梯度下降的方法就是用乙個迴圈,在迴圈中不計算梯度,更新權重。這是最基本的思想。但還有其他使用梯度下降的方法。
當訓練集比較大時,以計算機所有樣本來計算梯度,之後更新一次引數。這樣做有點浪費。乙個常用的方法是使用訓練集一批樣本來計算梯度。這個方法之所以也管用,是因為訓練集樣本是相關的。一小批樣本可以看做訓練集的近似。
mini-bach梯度下降中,當每批樣本只包含乙個樣本是,就是隨機梯度下降了。隨機梯度下降**梯度下降演算法;在實際應用中比較少見隨機梯度下降,因為一次計算多個樣本梯度更加高效。
技術上sgd是指用乙個樣本來計算梯度,實際中經常聽到sgd實際指mini-bach(mgd指minibatch gradient descent, 或者bgd指batch gradient descent,它們並不常見)。mini-batch的大小也是乙個超引數,但是它不需要使用交叉驗證來獲取;實際經常根據記憶體大小來制定,常常使用2的冪:32、64、128,這樣更容易實現向量化操作,且運算更快。
資料集(x,y)已知且固定。權重以乙個隨機數開始。前向傳播由評價函式計算得分。loss函式包含兩部分:data loss是計算評分和真實值的loss;正則化loss只和權重有關。在梯度下降過程中,計算梯度,更新引數。
在這一節中:
1、loss函式類似高緯度的地形優化,我們要到達最底部。svm的loss是分段的。
2、使用迭代增強方法優化loss函式。
3、梯度給出了loss函式下降最快的方向。
4、梯度下降過程中,要使用乙個超引數:步長(學習率)。學習率的設定需要技巧。
5、數值梯度和分析梯度。兩者優缺點,前者可以檢驗後者。
6、介紹了梯度下降演算法。
cs231n筆記總結
cs231n的課程以及作業都完成的差不多了,後續的課程更多的涉及到卷積神經網路的各個子方向了,比如語義分割 目標檢測 定位 視覺化 遷移學習 模型壓縮等等。assignment3有涉及到這些中的一部分,但需要深入了解的話還是得看 了。所以在看 前把之前已學的知識,筆記和作業 一起做個整理。部落格裡主...
CS231n理解筆記
linear classification notes 該方法的組成 乙個是評分函式 原始影象資料到類別分值的對映 乙個是損失函式 用來量化 分類標籤的得分和真實標籤之間的一致性。影象分類的任務是從已有的固定分類標籤中選擇乙個並分配一張影象,我們介紹了knn分類器,該分類器的基本思想是通過將測試影象...
cs231n 學習 前言
吐槽 我為啥學這個 學這門課之前,到官網 要科學上網哦 查了下相關資訊,有部分需求 要求1,得會 python 且熟悉 c c 其實我是不會 python 的,但語言只是一種工具,不該成為鴻溝,且這麼流行的語言上手也不應該難吧 盲目自信一把 要求2,微積分和線性代數,嗯,這個不是問題。要求3,概率統...