機器學習面試系列四

61.說說梯度下降法

  @LeftNotEasy,本題解析來源:http://www.cnblogs.com/LeftNotEasy/archive/2010/12/05/mathmatic_in_machine_learning_1_regression_and_gradient_descent.html

  下面是一個典型的機器學習的過程,首先給出一個輸入數據,我們的算法會通過一系列的過程得到一個估計的函數,這個函數有能力對沒有見過的新數據給出一個新的估計,也被稱爲構建一個模型。

 

   

  我們用X1,X2..Xn 去描述feature裏面的分量,比如x1=房間的面積,x2=房間的朝向等等,我們可以做出一個估計函數:

  θ在這兒稱爲參數,在這兒的意思是調整feature中每個分量的影響力,就是到底是房屋的面積更重要還是房屋的地段更重要。爲了如果我們令X0 = 1,就可以用向量的方式來表示了:

  我們程序也需要一個機制去評估我們θ是否比較好,所以說需要對我們做出的h函數進行評估,一般這個進行評估的函數稱爲損失函數(loss function),描述h函數不好的程度,在下面,我們稱這個函數爲J函數

  在這兒我們可以做出下面的一個損失函數:

 

  換言之,我們把對x(i)的估計值與真實值y(i)差的平方和作爲損失函數,前面乘上的1/2是爲了在求導的時候,這個係數就不見了。

  如何調整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(min square),是一種完全是數學描述的方法,另外一種就是梯度下降法。

  梯度下降法的算法流程如下:

  1)首先對θ賦值,這個值可以是隨機的,也可以讓θ是一個全零的向量。

  2)改變θ的值,使得J(θ)按梯度下降的方向進行減少。

  爲了描述的更清楚,給出下面的圖:

  這是一個表示參數θ與誤差函數J(θ)的關係圖,紅色的部分是表示J(θ)有着比較高的取值,我們需要的是,能夠讓J(θ)的值儘量的低,也就是達到深藍色的部分。θ0,θ1表示θ向量的兩個維度。

  在上面提到梯度下降法的第一步是給θ給一個初值,假設隨機給的初值是在圖上的十字點。

  然後我們將θ按照梯度下降的方向進行調整,就會使得J(θ)往更低的方向進行變化,如下圖所示,算法的結束將是在θ下降到無法繼續下降爲止。

  當然,可能梯度下降的最終點並非是全局最小點,即也可能是一個局部最小點,如下圖所示:

  上面這張圖就是描述的一個局部最小點,這是我們重新選擇了一個初始點得到的,看來我們這個算法將會在很大的程度上被初始點的選擇影響而陷入局部最小點。

  下面我將用一個例子描述一下梯度減少的過程,對於我們的函數J(θ)求偏導J:

   

  下面是更新的過程,也就是θi會向着梯度最小的方向進行減少。θi表示更新之前的值,-後面的部分表示按梯度方向減少的量,α表示步長,也就是每次按照梯度減少的方向變化多少。

  一個很重要的地方值得注意的是,梯度是有方向的,對於一個向量θ,每一維分量θi都可以求出一個梯度的方向,我們就可以找到一個整體的方向,在變化的時候,我們就朝着下降最多的方向進行變化就可以達到一個最小點,不管它是局部的還是全局的。

  用更簡單的數學語言進行描述步驟2)是這樣的:

   


62.梯度下降法找到的一定是下降最快的方向麼?
  梯度下降法並不是下降最快的方向,它只是目標函數在當前的點的切平面(當然高維問題不能叫平面)上下降最快的方向。在practical implementation中,牛頓方向(考慮海森矩陣)才一般被認爲是下降最快的方向,可以達到superlinear的收斂速度。梯度下降類的算法的收斂速度一般是linear甚至sublinear的(在某些帶複雜約束的問題)。by林小溪(https://www.zhihu.com/question/30672734/answer/139689869)。
  一般解釋梯度下降,會用下山來舉例。假設你現在在山頂處,必須抵達山腳下(也就是山谷最低處)的湖泊。但讓人頭疼的是,你的雙眼被蒙上了無法辨別前進方向。換句話說,你不再能夠一眼看出哪條路徑是最快的下山路徑,如下圖(圖片來源:http://blog.csdn.net/wemedia/details.html?id=45460):

  最好的辦法就是走一步算一步,先用腳向四周各個方向都邁出一步,試探一下週圍的地勢,用腳感覺下哪個方向是下降最大的方向。換言之,每走到一個位置的時候,求解當前位置的梯度,沿着梯度的負方向(當前最陡峭的位置向下)走一步。就這樣,每要走一步都根據上一步所在的位置選擇當前最陡峭最快下山的方向走下一步,一步步走下去,一直走到我們感覺已經到了山腳。
  當然這樣走下去,我們走到的可能並不一定是真正的山腳,而只是走到了某一個局部的山峯低處。換句話說,梯度下降不一定能夠找到全局的最優解,也有可能只是一個局部最優解。當然,如果損失函數是凸函數,梯度下降法得到的解就一定是全局最優解。

  @zbxzc(http://blog.csdn.net/u014568921/article/details/44856915):更進一步,我們來定義輸出誤差,即對於任意一組權值向量,那它得到的輸出和我們預想的輸出之間的誤差值。定義誤差的方法很多,不同的誤差計算方法可以得到不同的權值更新法則,這裏我們先用這樣的定義:

  上面公式中D代表了所有的輸入實例,或者說是樣本,d代表了一個樣本實例,od表示感知器的輸出,td代表我們預想的輸出。
  這樣,我們的目標就明確了,就是想找到一組權值讓這個誤差的值最小,顯然我們用誤差對權值求導將是一個很好的選擇,導數的意義是提供了一個方向,沿着這個方向改變權值,將會讓總的誤差變大,更形象的叫它爲梯度。

  既然梯度確定了E最陡峭的上升的方向,那麼梯度下降的訓練法則是:

  梯度上升和梯度下降其實是一個思想,上式中權值更新的+號改爲-號也就是梯度上升了。梯度上升用來求函數的最大值,梯度下降求最小值。

這樣每次移動的方向確定了,但每次移動的距離卻不知道。這個可以由步長(也稱學習率)來確定,記爲α。這樣權值調整可表示爲:

  總之,梯度下降法的優化思想是用當前位置負梯度方向作爲搜索方向,因爲該方向爲當前位置的最快下降方向,所以也被稱爲是“最速下降法”。最速下降法越接近目標值,步長越小,前進越慢。梯度下降法的搜索迭代示意圖如下圖所示:

  正因爲梯度度下降法在接近最優解的區域收斂速度明顯變慢,所以利用梯度下降法求解需要很多次的迭代。在機器學習中,基於基本的梯度下降法發展了兩種梯度下降方法,分別爲隨機梯度下降法和批量梯度下降法。by@wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040

隨機梯度下降

  普通的梯度下降算法在更新迴歸係數時要遍歷整個數據集,是一種批處理方法,這樣訓練數據特別忙龐大時,可能出現如下問題:

  1)收斂過程可能非常慢;

  2)如果誤差曲面上有多個局極小值,那麼不能保證這個過程會找到全局最小值。

  爲了解決上面的問題,實際中我們應用的是梯度下降的一種變體被稱爲隨機梯度下降。

  上面公式中的誤差是針對於所有訓練樣本而得到的,而隨機梯度下降的思想是根據每個單獨的訓練樣本來更新權值,這樣我們上面的梯度公式就變成了:


  經過推導後,我們就可以得到最終的權值更新的公式:


  有了上面權重的更新公式後,我們就可以通過輸入大量的實例樣本,來根據我們預期的結果不斷地調整權值,從而最終得到一組權值使得我們的算法能夠對一個新的樣本輸入得到正確的或無限接近的結果。

這裏做一個對比

設代價函數爲


  批量梯度下降



  參數更新爲:

         

  i是樣本編號下標,j是樣本維數下標,m爲樣例數目,n爲特徵數目。所以更新一個θj需要遍歷整個樣本集


隨機梯度下降

  參數更新爲:

        

  i是樣本編號下標,j是樣本維數下標,m爲樣例數目,n爲特徵數目。所以更新一個θj只需要一個樣本就可以。

  下面兩幅圖可以很形象的對比各種優化方法(圖來源:http://sebastianruder.com/optimizing-gradient-descent/):

SGD各優化方法在損失曲面上的表現

  從上圖可以看出, Adagrad、Adadelta與RMSprop在損失曲面上能夠立即轉移到正確的移動方向上達到快速的收斂。而Momentum 與NAG會導致偏離(off-track)。同時NAG能夠在偏離之後快速修正其路線,因爲其根據梯度修正來提高響應性。

SGD各優化方法在損失曲面鞍點處上的表現


63.牛頓法和梯度下降法有什麼不同

  @wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040
  1)牛頓法(Newton's method)

  牛頓法是一種在實數域和複數域上近似求解方程的方法。方法使用函數f (x)的泰勒級數的前面幾項來尋找方程f (x) = 0的根。牛頓法最大的特點就在於它的收斂速度很快。

  具體步驟:

  首先,選擇一個接近函數 f (x)零點的 x0,計算相應的 f (x0) 和切線斜率f  ' (x0)(這裏f ' 表示函數 f  的導數)。然後我們計算穿過點(x0,  f  (x0)) 並且斜率爲f '(x0)的直線和 x 軸的交點的x座標,也就是求如下方程的解:

  我們將新求得的點的 x 座標命名爲x1,通常x1會比x0更接近方程f  (x) = 0的解。因此我們現在可以利用x1開始下一輪迭代。迭代公式可化簡爲如下所示:

  已經證明,如果f  ' 是連續的,並且待求的零點x是孤立的,那麼在零點x周圍存在一個區域,只要初始值x0位於這個鄰近區域內,那麼牛頓法必定收斂。 並且,如果f  ' (x)不爲0, 那麼牛頓法將具有平方收斂的性能. 粗略的說,這意味着每迭代一次,牛頓法結果的有效數字將增加一倍。

  由於牛頓法是基於當前位置的切線來確定下一次的位置,所以牛頓法又被很形象地稱爲是"切線法"。牛頓法的搜索路徑(二維情況)如下圖所示:

  關於牛頓法和梯度下降法的效率對比:

  a)從收斂速度上看 ,牛頓法是二階收斂,梯度下降是一階收斂,前者牛頓法收斂速度更快。但牛頓法仍然是局部算法,只是在局部上看的更細緻,梯度法僅考慮方向,牛頓法不但考慮了方向還兼顧了步子的大小,其對步長的估計使用的是二階逼近。

  b)根據wiki上的解釋,從幾何上說,牛頓法就是用一個二次曲面去擬合你當前所處位置的局部曲面,而梯度下降法是用一個平面去擬合當前的局部曲面,通常情況下,二次曲面的擬合會比平面更好,所以牛頓法選擇的下降路徑會更符合真實的最優下降路徑。

  注:紅色的牛頓法的迭代路徑,綠色的是梯度下降法的迭代路徑。

  牛頓法的優缺點總結:

  優點:二階收斂,收斂速度快;

  缺點:牛頓法是一種迭代算法,每一步都需要求解目標函數的Hessian矩陣的逆矩陣,計算比較複雜。


