斯坦福CS231N深度學習與計算機視覺第四彈:最優化與隨機梯度下降

2021-02-08 大數據文摘

本文為史丹福大學CS231N課程的中文版內容筆記,已獲得史丹福大學課程Andrej Karpathy教授的授權翻譯與發表。大數據文摘作品,未經授權禁止轉載,轉載具體要求見文末。

機器學習培訓報名開始啦!
頂級講師課程設計
理論結合實際
更有五大福利提供
點擊文末「閱讀原文」查看詳細內容

翻譯:寒小陽&龍心塵


編者按:本期文章是我們為讀者帶來斯坦福課程文章第二個系列的【斯坦福深度學習與計算機視覺課程】專題第三期和第四期。文章內容為斯坦福CS231N系列,供有興趣的讀者感受、學習。

本課程的視頻翻譯也在同時進行,將在近期發布,敬請期待!

大數據文摘將陸續發布譯文和視頻,免費分享給各位讀者。


我們歡迎更多感興趣的志願者加入我們,一起交流學習。所有譯者均為志願者,如果你和我們一樣,是有能力、願分享的朋友,請加入我們。在大數據文摘後臺回復「志願者」,了解更多。


史丹福大學CS231N課程是深度學習與計算機視覺方面的經典教程,業界評價很高。之前也有國內朋友做一些零星的翻譯,為了與更多讀者分享高品質內容,大數據文摘對其進行了系統全面的翻譯,後續內容將陸續推出。


由於微信後臺的代碼編輯無法實現,我們採用了圖片插入的方式展示代碼,點擊圖片可查看更清晰的圖片。


同時,大數據文摘之前已獲得授權的斯坦福課程第一個系列史丹福大學CS224d課程【機器學習與自然語言處理】已經完成了八 個課時,我們將在每個周三繼續推送後續筆記及課程視頻,敬請關注。

回復「斯坦福」下載CS231N第三期和第四期筆記PDF版本

同時獲得斯坦福另一個系列課程CS224d深度學習與自然語言處理的相關資料



此外,對於有興趣進一步學習交流的讀者,我們將通過QQ群(鑑於微信人數限制問題)組織進行學習交流。


長按以下二維碼將直接跳轉至QQ加群

或者通過群號碼564538990進群


◆ ◆ ◆1.引言


上一節深度學習與計算機視覺系列(3)_線性SVM與SoftMax分類器 (由於微信編輯長度問題,第三期內容在此只提供概要,請回復斯坦福下載第三期筆記內容) 中提到兩個對圖像識別至關重要的概念:


1、用於把原始像素信息映射到不同類別得分的得分函數/score function

2、用於評估參數W效果(評估該參數下每類得分和實際得分的吻合度)的損失函數/loss function


其中對於線性SVM,我們有:


在取到合適的參數W的情況下,我們根據原始像素計算得到的預測結果和實際結果吻合度非常高,這時候損失函數得到的值就很小。

這節我們就講講,怎麼得到這個合適的參數W,使得損失函數取值最小化。也就是最優化的過程。


◆ ◆ ◆2. 損失函數可視化


我們在計算機視覺中看到的損失函數,通常都是定義在非常高維的空間裡的(比如CIFAR-10的例子裡一個線性分類器的權重矩陣W是10 x 3073維的,總共有30730個參數 -_-||),人要直接『看到』它的形狀/變化是非常困難的。但是機智的同學們,總是能想出一些辦法,把損失函數在某種程度上可視化的。比如說,我們可以把高維投射到一個向量/方向(1維)或者一個面(2維)上,從而能直觀地『觀察』到一些變化。


舉個例子說,我們可以對一個權重矩陣W(例如CIFAR-10中是30730個參數),可以找到W維度空間中的一條直線,然後沿著這條線,計算一下損失函數值的變化情況。具體一點說,就是我們找到一個向量W1(維度要和W一樣,這樣W1才能表示W的維度空間的一個方向),然後我們給不同的a值,計算L(W+aW1),這樣,如果a取得足夠密,其實我們就能夠在一定程度上描繪出損失函數沿著這個方向的變化了。


