日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

深度学习与计算机视觉教程(3) | 损失函数与最优化(CV通关指南·完结)

發布時間:2023/12/4 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 深度学习与计算机视觉教程(3) | 损失函数与最优化(CV通关指南·完结) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 作者:韓信子@ShowMeAI
  • 教程地址:https://www.showmeai.tech/tutorials/37
  • 本文地址:https://www.showmeai.tech/article-detail/262
  • 聲明:版權所有,轉載請聯系平臺與作者并注明出處
  • 收藏ShowMeAI查看更多精彩內容

本系列為 斯坦福CS231n《深度學習與計算機視覺(Deep Learning for Computer Vision)》的全套學習筆記,對應的課程視頻可以在 這里 查看。更多資料獲取方式見文末。


引言

在上一篇 深度學習與計算機視覺教程(2) - 圖像分類與機器學習基礎 內容中,我們對線性分類器做了一些介紹,我們希望線性分類器能夠準確地對圖像進行分類,要有一套優化其權重參數的方法,這就是本篇ShowMeAI要給大家介紹到的損失函數與最優化相關的知識。

本篇重點

  • 損失函數
  • 數據損失與正則損失
  • SVM 損失
  • Softmax損失
  • 優化策略
  • 梯度計算方法
  • 梯度下降

1.線性分類:損失函數

1.1 損失函數的概念

回到之前講解過的小貓分類示例,這個例子中權重值 WWW 非常差,因為貓類別的得分非常低(-96.8),而狗(437.9)和船(61.95)比較高。

我們定義損失函數(Loss Function)(有時也叫代價函數 Cost Function目標函數 Objective) LLL 來衡量對預估結果的「不滿意程度」。當評分函數輸出結果與真實結果之間差異越大,損失函數越大,反之越小。

對于有 NNN 個訓練樣本對應 NNN 個標簽的訓練集數據 (xi,yi)(x_{i},y_{i})(xi?,yi?)),損失函數定義為:

L=1N∑i=1NLi(f(xi,W),yi)L=\frac{1}{N} \sum_{i=1}^NL_i(f(x_i,W), y_i) L=N1?i=1∑N?Li?(f(xi?,W),yi?)

  • 即每個樣本損失函數求和取平均。目標就是找到一個合適的 WWW 使 LLL 最小。
  • 注意:真正的損失函數 LLL 還有一項正則損失 R(W)R(W)R(W),下面會有說明。

損失函數有很多種,下面介紹最常見的一些。

1.2 多類支持向量機損失 (Multiclass Support Vector Machine Loss)

SVM 的知識可以參考ShowMeAI的圖解機器學習教程中的文章支持向量機模型詳解,多類 SVM 可以看作二分類 SVM 的一個推廣,它可以把樣本數據分為多個類別。

1) 數據損失(data loss)

SVM 的損失函數想要 SVM 在正確分類上的得分始終比不正確分類上的得分高出一個邊界值 Δ\DeltaΔ。

我們先看一條數據樣本(一張圖片)上的損失函數 LiL_iLi? 如何定義,根據之前的描述,第 iii 個數據 (xi,yi)(x_{i},y_{i})(xi?,yi?) )中包含圖像 xix_ixi? 的像素和代表正確類別的標簽 yiy_iyi?。給評分函數輸入像素數據,然后通過公式 f(xi,W)f(x_i, W)f(xi?,W) )來計算不同分類類別的分值。

這里我們將所有分值存放到 sss 中,第 jjj 個類別的得分就是 sss 的第 jjj 個元素: sj=f(xi,Wj)s_j = f(x_i, W_j)sj?=f(xi?,Wj?)。針對第 iii 條數據樣本的多類 SVM 的損失函數定義如下:

Li=∑j≠yimax?(0,sj?syi+Δ)L_i = \sum_{j\neq y_i} \max(0, s_j - s_{y_i} + \Delta) Li?=j=yi?∑?max(0,sj??syi??+Δ)

直觀來看,就是如果評分函數給真實標簽的分數比其他某個標簽的分數高出 Δ\DeltaΔ,則對該其他標簽的損失為 000;否則損失就是 sj?syi+Δs_j - s_{y_i}+ \Deltasj??syi??+Δ。要對所有不正確的分類循環一遍。

下面用一個示例來解釋一下:

簡化計算起見,我們只使用3個訓練樣本,對應3個類別的分類,yi=0,1,2y_i =0,1,2yi?=0,1,2 對于第1張圖片 「小貓」 來說,評分 s=[3.2,5.1,?1.7]s=[3.2, 5.1, -1.7]s=[3.2,5.1,?1.7] 其中 syi=3.2s_{y_i}=3.2syi??=3.2 如果把 Δ\DeltaΔ 設為 111,則針對小貓的損失函數:

L1=max(0,5.1?3.2+1)+max(0,?1.7?3.2+1)=max(0,2.9)+max(0,?3.9)=2.9+0=2.9L_1 = max(0, 5.1 - 3.2 + 1) +max(0, -1.7 - 3.2 + 1) = max(0, 2.9) + max(0, -3.9) = 2.9 + 0 =2.9 L1?=max(0,5.1?3.2+1)+max(0,?1.7?3.2+1)=max(0,2.9)+max(0,?3.9)=2.9+0=2.9

同理可得 L2=0L_2 =0L2?=0,L3=12.9L_3 =12.9L3?=12.9,所以對整個訓練集的損失:L=(2.9+0+12.9)/3=5.27L= (2.9 + 0 + 12.9)/3 =5.27L=(2.9+0+12.9)/3=5.27。

上面可以看到 SVM 的損失函數不僅想要正確分類類別 yiy_iyi? 的分數比不正確類別分數高,而且至少要高 Δ\DeltaΔ。如果不滿足這點,就開始計算損失值。

展開一點解釋如下:之所以會加入一個 Δ\DeltaΔ,是為了真實標簽的分數比錯誤標簽的分數高出一定的距離,如上圖所示,如果其他分類分數進入了紅色的區域,甚至更高,那么就開始計算損失;如果沒有這些情況,損失值為 000:

  • 損失最小是 000,最大無窮;
  • 如果求和的時候,不加 j≠yij\neq y_ij=yi? 這一條件,LLL 會加 Δ\DeltaΔ;
  • 計算 LiL_iLi? 時使用平均不用求和,只會縮放 LLL 不會影響好壞;而如果使用平方,就會打破平衡,會使壞的更壞,LLL 受到影響。

