CS-231N-斯坦福李飛飛機器視覺課(Cydiachen版筆記+感悟)

CS 231N 斯坦福李飛飛機器視覺課

這個筆記的話,由於自己的課件之間有一些耦合性,可是關聯性也不是很大,這裏的話,由於我是在雷鋒網上看的整個視頻課程,感謝字幕組有整理出來每個Lecture的關鍵詞,這裏的話個人筆記組織的話,主要就是以名詞爲主進行組織:python

0.0 Lecture 1

0.1.1 Adaboost 算法

Adaboost是一種迭代的算法,本質上實際上是對於一個訓練集來訓練不一樣的分類器classifier,而後把這些classifier進行集合,組成一個更強的classifier。其實本質上仍是一個級聯的過程。算法

整個算法的話,過程的話實際上是:編程

一、先對於N個訓練樣本進行學習獲得第一個弱分類器;網絡

二、而後把粉錯誤的樣本和新的樣本數據一塊兒構成一個新的N個的新的訓練樣本,對於這個新的樣本集合進行學習獲得第二個弱分類器;架構

三、以此類推,每次都把以前全部的classifier分錯誤的樣本+新的樣本組成一個N個訓練樣本集,再經過學習獲得後續的分類器;框架

四、最終的話,咱們獲得一個強分類器,所以咱們的數據被分割成爲哪一類是由分類器的權值決定的。機器學習

0.0.1 Annotate 標上註釋

這裏面的話,實際上是Li Fei Fei組的一個研究方向,由於咱們自己的話但願的是經過天然語言和機器視覺的結合實現,咱們看到一幅圖片,機器對應生成語言來進行描述圖片。分佈式

0.0.2 Block World

這裏的話,實際上是早期學者研究的時候學者對於世界的一種簡單建模。函數

其實不少時候,發現自己的話仍是先從圖形的邊緣特徵入手,來構建圖像中物體的框架,而後更抽象的就是提取出對應的特徵點,而後把整個圖像的特徵抽象爲一個點。性能

0.0.3 Bounding Box 邊界框

在這裏的話,其實咱們看到Bounding Box的話,是最初的一種圖像目標檢測的一種方法,通常來講咱們想要檢測一個目標,不僅僅是要獲得一個分類,更但願可以把物體單獨提取出來,這裏的話簡單的就是拿一個框框出來,這個很是的簡單,可是的話,將來想作的是可以直接摳圖出來,那就涉及到了圖像分割問題。

0.0.4 Convolutional Neural Network 卷積神經網絡

卷積神經網路——也就是咱們所說的CNN network structure, 是經過構建一個神經網絡來進行圖像的分類問題。

這裏的話,咱們使用了這些網絡架構,進而能夠獲得很好的性能提高。上圖除了2010仍是傳統的分類方法以外,2012年以後的都是深度學習的方法。

其實的話,所謂的深度學習本質上只是機器學習的一個子集。所謂的深度Depth其實不是什麼新鮮事,僅僅是實現了層級數比較多的神經網絡進而進行機器學習而已。

這裏的卷積神經網絡其實和以前Lecun的手寫數字識別模型是很是的相似的。

這裏的話,其實能夠看出,深度學習也是受益於硬件提高很是的多,若是沒有高性能CPU、GPU的出現,那麼咱們在實現CNN的過程當中不會有這麼大的提高。

0.0.5 Fully-Connected Layers

這裏的咱們的fully connected layers主要指的是CNN中的一個特別的層級,在中文中能夠被翻譯爲:全連接層/徹底連接層;在CNN中間,咱們的Fully-connected Layers主要實現一種功能:經過把學習到了的分佈式特徵表示來映射到咱們的樣本標記空間中。其實就至關於咱們的CNN以前的步驟作的是特徵提取的過程,可是最後的話咱們若是想要實現一個分類的過程的話,仍是須要Fully-connected layer來進行實現的。

在這裏面的話,咱們的全連接層的操做能夠有卷積層操做實現,經常你們使用的一種方法是藉助傳統機器學習中的一個神經元的激活方法進行表示全連接的。這裏的話,整個全連接的核心操做就是$y = W x$,進而把一個特徵空間線性變換到了另外一個特徵空間中,目標空間中的任意一個維度的話也就會受到源空間的每個維度的影響,因此說目標向量其實能夠是源向量的加權和。