同樣,如果我們給兩個方向W1和W3,那麼我們可以確定一個平面,我們再取不同值的a和b,計算L(W+aW1+bW2)的值,那麼我們就可以大致繪出在這個平面上,損失函數的變化情況了。


根據上面的方法,我們畫出了下面3個圖。最上面的圖是調整a的不同取值,繪出的損失函數變化曲線(越高值越大);中間和最後一個圖是調整a與b的取值,繪出的損失函數變化圖(藍色表示損失小,紅色表示損失大),中間是在一個圖片樣本上計算的損失結果,最下圖為100張圖片上計算的損失結果的一個平均。顯然沿著直線方向得到的曲線底端為最小的損失值點,而曲面呈現的碗狀圖形碗底為損失函數取值最小處。 


 



我們從數學的角度,來嘗試解釋一下,上面的凹曲線是怎麼出來的。對於第i個樣本,我們知道它的損失函數值為: 



所有的樣本上的損失函數值,是它們損失函數值(max(0,-),因此最小值為0)的平均值。為了更好理解,我們假定訓練集裡面有3個樣本,都是1維的,同時總共有3個類別。所以SVM損失(暫時不考慮正則化項)可以表示為如下的式子:




◆ ◆ ◆3. 最優化


在我們現在這個問題中,所謂的『最優化』其實指的就是找到能讓損失函數最小的參數。如果大家看過或者了解凸優化的話,我們下面介紹的方法,對你而言可能太簡單了,有點原始,但是大家別忘了,我們後期要處理的是神經網絡的損失函數,那可不是一個凸函數哦,所以我們還是一步步來一起看看,如果去實現最優化問題。


3.1 策略1:隨機搜尋(不太實用)


以一個笨方法開始,我們知道,當我們手頭上有參數後,我們是可以計算損失函數,評估參數合適程度的。所以最直接粗暴的方法就是,我們儘量多地去試參數,然後從裡面選那個讓損失函數最小的,作為最後的。代碼當然很簡單,如下:

# 假設 X_train 是訓練集 (例如. 3073 x 50,000)

# 假設 Y_train 是類別結果 (例如. 1D array of 50,000)

bestloss = float("inf") # 初始化一個最大的float值

for num in xrange(1000):

 W = np.random.randn(10, 3073) * 0.0001 # 隨機生成一組參數

 loss = L(X_train, Y_train, W) # 計算損失函數

 if loss < bestloss: # 比對已搜尋中最好的結果

   bestloss = loss

   bestW = W

 print 'in attempt %d the loss was %f, best %f' % (num, loss, bestloss)

# prints:

# 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)

一通隨機試驗和搜尋之後,我們會拿到試驗結果中最好的參數W, 然後在測試集上看看效果:


# 假定 X_test 為 [3073 x 10000], Y_test 為 [10000 x 1]

scores = Wbest.dot(Xte_cols) # 10 x 10000, 計算類別得分

# 找到最高得分作為結果

Yte_predict = np.argmax(scores, axis = 0)

# 計算準確度

np.mean(Yte_predict == Yte)

# 返回 0.1555

隨機搜尋得到的參數W,在測試集上的準確率為15.5%,總共10各類別,我們不做任何預測只是隨機猜的結果應該是10%,好像稍高一點,但是...大家也看到了...這個準確率...實在是沒辦法在實際應用中使用。


3.2 策略2:隨機局部搜索

上一個策略完全就是盲搜,要想找到全局最優的那個結果基本是不可能的。它最大的缺點,就在於下一次搜索完全是隨機進行的,沒有一個指引方向。那我們多想想,就能想出一個在上個策略的基礎上,優化的版本,叫做『隨機局部搜索』。


這個策略的意思是,我們不每次都隨機產生一個參數矩陣W了,而是在現有的參數W基礎上,搜尋一下周邊臨近的參數,有沒有比現在參數更好的W, 然後我們用新的W替換現在的W, 接著在周圍繼續小範圍搜尋。這個過程呢,可以想像成,我們在一座山上,現在要下山,然後我們每次都伸腳探一探周邊,找一個比現在的位置下降一些的位置,然後邁一步,接著在新的位置上做同樣的操作,一步步直至下山。