在訓練最開始的時候,往往會給 WWW 一個比較小的初值,結果就是 sss 中所有值都很小接近于 000,此時的損失 LLL 應該等于分類類別數 K?1K-1K?1,這里是 222。可根據這個判斷代碼是否有問題;

非向量化和向量化多類 SVM 損失代碼實現如下:

def L_i(x, y, W):"""非向量化版本。計算單個例子(x,y)的多類 SVM 損失    - x 是表示圖像的列向量(例如,CIFAR-10中的3073 x 1),附加偏置維度- y 是一個給出正確類索引的整數(例如,CIFAR-10中的0到9之間)    - W 是權重矩陣(例如,CIFAR-10中的10 x 3073)  """delta = 1.0 # 間隔 deltascores = W.dot(x) # 得分數組,10 x 1correct_class_score = scores[y]D = W.shape[0] # 分類的總數,即為10loss_i = 0.0for j in range(D): # 迭代所有錯誤分類   if j == y:# 跳過正確分類的continue# 第 i 個樣本累加損失loss_i += max(0, scores[j] - correct_class_score + delta)return loss_idef L_i_vectorized(x, y, W):'''更快的半向量化實現。half-vectorized指的是這樣一個事實:對于單個樣本,實現不包含for循環,但是在樣本外仍然有一個循環(在此函數之外)'''delta = 1.0scores = W.dot(x)# 用一個向量操作計算和所有類別的間隔margins = np.maximum(0, scores - scores[y] + delta)# y處的值應該為0  margins[y] = 0loss_i = np.sum(margins)return loss_i

這里的評分函數 f(xi;W)=Wxif(x_i; W) = W x_if(xi?;W)=Wxi?,所以損失函數可以寫為:

Li=∑j≠yimax?(0,wjTxi?wyiTxi+Δ)L_i = \sum_{j\neq y_i} \max(0, w_j^T x_i - w_{y_i}^T x_i + \Delta) Li?=j=yi?∑?max(0,wjT?xi??wyi?T?xi?+Δ)

  • 其中 wjw_jwj? 是 WWW 的第 jjj 行,然后被拉成一個行列向量,與 $x_i $ 列向量做點積。

max(0,?)max(0,-)max(0,?) 函數,常被稱為合頁損失hinge loss)。比如平方合頁損失 SVM (即 L2 - SVM ),它使用的是 max(0,?)2max(0,-)^2max(0,?)2 ),將更強烈(平方地而不是線性地)地懲罰過界的邊界值。不使用平方是更標準的版本,但是在某些數據集中,平方合頁損失會工作得更好。可以通過交叉驗證來決定到底使用哪個。

總結:我們對于預測訓練集數據分類標簽的結果,有一些不滿意的地方,而損失函數就能將這些不滿意的程度量化。

2) 正則化損失(regularization loss)

假設有1個數據集和1組權重 WWW 能夠正確地分類每個數據,即所有 LiL_iLi? 都為 000,這樣的 WWW 是否唯一?其實只要是任意 λ>1\lambda >1λ>1,λW\lambda WλW 都可以滿足 Li=0L_i = 0Li?=0,因為把差值放大 λ\lambdaλ 倍后,仍然會大于 Δ\DeltaΔ。

所以,我們希望對某些 WWW 添加一些偏好,讓我們的W更趨向于希望的形式,一個常見的做法是向損失函數增加一個正則化懲罰regularization penalty) R(W)R(W)R(W) ,它同時也能讓模型更加泛化。

結合上述思路我們得到完整的多類 SVM 損失函數,它由兩個部分組成:數據損失data loss),即所有樣例的平均損失,以及正則化損失****(regularization loss)。完整公式如下:

L=1N∑iLi?data?loss?+λR(W)?regularization?loss?L=\underbrace{\frac{1}{N} \sum_{i} L_{i}}_{\text {data loss }}+\underbrace{\lambda R(W)}_{\text {regularization loss }} L=data?loss?N1?i∑?Li???+regularization?loss?λR(W)??

① 常用的正則化損失

  • 最常用的R(W)是 L2 范式,WWW 每個元素平方后加起來作為懲罰項,可以限制大的權重,更希望 WWW 的元素分布比較均勻:

R(W)=∑k∑lWk,l2R(W) = \sum_k\sum_l W_{k,l}^2 R(W)=k∑?l∑?Wk,l2?

  • 除此之外還有 L1 范式,作為懲罰項更希望一個比較簡單的模型,即 WWW 中有很多的 000:

R(W)=∑k∑l∣Wk,l∣R(W) = \sum_k\sum_l \vert W_{k,l}\vert R(W)=k∑?l∑?∣Wk,l?∣

  • L1 和 L2 也可以組合起來:

R(W)=∑k∑lβWk,l2+∣Wk,l∣R(W) = \sum_k\sum_l \beta W_{k,l}^2 + \vert W_{k,l}\vert R(W)=k∑?l∑?βWk,l2?+∣Wk,l?∣

② 對正則化損失的理解

引入 L2 范數正則化損失最好的性質就是對大數值權重進行懲罰,可以提升其泛化能力,因為這就意味著沒有哪個維度能夠獨自對于整體分值有過大的影響。

舉個例子,假設輸入向量 x=[1,1,1,1]x = [1,1,1,1]x=[1,1,1,1],兩個權重向量 w1=[1,0,0,0]w_1 = [1,0,0,0]w1?=[1,0,0,0],w2=[0.25,0.25,0.25,0.25]w_2 = [0.25,0.25,0.25,0.25]w2?=[0.25,0.25,0.25,0.25]。那么 w1Tx=w2Tx=1w_1^Tx = w_2^Tx = 1w1T?x=w2T?x=1。兩個權重向量都得到同樣的內積,但是 w1w_1w1? 的 L2 懲罰是1.0,而 w2w_2w2? 的 L2 懲罰是 0.250.250.25。因此,根據 L2 懲罰來看,w2w_2w2? 更好,因為它的正則化損失更小。從直觀上來看,這是因為 w2w_2w2? 的權重值更小且更分散,這就會鼓勵分類器最終將所有維度上的特征都用起來,而不是強烈依賴其中少數幾個維度。這一效果將會提升分類器的泛化能力,并避免過擬合。

注意,和權重不同,偏置項沒有這樣的效果,因為它們并不控制輸入維度上的影響強度。因此通常只對權重 WWW 正則化,而不正則化偏置項 bbb