這裏的話,咱們最後兩個fully connected layers主要作的工做就是對於咱們的特徵作分類,其實這裏的話認爲咱們使用傳統的softmax操做也是能夠的。

0.0.6 Generalize 泛化

在深度學習(機器學習)中間,其實比較重要的一個概念就是咱們想要儘量的實現模型的generalization,由於咱們但願創建一個通用的模型,從而可以對於儘量多的問題進行咱們想要的操做。這裏的話不知道咱們的人臉方法和其餘超分辨率方法能不能有一種泛化模型。

0.0.7 Histogram of Gradient 方向梯度直方圖

這是一種能夠比較好的表示圖片的方法,經過構建一個圖片的梯度直方圖,可以把整個畫面中的相關特徵經過統計建模轉換成機率模型,這樣子的話在咱們後面的處理過程當中也能夠有比較大的提高。

0.0.8 Image formation 圖像成像原理

其實這裏面的話,並非徹底的研究說成像,而是但願從生物體自己的一種對於圖像感知的方法上面獲得啓發從而構建機器的視覺模型。下面的話我結合PPT中間的一張圖像對於人眼成像的原理進行簡單的介紹:

一、人眼其實一開始對於圖像的話是一個簡單感知的過程。在最開始,咱們的人眼是有一個叫Primary Visual Corte(初級視覺皮層)的過程,這歌層級的話其實主要就是獲得咱們第二張的Edge Image,經過咱們的Edge Image,咱們能夠感知到整幅圖像邊緣信息,從而大概對於物體的輪廓有一個瞭解。其實咱們的超分辨率的話自己也能夠概括成爲一個低級視覺的問題。

二、在咱們提出出來對應的features以後,咱們進一步的就是構建了一個相對的深度等其餘信息的結構圖,進一步的可讓咱們看出來整個圖形是什麼樣子的,這樣子的話這些輔助信息的話也能夠幫助咱們進行物體的辨別;

1.0 Lecture 2

1.0.1 Column Vector

這裏的話其實有一個想法:在咱們進行圖片分類任務的時候,其實若是我想要把整個過程用矩陣進行表示的話,其實就是:
$$Y = W * X$$

在這個公式之中,咱們能夠理解成:X爲咱們的輸入圖像,其中的尺寸是$width * height * channels$的一個三維矩陣(能夠看做一個立方體),而後通過一個分類器classifier(廣義)以後,咱們能夠獲得對應的輸出,這裏的輸出的話實際上是咱們本身須要的結果,有的時候多是一幅圖片$width * height *channel$或者是對應的標籤(分類問題),這裏的話,咱們並非單純的生成一個標籤,而有多是生成各個標籤的權重值的列向量:{cat:1,dog:0.2348294....,car:0.231123123}。這樣子的話其實根據咱們每個須要的結果不一樣,咱們乘以的矩陣的維度也是不同的。這裏的話惟一的要求應該就是知足矩陣運算的維度便可。

1.0.2 CLassifier 分類器

這裏的話,咱們能夠看出,若是咱們合理的設計咱們的分類器,咱們其實最簡單的想法是經過hard-coding來進行編程,可是單單是識別貓的過程就是很是複雜的,咱們沒有辦法使用人力就寫出來,這個時候的話咱們其實就但願能不能有別的方法能夠從數據中歸納出範式,咱們只須要解決這個概括過程就能夠了呢?答案是確定的。不少人都在研究Data-dirven的method來進行圖像的分類:

  1. Collect a dataset of images and labels
  2. Use Machine Learning to train a classifier
  3. Evaluate the classifier on new images

這裏的話,其實最簡單的辦法就是使用nearest neighbor的方法對於整個圖像特徵進行判斷,進而看看能不能實現一個簡單的分類。其實這個方法的話,用數學方法來表示的話很是的簡單:

這裏的話,咱們首先假設咱們的Sampled image(已經標記好爲若干分類)爲$L_j,其中j = 0,1,2,...,n$,對應的咱們須要判斷的圖像分別爲:$I_k, 其中k = 0,1,2,...,m$,咱們須要作的操做僅僅是分別計算一下每個待比較圖像$I$和已經分類好的圖像$L$之間的距離(像素與像素之間的差值大小),$Score = I_k - L_j$,而後再對於這個Score列向量提取出最大值而且對應到相應的標籤就能夠完成一個最簡單的聚類過程。

這裏面的話,引伸出來了其餘的幾個概念,能夠在這個簡單的聚類過程當中進行解答:

1.0.2.1 Comparison function

這裏的話,咱們的整個比較過程的話,咱們是在以前簡單的一個$|I_k - L_j|$這個公式完成的。這個公式其實區分能力很是的很差,咱們能夠選擇其餘的評價圖片與圖片之間距離、類似度的函數進行比較,這個函數就能夠叫作Comparison Function。

1.0.2.2 Decision Boundaries

在這個聚類結果的圖形中,其實咱們就能夠看出,中間的這些不一樣顏色的交界處其實就是咱們的decision boundaries,不一樣聚類與聚類之間的邊界線。可是咱們不少時候最好對於位於boundaries上面的每個點仔細的考察一下,可能可以對於模型有更好的修正。

這裏面的話,咱們調節decision boundaries的時候,其實有不少種方法:一、改變咱們的comparison function能夠幫助咱們調節咱們的decision boundaries

二、咱們能夠改變判決的法則,以前咱們只是從最接近的一個臨接處進行分類;如今的話,咱們須要結合已有分類中間的若干個點進行分類,而後進行一個majority vote從而獲得對應的分類結果。

1.0.2.3 Distance Function

咱們通常使用的comparison function對於一些經典的函數,咱們總結稱這些函數分別爲:Distance function,咱們經常使用的Distance 函數有如下,也就是咱們常稱的L-1,L-2距離。

當咱們使用不一樣的distance function的時候,咱們獲得的結果也存在不一樣:

1.0.2.4 Hyper parameter 超參數

這裏的話會引出來一個新的概念:超參數。超參數的意思其實並非什麼超級的意思,更多時候表明咱們對於整個模型須要手動調節的參數。

這裏的話,K表明的是咱們選取的參考點的數目,能夠是1,也能夠是3,5等值。 Distance表明的是咱們選擇的Distance function,能夠是L_1 Distance,也能夠是L_2 Distance.

其實咱們在整個神經網絡的過程當中,最重要的就是這個調參過程。怎麼樣獲取一個更好的超參數呢?其實人們的方法也很蠢,就是不斷的在數據集上面進行測試,不斷的優化調節。

但其實在最後咱們能夠看到,平時咱們正常的實踐的時候,基本上仍是不用這種Means或者說K-means方法的,其中有一個緣由以下:

這個圖片裏咱們能夠看出來,咱們的這裏面3個圖片有相同的L2距離。

同時的話,K-Means方法的運算量也是很是的巨大,其實不是很值得用作實際的應用。

1.0.3 線性分類器

Parametric Approach:

使用這個方法,經過把一幅圖像通過咱們設計好的一個係數矩陣操做以後,轉換爲10個類別標籤。

其實總感受這種方法和咱們的稀疏字典有一些能夠參考的關係,其實主要的工做量應該是在如何設計這個W係數矩陣。這裏的話有一個實際的例子:

這一種方法的話,在最後其實和咱們以前的聚類有一些相似的地方,同時也存在一些區別,不如說這裏面每個score的話,都有對應的得分。最後訓練獲得的每個結果的話,都是對應的pattern。

上面這幅圖僅僅是在CIFAR-10 數據集上訓練獲得的一個線性分類器,其實每一個裏面都可以看出來很是模糊的樣子,特別是Car這個類別,特徵算是比較明顯的了。

線性分類器本質上作了哪些工做呢?其實他主要的做用就是經過創建幾個線性分割線,把咱們的線性空間進行了分割,從而實現一種分類的效果。

線性分類器這樣子的話,看上去咱們對於高維空間也能有不錯的分割效果,那是否是咱們只是用線性分類器就能夠實現一切問題了呢?答案是否認的。線性分類器存在自身的失效的分類案例。