從代碼實現的角度看,以上的過程,實際上就是對於一個當前W,我們每次實驗和添加W,然後看看損失函數是否比當前要低,如果是,就替換掉當前的W,代碼如下:

W = np.random.randn(10, 3073) * 0.001 # 初始化權重矩陣W

bestloss = float("inf")

for i in xrange(1000):

 step_size = 0.0001

 Wtry = W + np.random.randn(10, 3073) * step_size

 loss = L(Xtr_cols, Ytr, Wtry)

 if loss < bestloss:

   W = Wtry

   bestloss = loss

 print 'iter %d loss is %f' % (i, bestloss)

我們做了這麼個小小的修正之後,我們再拿剛才一樣的測試集來測一下效果,結果發現準確率提升至21.4%,雖然離實際應用差很遠,但只是比剛才要進步一點點了。


但是還是有個問題,我們每次測試周邊點的損失函數,是一件非常耗時的事情。我們有沒有辦法能夠直接找到我們應該迭代的方向呢?


3.3 策略3:順著梯度下滑


剛才的策略,我們說了,最大的缺點是非常耗時,且計算量也很大。我們一直在做的事情,就是在當前的位置基礎上,想找到一個最合適的下降方向。我們依舊回到我們假設的那個情境,如果我們在山頂,要以最快的方式下山,我們會怎麼做?我們可能會環顧四周,然後找到最陡的方向,邁一小步,然後再找當前位置最陡的下山方向,再邁一小步...


而這裡提到的最陡的方向,其實對應的就是數學裡『梯度』的概念,也就是說,其實我們無需『伸腳試探』周邊的陡峭程度,而是可以通過計算損失函數的梯度,直接取得這個方向。


我們知道在1個變量的函數裡,某點的斜率/導數代表其變化率最大的方向。而對於多元的情況,梯度是上面情況的一個擴展,只不過這時候的變量不再是一個,而是多個,同時我們計算得到的『梯度方向』也是一個多維的向量。大家都知道數學上計算1維/元函數『梯度/導數』的表達式如下: 


對於多元的情況,這個時候我們需要求的東西擴展成每個方向的『偏導數』,然後把它們合在一塊組成我們的梯度向量。

我們用幾張圖來說明這個過程: 



 



◆ ◆ ◆4. 計算梯度


有兩種計算梯度的方法:

慢一些但是簡單一些的數值梯度/numerical gradient

速度快但是更容易出錯的解析梯度/analytic gradient


4.1 數值梯度


根據上面提到的導數求解公式,我們可以得到數值梯度計算法。下面是一段簡單的代碼,對於一個給定的函數f和一個向量x,求解這個點上的梯度:

def eval_numerical_gradient(f, x):

 """

 一個最基本的計算x點上f的梯度的算法

 - f 為參數為x的函數

 - x 是一個numpy的vector

 """

 fx = f(x) # 計算原始點上函數值

 grad = np.zeros(x.shape)

 h = 0.00001

 # 對x的每個維度都計算一遍

 it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])

 while not it.finished:

   # 計算x+h處的函數值

   ix = it.multi_index

   old_value = x[ix]

   x[ix] = old_value + h # 加h

   fxh = f(x) # 計算f(x + h)

   x[ix] = old_value # 存儲之前的函數值

   # 計算偏導數

   grad[ix] = (fxh - fx) / h # 斜率

   it.iternext() # 開始下一個維度上的偏導計算

 return grad

代碼的方法很簡單,對每個維度,都在原始值上加上一個很小的h,然後計算這個維度/方向上的偏導,最後組在一起得到梯度grad。


4.1.1 實際計算中的提示