64.什麼是擬牛頓法(Quasi-Newton Methods)

  @wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040
  擬牛頓法是求解非線性優化問題最有效的方法之一,於20世紀50年代由美國Argonne國家實驗室的物理學家W.C.Davidon所提出來。Davidon設計的這種算法在當時看來是非線性優化領域最具創造性的發明之一。不久R. Fletcher和M. J. D. Powell證實了這種新的算法遠比其他方法快速和可靠,使得非線性優化這門學科在一夜之間突飛猛進。

  擬牛頓法的本質思想是改善牛頓法每次需要求解複雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的複雜度。擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標函數的梯度。通過測量梯度的變化,構造一個目標函數的模型使之足以產生超線性收斂性。這類方法大大優於最速下降法,尤其對於困難的問題。另外,因爲擬牛頓法不需要二階導數的信息,所以有時比牛頓法更爲有效。如今,優化軟件中包含了大量的擬牛頓算法用來解決無約束,約束,和大規模的優化問題。

  具體步驟:

  擬牛頓法的基本思想如下。首先構造目標函數在當前迭代xk的二次模型:

  這裏Bk是一個對稱正定矩陣,於是我們取這個二次模型的最優解作爲搜索方向,並且得到新的迭代點:

  其中我們要求步長ak滿足Wolfe條件。這樣的迭代與牛頓法類似,區別就在於用近似的Hessian矩陣Bk代替真實的Hessian矩陣。所以擬牛頓法最關鍵的地方就是每一步迭代中矩陣Bk的更新。現在假設得到一個新的迭代xk+1,並得到一個新的二次模型:

  我們儘可能地利用上一步的信息來選取Bk。具體地,我們要求

  從而得到

  這個公式被稱爲割線方程。常用的擬牛頓法有DFP算法和BFGS算法。


65.請說說隨機梯度下降法的問題和挑戰

那到底如何優化隨機梯度法呢?詳情請點擊:https://ask.julyedu.com/question/7913


66.說說共軛梯度法
  @wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040
  共軛梯度法是介於梯度下降法(最速下降法)與牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了梯度下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hessian矩陣並求逆的缺點,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的算法之一。在各種優化算法中,共軛梯度法是非常重要的一種。其優點是所需存儲量小,具有逐步收斂性,穩定性高,而且不需要任何外來參數。

  下圖爲共軛梯度法和梯度下降法搜索最優解的路徑對比示意圖:

注:綠色爲梯度下降法,紅色代表共軛梯度法


67.對所有優化問題來說, 有沒有可能找到比現在已知算法更好的算法?
  @抽象猴,來源:https://www.zhihu.com/question/41233373/answer/145404190

  沒有免費的午餐定理:
  對於訓練樣本(黑點),不同的算法A/B在不同的測試樣本(白點)中有不同的表現,這表示:對於一個學習算法A,若它在某些問題上比學習算法 B更好,則必然存在一些問題,在那裏B比A好。
  也就是說:對於所有問題,無論學習算法A多聰明,學習算法 B多笨拙,它們的期望性能相同。
  但是:沒有免費午餐定力假設所有問題出現機率相同,實際應用中,不同的場景,會有不同的問題分佈,所以,在優化算法時,針對具體問題進行分析,是算法優化的核心所在。


68.什麼最小二乘法?

  我們口頭中經常說:一般來說,平均來說。如平均來說,不吸菸的健康優於吸菸者,之所以要加“平均”二字,是因爲凡事皆有例外,總存在某個特別的人他吸菸但由於經常鍛鍊所以他的健康狀況可能會優於他身邊不吸菸的朋友。而最小二乘法的一個最簡單的例子便是算術平均。

  最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和爲最小。用函數表示爲:

  使誤差「所謂誤差,當然是觀察值與實際真實值的差量」平方和達到最小以尋求估計值的方法,就叫做最小二乘法,用最小二乘法得到的估計,叫做最小二乘估計。當然,取平方和作爲目標函數只是衆多可取的方法之一。

  最小二乘法的一般形式可表示爲:

  有效的最小二乘法是勒讓德在 1805 年發表的,基本思想就是認爲測量中有誤差,所以所有方程的累積誤差爲

  我們求解出導致累積誤差最小的參數即可:

  勒讓德在論文中對最小二乘法的優良性做了幾點說明:

  •  最小二乘使得誤差平方和最小,並在各個方程的誤差之間建立了一種平衡,從而防止某一個極端誤差取得支配地位

  •  計算中只要求偏導後求解線性方程組,計算過程明確便捷

  • 最小二乘可以導出算術平均值作爲估計值

  對於最後一點,從統計學的角度來看是很重要的一個性質。推理如下:假設真值爲 θx1,⋯,xn爲n次測量值, 每次測量的誤差爲ei=xi−θ,按最小二乘法,誤差累積爲

  求解 使達到最小,正好是算術平均

  由於算術平均是一個歷經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,所以從另一個角度說明了最小二乘方法的優良性,使我們對最小二乘法更加有信心。

  最小二乘法發表之後很快得到了大家的認可接受,並迅速的在數據分析實踐中被廣泛使用。不過歷史上又有人把最小二乘法的發明歸功於高斯,這又是怎麼一回事呢。高斯在1809年也發表了最小二乘法,並且聲稱自己已經使用這個方法多年。高斯發明了小行星定位的數學方法,並在數據分析中使用最小二乘方法進行計算,準確的預測了穀神星的位置。
  對了,最小二乘法跟SVM有什麼聯繫呢?請參見