好比說下面的三個cases就是咱們的線性分類器沒有辦法作到的問題——可是,其實第二個仍是能夠作到的,可是這裏面的話首先就須要咱們對於整個樣本空間進行一個變換,把對應的部分轉換到對應的樣本空間之中,再使用線性的方法進行分割。

這裏的話還有一個問題,咱們學習到了一個係數矩陣,可是這個係數矩陣怎麼樣作可以使得咱們能夠很好的衡量這個分類器呢?咱們的想法是:咱們能不能經過構造一個函數,而後經過咱們已知的分類以後的結果,對於正確分值的部分進行增長,錯誤分值的節點進行減少呢?

答案是能夠的。這個時候就須要引出一個函數,來正確的表示咱們的係數矩陣對於判斷正確與否的影響關係。經過這個函數,咱們可以知道往哪一個方向來修正咱們的係數矩陣。

2.0 Lecture 3 Loss function and optimaztion

2.0.1 Loss Function

Loss function:創建Loss function的目的是可以及時可以對咱們的係數矩陣有一個修正;而且咱們但願經過loss function來進行優化相關的parameter。

這裏的話,咱們創建了一個樣本:${(x_i,y_i)}_{i=1}^N$,這裏面的話$x_i$表明的是圖片,$y_i$是標籤。整個dataset的loss其實就是全部的樣本的loss總和:
$$L = \frac{1}{N} \sum_i L_i(f(x_i,W),y_i)$$

這個是簡單的一個整體loss的表達式。

2.0.2 Multiclass SVM loss

這裏的話,$(x_i,y_i)$,其中$x_i$表明圖片,$y_i$表明標籤。這裏的話有一個分數:$s = f(x_i,W)$,咱們的SVM是有這樣子的效果的:
$$L = begin{cases} 0, & text {if S_{y_i} bigger S_j+1 } \ s_j - S_{y_i}+1 , & text{otherwise}
end{cases}$$
$$L = \sum_{j \neq y_i} max(0,s_j - s_{y_j} +1)$$

舉例:用一個例子演示公式是如何計算的。假設有3個分類,而且獲得了分值s=[13,-7,11]。其中第一個類別是正確類別,即$y_i=0$。同時假設$\Delta$是10(後面會詳細介紹該超參數)。上面的公式是將全部不正確分類$(j\not=y_i)$加起來,因此咱們獲得兩個部分:

$ Li=max(0,-7-13+10)+max(0,11-13+10)$
能夠看到第一個部分結果是0,這是由於$[-7-13+10]$獲得的是負數,通過max(0,-)函數處理後獲得0。這一對類別分數和標籤的損失值是0,這是由於正確分類的得分13與錯誤分類的得分-7的差爲20,高於邊界值10。而SVM只關心差距至少要大於10,更大的差值仍是算做損失值爲0。第二個部分計算[11-13+10]獲得8。雖然正確分類的得分比不正確分類的得分要高(13>11),可是比10的邊界值仍是小了,分差只有2,這就是爲何損失值等於8。簡而言之,SVM的損失函數想要正確分類類別y_i的分數比不正確類別分數高,並且至少要高Delta。若是不知足這點,就開始計算損失值。

那麼在此次的模型中,咱們面對的是線性評分函數$(f(x_i,W)=Wx_i)$,因此咱們能夠將損失函數的公式稍微改寫一下:

$L_i=\sum_{j\not=y_i}max(0,w^T_jx_i-w^T_{y_i}x_i+\Delta)$
其中$w_j$是權重$W$的第$j$行,被變形爲列向量。然而,一旦開始考慮更復雜的評分函數f公式,這樣作就不是必須的了。

在結束這一小節前,還必須提一下的屬因而關於0的閥值:$max(0,-)$函數,它常被稱爲折葉損失(hinge loss)。有時候會聽到人們使用平方折葉損失SVM(即L2-SVM),它使用的是$max(0,-)^2$,將更強烈(平方地而不是線性地)地懲罰過界的邊界值。不使用平方是更標準的版本,可是在某些數據集中,平方折葉損失會工做得更好。能夠經過交叉驗證來決定到底使用哪一個。

2.0.3 regularization 正則化