我們仔細看看導數求解的公式,會發現數學定義上h是要趨於0的,但實際我們計算的時候我們只要取一個足夠小的數(比如1e-5)作為h就行了,所以我們要精準計算偏導的話,要儘量取到不會帶來數值計算問題,同時又能很小的h。另外,其實實際計算中,我們用另外一個公式用得更多


下面我們用上面的公式在CIFAR-10數據集上,試一試吧:

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_log

 W_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

4.1.2 關於迭代的細節


如果大家仔細看上述代碼的話,會發現我們step_size設的都是負的,確實我們每次update權重W的時候,是用原來的W減掉梯度方向的一個較小的值,這樣損失函數才能減小。


4.1.3 關於迭代的步長

我們計算得到梯度之後,就確定了幅度變化最快(負梯度是下降方向)的方向,但是它並沒有告訴我們,我朝著這個方向,應該邁進多遠啊。之後的章節會提到,選擇正確的迭代步長(有時候我們也把它叫做學習速率)是訓練過程中最重要(也是最讓人頭疼)的一個待設定參數。就像我想以最快的速度下山,我們能感知到最陡的方向,卻不知道應該邁多大的步子。如果我們小步邁進,那確實每一步都能比上一步下降一些,但是速度太慢了親!!但是如果我們以非常非常大的步伐邁進(假如腿巨長 -_-||),那你猜怎麼著,你一不小心可能就邁過山腳邁到另一座山山腰上了...


下圖是對以上情況的一個描述和解釋: 


 


4.1.4 效率問題

如果你再回過頭去看看上面計算數值梯度的程序,你會發現,這個計算方法的複雜度,基本是和我們的參數個數成線性關係的。這意味著什麼呢?在我們的CIFAR-10例子中,我們總共有30730個參數,因此我們單次迭代總共就需要計算30731次損失函數。這個問題在之後會提到的神經網絡中更為嚴重,很可能兩層神經元之間就有百萬級別的參數權重,所以,計算機算起來都很耗時...人也要等結果等到哭瞎...


4.2 解析法計算梯度


數值梯度發非常容易實現,但是從公式裡面我們就看得出來,梯度實際上是一個近似(畢竟你沒辦法把h取到非常小),同時這也是一個計算非常耗時的算法。第二種計算梯度的方法是解析法,它可以讓我們直接得到梯度的一個公式(代入就可以計算,非常快),但是呢,不像數值梯度法,這種方法更容易出現錯誤。so,聰明的同學們,就想了一個辦法,我們可以先計算解析梯度和數值梯度,然後比對結果和校正,在確定我們解析梯度實現正確之後,我們就可以大膽地進行解析法計算了(這個過程叫做梯度檢查/檢測)



我們拿一個樣本點的SVM損失函數舉例: 




一旦得到梯度的表達式,那計算梯度和調整權重就變得非常直接和簡單。熟練掌握如何在loss expression下計算梯度是非常重要的一個技巧,貫穿整個神經網絡的訓練實現過程,關於這個內容,下次會詳細講到。


◆ ◆ ◆5. 梯度下降


在我們有辦法計算得到梯度之後,使用梯度去更新已有權重參數的過程叫做『梯度下降』,偽代碼其實就是如下的樣子:


while True:

 weights_grad = evaluate_gradient(loss_fun, data, weights)

 weights += - step_size * weights_grad # 梯度下降更新參數

這個簡單的循環實質上就是很多神經網絡庫的核心。當然,我們也有其他的方式去實現最優化(比如說L-BFGS),但是梯度下降確實是當前使用最廣泛,也相對最穩定的神經網絡損失函數最優化方法。


5.1 Mini-batch gradient descent


在大型的應用當中(比如ILSVRC),訓練數據可能是百萬千萬級別的。因此,對整個訓練數據集的樣本都算一遍損失函數,以完成參數迭代是一件非常耗時的事情,一個我們通常會用到的替代方法是,採樣出一個子集在其上計算梯度。現在比較前沿的神經網絡結構基本都是這麼做的,例如ConvNets是每256張作為一個batch去完成參數的更新。參數更新的代碼如下:

while True:

 data_batch = sample_training_data(data, 256) # 抽樣256個樣本作為一個batch

 weights_grad = evaluate_gradient(loss_fun, data_batch, weights)

 weights += - step_size * weights_grad # 參數更新

之所以可以這麼做,是因為訓練數據之間其實是關聯的。我們簡化一下這個問題,你想想,如果ILSVRC中的120w圖片,如果只是1000張不同的圖片,一直複製1200次得到的。那麼其實我們在這1000張圖片上算得的損失函數和120w的平均其實是一致的。當然,當然,在實際場景中,我們肯定很少遇到這種多次重複的情況,但是原數據的一個子集(mini-batch)上的梯度,其實也是對整體數據上梯度的一個很好的近似。因此,只在mini-batch上計算和更新參數,會有快得多的收斂速度。


上述算法的一個極端的情況是,如果我們的一個mini-batch裡面只有一張圖片。那這個過程就變成『隨機梯度下降/Stochastic Gradient Descent (SGD)』,說起來,這個其實在實際應用中倒也沒那麼常見,原因是向量化之後,一次計算100張圖片,其實比計算一張圖片100次,要快得多。所以即使從定義上來說,SGD表示我們用一張圖片上的梯度近似全局梯度,但是很多時候人們提到SGD的時候,其實他們指的是mini-batch梯度下降,也就是說,我們把一個batch當做1份了。額,還要稍微提一句的是,有些同學可能會問,這個batch size本身不是一個需要實驗的參數嗎,取多大的batch size好啊?但實際應用中,我們倒很少會用cross-validation去選擇這個參數。這麼說吧,我們一般是基於我們內存限制去取這個值的,比如設成100左右。


◆ ◆ ◆6. 總結


把損失函數在各參數上的取值,想像成我們所在山峰的高度。那麼我們要最小化損失函數,實際上就是『要想辦法下山』。

我們採取的下山策略是,一次邁一小步,只要每次都往下走了,那麼最後就會到山底。

梯度對應函數變化最快的方向,負梯度的方向就是我們下山,環顧四周之後,發現最陡的下山路方向。

我們的步長(也叫學習率),會影響我們的收斂速度(下山速度),如果步伐特別特別大,甚至可能躍過最低點,跑到另外一個高值位置了。

我們用mini-batch的方式,用一小部分的樣本子集,計算和更新參數,減少計算量,加快收斂速度。


如需轉載,請在開篇顯著位置註明作者和出處(轉自:大數據文摘|bigdatadigest),並在文章結尾放置大數據文摘醒目二維碼。無原創標識文章請按照轉載要求編輯,可直接轉載,轉載後請將轉載連結發送給我們;有原創標識文章,請發送【文章名稱-待授權公眾號名稱及ID】給我們申請白名單授權。未經許可的轉載以及改編者,我們將依法追究其法律責任。聯繫郵箱:zz@bigdatadigest.cn。



◆ ◆ ◆

大數據文章斯坦福深度學習課程

大數據文摘後臺回復「志願者」,了解如何加入我們


專欄主編


項目管理


內容運營:魏子敏

統籌:汪德誠


往期精彩文章推薦,點擊圖片可閱讀


【又一重磅】再獲翻譯授權,斯坦福CS231N深度學習與計算機視



斯坦福深度學習課程第七彈:RNN,GRU與LSTM



斯坦福CS231N深度學習與計算機視覺第二彈:圖像分類與KNN