http://blog.csdn.net/v_july_v/article/details/7624837


69.看你T恤上印着:人生苦短,我用Python,你可否說說Python到底是什麼樣的語言?你可以比較其他技術或者語言來回答你的問題。
  @David 9,  http://nooverfit.com/wp/15%E4%B8%AA%E9%87%8D%E8%A6%81python%E9%9D%A2%E8%AF%95%E9%A2%98-%E6%B5%8B%E6%B5%8B%E4%BD%A0%E9%80%82%E4%B8%8D%E9%80%82%E5%90%88%E5%81%9Apython%EF%BC%9F/ 

  這裏是一些關鍵點:Python是解釋型語言。這意味着不像C和其他語言,Python運行前不需要編譯。其他解釋型語言包括PHP和Ruby。

  Python是動態類型的,這意味着你不需要在聲明變量時指定類型。你可以先定義x=111,然後 x=”I’m a string”。

  Python是面嚮對象語言,所有允許定義類並且可以繼承和組合。Python沒有訪問訪問標識如在C++中的public, private, 這就非常信任程序員的素質,相信每個程序員都是“成人”了~

  在Python中,函數是一等公民。這就意味着它們可以被賦值,從其他函數返回值,並且傳遞函數對象。類不是一等公民。

  寫Python代碼很快,但是跑起來會比編譯型語言慢。幸運的是,Python允許使用C擴展寫程序,所以瓶頸可以得到處理。Numpy庫就是一個很好例子,因爲很多代碼不是Python直接寫的,所以運行很快。

  Python使用場景很多 – web應用開發、大數據應用、數據科學、人工智能等等。它也經常被看做“膠水”語言,使得不同語言間可以銜接上。

  Python能夠簡化工作  ,使得程序員能夠關心如何重寫代碼而不是詳細看一遍底層實現。

  @July:Python目前早已成爲AI時代的第一語言,爲幫助大家更好的學習Python語言、數據分析、爬蟲等相關知識,七月在線特開一系列Python課程,有需要的親們可以看下,比如《Python數據分析集訓營》http://www.julyedu.com/weekend/python


70.Python是如何進行內存管理的?
  @Tom_junsong,來源:http://www.cnblogs.com/tom-gao/p/6645859.html
  從三個方面來說,一對象的引用計數機制,二垃圾回收機制,三內存池機制
一、對象的引用計數機制
  Python內部使用引用計數,來保持追蹤內存中的對象,所有對象都有引用計數。
引用計數增加的情況:
  1,一個對象分配一個新名稱
  2,將其放入一個容器中(如列表、元組或字典)
引用計數減少的情況:
  1,使用del語句對對象別名顯示的銷燬
  2,引用超出作用域或被重新賦值
  sys.getrefcount( )函數可以獲得對象的當前引用計數
  多數情況下,引用計數比你猜測得要大得多。對於不可變數據(如數字和字符串),解釋器會在程序的不同部分共享內存,以便節約內存。
二、垃圾回收
  1,當一個對象的引用計數歸零時,它將被垃圾收集機制處理掉。
  2,當兩個對象a和b相互引用時,del語句可以減少a和b的引用計數,並銷燬用於引用底層對象的名稱。然而由於每個對象都包含一個對其他對象的應用,因此引用計數不會歸零,對象也不會銷燬。(從而導致內存泄露)。爲解決這一問題,解釋器會定期執行一個循環檢測器,搜索不可訪問對象的循環並刪除它們。
三、內存池機制
  Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統。
  1,Pymalloc機制。爲了加速Python的執行效率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放。
  2,Python中所有小於256個字節的對象都使用pymalloc實現的分配器,而大的對象則使用系統的malloc。
  3,對於Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數,用於緩存這些整數的內存就不能再分配給浮點數。


71.請寫出一段Python代碼實現刪除一個list裏面的重複元素
  @Tom_junsong,http://www.cnblogs.com/tom-gao/p/6645859.html
1,使用set函數,set(list)
2,使用字典函數,
>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]
>>> b={}
>>>b=b.fromkeys(a)
>>>c=list(b.keys())
>>> c


72.編程用sort進行排序,然後從最後一個元素開始判斷
  a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
  @Tom_junsong,http://www.cnblogs.com/tom-gao/p/6645859.html
a.sort()
last=a[-1]
for i inrange(len(a)-2,-1,-1):
if last==a[i]:
del a[i]
else:last=a[i]
print(a)


73.Python裏面如何生成隨機數?
  @Tom_junsong,http://www.cnblogs.com/tom-gao/p/6645859.html
  random模塊
  隨機整數:random.randint(a,b):返回隨機整數x,a<=x<=b
  random.randrange(start,stop,[,step]):返回一個範圍在(start,stop,step)之間的隨機整數,不包括結束值。
  隨機實數:random.random( ):返回0到1之間的浮點數
  random.uniform(a,b):返回指定範圍內的浮點數。更多Python筆試面試題請看:http://python.jobbole.com/85231/


74.說說常見的損失函數

  對於給定的輸入X,由f(X)給出相應的輸出Y,這個輸出的預測值f(X)與真實值Y可能一致也可能不一致(要知道,有時損失或誤差是不可避免的),用一個損失函數來度量預測錯誤的程度。損失函數記爲L(Y, f(X))。

  常用的損失函數有以下幾種(基本引用自《統計學習方法》):

      

  如此,SVM有第二種理解,即最優化+損失最小,或如@夏粉_百度所說“可從損失函數和優化算法角度看SVM,boosting,LR等算法,可能會有不同收穫”。關於SVM的更多理解請參考:http://blog.csdn.net/v_july_v/article/details/7624837


75.簡單介紹下logistics迴歸

  Logistic迴歸目的是從特徵學習出一個0/1分類模型,而這個模型是將特性的線性組合作爲自變量,由於自變量的取值範圍是負無窮到正無窮。因此,使用logistic函數(或稱作sigmoid函數)將自變量映射到(0,1)上,映射後的值被認爲是屬於y=1的概率。

  假設函數

  其中x是n維特徵向量,函數g就是logistic函數。

  的圖像是

  可以看到,將無窮映射到了(0,1)。

  而假設函數就是特徵屬於y=1的概率。

  從而,當我們要判別一個新來的特徵屬於哪個類時,只需求即可,若大於0.5就是y=1的類,反之屬於y=0類。

  此外,只和有關,>0,那麼,而g(z)只是用來映射,真實的類別決定權還是在於。再者,當時,=1,反之=0。如果我們只從出發,希望模型達到的目標就是讓訓練數據中y=1的特徵,而是y=0的特徵。Logistic迴歸就是要學習得到,使得正例的特徵遠大於0,負例的特徵遠小於0,而且要在全部訓練實例上達到這個目標。

  接下來,嘗試把logistic迴歸做個變形。首先,將使用的結果標籤y = 0和y = 1替換爲y = -1,y = 1,然後將)中的替換爲b,最後將後面的替換爲(即)。如此,則有了。也就是說除了y由y=0變爲y=-1外,線性分類函數跟logistic迴歸的形式化表示沒區別。

  進一步,可以將假設函數中的g(z)做一個簡化,將其簡單映射到y=-1和y=1上。映射關係如下:


76.看你是搞視覺的,熟悉哪些CV框架,順帶聊聊CV最近五年的發展史如何?

  原英文:adeshpande3.github.io
  作者:Adit Deshpande,UCLA CS研究生
  譯者:新智元聞菲、胡祥傑
  譯文鏈接:https://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=2651986617&idx=1&sn=fddebd0f2968d66b7f424d6a435c84af&scene=0#wechat_redirect的
  本段結構如下:

  AlexNet(2012年)

  ZF Net(2013年)

  VGG Net(2014年)

  GoogLeNet (2015年)

  微軟 ResNet (2015年)

  區域 CNN(R-CNN - 2013年,Fast R-CNN - 2015年,Faster R-CNN - 2015年)

  生成對抗網絡(2014年)

  生成圖像描述(2014年)

  空間轉化器網絡(2015年)

  AlexNet(2012年)

  一切都從這裏開始(儘管有些人會說是Yann LeCun 1998年發表的那篇論文才真正開啓了一個時代)。這篇論文,題目叫做“ImageNet Classification with Deep Convolutional Networks”,迄今被引用6184次,被業內普遍視爲行業最重要的論文之一。Alex Krizhevsky、Ilya Sutskever和 Geoffrey Hinton創造了一個“大型的深度卷積神經網絡”,贏得了2012 ILSVRC(2012年ImageNet 大規模視覺識別挑戰賽)。稍微介紹一下,這個比賽被譽爲計算機視覺的年度奧林匹克競賽,全世界的團隊相聚一堂,看看是哪家的視覺模型表現最爲出色。2012年是CNN首次實現Top 5誤差率15.4%的一年(Top 5誤差率是指給定一張圖像,其標籤不在模型認爲最有可能的5個結果中的機率),當時的次優項誤差率爲26.2%。這個表現不用說震驚了整個計算機視覺界。可以說,是自那時起,CNN才成了家喻戶曉的名字。

  論文中,作者討論了網絡的架構(名爲AlexNet)。相比現代架構,他們使用了一種相對簡單的佈局,整個網絡由5層卷積層組成,最大池化層、退出層(dropout layer)和3層全卷積層。網絡能夠對1000種潛在類別進行分類。

  AlexNet 架構:看上去有些奇怪,因爲使用了兩臺GPU訓練,因而有兩股“流”。使用兩臺GPU訓練的原因是計算量太大,只能拆開來。

  要點

  使用ImageNet數據訓練網絡,ImageNet數據庫含有1500多萬個帶標記的圖像,超過2.2萬個類別。

  使用ReLU代替傳統正切函數引入非線性(ReLU比傳統正切函數快幾倍,縮短訓練時間)。

  使用了圖像轉化(image translation)、水平反射(horizontal reflection)和補丁提取(patch extraction)這些數據增強技術。

  用dropout層應對訓練數據過擬合的問題。

  使用批處理隨機梯度下降訓練模型,註明動量衰減值和權重衰減值。

  使用兩臺GTX 580 GPU,訓練了5到6天

  爲什麼重要?

  Krizhevsky、Sutskever 和 Hinton 2012年開發的這個神經網絡,是CNN在計算機視覺領域的一大亮相。這是史上第一次有模型在ImageNet 數據庫表現這麼好,ImageNet 數據庫難度是出了名的。論文中提出的方法,比如數據增強和dropout,現在也在使用,這篇論文真正展示了CNN的優點,並且以破紀錄的比賽成績實打實地做支撐。

  ZF Net(2013年)

  2012年AlexNet出盡了風頭,ILSVRC 2013就有一大批CNN模型冒了出來。2013年的冠軍是紐約大學Matthew Zeiler 和 Rob Fergus設計的網絡 ZF Net,錯誤率 11.2%。ZF Net模型更像是AlexNet架構的微調優化版,但還是提出了有關優化性能的一些關鍵想法。還有一個原因,這篇論文寫得非常好,論文作者花了大量時間闡釋有關卷積神經網絡的直觀概念,展示了將濾波器和權重可視化的正確方法。

  在這篇題爲“Visualizing and Understanding Convolutional Neural Networks”的論文中,Zeiler和Fergus從大數據和GPU計算力讓人們重拾對CNN的興趣講起,討論了研究人員對模型內在機制知之甚少,一針見血地指出“發展更好的模型實際上是不斷試錯的過程”。雖然我們現在要比3年前知道得多一些了,但論文所提出的問題至今仍然存在!這篇論文的主要貢獻在於提出了一個比AlexNet稍微好一些的模型並給出了細節,還提供了一些製作可視化特徵圖值得借鑑的方法。

  

  要點

  除了一些小的修改,整體架構非常類似AlexNet。

  AlexNet訓練用了1500萬張圖片,而ZFNet只用了130萬張。

  AlexNet在第一層中使用了大小爲11×11的濾波器,而ZF使用的濾波器大小爲7x7,整體處理速度也有所減慢。做此修改的原因是,對於輸入數據來說,第一層卷積層有助於保留大量的原始象素信息。11×11的濾波器漏掉了大量相關信息,特別是因爲這是第一層卷積層。

  隨着網絡增大,使用的濾波器數量增多。

  利用ReLU的激活函數,將交叉熵代價函數作爲誤差函數,使用批處理隨機梯度下降進行訓練。

  使用一臺GTX 580 GPU訓練了12天。

  開發可視化技術“解卷積網絡”(Deconvolutional Network),有助於檢查不同的特徵激活和其對輸入空間關係。名字之所以稱爲“deconvnet”,是因爲它將特徵映射到像素(與卷積層恰好相反)。

  DeConvNet

  DeConvNet工作的基本原理是,每層訓練過的CNN後面都連一層“deconvet”,它會提供一條返回圖像像素的路徑。輸入圖像進入CNN之後,每一層都計算激活。然而向前傳遞。現在,假設我們想知道第4層卷積層某個特徵的激活值,我們將保存這個特徵圖的激活值,並將這一層的其他激活值設爲0,再將這張特徵圖作爲輸入送入deconvnet。Deconvnet與原來的CNN擁有同樣的濾波器。輸入經過一系列unpool(maxpooling倒過來),修正,對前一層進行過濾操作,直到輸入空間滿。

  這一過程背後的邏輯在於,我們想要知道是激活某個特徵圖的是什麼結構。下面來看第一層和第二層的可視化。

  ConvNet的第一層永遠是低層特徵檢測器,在這裏就是對簡單的邊緣、顏色進行檢測。第二層就有比較圓滑的特徵了。再來看第三、第四和第五層。

  這些層展示出了更多的高級特徵,比如狗的臉和鮮花。值得一提的是,在第一層卷積層後面,我們通常會跟一個池化層將圖像縮小(比如將 32x32x32 變爲16x16x3)。這樣做的效果是加寬了第二層看原始圖像的視野。更詳細的內容可以閱讀論文。

  爲什麼重要?

  ZF Net不僅是2013年比賽的冠軍,還對CNN的運作機制提供了極好的直觀信息,展示了更多提升性能的方法。論文所描述的可視化方法不僅有助於弄清CNN的內在機理,也爲優化網絡架構提供了有用的信息。Deconv可視化方法和 occlusion 實驗也讓這篇論文成了我個人的最愛。

  VGG Net(2015年)

  簡單、有深度,這就是2014年錯誤率7.3%的模型VGG Net(不是ILSVRC 2014冠軍)。牛津大學的Karen Simonyan 和 Andrew Zisserman Main Points創造了一個19層的CNN,嚴格使用3x3的過濾器(stride =1,pad= 1)和2x2 maxpooling層(stride =2)。簡單吧?

  要點

  這裏使用3x3的濾波器和AlexNet在第一層使用11x11的濾波器和ZF Net 7x7的濾波器作用完全不同。作者認爲兩個3x3的卷積層組合可以實現5x5的有效感受野。這就在保持濾波器尺寸較小的同時模擬了大型濾波器,減少了參數。此外,有兩個卷積層就能夠使用兩層ReLU。

  3卷積層具有7x7的有效感受野。

  每個maxpool層後濾波器的數量增加一倍。進一步加強了縮小空間尺寸,但保持深度增長的想法。

  圖像分類和定位任務都運作良好。

  使用Caffe工具包建模。

  訓練中使用scale jittering的數據增強技術。

  每層卷積層後使用ReLU層和批處理梯度下降訓練。

  使用4臺英偉達Titan Black GPU訓練了兩到三週。

  爲什麼重要?

  在我看來,VGG Net是最重要的模型之一,因爲它再次強調CNN必須夠深,視覺數據的層次化表示纔有用。深的同時結構簡單。

  GoogLeNet(2015年)

  理解了我們剛纔所說的神經網絡架構中的簡化的概念了嗎?通過推出 Inception 模型,谷歌從某種程度上把這一概念拋了出來。GoogLeNet是一個22層的卷積神經網絡,在2014年的ILSVRC2014上憑藉6.7%的錯誤率進入Top 5。據我所知,這是第一個真正不使用通用方法的卷積神經網絡架構,傳統的卷積神經網絡的方法是簡單堆疊卷積層,然後把各層以序列結構堆積起來。論文的作者也強調,這種新的模型重點考慮了內存和能量消耗。這一點很重要,我自己也會經常忽略:把所有的層都堆疊、增加大量的濾波器,在計算和內存上消耗很大,過擬合的風險也會增加。

  換一種方式看 GoogLeNet:

  Inception 模型

  第一次看到GoogLeNet的構造時,我們立刻注意到,並不是所有的事情都是按照順序進行的,這與此前看到的架構不一樣。我們有一些網絡,能同時並行發生反應。

  這個盒子被稱爲 Inception 模型。可以近距離地看看它的構成。

  

  底部的綠色盒子是我們的輸入層,頂部的是輸出層(把這張圖片向右旋轉90度,你會看到跟展示了整個網絡的那張圖片相對應的模型)。基本上,在一個傳統的卷積網絡中的每一層中,你必須選擇操作池還是卷積操作(還要選擇濾波器的大小)。Inception 模型能讓你做到的就是並行地執行所有的操作。事實上,這就是作者構想出來的最“初始”的想法。

  現在,來看看它爲什麼起作用。它會導向許多不同的結果,我們會最後會在輸出層體積上獲得極端大的深度通道。作者處理這個問題的方法是,在3X3和5X5層前,各自增加一個1X1的卷積操作。1X1的卷積(或者網絡層中的網絡),提供了一個減少維度的方法。比如,我們假設你擁有一個輸入層,體積是100x100x60(這並不定是圖像的三個維度,只是網絡中每一層的輸入)。增加20個1X1的卷積濾波器,會讓你把輸入的體積減小到100X100X20。這意味着,3X3層和5X5層不需要處理輸入層那麼大的體積。這可以被認爲是“池特徵”(pooling of feature),因爲我們正在減少體積的高度,這和使用常用的最大池化層(maxpooling layers)減少寬度和長度類似。另一個需要注意的是,這些1X1的卷積層後面跟着的是ReLU 單元,這肯定不會有害。

  你也許會問,“這個架構有什麼用?”這麼說吧,這個模型由一個網絡層中的網絡、一箇中等大小的過濾卷積、一個大型的過濾卷積、一個操作池(pooling operation)組成。網絡卷積層中的網絡能夠提取輸入體積中的每一個細節中的信息,同時 5x5 的濾波器也能夠覆蓋大部分接受層的的輸入,進而能提起其中的信息。你也可以進行一個池操作,以減少空間大小,降低過度擬合。在這些層之上,你在每一個卷積層後都有一個ReLU,這能改進網絡的非線性特徵。基本上,網絡在執行這些基本的功能時,還能同時考慮計算的能力。這篇論文還提供了更高級別的推理,包括的主題有稀疏和緊密聯結(見論文第三和第四節)。

  要點

  整個架構中使用了9個Inception 模型,總共超過100層。這已經很深了……沒有使用完全連接的層。他們使用一個平均池代替,從 7x7x1024 的體積降到了 1x1x1024,這節省了大量的參數。比AlexNet的參數少了12X在測試中,相同圖像的多個剪裁建立,然後填到網絡中,計算softmax probabilities的均值,然後我們可以獲得最後的解決方案。在感知模型中,使用了R-CNN中的概念。Inception有一些升級的版本(版本6和7),“少數高端的GPU”一週內就能完成訓練。

  爲什麼重要?

  GoogLeNet 是第一個引入了“CNN 各層不需要一直都按順序堆疊”這一概念的模型。用Inception模型,作者展示了一個具有創造性的層次機構,能帶來性能和計算效率的提升。這篇論文確實爲接下來幾年可能會見到的令人驚歎的架構打下了基礎。

  微軟 ResNet(2015年)

  想象一個深度CNN架構,再深、再深、再深,估計都還沒有 ILSVRC 2015 冠軍,微軟的152層ResNet架構深。除了在層數上面創紀錄,ResNet 的錯誤率也低得驚人,達到了3.6%,人類都大約在5%~10%的水平。

  爲什麼重要?

  只有3.6%的誤差率,這應該足以說服你。ResNet模型是目前最好的CNN架構,而且是殘差學習理念的一大創新。從2012年起,錯誤率逐年下降,我懷疑到ILSVRC2016,是否還會一直下降。我相信,我們現在堆放更多層將不會實現性能的大幅提升。我們必須要創造新的架構。

  區域 CNN:R-CNN(2013年)、Fast R-CNN(2015年)、Faster R-CNN(2015年)

  一些人可能會認爲,R-CNN的出現比此前任何關於新的網絡架構的論文都有影響力。第一篇關於R-CNN的論文被引用了超過1600次。Ross Girshick 和他在UC Berkeley 的團隊在機器視覺上取得了最有影響力的進步。正如他們的文章所寫, Fast R-CNN 和 Faster R-CNN能夠讓模型變得更快,更好地適應現代的物體識別任務。

  R-CNN的目標是解決物體識別的難題。在獲得特定的一張圖像後, 我們希望能夠繪製圖像中所有物體的邊緣。這一過程可以分爲兩個組成部分,一個是區域建議,另一個是分類。

  論文的作者強調,任何分類不可知區域的建議方法都應該適用。Selective Search專用於RCNN。Selective Search 的作用是聚合2000個不同的區域,這些區域有最高的可能性會包含一個物體。在我們設計出一系列的區域建議之後,這些建議被匯合到一個圖像大小的區域,能被填入到經過訓練的CNN(論文中的例子是AlexNet),能爲每一個區域提取出一個對應的特徵。這個向量隨後被用於作爲一個線性SVM的輸入,SVM經過了每一種類型和輸出分類訓練。向量還可以被填入到一個有邊界的迴歸區域,獲得最精準的一致性。

  非極值壓抑後被用於壓制邊界區域,這些區域相互之間有很大的重複。

  Fast R-CNN

  原始模型得到了改進,主要有三個原因:訓練需要多個步驟,這在計算上成本過高,而且速度很慢。Fast R-CNN通過從根本上在不同的建議中分析卷積層的計算,同時打亂生成區域建議的順利以及運行CNN,能夠快速地解決問題。

  

  Faster R-CNN的工作是克服R-CNN和 Fast R-CNN所展示出來的,在訓練管道上的複雜性。作者 在最後一個卷積層上引入了一個區域建議網絡(RPN)。這一網絡能夠只看最後一層的特徵就產出區域建議。從這一層面上來說,相同的R-CNN管道可用。

  爲什麼重要?

  能夠識別出一張圖像中的某一個物體是一方面,但是,能夠識別物體的精確位置對於計算機知識來說是一個巨大的飛躍。更快的R-CNN已經成爲今天標準的物體識別程序。

  生成對抗網絡(2015年)

  按照Yann LeCun的說法,生成對抗網絡可能就是深度學習下一個大突破。假設有兩個模型,一個生成模型,一個判別模型。判別模型的任務是決定某幅圖像是真實的(來自數據庫),還是機器生成的,而生成模型的任務則是生成能夠騙過判別模型的圖像。這兩個模型彼此就形成了“對抗”,發展下去最終會達到一個平衡,生成器生成的圖像與真實的圖像沒有區別,判別器無法區分兩者。

  左邊一欄是數據庫裏的圖像,也即真實的圖像,右邊一欄是機器生成的圖像,雖然肉眼看上去基本一樣,但在CNN看起來卻十分不同。

  爲什麼重要?

  聽上去很簡單,然而這是只有在理解了“數據內在表徵”之後才能建立的模型,你能夠訓練網絡理解真實圖像和機器生成的圖像之間的區別。因此,這個模型也可以被用於CNN中做特徵提取。此外,你還能用生成對抗模型製作以假亂真的圖片。

  生成圖像描述(2014年)

  把CNN和RNN結合在一起會發生什麼?Andrej Karpathy 和李飛飛寫的這篇論文探討了結合CNN和雙向RNN生成不同圖像區域的自然語言描述問題。簡單說,這個模型能夠接收一張圖片,然後輸出

  很神奇吧。傳統CNN,訓練數據中每幅圖像都有單一的一個標記。這篇論文描述的模型則是每幅圖像都帶有一句話(或圖說)。這種標記被稱爲弱標記,使用這種訓練數據,一個深度神經網絡“推斷句子中的部分與其描述的區域之間的潛在對齊(latent alignment)”,另一個神經網絡將圖像作爲輸入,生成文本的描述。

  爲什麼重要?

  使用看似不相關的RNN和CNN模型創造了一個十分有用的應用,將計算機視覺和自然語言處理結合在一起。這篇論文爲如何建模處理跨領域任務提供了全新的思路。

  空間轉換器網絡(2015年)

  最後,讓我們來看該領域最近的一篇論文。本文是谷歌DeepMind的一個團隊在一年前寫的。這篇論文的主要貢獻是介紹了空間變換器(Spatial Transformer)模塊。基本思路是,這個模塊會轉變輸入圖像,使隨後的層可以更輕鬆地進行分類。作者試圖在圖像到達特定層前改變圖像,而不是更改主CNN架構本身。該模塊希望糾正兩件事:姿勢標準化(場景中物體傾斜或縮放)和空間注意力(在密集的圖像中將注意力集中到正確的物體)。對於傳統的CNN,如果你想使你的模型對於不同規格和旋轉的圖像都保持不變,那你需要大量的訓練樣本來使模型學習。讓我們來看看這個模塊是如何幫助解決這一問題。

  傳統CNN模型中,處理空間不變性的是maxpooling層。其原因是,一旦我們知道某個特定特性還是起始輸入量(有高激活值),它的確切位置就沒有它對其他特性的相對位置重要,其他功能一樣重要。這個新的空間變換器是動態的,它會對每個輸入圖像產生不同的行爲(不同的扭曲/變形)。這不僅僅是像傳統 maxpool 那樣簡單和預定義。讓我們來看看這個模塊是如何工作的。該模塊包括:

  一個本地化網絡,會吸收輸入量,並輸出應施加的空間變換的參數。參數可以是6維仿射變換。

  採樣網格,這是由捲曲規則網格和定位網絡中創建的仿射變換(theta)共同產生的。

  一個採樣器,其目的是執行輸入功能圖的翹曲。

  

  該模塊可以放入CNN的任何地方中,可以幫助網絡學習如何以在訓練過程中最大限度地減少成本函數的方式來變換特徵圖。

  爲什麼重要?

  CNN的改進不一定要到通過網絡架構的大改變來實現。我們不需要創建下一個ResNet或者 Inception 模型。本文實現了對輸入圖像進行仿射變換的簡單的想法,以使模型對平移,縮放和旋轉保持不變。更多請查看https://pan.baidu.com/s/1dFyVLst#list/path=%2F