同時,因為正則化懲罰的存在,不可能在所有的例子中得到 000 的損失值,這是因為只有當 W=0W=0W=0 的特殊情況下,才能得到損失值為 000。

但是從 L1 懲罰來看,w1w_1w1? 可能會更好一些,當然這里 L1 懲罰相同,但是一般來說,L1 懲罰更希望 WWW 比較稀疏,最好是有很多為 000 的元素,這一特性可以用來在不改變模型的基礎上防止過擬合。

比如下面的例子中:

假設我們的訓練數據得到的模型是藍色的曲線,可以看出應該是一個多項式函數,比如 f=w1x1+w2x22+w3x33+w4x44f=w_1x_1+w_2x_2^2+w_3x_3^3+w_4x_4^4f=w1?x1?+w2?x22?+w3?x33?+w4?x44?。但是當新的綠色數據輸入時,顯然模型是錯誤的,更準確的應該是綠色的線。

如果我們使用 L1 懲罰,由于 L1 懲罰的特性,會希望 WWW 變得稀疏,可讓 w2,w3,w4w_2,w_3,w_4w2?,w3?,w4? 變成接近 000 的數,這樣就可以在不改變模型的情況下,讓模型變得簡單泛化。

思考超參數 Δ\DeltaΔ 和 λ\lambdaλ 應該被設置成什么值需要通過交叉驗證來求得嗎

  • Δ\DeltaΔ 在絕大多數情況下設為 1 都是安全的。
  • Δ\DeltaΔ 和 λ\lambdaλ 看起來是兩個不同的超參數,但實際上他們一起控制同一個權衡:即損失函數中的數據損失和正則化損失之間的權衡。
  • 理解這一點的關鍵是,權重 WWW 的大小對于分類分值有直接影響(對他們的差異也有直接影響):當我們將 WWW 中值縮小,分類分值之間的差異也變小,反之亦然。
  • 因此,不同分類分值之間的邊界的具體值 Δ=1\Delta=1Δ=1 或 Δ=100\Delta=100Δ=100 從某些角度來看是沒意義的,因為權重自己就可以控制差異變大和縮小。也就是說,真正的權衡是我們允許權重能夠變大到何種程度(通過正則化強度 λ\lambdaλ 來控制)。

③ 與二元 SVM 的關系

二元 SVM 對于第 iii 個數據的損失計算公式是:

Li=Cmax?(0,1?yiwTxi)+R(W)L_i = C \max(0, 1 - y_i w^Tx_i) + R(W) Li?=Cmax(0,1?yi?wTxi?)+R(W)

其中,CCC 是一個超參數,并且 yi∈{?1,1}y_i \in \{ -1,1 \}yi?∈{?1,1},這個公式是多類 SVM 公式只有兩個分類類別的特例,CCC 和 λ\lambdaλ 的倒數正相關。比如對真實標簽為 yi=1y_i=1yi?=1 的數據得分是 505050,則 Li=0L_i=0Li?=0。這里只用到了 yi=1y_i=1yi?=1 標簽的得分,因為二元 SVM 的W只有一行,只有一個得分并且是自身分類的得分,只要這個得分和 yiy_iyi? 的乘積大于 111 就是預測正確的了。

最終,我們得到了多類 SVM 損失的完整表達式:

L=1N∑i∑j≠yi[max?(0,f(xi;W)j?f(xi;W)yi+Δ)]+λ∑k∑lWk,l2L = \frac{1}{N} \sum_i \sum_{j\neq y_i} \left[ \max(0, f(x_i; W)_{j} - f(x_i; W)_{y_i} + \Delta) \right] + \lambda \sum_k\sum_l W_{k,l}^2 L=N1?i∑?j=yi?∑?[max(0,f(xi?;W)j??f(xi?;W)yi??+Δ)]+λk∑?l∑?Wk,l2?

接下來要做的,就是找到能夠使損失值最小化的權重了。

1.3 Softmax分類器損失

SVM 是最常用的分類器之一,另一個常用的是Softmax分類器。Softmax 分類器可以理解為邏輯回歸分類器面對多個分類的一般化歸納,又稱為多項式邏輯回歸((Multinomial Logistic Regression)。

1) 損失函數

還是以之前小貓的圖片為例:

圖片上的公式初一看可能感覺有點復雜,下面逐個解釋:

  • sss 依然是存放所有分類分值的一維數組,s=f(xi,W)s=f(x_i,W)s=f(xi?,W),sjs_jsj? 對應著第 jjj 個分類的得分,對數據 xix_ixi? 的真實標簽得分還是 syis_{y_i}syi??。現在這個分數被 Softmax 分類器稱作非歸一化log概率

  • 函數 fk(s)=esk∑jesjf_k(s)=\frac{e^{s_k}}{\sum_j e^{s_j}}fk?(s)=∑j?esj?esk?? 是 Softmax 函數,其輸入值是一個向量 sss,向量中元素為任意實數的評分值,函數對其進行壓縮,輸出一個向量,其中每個元素值在 000 到 111 之間,且所有元素之和為 111。現在可以把這個壓縮后的向量看作一個概率分布,分類標簽是 kkk 的概率: P(Y=k∣X=xi)=esk∑jesjP(Y=k|X=x_i)=\frac{e^{s_k}}{\sum_j e^{s_j}}P(Y=k∣X=xi?)=∑j?esj?esk??。這個概率被稱作歸一化概率,得分的指數形式被稱作非歸一化概率

  • 由上所述,真實分類標簽的概率: P(Y=yi∣X=xi)=esyi∑jesjP(Y=y_i|X=x_i)=\frac{e^{s_{y_i}}}{\sum_j e^{s_j}}P(Y=yi?∣X=xi?)=∑j?esj?esyi???,如果這個概率為 111 就最好不過了。所以我們希望這個概率的對數似然最大化,也就是相當于負對數似然最小。由于概率 PPP 在 [0,1][0, 1][0,1] 之間,所以 ?log(P)-log(P)?log(P) 在 000 到正無窮之間,所以我們可以用這個負對數似然作為對于 xix_ixi? 的損失函數

Li=?logP(Y=yi∣X=xi)=?log(esyi∑jesj)L_i=-logP(Y=y_i|X=x_i)=-log(\frac{e^{s_{y_i}}}{\sum_j e^{s_j}}) Li?=?logP(Y=yi?∣X=xi?)=?log(∑j?esj?esyi???)

  • 整個數據集的損失:

L=1N∑i[?log(esyi∑jesj)]+λR(W)L = \frac{1}{N} \sum_i \left[ -log(\frac{e^{s_{y_i}}}{\sum_j e^{s_j}}) \right] + \lambda R(W) L=N1?i∑?[?log(∑j?esj?esyi???)]+λR(W)

  • SVM 中使用的是合頁損失(hinge loss)有時候又被稱為最大邊界損失(max-margin loss),Softmax分類器中使用的為交叉熵損失cross-entropy loss),因為使用的是 Softmax 函數,求一個歸一化的概率。

根據上面的分析,可以計算出小貓的 Softmax 損失為 0.890.890.89。損失為 000 的時候最好,無窮大的時候最差。

其中:

  • Softmax 損失,最大無窮,最小是 000;
  • 給W一個比較小的初值,sss 中所有值都很小接近于 000 時,此時的損失L應該等于分類類別數的對數: logKlogKlogK。可根據這個判斷代碼是否有問題;
  • 實際代碼編寫中,由于指數形式的存在,如果得分很高,會得到一個非常大的數。除以大數值可能導致數值計算的不穩定,所以學會使用歸一化技巧非常重要。如果在分式的分子和分母都乘以一個常數 CCC,并把它變換到求和之中,就能得到一個從數學上等價的公式:

esyi∑jesj=CesyiC∑jesj=esyi+log?C∑jesj+log?C\frac{e^{s_{y_i}}}{\sum_j e^{s_j}} = \frac{Ce^{s_{y_i}}}{C\sum_j e^{s_j}} = \frac{e^{s_{y_i} + \log C}}{\sum_j e^{s_j + \log C}} ∑j?esj?esyi???=C∑j?esj?Cesyi???=∑j?esj?+logCesyi??+logC?

  • 通常將 CCC 設為 logC=?max?jsjlog C = -\max_j s_jlogC=?maxj?sj?

該技巧簡單地說,就是應該將向量 sss 中的數值進行平移,使得最大值為 000。參考python實現代碼如下:

s = np.array([123, 456, 789]) # 例子中有3個分類,每個評分的數值都很大
p = np.exp(s) / np.sum(np.exp(s)) # 不好:數值問題,可能導致數值爆炸# 那么將f中的值平移到最大值為0:
s -= np.max(s) # s變成 [-666, -333, 0]
p = np.exp(s) / np.sum(np.exp(s)) # 現在可以了,將給出正確結果

1.4 Softmax 和 SVM 比較

Softmax 和 SVM 這兩類損失的對比如下圖所示:

① 計算上有差異

SVM 和 Softmax 分類器對于數據有不同的處理方式。兩個分類器都計算了同樣的分值向量 sss(本節中是通過矩陣乘來實現)。不同之處在于對 sss 中分值的解釋:

  • SVM 分類器將它們看做是類別評分,它的損失函數鼓勵正確的類別(本例中是藍色的類別2)的分值比其他類別的分值高出至少一個安全邊界值
  • Softmax 分類器將這些數值看做是每個類別沒有歸一化的對數概率,鼓勵正確分類的歸一化的對數概率變高,其余的變低

SVM 的最終的損失值是 1.581.581.58,Softmax 的最終的損失值是 0.4520.4520.452,注意這兩個數值大小沒有可比性。只在給定同樣數據,在同樣的分類器的損失值計算中,損失之間比較才有意義。

② 損失的絕對數值不可以直接解釋

SVM 的計算是無標定的,而且難以針對所有分類的評分值給出直觀解釋。Softmax 分類器則不同,它允許我們計算出對于所有分類標簽的 「概率」。

但這里要注意,「不同類別概率」 分布的集中或離散程度是由正則化參數 λ\lambdaλ 直接決定的。隨著正則化參數 λ\lambdaλ 不斷增強,權重數值會越來越小,最后輸出的概率會接近于均勻分布。

也就是說,Softmax 分類器算出來的概率可以某種程度上視作一種對于分類正確性的自信。和 SVM 一樣,數字間相互比較得出的大小順序是可以解釋的,但其絕對值則難以直觀解釋。

③ 實際應用時,SVM 和 Softmax 是相似的

兩種分類器的表現差別很小。

  • 相對于 Softmax 分類器,SVM 更加 「局部目標化(local objective)」,只要看到正確分類相較于不正確分類,已經得到了比邊界值還要高的分數,它就會認為損失值是 000,對于數字個體的細節是不關心的。
  • Softmax 分類器對于分數是永不滿足的:正確分類總能得到更高的概率,錯誤分類總能得到更低的概率,損失值總是能夠更小。

2.優化

截止目前,我們已知以下內容:

  • 評分函數: s=f(W,x)=Wxs=f(W,x)=Wxs=f(W,x)=Wx

  • 損失函數

    • SVM 數據損失: Li=∑j≠yimax?(0,sj?syi+Δ)L_i = \sum_{j\neq y_i} \max(0, s_j - s_{y_i} + \Delta)Li?=∑j=yi??max(0,sj??syi??+Δ)
    • Softmax 數據損失: Li=?log(esyi∑jesj)L_i=-log(\frac{e^{s_{y_i}}}{\sum_j e^{s_j}})Li?=?log(∑j?esj?esyi???)
    • 全損失: L=1N∑i=1NLi+R(W)L=\frac{1}{N} \sum_{i=1}^NL_i+R(W)L=N1?∑i=1N?Li?+R(W)

它們之間的關系:

下一步我們希望尋找最優的 WWW 讓損失loss最小化。

2.1 損失函數可視化

損失函數一般都是定義在高維度的空間中(比如,在 CIFAR-10 中一個線性分類器的權重矩陣大小是 [10×3073][10 \times 3073][10×3073],就有 30730 個參數),這樣要將其可視化就很困難。

解決辦法是在1維或2維方向上對高維空間進行切片,就能得到一些直觀感受。

  • 例如,隨機生成一個權重矩陣 WWW,該矩陣就與高維空間中的一個點對應。然后沿著某個維度方向前進的同時記錄損失函數值的變化。
  • 換句話說,就是生成一個隨機的方向 W1W_1W1? 并且沿著此方向計算損失值,計算方法是根據不同的 aaa 值來計算 L(W+aW1)L(W + a W_1)L(W+aW1?)。這個過程將生成一個圖表,其 xxx 軸是值 aaa,yyy 軸是損失函數值。
  • 對應到兩維上,即通過改變 a,ba,ba,b 來計算損失值 L(W+aW1+bW2)L(W + a W_1 + b W_2)L(W+aW1?+bW2?),從而給出二維的圖像。在圖像中,可以分別用 xxx 和 yyy 軸表示 a,ba, ba,b,而損失函數的值可以用顏色變化表示。