相關焦點

  • 斯坦福CS231N深度學習與計算機視覺第八彈:神經網絡訓練與注意點
    本文為史丹福大學CS231N課程的中文版內容筆記,已獲得史丹福大學課程Andrej Karpathy教授的授權翻譯與發表。本課程的視頻翻譯也在同時進行,將在近期發布,敬請期待!大數據文摘將陸續發布譯文和視頻,免費分享給各位讀者。我們歡迎更多感興趣的志願者加入我們,一起交流學習。所有譯者均為志願者,如果你和我們一樣,是有能力、願分享的朋友,請加入我們。
  • 重磅 | 帶學斯坦福CS231n計算機視覺課+帶打全球頂級kaggle大賽
    基於這樣的招聘環境下,我們決定真正從大廠招人的要求入手,在學習路徑上向下深挖,不浮於表面,學的越深站的越穩。為此我們用了2周時間,篩選和研究了市面上所有最具價值的學習資料,並讓往期學員深入參與調研,最後選擇了以斯坦福李飛飛的計算機視覺課作為帶學教材,以kaggle比賽作為實踐,開設我們第一期《深度學習》訓練營。
  • 李飛飛計算機視覺成名作:斯坦福CS231n作業詳解第二彈!
    大數據文摘作品學習斯坦福CS231n公開課的同學看過來,Assignment 2 的Q1-Q5詳解來啦!本期作業詳解幫你搞定基於神經網絡的圖片識別、卷積神經網絡和深度學習框架Tensorflow,快來和文摘菌一起寫作業吧!
  • 李飛飛計算機視覺成名作:斯坦福CS231n作業詳解第三彈!
    大數據文摘作品  學習斯坦福CS231n公開課的同學看過來,Assignment 1 - 3 的詳解全部出爐啦!  昨天,大數據文摘發起了吳恩達李飛飛課程打卡召集令,然後大家參加#春節打卡#活動的熱情異常的高!
  • 【資源】斯坦福CS231n 2017春季課程全公開,視頻+PPT+英文字幕
    建立架構生物神經元模型,激活函數,神經網絡架構神經網絡第2部分:設置數據和損失預處理,權重初始化,批量歸一化,正則化(L2 /dropout),損失函數神經網絡第3部分:學習和評估梯度檢查,完整性檢查,動量(+ nesterov),二階方法,Adagrad / RMSprop,超參數優化,模型集合把它放在一起:一個神經網絡案例研究
  • 斯坦福CS231N深度學習與計算機視覺第六彈:神經網絡結構與神經元激勵函數
    頂級講師課程設計理論結合實際更有五大福利提供點擊文末「閱讀原文」查看詳細內容翻譯:寒小陽&龍心塵編者按:本期文章是我們為讀者帶來斯坦福課程文章第二個系列的【斯坦福深度學習與計算機視覺課程】專題六期。文章內容為斯坦福CS231N系列,供有興趣的讀者感受、學習。
  • 【又一重磅】再獲翻譯授權,斯坦福CS231N深度學習與計算機視覺
    大數據文摘將陸續發布譯文,免費分享給各位讀者。所有譯者均為志願者,如果你和我們一樣,是有能力、願分享的朋友,請加入我們。在大數據文摘後臺回復「志願者」,了解更多。史丹福大學CS231N課程是深度學習與計算機視覺方面的經典教程,業界評價很高。
  • 教程| 斯坦福CS231n 2017最新課程:李飛飛詳解深度學習的框架實現...
    作者:李飛飛等機器之心編譯參與:Smith、蔣思源史丹福大學的課程 CS231n (Convolutional Neural Networks for Visual Recognition) 作為深度學習和計算機視覺方面的重要基礎課程,在學界廣受推崇。
  • 斯坦福Serena Yeung帶你認識神經網絡 · 2017CS231n 第4彈
    雷鋒網(公眾號:雷鋒網)CS231n 2017雙語字幕版獨家上線CS231n的全稱是 CS231n: Convolutional Neural Networks for Visual Recognition,即面向視覺識別的卷積神經網絡。該課程是史丹福大學計算機視覺實驗室推出的課程。需要注意的是,雷鋒字幕組這次翻譯的是 2017 春季(4 月至 6 月)的最新版本。
  • 斯坦福CS231n開放全部視頻,文摘帶你一起組團學習打怪,約嗎?
    觀看地址:http://www.bilibili.com/video/av13260183/這門課由史丹福大學人工智慧實驗室與視覺實驗室主任李飛飛主講,主要介紹深度學習(尤其是卷積神經網絡和與其相關的框架)在計算機視覺領域的應用。
  • 獨家| CMU 2018 秋季《深度學習導論》中文字幕版今日上線!
    每周學習時間 (Units): 本課程值得每周花 36 小時學習第一講:深度學習簡介 課程安排神經計算的歷史和認知基礎多層感知機第二講神經網絡作為通用逼近器第三講訓練神經網絡感知器學習規則經驗風險最小化梯度下降優化
  • 只看視頻不動手的你可能學了門假課程,李飛飛計算機視覺成名作斯坦福CS231n作業詳解重磅來襲!
    看完斯坦福CS231n的公開課,是不是覺得還不夠過癮?快來和文摘菌一起寫作業敲代碼吧!提到深度學習與計算機視覺,不得不提ImageNet和它的創建者,史丹福大學計算機科學系副教授、Google Cloud 人工智慧和機器學習團隊的首席科學家李飛飛。而她的成名作,史丹福大學課程《深度學習與計算機視覺》自從公開視頻和作業,也造福了一批對計算機視覺感興趣的IT從業者。
  • 斯坦福CS231n Spring 2017開放全部課程視頻(附大綱)
    CS231n近幾年一直是計算機視覺領域和深度學習領域最為經典的課程之一。
  • 斯坦福CS231n Spring 2017開放全部課程視頻
    斯坦福開放了2017視覺領域深度學習的春季課程,趕緊學起吧。CS231n近幾年一直是計算機視覺領域和深度學習領域最為經典的課程之一。而最近剛剛結課的CS231n Spring 2017 仍由李飛飛主講,並邀請了Goodfellow等人對其中部分章節詳細介紹。
  • 斯坦福CS231N課程學習筆記(一).課程簡介與準備
    前言        開這個系列是因為工作中需要用到計算機視覺相關知識。幾經淘洗,發現了史丹福大學的CS231N課程。
  • 乾貨|| 斯坦福李飛飛2017 CS231n最新課程(全部內容)
    李飛飛主講的CS231n課程作為深度學習和計算機視覺方面的重要基礎課,一直備受推崇,今年4月,她的課程再次開課,並進行了調整和更新,智能觀整理了最新的課程全部內容,分享給大家。第一講這一講做了整體課程介紹,包括計算機視覺概述、歷史背景以及課程組織等。
  • 斯坦福CS224n《基於深度學習的NLP》課程更新,C.Manning主講
    cs224n課程《基於深度學習的自然語言處理》詳細安排,主講人為史丹福大學人工智慧實驗室主任,著名計算機科學家Christopher Manning教授,1月份課程閱讀材料已公布。近日,史丹福大學官網公布了2019年度冬季cs224n課程:基於深度學習的自然語言處理的課程安排。本課程主講人為史丹福大學人工智慧實驗室主任,著名計算機科學家Christopher Manning教授。
  • IT新技術篇:深度學習的57個名詞
    論文:Adadelta:一種自適應學習率方法ADADELTA: An Adaptive Learning Rate Method技術博客:斯坦福CS231n:優化算法http://cs231n.github.io/neural-networks-3/技術博客:梯度下降優化算法概述http://sebastianruder.com
  • 李飛飛斯坦福CS231n,原來學霸們都是這麼學的
    雷鋒網(公眾號:雷鋒網)按:偷偷刷了好多遍李飛飛主講的斯坦福 CS3 月 28 日起,雷鋒字幕組聯合 AI 慕課學院推出 3 期以「斯坦福深度視覺識別課CS231n」為主題的 Live 實戰分享課。(原創代碼+論文解讀+場景應用+實用套路)雷鋒網本次活動邀請到來自 CHISON 醫學影像、BIGO LIVE、某金融科技的 3 位資深算法工程師,分享他們的視覺識別實戰經驗。
  • 【深度學習自學指南】微軟&頭條實習生現身說法:我是這樣進大廠的
    開啟新篇章現在,你終於成為了一個掌握深度學習技能的人,可以考慮在計算機視覺、自然語言處理、機器學習、自動駕駛……等許多領域深入發展了。計算機視覺斯坦福CS231n(2017)https://www.youtube.com/watch?