77.深度學習在視覺領域有何前沿進展
  @元峯,本題解析來源:https://zhuanlan.zhihu.com/p/24699780

  引言

  在今年的神經網絡頂級會議NIPS2016上,深度學習三大牛之一的Yann Lecun教授給出了一個關於機器學習中的有監督學習、無監督學習和增強學習的一個有趣的比喻,他說:如果把智能(Intelligence)比作一個蛋糕,那麼無監督學習就是蛋糕本體,增強學習是蛋糕上的櫻桃,那麼監督學習,僅僅能算作蛋糕上的糖霜(圖1)。


圖1. Yann LeCun 對監督學習,增強學習和無監督學習的價值的形象比喻

1. 深度有監督學習在計算機視覺領域的進展

1.1 圖像分類(Image Classification)

  自從Alex和他的導師Hinton(深度學習鼻祖)在2012年的ImageNet大規模圖像識別競賽(ILSVRC2012)中以超過第二名10個百分點的成績(83.6%的Top5精度)碾壓第二名(74.2%,使用傳統的計算機視覺方法)後,深度學習真正開始火熱,卷積神經網絡(CNN)開始成爲家喻戶曉的名字,從12年的AlexNet(83.6%),到2013年ImageNet 大規模圖像識別競賽冠軍的88.8%,再到2014年VGG的92.7%和同年的GoogLeNet的93.3%,終於,到了2015年,在1000類的圖像識別中,微軟提出的殘差網(ResNet)以96.43%的Top5正確率,達到了超過人類的水平(人類的正確率也只有94.9%).
  Top5精度是指在給出一張圖片,模型給出5個最有可能的標籤,只要在預測的5個結果中包含正確標籤,即爲正確