下圖是一個無正則化的多類 SVM 的損失函數的圖示。左邊和中間只有一個樣本數據,右邊是 CIFAR-10 中的 100 個數據,藍色部分是低損失值區域,紅色部分是高損失值區域:

上圖中注意損失函數的分段線性結構。多個樣本的損失值是總體的平均值,所以右邊的碗狀結構是很多的分段線性結構的平均。可以通過數學公式來解釋損失函數的分段線性結構。

對于1條單獨的數據樣本,有損失函數的計算公式如下:

Li=∑j≠yi[max?(0,wjTxi?wyiTxi+1)]L_i = \sum_{j\neq y_i} \left[ \max(0, w_j^Tx_i - w_{y_i}^Tx_i + 1) \right] Li?=j=yi?∑?[max(0,wjT?xi??wyi?T?xi?+1)]

每個樣本的數據損失值是以 WWW 為參數的線性函數的總和。WWW 的每一行( wjw_jwj? ),有時候它前面是一個正號(比如當它對應非真實標簽分類的時候),有時候它前面是一個負號(比如當它是正確分類的時候)。

比如,假設有一個簡單的數據集,其中包含有3個只有1個維度的點,數據集數據點有3個類別。那么完整的無正則化 SVM 的損失值計算如下:

L0=max?(0,w1Tx0?w0Tx0+1)+max?(0,w2Tx0?w0Tx0+1)L1=max?(0,w0Tx1?w1Tx1+1)+max?(0,w2Tx1?w1Tx1+1)L2=max?(0,w0Tx2?w2Tx2+1)+max?(0,w1Tx2?w2Tx2+1)L=(L0+L1+L2)/3\begin{aligned} L_0 = & \max(0, w_1^Tx_0 - w_0^Tx_0 + 1) + \max(0, w_2^Tx_0 - w_0^Tx_0 + 1) \\ L_1 = & \max(0, w_0^Tx_1 - w_1^Tx_1 + 1) + \max(0, w_2^Tx_1 - w_1^Tx_1 + 1) \\ L_2 = & \max(0, w_0^Tx_2 - w_2^Tx_2 + 1) + \max(0, w_1^Tx_2 - w_2^Tx_2 + 1) \\ L = & (L_0 + L_1 + L_2)/3 \end{aligned} L0?=L1?=L2?=L=?max(0,w1T?x0??w0T?x0?+1)+max(0,w2T?x0??w0T?x0?+1)max(0,w0T?x1??w1T?x1?+1)+max(0,w2T?x1??w1T?x1?+1)max(0,w0T?x2??w2T?x2?+1)+max(0,w1T?x2??w2T?x2?+1)(L0?+L1?+L2?)/3?

這些例子都是一維的,所以數據 xix_ixi? 和權重 wjw_jwj? 都是數字。單看 w0w_0w0?,可以看到最上面的三個式子每一個都含 w0w_0w0? 的線性函數,且每一項都會與 000 比較,取兩者的最大值。第一個式子線性函數斜率是負的,后面兩個斜率是正的,可作圖如下:

上圖中,橫軸是 w0w_0w0?,縱軸是損失,三條線對應三個線性函數,加起來即為右圖。

補充解釋

  • 我們將上面的評分函數 fff 擴展到神經網絡,目標損失函數就就不再是凸函數了,圖像也不會像上面那樣是個碗狀,而是凹凸不平的復雜地形形狀。
  • 由于 max 操作,損失函數中存在一些不可導點(kinks),比如折點處,這些點使得損失函數不可微,因為在這些不可導點,梯度是沒有定義的。但是次梯度(subgradient)依然存在且常常被使用。在本教程中,我們會交換使用次梯度和梯度兩個術語。某點的次梯度是該點的左右導數之間的任意值。

2.2 優化策略(Optimization Strategy)

優化策略的目標是:找到能夠最小化損失函數值的權重 WWW

1) 策略一:隨機搜索(Random search)

隨機嘗試很多不同的權重,然后看其中哪個最好。這是一個差勁的初始方案。代碼如下:

# 假設X_train的每一列都是一個數據樣本(比如3073 x 50000)
# 假設Y_train是數據樣本的類別標簽(比如一個長50000的一維數組)
# 假設函數L對損失函數進行評價bestloss = float("inf") # 初始指定一個最高的損失
for num in range(1000):W = np.random.randn(10, 3073) * 0.0001 # 隨機生成一個10x3073的W矩陣# 都接近為0loss = L(X_train, Y_train, W) # 得到整個訓練集的損失if loss < bestloss: # 保持最好的解決方式bestloss = lossbestW = Wprint 'in attempt %d the loss was %f, best %f' % (num, loss, bestloss)# 輸出:
# in attempt 0 the loss was 9.401632, best 9.401632
# in attempt 1 the loss was 8.959668, best 8.959668
# in attempt 2 the loss was 9.044034, best 8.959668
# in attempt 3 the loss was 9.278948, best 8.959668
# in attempt 4 the loss was 8.857370, best 8.857370
# in attempt 5 the loss was 8.943151, best 8.857370
# in attempt 6 the loss was 8.605604, best 8.605604
# ... (trunctated: continues for 1000 lines)

在上面的代碼中,我們嘗試了若干隨機生成的權重矩陣 WWW,其中某些的損失值較小,而另一些的損失值大些。我們可以把這次隨機搜索中找到的最好的權重 WWW 取出,然后去跑測試集:

# 假設X_test尺寸是[3073 x 10000], Y_test尺寸是[10000 x 1]
scores = Wbest.dot(Xte_cols) # 10 x 10000, 每個樣本對應10個類得分,共10000
# 找到在每列中評分值最大的索引(即預測的分類)
Yte_predict = np.argmax(scores, axis = 0)
# 以及計算準確率
np.mean(Yte_predict == Yte)
# 返回 0.1555

驗證集上表現最好的權重W跑測試集的準確率是 15.5%15.5\%15.5%,而完全隨機猜的準確率是 10%10\%10%,效果不好!

思路調整:新的策略是從隨機權重W開始,然后迭代取優,每次都讓它的損失值變得更小一點,從而獲得更低的損失值。想象自己是一個蒙著眼睛的徒步者,正走在山地地形上,目標是要慢慢走到山底。在 CIFAR-10 的例子中,這山是 307303073030730 維的(因為 WWW 是 3073×103073 \times 103073×10)。我們在山上踩的每一點都對應一個的損失值,該損失值可以看做該點的海拔高度。