在上面的multiclass的損失函數中存在一個問題,這裏的話假設咱們有一個數據集和一個weight matrix W,這裏的話能夠正確的分類每個數據(這裏的話全部的邊界都知足,對於全部的i都有$L_i = 0$),可是爲題在於:這個W並非惟一的,同時也有可能有不少類似的W能夠正確的分類全部的數據。

換句話說,咱們但願能向某些特定的權重W添加一些偏好,對其餘權重則不添加,以此來消除模糊性。這一點是可以實現的,方法是向損失函數增長一個正則化懲罰(regularization penalty)$R(W)$部分。最經常使用的正則化懲罰是L2範式,L2範式經過對全部參數進行逐元素的平方懲罰來抑制大數值的權重:

$R(W)=\sum_k \sum_l W^2_{k,l}$
上面的表達式中,將W中全部元素平方後求和。注意正則化函數不是數據的函數,僅基於權重。包含正則化懲罰後,就可以給出完整的多類SVM損失函數了,它由兩個部分組成:數據損失(data loss),即全部樣例的的平均損失L_i,以及正則化損失(regularization loss)。完整公式以下所示:

$L= \underbrace{ \frac{1}{N}\sum_i L_i}_{data \ loss}+\underbrace{\lambda R(W)}_{regularization \ loss}$

將其展開完整公式是:

$L=\frac{1}{N}\sum_i\sum_{j\not=y_i}[max(0,f(x_i;W)_j-f(x_i;W)_{y_i}+\Delta)]+\lambda \sum_k \sum_l W^2_{k,l}$

其中,N是訓練集的數據量。如今正則化懲罰添加到了損失函數裏面,並用超參數lambda來計算其權重。該超參數沒法簡單肯定,須要經過交叉驗證來獲取。