圖2. 2010-2015年ILSVRC競賽圖像識別錯誤率演進趨勢

1.2 圖像檢測(Image Dection)

  伴隨着圖像分類任務,還有另外一個更加有挑戰的任務–圖像檢測,圖像檢測是指在分類圖像的同時把物體用矩形框給圈起來。從14年到16年,先後涌現出R-CNN,Fast R-CNN, Faster R-CNN, YOLO, SSD等知名框架,其檢測平均精度(mAP),在計算機視覺一個知名數據集上PASCAL VOC上的檢測平均精度(mAP),也從R-CNN的53.3%,到Fast RCNN的68.4%,再到Faster R-CNN的75.9%,最新實驗顯示,Faster RCNN結合殘差網(Resnet-101),其檢測精度可以達到83.8%。深度學習檢測速度也越來越快,從最初的RCNN模型,處理一張圖片要用2秒多,到Faster RCNN的198毫秒/張,再到YOLO的155幀/秒(其缺陷是精度較低,只有52.7%),最後出來了精度和速度都較高的SSD,精度75.1%,速度23幀/秒。 

圖3. 圖像檢測示例

1.3 圖像分割(Semantic Segmentation)

  圖像分割也是一項有意思的研究領域,它的目的是把圖像中各種不同物體給用不同顏色分割出來,如下圖所示,其平均精度(mIoU,即預測區域和實際區域交集除以預測區域和實際區域的並集),也從最開始的FCN模型(圖像語義分割全連接網絡,該論文獲得計算機視覺頂會CVPR2015的最佳論文的)的62.2%,到DeepLab框架的72.7%,再到牛津大學的CRF as RNN的74.7%。該領域是一個仍在進展的領域,仍舊有很大的進步空間。

圖4. 圖像分割的例子