2) 策略二:隨機本地搜索

第一個策略可以看做是每走一步都嘗試幾個隨機方向,如果是上山方向就停在原地,如果是下山方向,就向該方向走一步。這次我們從一個隨機 WWW 開始,然后生成一個隨機的擾動 aWaWaW,只有當 W+aWW+aWW+aW 的損失值變低,我們才會更新。

這個過程的參考實現代碼如下:

W = np.random.randn(10, 3073) * 0.001 # 生成隨機初始W
bestloss = float("inf")
for i in xrange(1000):step_size = 0.0001Wtry = W + np.random.randn(10, 3073) * step_sizeloss = L(Xtr_cols, Ytr, Wtry)if loss < bestloss:W = Wtrybestloss = lossprint 'iter %d loss is %f' % (i, bestloss)

用上述方式迭代 1000 次,這個方法可以得到 21.4%21.4\%21.4% 的分類準確率。

3) 策略三:跟隨梯度

前兩個策略關鍵點都是在權重空間中找到合適的方向,使得沿其調整能降低損失函數的損失值。其實不需要隨機尋找方向,我們可以直接計算出最好的方向,這個方向就是損失函數的梯度gradient)。這個方法就好比是感受我們腳下山體的傾斜程度,然后向著最陡峭的下降方向下山。

在一維函數中,斜率是函數在某一點的瞬時變化率。梯度是函數斜率的一般化表達,它是一個向量。

在輸入空間中,梯度是各個維度的斜率組成的向量(或者稱為導數 derivatives)。對一維函數的求導公式如下:

df(x)dx=lim?h→0f(x+h)?f(x)h\frac{df(x)}{dx} = \lim_{h\ \to 0} \frac{f(x + h) - f(x)}{h} dxdf(x)?=h?→0lim?hf(x+h)?f(x)?

當函數有多個自變量的時候,我們稱導數為偏導數,而梯度就是在每個維度上偏導數所形成的向量。設三元函數 f(x,y,z)f(x,y,z)f(x,y,z) 在空間區域 GGG 內具有一階連續偏導數,點 P(x,y,z)∈GP(x,y,z)\in GP(x,y,z)∈G,稱向量

{?f?x,?f?y,?f?z}=?f?xi?+?f?yj?+?f?zk?=fx(x,y,z)i?+fy(x,y,z)j?+fz(x,y,z)k?\{ \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} ,\frac{\partial f}{\partial z} \} = \frac{\partial f}{\partial x}\vec{i} +\frac{\partial f}{\partial y}\vec{j} +\frac{\partial f}{\partial z} \vec{k} = f_{x}(x,y,z)\vec{i}+f_{y}(x,y,z)\vec{j}+f_{z}(x,y,z)\vec{k} {?x?f?,?y?f?,?z?f?}=?x?f?i+?y?f?j?+?z?f?k=fx?(x,y,z)i+fy?(x,y,z)j?+fz?(x,y,z)k

為函數 f(x,y,z)f(x,y,z)f(x,y,z) )在點 PPP 的梯度

記為:

gradf(x,y,z)=fx(x,y,z)i?+fy(x,y,z)j?+fz(x,y,z)k?grad f(x,y,z)=f_{x}(x,y,z)\vec{i}+f_{y}(x,y,z)\vec{j}+f_{z}(x,y,z)\vec{k} gradf(x,y,z)=fx?(x,y,z)i+fy?(x,y,z)j?+fz?(x,y,z)k

3.梯度計算

關于梯度計算與檢查的詳細知識也可以參考ShowMeAI的深度學習教程 | 吳恩達專項課程 · 全套筆記解讀中的文章深度學習的實用層面里對于「梯度檢驗 (Gradient checking)」部分的講解

計算梯度有兩種方法:

  • 緩慢的近似方法(數值梯度法),但實現相對簡單。
  • 分析梯度法,計算迅速,結果精確,但是實現時容易出錯,且需要使用微分。

下面我們展開介紹這兩種方法

3.1 數值梯度法

數值梯度法是借助于梯度的定義對其進行逼近計算。

下面代碼中:

輸入為函數 fff 和矩陣 xxx,計算 fff 的梯度的通用函數,它返回函數 fff 在點 xxx 處的梯度,利用公式 df(x)dx=lim?h→0f(x+h)?f(x)h\frac{df(x)}{dx} = \lim_{h\ \to 0} \frac{f(x + h) - f(x)}{h}dxdf(x)?=limh?→0?hf(x+h)?f(x)?,代碼對 xxx 矩陣所有元素進行迭代,在每個元素上產生一個很小的變化 hhh,通過觀察函數值變化,計算函數在該元素上的偏導數。最后,所有的梯度存儲在變量 grad 中:

參考實現代碼如下:

def eval_numerical_gradient(f, x):"""  我們是求L關于w的梯度,f就是損失L,x就是權重矩陣w一個 f 在 x 處的數值梯度法的簡單實現- f 是參數 x 的函數,x 是矩陣,比如之前的 w 是10x3073  - x 是計算梯度的點""" fx = f(x) # 計算x點處的函數值grad = np.zeros(x.shape)  # 梯度矩陣也是10x3073h = 0.00001  # 近似為0的變化量# 對x中所有的索引進行迭代,比如從(0,0)到(9,3072)it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])# np.nditer是np自帶的迭代器# flags=['multi_index']表示對 x 進行多重索引 比如(0,0)# op_flags=['readwrite']表示不僅可以對x進行read(讀取),還可以write(寫入)while not it.finished:# 計算x+h處的函數值ix = it.multi_index   #索引從(0,0)開始,即從x矩陣第一行第一列的元素開始old_value = x[ix]   # 先將x(0,0)處原值保存x[ix] = old_value + h # 增加hfxh = f(x) # 計算新的f(x + h)x[ix] = old_value # 將x(0,0)處改回原值# 計算偏導數grad[ix] = (fxh - fx) / h # x(0,0)處的偏導數it.iternext() # 到下個維度x(0,1)return grad # 最終是計算好的10x3073的梯度矩陣

實際中用中心差值公式centered difference formula)[f(x+h)?f(x?h)]/2h[f(x+h) - f(x-h)] / 2 h[f(x+h)?f(x?h)]/2h 效果會更好。下面計算權重空間中的某些隨機點上,CIFAR-10 損失函數的梯度:

# 為了使用上面的代碼,需要一個只有一個參數的函數
# (在這里參數就是權重W)所以封裝了X_train和Y_train
def CIFAR10_loss_fun(W):return L(X_train, Y_train, W)W = np.random.rand(10, 3073) * 0.001 # 隨機權重矩陣
df = eval_numerical_gradient(CIFAR10_loss_fun, W) # 得到梯度矩陣梯度告訴我們損失函數在每個元素上的斜率,以此來進行更新:
loss_original = CIFAR10_loss_fun(W) # 初始損失值
print 'original loss: %f' % (loss_original, )# 查看不同步長的效果
for step_size_log in [-10, -9, -8, -7, -6, -5,-4,-3,-2,-1]:step_size = 10 ** step_size_logW_new = W - step_size * df # 權重空間中的新位置,使用負梯度loss_new = CIFAR10_loss_fun(W_new)print 'for step size %f new loss: %f' % (step_size, loss_new)# 輸出:
# original loss: 2.200718
# for step size 1.000000e-10 new loss: 2.200652
# for step size 1.000000e-09 new loss: 2.200057
# for step size 1.000000e-08 new loss: 2.194116
# for step size 1.000000e-07 new loss: 2.135493
# for step size 1.000000e-06 new loss: 1.647802
# for step size 1.000000e-05 new loss: 2.844355
# for step size 1.000000e-04 new loss: 25.558142
# for step size 1.000000e-03 new loss: 254.086573
# for step size 1.000000e-02 new loss: 2539.370888
# for step size 1.000000e-01 new loss: 25392.214036

① 在梯度負方向上更新

  • 在上面的代碼中,為了計算 W_new,要注意我們是向著梯度 dfdfdf 的負方向去更新,這是因為我們希望損失函數值是降低而不是升高。(偏導大于000,損失遞增,WWW需要減小;偏導小于000,損失遞減,W需要增大。)

② 步長的影響

  • 從某個具體的點 WWW 開始計算梯度,梯度指明了函數在哪個方向是變化率最大的,即損失函數下降最陡峭的方向,但是沒有指明在這個方向上應該邁多大的步子。
  • 小步長下降穩定但進度慢,大步長進展快但是風險更大,可能導致錯過最優點,讓損失值上升。
  • 在上面的代碼中就能看見反例,在某些點如果步長過大,反而可能越過最低點導致更高的損失值。選擇步長(也叫作學習率)將會是神經網絡訓練中最重要(也是最麻煩)的超參數設定之一。

③ 效率問題

  • 計算數值梯度的復雜性和參數的量線性相關。在本例中有 30730 個參數,所以損失函數每走一步就需要計算 30731 次損失函數(計算梯度時計算 30730 次,最終計算一次更新后的。)
  • 現代神經網絡很容易就有上千萬的參數,因此這個問題只會越發嚴峻。顯然這個策略不適合大規模數據。

3.2 解析梯度法

數值梯度的計算比較簡單,但缺點在于只是近似不夠精確,且耗費計算資源太多。

得益于牛頓-萊布尼茨的微積分,我們可以利用微分來分析,得到計算梯度的公式(不是近似),用公式計算梯度速度很快,但在實現的時候容易出錯。

為了解決這個問題,在實際操作時常常將分析梯度法的結果和數值梯度法的結果作比較,以此來檢查其實現的正確性,這個步驟叫做梯度檢查

比如我們已知多類 SVM 的數據損失 LiL_iLi?:

Li=∑j≠yi[max?(0,wjTxi?wyiTxi+Δ)]L_i = \sum_{j\neq y_i} \left[ \max(0, w_j^Tx_i - w_{y_i}^Tx_i + \Delta) \right] Li?=j=yi?∑?[max(0,wjT?xi??wyi?T?xi?+Δ)]

可以對函數進行微分。比如對 wyiw_{y_i}wyi?? 微分:

?wyiLi=?(∑j≠yi1(wjTxi?wyiTxi+Δ>0))xi\nabla_{w_{y_i}} L_i = - \left( \sum_{j\neq y_i} \mathbb{1}(w_j^Tx_i - w_{y_i}^Tx_i + \Delta > 0) \right) x_i ?wyi???Li?=????j=yi?∑?1(wjT?xi??wyi?T?xi?+Δ>0)???xi?

  • 其中 111 是一個示性函數,如果括號中的條件為真,那么函數值為111,如果為假,則函數值為000。

雖然上述公式看起來復雜,但在代碼實現的時候比較簡單:只需要計算沒有滿足邊界值的即對損失函數產生貢獻的分類的數量,然后乘以 xix_ixi? 就是梯度了。

  • 注意,這個梯度只是對應正確分類的 WWW 的行向量的梯度,那些 j≠yij \neq y_ij=yi? 行的梯度是:

?wjLi=1(wjTxi?wyiTxi+Δ>0)xi\nabla_{w_j} L_i = \mathbb{1}(w_j^Tx_i - w_{y_i}^Tx_i + \Delta > 0) x_i ?wj??Li?=1(wjT?xi??wyi?T?xi?+Δ>0)xi?

一旦將梯度的公式微分出來,代碼實現公式并用于梯度更新就比較順暢了。

4.梯度下降(Gradient Descent)

關于Batch Gradient Descent、Mini-batch gradient descent、Stochastic Gradient Descent的詳細知識也可以參考ShowMeAI的的深度學習教程 | 吳恩達專項課程 · 全套筆記解讀中的文章神經網絡優化算法

現在可以利用微分公式計算損失函數梯度了,程序重復地計算梯度然后對參數進行更新,這一過程稱為梯度下降。

4.1 普通梯度下降

# 普通的梯度下降
while True:weights_grad = evaluate_gradient(loss_fun, data, weights)weights += - step_size * weights_grad # 進行梯度更新

這個簡單的循環在所有的神經網絡核心庫中都有。雖然也有其他實現最優化的方法(比如LBFGS),但是到目前為止,梯度下降是對神經網絡的損失函數最優化中最常用的方法。

后面大家見到的新的優化算法也是在其基礎上增加一些新的東西(比如更新的具體公式),但是核心思想不變,那就是我們一直跟著梯度走,直到結果不再變化。

4.2 小批量梯度下降(Mini-batch gradient descent)