其中最好的性質就是對大數值權重進行懲罰,能夠提高其泛化能力,由於這就意味着沒有哪一個維度可以獨自對於總體分值有過大的影響。舉個例子,假設輸入向量$x=[1,1,1,1]$,兩個權重向量$w_1=[1,0,0,0]$,$w_2=[0.25,0.25,0.25,0.25$。那麼$w^T_1x=w^T_2=1$,兩個權重向量都獲得一樣的內積,可是$w_1$的L2懲罰是1.0,而$w_2$的L2懲罰是0.25。所以,根據L2懲罰來看,$w_2$更好,由於它的正則化損失更小。從直觀上來看,這是由於w_2的權重值更小且更分散。既然L2懲罰傾向於更小更分散的權重向量,這就會鼓勵分類器最終將全部維度上的特徵都用起來,而不是強烈依賴其中少數幾個維度。在後面的課程中能夠看到,這一效果將會提高分類器的泛化能力,並避免過擬合。

這裏的話咱們主要採用的Regularization方法分別有好幾種,以下圖所示:

2.0.4 SoftMax 函數(這一段從課程官方筆記整理)

Softmax分類器,它的損失函數與SVM的損失函數不一樣。對於學習過二元邏輯迴歸分類器的讀者來講,Softmax分類器就能夠理解爲邏輯迴歸分類器面對多個分類的通常化概括。SVM將輸出$f(x_i,W)$做爲每一個分類的評分(由於無定標,因此難以直接解釋)。與SVM不一樣,Softmax的輸出(歸一化的分類機率)更加直觀,而且從機率上能夠解釋,這一點後文會討論。在Softmax分類器中,函數映射$f(x_i;W)=Wx_i$保持不變,但將這些評分值視爲每一個分類的未歸一化的對數機率,而且將折葉損失(hinge loss)替換爲交叉熵損失(cross-entropy loss)。公式以下:

$$Li=-log(\frac{e^{f_{y_i}}}{\sum_je^{f_j}}) 或等價的 L_i=-f_{y_i}+log(\sum_je^{f_j})$$

在上式中,使用$f_j$來表示分類評分向量f中的第j個元素。和以前同樣,整個數據集的損失值是數據集中全部樣本數據的損失值L_i的均值與正則化損失R(W)之和。

其中函數$f_j(z)=\frac{e^{z_j}}{\sum_ke^{z_k}}$被稱做softmax 函數:其輸入值是一個向量,向量中元素爲任意實數的評分值(z中的),函數對其進行壓縮,輸出一個向量,其中每一個元素值在0到1之間,且全部元素之和爲1。

信息理論視角:在「真實」分佈p和估計分佈q之間的交叉熵定義以下:

$$H(p,q)=-\sum_xp(x) logq(x)$$
所以,Softmax分類器所作的就是最小化在估計分類機率(就是上面的$e^{f_{y_i}}/\sum_je^{f_j})$和「真實」分佈之間的交叉熵,在這個解釋中,「真實」分佈就是全部機率密度都分佈在正確的類別上(好比:$p=[0,...1,...,0]$中在$y_i$的位置就有一個單獨的1)。還有,既然交叉熵能夠寫成熵和相對熵(Kullback-Leibler divergence)$H(p,q)=H(p)+D_{KL}(p||q)$,而且delta函數p的熵是0,那麼就能等價的看作是對兩個分佈之間的相對熵作最小化操做。換句話說,交叉熵損失函數「想要」預測分佈的全部機率密度都在正確分類上。

譯者注:Kullback-Leibler差別(Kullback-Leibler Divergence)也叫作相對熵(Relative Entropy),它衡量的是相同事件空間裏的兩個機率分佈的差別狀況。

機率論解釋:先看下面的公式:

$$P(y_i|x_i,W)=\frac{e^{f_{y_i}}}{\sum_je^{f_j}}$$
能夠解釋爲是給定圖像數據$x_i$,以W爲參數,分配給正確分類標籤$y_i$的歸一化機率。爲了理解這點,請回憶一下Softmax分類器將輸出向量f中的評分值解釋爲沒有歸一化的對數機率。那麼以這些數值作指數函數的冪就獲得了沒有歸一化的機率,而除法操做則對數據進行了歸一化處理,使得這些機率的和爲1。從機率論的角度來理解,咱們就是在最小化正確分類的負對數機率,這能夠看作是在進行最大似然估計(MLE)。該解釋的另外一個好處是,損失函數中的正則化部分R(W)能夠被看作是權重矩陣W的高斯先驗,這裏進行的是最大後驗估計(MAP)而不是最大似然估計。說起這些解釋只是爲了讓讀者造成直觀的印象,具體細節就超過本課程範圍了。

實操事項:數值穩定。編程實現softmax函數計算的時候,中間項$e^{f_{y_i}}$和$\sum_j e^{f_j}$由於存在指數函數,因此數值可能很是大。除以大數值可能致使數值計算的不穩定,因此學會使用歸一化技巧很是重要。若是在分式的分子和分母都乘以一個常數C,並把它變換到求和之中,就能獲得一個從數學上等價的公式:

$$\frac{e^{f_{y_i}}}{\sum_je^{f_j}}=\frac{Ce^{f_{y_i}}}{C\sum_je^{f_j}}=\frac{e^{f_{y_i}+logC}}{\sum_je^{f_j+logC}}$$
C的值可自由選擇,不會影響計算結果,經過使用這個技巧能夠提升計算中的數值穩定性。一般將C設爲$logC=-max_jf_j$。該技巧簡單地說,就是應該將向量f中的數值進行平移,使得最大值爲0。代碼實現以下:

f = np.array([123, 456, 789]) # 例子中有3個分類,每一個評分的數值都很大
p = np.exp(f) / np.sum(np.exp(f)) # 不妙:數值問題,可能致使數值爆炸

# 那麼將f中的值平移到最大值爲0:
f -= np.max(f) # f becomes [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # 如今OK了,將給出正確結果

2.0.5 Softmax 和 SVM的比較

其實能夠看得出,咱們使用softmax和svm的時候,都是同時對於咱們的獲得的score函數進行一個判決。

不一樣的是他們的判決方法是不一樣的。SVM分類器將它們看作是分類評分,它的損失函數鼓勵正確的分類的分值比其餘分類的分值高出至少一個邊界值。Softmax分類器將這些數值看作是每一個分類沒有歸一化的對數機率,鼓勵正確分類的歸一化的對數機率變高,其他的變低。(其實softmax更加的直觀一些)

2.0.6 優化問題

通常來講的話,咱們對於圖像數據$x_i$,咱們若是對於參數集$W$作出來的分類預測和咱們的真實狀況一致的話,那麼咱們的loss $L$就很小。

這裏面的話,其實咱們就是但願經過咱們的優化方法可以實現損失函數最小化參數$W$的過程。

這裏的話,整個課程裏面舉的例子是:人們沿着一個路線下山,若是沒有地圖,咱們怎麼樣最快的下山呢?最好的辦法,沿着最陡峭的地方下山。最終咱們若是到達了山谷,那麼咱們在山谷這一點的斜率能夠近似的看做是0.

這裏的話,根據Justin整理的課程筆記的話,因爲咱們是進行神經網絡的深度學習的,咱們通常的損失函數都是定義在高緯度的空間中間的,這裏咱們是僅僅使用CIFAR-10數據集的話,咱們的線性分類器的權重矩陣的大小就是$[10*3073]$,總共有30730個參數。這個時候的話,咱們若是想要把這個損失函數可視化就很是的苦難了。可是這個時候,咱們若是在某幾個維度上面對高維空間進行了切片處理,咱們就能夠近似的知道這個時候的導數變化狀況。

這裏的話,咱們想要讓咱們的損失函數達到極小值,那咱們應該怎麼辦呢?這時候有三個備選方法:

方法一:隨機搜索;在隨機搜索的時候,咱們隨機的嘗試不少不一樣的權重,而後根據不一樣的權重對應的損失函數,進而比較哪個最好。這種辦法的話成功的準確率是很低的。

方法二:沿斜率降低;在咱們的一維空間中,咱們的函數的導數定義以下:$$\frac{df(x)}{dx} = \lim_{h \to 0}\frac{f(x+h)-f(x)}{h}$$

在多維的空間中,咱們的導數定義的話沒有那麼複雜,僅僅是使用咱們在各個方向上的梯度就能夠解決。這裏的話,咱們在每個方向上面的斜率的話其實就是這個點上面導數和方向的點乘積,某一個方向上面若是斜率最大那麼就能夠稱之爲是negative gradient。

這種方法的話其實就很像是咱們的迭代方法,若是咱們不達到局部最優,咱們就跳不出咱們的迭代過程。

這種方法其實可能也比較直觀,可是由於使用了迭代,運算的複雜度實際上是比較大的。

方法三:這裏的話,其實和上課的課件是存在區別的,這裏的話咱們按照justin整理的筆記爲主,這種方法咱們稱之爲隨機本地搜索。

咱們上面的方法的話,其實能夠看做是咱們每走一步都隨機的選擇幾個方向,若是這個方向是朝着山下的那麼咱們就降低一步。咱們新的方法的話,咱們從一個徹底隨機的$W$開始,在以後每一次咱們隨機的產生一個小的誤差(未來報道出現了誤差,我也有責任的)$\delta W$,這個時候只有咱們的$W + \delta W$這個損失下降了,咱們纔會更新咱們的模型。

===上面的話,因爲是根據PPT和Justin的筆記一塊兒進行寫的,因此可能邏輯上不是很清晰,可是內容都覆蓋到了===

2.0.7 梯度的計算

咱們通常的話,其實在計算機實現計算梯度的方法有兩種:

第一種辦法:數值梯度法,這種方法其實就是咱們一開始學習導數時候的數值方法,這種方法咱們本身用起來方便,同時實現也就簡單;

第二種方法:分析梯度法:其實就是數學方法人工計算梯度表達式,這裏面的話計算迅速(還不是由於咱們人工已經搞定了),計算結果精確,可是在實現的時候容易出錯,同時須要使用微分。

這裏的惡化,能夠參考一下給出來的python代碼,看一看numerical gradient:下面的代碼中,輸入是函數f和向量x,計算返回f在x的梯度

'''python

def eval_numerical_gradient(f,x):

fx = f(x)
grad = np.zeros(x.shape)
h = 0.000001

it = np.nditer(x,flags = ['multi_index'],op_flags = ['readwrite'])
while not ot.finished:

ix = it.multi_index
old_value = x[ix]
x[ix] = old_value + h
fxh = f(x)
x[ix] = old_value

grad[ix] = (fxh - fx) /h
it.iternext()

return grad

'''

相關文章
相關標籤/搜索