1.4 圖像標註–看圖說話(Image Captioning)

  圖像標註是一項引人注目的研究領域,它的研究目的是給出一張圖片,你給我用一段文字描述它,如圖中所示,圖片中第一個圖,程序自動給出的描述是“一個人在塵土飛揚的土路上騎摩托車”,第二個圖片是“兩隻狗在草地上玩耍”。由於該研究巨大的商業價值(例如圖片搜索),近幾年,工業界的百度,谷歌和微軟 以及學術界的加大伯克利,深度學習研究重地多倫多大學都在做相應的研究。圖5.圖像標註,根據圖片生成描述文字

1.5 圖像生成–文字轉圖像(Image Generator)

  圖片標註任務本來是一個半圓,既然我們可以從圖片產生描述文字,那麼我們也能從文字來生成圖片。如圖6所示,第一列“一架大客機在藍天飛翔”,模型自動根據文字生成了16張圖片,第三列比較有意思,“一羣大象在乾燥草地行走”(這個有點違背常識,因爲大象一般在雨林,不會在乾燥草地上行走),模型也相應的生成了對應圖片,雖然生成的質量還不算太好,但也已經中規中矩。

圖6.根據文字生成圖片

2.強化學習(Reinforcement Learning)

  在監督學習任務中,我們都是給定樣本一個固定標籤,然後去訓練模型,可是,在真實環境中,我們很難給出所有樣本的標籤,這時候,強化學習就派上了用場。簡單來說,我們給定一些獎勵或懲罰,強化學習就是讓模型自己去試錯,模型自己去優化怎麼才能得到更多的分數。2016年大火的AlphaGo就是利用了強化學習去訓練,它在不斷的自我試錯和博弈中掌握了最優的策略。利用強化學習去玩flyppy bird,已經能夠玩到幾萬分了。

 

 圖7. 強化學習玩flappy bird

  谷歌DeepMind發表的使用增強學習來玩Atari遊戲,其中一個經典的遊戲是打磚塊(breakout),DeepMind提出的模型僅僅使用像素作爲輸入,沒有任何其他先驗知識,換句話說,模型並不認識球是什麼,它玩的是什麼,令人驚訝的是,在經過240分鐘的訓練後,它不光學會了正確的接球,擊打磚塊,它甚至學會了持續擊打同一個位置,遊戲就勝利的越快(它的獎勵也越高)。

  視頻鏈接:http://v.youku.com/v_show/id_XMTUxODU2NjY5Ng==.html

圖8.使用深度增強學習來玩Atari Breakout 

  強化學習在機器人領域和自動駕駛領域有極大的應用價值,當前arxiv上基本上每隔幾天就會有相應的論文出現。機器人去學習試錯來學習最優的表現,這或許是人工智能進化的最優途徑,估計也是通向強人工智能的必經之路。

3深度無監督學習(Deep Unsupervised Learning)–預測學習

  相比有限的監督學習數據,自然界有無窮無盡的未標註數據。試想,如果人工智能可以從龐大的自然界自動去學習,那豈不是開啓了一個新紀元?當前,最有前景的研究領域或許應屬無監督學習,這也正是Yann Lecun教授把無監督學習比喻成人工智能大蛋糕的原因吧。
  深度學習牛人Ian Goodfellow在2014年提出