在大規模的應用中(比如 ILSVRC 挑戰賽),訓練數據量 NNN 可以達到百萬級量級。如果像這樣計算整個訓練集,來獲得僅僅一個參數的更新就太浪費計算資源了。一個常用的方法通過訓練集中的小批量(batches)數據來計算。

例如,在目前最高水平的卷積神經網絡中,一個典型的小批量包含 256 個樣本,而整個訓練集是一百二十萬個樣本。(CIFAR-10,就有 50000 個訓練樣本。)比如這個小批量數據就用來實現一個參數更新:

# 普通的小批量數據梯度下降
while True:data_batch = sample_training_data(data, 256) # 從大規模訓練樣本中提取256個樣本weights_grad = evaluate_gradient(loss_fun, data_batch, weights)weights += - step_size * weights_grad # 參數更新

這個方法之所以效果不錯,是因為訓練集中的數據都是相關的。

要理解這一點,可以想象一個極端情況:在ILSVRC中的 120萬個圖像是1000張不同圖片的復制(每個類別1張圖片,每張圖片復制 1200 次)。那么顯然計算這1200張復制圖像的梯度就應該是一樣的。對比120萬張圖片的數據損失的均值與只計算1000張的子集的數據損失均值時,結果應該是一樣的。

實際情況中,數據集肯定不會包含重復圖像,那么小批量數據的梯度就是對整個數據集梯度的一個近似。因此,在實踐中通過計算小批量數據的梯度可以實現更快速地收斂,并以此來進行更頻繁的參數更新

小批量數據策略有個極端情況:每批數據的樣本量為1,這種策略被稱為隨機梯度下降Stochastic Gradient Descent 簡稱SGD),有時候也被稱為在線梯度下降。SGD在技術上是指每次使用1個樣本來計算梯度,你還是會聽到人們使用SGD來指代小批量數據梯度下降(或者用MGD來指代小批量數據梯度下降)。

小批量數據的大小是一個超參數,但是一般并不需要通過交叉驗證來調參。它一般設置為同樣大小,比如32、64、128等。之所以使用2的指數,是因為在實際中許多向量化操作實現的時候,如果輸入數據量是2的指數,那么運算更快。

5.圖像特征提取

直接輸入原始像素,效果不好,可以將圖像的特征計算出來,便于分類。

常用的特征計算方式:顏色直方圖、詞袋、計算邊緣等,神經網絡中是特征是訓練過程中得到的。

6.在線程序

線性分類器各種細節,可在斯坦福大學開發的一個在線程序觀看演示:點擊這里

7.拓展學習

可以點擊 B站 查看視頻的【雙語字幕】版本

【字幕+資料下載】斯坦福CS231n | 面向視覺識別的卷積神經網絡 (2017·全16講)

  • 【課程學習指南】斯坦福CS231n | 深度學習與計算機視覺
  • 【字幕+資料下載】斯坦福CS231n | 深度學習與計算機視覺 (2017·全16講)
  • 【CS231n進階課】密歇根EECS498 | 深度學習與計算機視覺
  • 【深度學習教程】吳恩達專項課程 · 全套筆記解讀
  • 【Stanford官網】CS231n: Deep Learning for Computer Vision

8.要點總結

  • 損失函數,包括數據損失與正則損失
  • 多類 SVM 損失與Softmax損失比較
  • 梯度計算方法(數值梯度與解析梯度)
  • 梯度下降優化算法

ShowMeAI 斯坦福 CS231n 全套解讀

  • 深度學習與計算機視覺教程(1) | CV引言與基礎 @CS231n
  • 深度學習與計算機視覺教程(2) | 圖像分類與機器學習基礎 @CS231n
  • 深度學習與計算機視覺教程(3) | 損失函數與最優化 @CS231n
  • 深度學習與計算機視覺教程(4) | 神經網絡與反向傳播 @CS231n
  • 深度學習與計算機視覺教程(5) | 卷積神經網絡 @CS231n
  • 深度學習與計算機視覺教程(6) | 神經網絡訓練技巧 (上) @CS231n
  • 深度學習與計算機視覺教程(7) | 神經網絡訓練技巧 (下) @CS231n
  • 深度學習與計算機視覺教程(8) | 常見深度學習框架介紹 @CS231n
  • 深度學習與計算機視覺教程(9) | 典型CNN架構 (Alexnet, VGG, Googlenet, Restnet等) @CS231n
  • 深度學習與計算機視覺教程(10) | 輕量化CNN架構 (SqueezeNet, ShuffleNet, MobileNet等) @CS231n
  • 深度學習與計算機視覺教程(11) | 循環神經網絡及視覺應用 @CS231n
  • 深度學習與計算機視覺教程(12) | 目標檢測 (兩階段, R-CNN系列) @CS231n
  • 深度學習與計算機視覺教程(13) | 目標檢測 (SSD, YOLO系列) @CS231n
  • 深度學習與計算機視覺教程(14) | 圖像分割 (FCN, SegNet, U-Net, PSPNet, DeepLab, RefineNet) @CS231n
  • 深度學習與計算機視覺教程(15) | 視覺模型可視化與可解釋性 @CS231n
  • 深度學習與計算機視覺教程(16) | 生成模型 (PixelRNN, PixelCNN, VAE, GAN) @CS231n
  • 深度學習與計算機視覺教程(17) | 深度強化學習 (馬爾可夫決策過程, Q-Learning, DQN) @CS231n
  • 深度學習與計算機視覺教程(18) | 深度強化學習 (梯度策略, Actor-Critic, DDPG, A3C) @CS231n

ShowMeAI 系列教程推薦

  • 大廠技術實現:推薦與廣告計算解決方案
  • 大廠技術實現:計算機視覺解決方案
  • 大廠技術實現:自然語言處理行業解決方案
  • 圖解Python編程:從入門到精通系列教程
  • 圖解數據分析:從入門到精通系列教程
  • 圖解AI數學基礎:從入門到精通系列教程
  • 圖解大數據技術:從入門到精通系列教程
  • 圖解機器學習算法:從入門到精通系列教程
  • 機器學習實戰:手把手教你玩轉機器學習系列
  • 深度學習教程:吳恩達專項課程 · 全套筆記解讀
  • 自然語言處理教程:斯坦福CS224n課程 · 課程帶學與全套筆記解讀
  • 深度學習與計算機視覺教程:斯坦福CS231n · 全套筆記解讀

總結

以上是生活随笔為你收集整理的深度学习与计算机视觉教程(3) | 损失函数与最优化(CV通关指南·完结)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。