生成對抗網絡(https://arxiv.org/abs/1406.2661)後,該領域越來越火,成爲16年研究最火熱的一個領域之一。大牛Yann LeCun曾說:“對抗網絡是切片面包發明以來最令人激動的事情。”這句話足以說明生成對抗網絡有多重要。 
  生成對抗網絡的一個簡單解釋如下:假設有兩個模型,一個是生成模型(Generative Model,下文簡寫爲G),一個是判別模型(Discriminative Model,下文簡寫爲D),判別模型(D)的任務就是判斷一個實例是真實的還是由模型生成的,生成模型(G)的任務是生成一個實例來騙過判別模型(D),兩個模型互相對抗,發展下去就會達到一個平衡,生成模型生成的實例與真實的沒有區別,判別模型無法區分自然的還是模型生成的。以贗品商人爲例,贗品商人(生成模型)製作出假的畢加索畫作來欺騙行家(判別模型D),贗品商人一直提升他的高仿水平來區分行家,行家也一直學習真的假的畢加索畫作來提升自己的辨識能力,兩個人一直博弈,最後贗品商人高仿的畢加索畫作達到了以假亂真的水平,行家最後也很難區分正品和贗品了。下圖是Goodfellow在發表生成對抗網絡論文中的一些生成圖片,可以看出,模型生成的模型與真實的還是有大差別,但這是14年的論文了,16年這個領域進展非常快,相繼出現了
條件生成對抗網絡(Conditional Generative Adversarial Nets)信息生成對抗網絡(InfoGAN)深度卷積生成對抗網絡(Deep Convolutional Generative Adversarial Network, DCGAN),更重要的是,當前生成對抗網絡把觸角伸到了視頻預測領域,衆所周知,人類主要是靠視頻序列來理解自然界的,圖片只佔非常小的一部分,當人工智能學會理解視頻後,它也真正開始顯現出威力了。

  這裏推薦一篇2017年初Ian GoodFellow結合他在NIPS2016的演講寫出的綜述性論文NIPS 2016 Tutorial: Generative Adversarial Networks圖9 生成對抗網絡生成的一些圖片,最後邊一列是與訓練集中圖片最相近的生產圖片

3.1條件生成對抗網絡(Conditional Generative Adversarial Nets,CGAN)

  生成對抗網絡一般是根據隨機噪聲來生成特定類型的圖像等實例,條件生成對抗網絡則是根據一定的輸入來限定輸出,例如根據幾個描述名詞來生成特定的實例,這有點類似1.5節介紹的由文字生成圖像,下圖是Conditioanal Generative Adversarial Nets論文中的一張圖片,根據特定的名詞描述來生成圖片。(注意:左邊的一列圖片的描述文字是訓練集中不存在的,也就是說是模型根據沒有見過的描述來生成的圖片,右邊的一列圖片的描述是訓練集中存在的)


圖10. 根據文字來生成圖片

  條件生成對抗網絡的另一篇有意思的論文是圖像到圖像的翻譯,該論文提出的模型能夠根據一張輸入圖片,然後給出模型生成的圖片,下圖是論文中的一張圖,其中左上角第一對非常有意思,模型輸入圖像分割的結果,給出了生成的真實場景的結果,這類似於圖像分割的反向工程。

圖11. 根據特定輸入來生成一些有意思的輸出圖片

  生成對抗網絡也用在了圖像超分辨率上,2016年有人提出SRGAN模型(https://arxiv.org/abs/1609.04802),它把原高清圖下采樣後,試圖用生成對抗網絡模型來還原圖片來生成更爲自然的,更逼近原圖像的圖像。下圖中最右邊是原圖,把他降採樣後採用三次差值(Bicubic Interpolation)得到的圖像比較模糊,採用殘差網絡的版本(SRResNet)已經乾淨了很多,我們可以看到SRGAN生成的圖片更爲真實一些。

圖12.生成對抗網絡做超分辨率的例子,最右邊是原始圖像

  生成對抗網絡的另一篇有影響力的論文是深度卷積生成對抗網絡DCGAN(https://arxiv.org/abs/1511.06434),作者把卷積神經網絡和生成對抗網絡結合起來,作者指出該框架可以很好的學習事物的特徵,論文在圖像生成和圖像操作上給出了很有意思的結果,例如圖13,帶眼睛的男人-不戴眼鏡的男人+不帶眼睛的女人=帶眼睛的女人,該模型給出了圖片的類似向量化操作。圖13. DCGAN論文中的例圖

  生成對抗網絡的發展是在是太火爆,一篇文章難以羅列完全,對此感興趣的朋友們可以自己在網絡搜素相關論文來研究
  openAI的一篇描述生成對抗網絡的博客非常棒,因爲Ian Goodfellow就在OpenAI工作,所以這篇博客的質量還是相當有保障的。鏈接爲:
https://openai.com/blog/generative-models/

3.2 視頻預測

  該方向是筆者自己最感興趣的方向,Yann LeCun也提出,“用預測學習來替代無監督學習”,預測學習通過觀察和理解這個世界是如何運作的,然後對世界的變化做出預測,機器學會了感知世界的變化,然後對世界的狀態進行了推斷。
  今年的NIPS上,MIT的學者Vondrick等人發表了一篇名爲
Generating Videos with Scene Dynamics(http://carlvondrick.com/tinyvideo/)的論文,該論文提出了基於一幅靜態的圖片,模型自動推測接下來的場景,例如給出一張人站在沙灘的圖片,模型自動給出一段接下來的海浪涌動的小視頻。該模型是以無監督的方式,在大量的視頻上訓練而來的。該模型表明它可以自動學習到視頻中有用的特徵。下圖是作者的官方主頁上給出的圖,是動態圖,如果無法正常查看,請轉入http://carlvondrick.com/tinyvideo/
  視頻生成例子,下圖的視頻是模型自動生成的,我們可以看到圖片不太完美,但已經能相當好的表示一個場景了。 

 

圖14. 隨機生成的視頻,沙灘上波濤涌動,火車奔馳的場景

  條件視頻生成,下圖是輸入一張靜態圖,模型自動推演出一段小視頻。

 

 圖15.根據一張草地靜態圖,模型自動推測人的移動場景,該圖爲動圖,如果無法查看,請訪問http://carlvondrick.com/tinyvideo/

圖16.給出一張鐵道圖,模型自動推測火車跑過的樣子,該圖爲動圖,如果無法查看,請訪問http://carlvondrick.com/tinyvideo/

  MIT的CSAIL實驗室也放出了一篇博客,題目是《教會機器去預測未來》(http://news.mit.edu/2016/teaching-machines-to-predict-the-future-0621),該模型在youtube視頻和電視劇上(例如The Office和《絕望主婦》)訓練,訓練好以後,如果你給該模型一個親吻之前的圖片,該模型能自動推測出加下來擁抱親吻的動作,具體的例子見下圖。 

圖17. 給出一張靜態圖,模型自動推測接下來的動作

  哈佛大學的Lotter等人提出了PredNet(https://coxlab.github.io/prednet/),該模型也是在KITTI數據集(http://www.cvlibs.net/datasets/kitti/)上訓練,然後該模型就可以根據前面的視頻,預測行車記錄儀接下來幾幀的圖像,模型是用長短期記憶神經網絡(LSTM)訓練得到的。具體例子見下圖,給出行車記錄儀前幾張的圖片,自動預測接下來的五幀場景,模型輸入幾幀圖像後,預測接下來的5幀,由圖可知,越往後,模型預測的越是模糊,但模型已經可以給出有參加價值的預測結果了。圖片是動圖,如果無法正常查看,請訪問論文作者的博客https://coxlab.github.io/prednet/


圖18. 給出行車記錄儀前幾張的圖片,自動預測接下來的五幀場景,該圖爲動圖,如果無法查看,請訪問https://coxlab.github.io/prednet/

4 總結

  生成對抗網絡,無監督學習視頻預測的論文實在是太多,本人精力實在有限,對此感興趣的讀者可以每天刷一下arxiv的計算機視覺版塊的計算機視覺和模型識別神經網絡和進化計算人工智能等相應版塊,基本上每天都有這方面新論文出現。圖像檢測和分割,增強學習,生成對抗網絡,預測學習都是人工智能發展火熱的方向,希望對深度學習感興趣的我們在這方面能做出來點成果。謝謝朋友們的閱讀,對深度無監督學習感興趣的朋友,歡迎一起學習交流,請私信我。

5 參考文獻

  在寫本文的過程中,我儘量把論文網址以鏈接的形式附着在正文中.本文參考的大部分博客和論文整理如下,方便大家和自己以後研究查看。

  參考博客

1.NIPS 主旨演講】Yann LeCun:用預測學習替代無監督學習

https://mp.weixin.qq.com/s/VJkiVmGBMv3sL94mivjNHg

2.計算機視覺和 CNN 發展十一座里程碑

https://mp.weixin.qq.com/s/eosTWBbLpwVroYPEb9Q0wA

3.Generative Models

https://blog.openai.com/generative-models/

4.Generating Videos with Scene Dynamics

http://carlvondrick.com/tinyvideo/

5.Teaching machines to predict the future

http://news.mit.edu/2016/teaching-machines-to-predict-the-future-0621

  參考論文

1.Resnet模型,圖像分類,超過人類的計算機識別水平。Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

https://arxiv.org/abs/1502.01852

2.圖像檢測 Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

https://arxiv.org/abs/1506.01497

3.圖像分割Conditional Random Fields as Recurrent Neural Networks

http://www.robots.ox.ac.uk/~szheng/CRFasRNN.html

4.圖像標註,看圖說話 Show and Tell: A Neural Image Caption Generator

https://arxiv.org/abs/1411.4555

5.文字生成圖像Generative Adversarial Text to Image Synthesis

https://arxiv.org/abs/1605.05396

6.強化學習玩flyppy bird Using Deep Q-Network to Learn How To Play Flappy Bird

https://github.com/yenchenlin/DeepLearningFlappyBird

7.強化學習玩Atari遊戲 Playing Atari with Deep Reinforcement Learning

https://arxiv.org/abs/1312.5602

8.生成對抗網絡 Generative Adversarial Networks

https://arxiv.org/abs/1406.2661

9.條件生成對抗網絡Conditional Generative Adversarial Nets

https://arxiv.org/abs/1411.1784

10.生成對抗網絡做圖像超分辨率Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network

https://arxiv.org/abs/1609.04802

11.深度卷積生成對抗網絡Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks

https://arxiv.org/abs/1511.06434

12.由圖片推演視頻Generating Videos with Scene Dynamics

http://carlvondrick.com/tinyvideo/

13.視頻預測和無監督學習Deep Predictive Coding Networks for Video Prediction and Unsupervised Learning

https://coxlab.github.io/prednet/


78.HashMap與HashTable區別
  點評:HashMap基於Hashtable實現,不同之處在於HashMap是非同步的,並且允許null,即null value和null key,Hashtable則不允許null,詳見:
http://oznyang.iteye.com/blog/30690。此外,記住一點:hashmap/hashset等凡是帶有hash字眼的均基於hashtable實現,沒帶hash字眼的如set/map均是基於紅黑樹實現,前者無序,後者有序,詳見此文第一部分:《教你如何迅速秒殺掉:99%的海量數據處理面試題》http://blog.csdn.net/v_july_v/article/details/7382693

  不過,估計還是直接來圖更形象點,故直接上圖(圖片來源:July9月28日在上海交大面試&算法講座的PPThttp://vdisk.weibo.com/s/zrFL6OXKg_1me):


79.在分類問題中,我們經常會遇到正負樣本數據量不等的情況,比如正樣本爲10w條數據,負樣本只有1w條數據,以下最合適的處理方法是(  )
A 將負樣本重複10次,生成10w樣本量,打亂順序參與分類
B 直接進行分類,可以最大限度利用數據
C 從10w正樣本中隨機抽取1w參與分類
D 將負樣本每個權重設置爲10,正樣本權重爲1,參與訓練過程
  @管博士:準確的說,其實選項中的這些方法各有優缺點,需要具體問題具體分析,有篇文章對各種方法的優缺點進行了分析,講的不錯 感興趣的同學可以參考一下:https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/。


80.以下第80題~第94題來自:http://blog.csdn.net/u011204487
  深度學習是當前很熱門的機器學習算法,在深度學習中,涉及到大量的矩陣相乘,現在需要計算三個稠密矩陣A,B,C的乘積ABC,假設三個矩陣的尺寸分別爲
m∗n,n∗p,p∗q,且m<n<p<q,以下計算順序效率最高的是(A) 
A.(AB)C
B.AC(B)
C.A(BC)
D.所以效率都相同
  @BlackEyes_SGC: m*n*p<m*n*q,m*p*q< n*p*q, 所以 (AB)C 最小


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章