天天看點

深度學習目前進展和了解

%probability (機率論)

http://www.zhihu.com/question/29687860/answer/45794666?utm_campaign=rss&utm_medium=rss&utm_source=rss&utm_content=title

問:   之前聽到一種說法,什麼統計學家不認同機器學習的觀點,什麼最後搞統計學的最後都去做機器學習了,具體記不清楚了,這兩方在理念上有什麼不一樣的地方呢? 答:

         具體來說,機器學習應該是分為 probability base 和non-probability base的。 當我們在意一個模型的可信性和精度的時候,刻畫研究對象的probability distribution是重要的。但是相對于經典并且傳統的統計,機器學習像是一個思想更開放的年輕人。non-probability base 部分的機器學習 不是 比統計學家 “ 更關心模型的預測能力 ”, 而是 比起關心模型可信性,“ 更關心模型的預測能力 ”。是以它擺脫了 研究probability distribution的束縛,用另外一些方式,for example,(online learning, active learning?)來進行預測。

       經典統計和機器學習分别在哪些領域有優勢?

       在一些傳統領域,工程實驗,生物試驗,社會調查,實體實驗,我們能獲得的資料量非常小,我們必須小心翼翼的對待我們的模型,從有限的資料中提取盡量可能多的資訊。抑或是一些對參數很敏感的預測,差之毫厘失之千裡,比如檢驗一個艾滋病新藥物是否有效,來決定要不要投入funding去進行研發,我們就要用嚴謹的機率統計模型。

       但是在搜尋引擎,淘寶使用者購買資訊,人臉特征識别等領域,我們能夠獲得很大量的資料,而且資料次元也非常高,用傳統方式模組化,很有可能次元高到嚴謹的function根本解不出來,機器學習的理論就非常有效了。         machine learning調參的過程        “grid search啊,grid search就是自動暴力調參,設定好要跑的參數讓程式自動跑,跑一晚上第二天起來看哪個參數組合得到的結果最好。 可能對機器學習之是以有暴力調參的印象,多是由于deep learning的原因,這個現在很火,但絕大部分人沒辦法弄懂原理,什麼ReLU,Dropout,BatchNormalization,估計沒幾個知道這些為什麼會有用,看上去像拍腦袋想出來的,但反正是有用,想用好就隻能憑感覺調參數了。

但是其他更成熟的模型,比如svm,ensemble,他們準确率高是有理論支撐的” ------------------------------------------------------------------------------------------以下是深度學習----------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------深度學習的工具--------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- torch7、theano、caffe

來源于知乎使用者的回答: 連結:http://www.zhihu.com/question/34789475/answer/60700029

來源:知乎

總結:caffe用來實作隻是用來實作cnn;torch7用來實作cnn和rnn都可以

        caffe的代碼結構非常清晰,這也是我學C++看的第一份代碼。如果要在caffe中加新的layer也很簡單,基本上就是重載3個函數:setup,forward,backward。

       使用caffe訓練模型基本上就是寫寫配置檔案。另外caffe提供了很多牛人訓練好的模型給你玩Home · BVLC/caffe Wiki · GitHub,caffe圍繞cnn做了非常完備的工作,然而,正是因為caffe一開始的是為了實作一個高效的cnn訓練架構,是以,也給自身帶了一些限制:不能很友善得擴充到其它模型。caffe另外一個缺點就是接口一直沒有穩定下來(目前好像還有重構計劃),是以,導緻我半年前寫的代碼現在都不能直接用了。這也是導緻我學習torch7的原因之一,但不是主要原因。當然,每一個優秀的算法都值得為它實作一個優化的計算架構。

        再說torch7,理想中我最喜歡的的機器學習的庫應該是實作并且優化了基本的計算單元,使用者可以很簡單地在此基礎上實作自己的算法,不用浪費精力在計算優化上面。而torch7恰好符合這種要求。核心的計算單元使用C或者cuda做了很好的優化。

torch 7核心代碼用C/CUDA C,上層提供腳本(lua)語言調用,效率與caffe幾乎沒有差别,試驗新想法時可能會快一點。另外,torch7建構的是一個生态系統,安裝新的模型實作子產品隻需要luarocks install package. 比如:luarocks install rnn。之後就可以歡樂地使用rnn模型了。有很多學者在torch7的基本單元之上貢獻了其它的模型。具體參考 Cheatsheet · torch/torch7 Wiki · GitHub。另外,FB在今年CVPR的tutorial上明确提到,由于lua解釋器的小巧,未來torch 7可以直接部署到手機上。torch7的缺點可能就是1. wrapper是lua語言,需要一點時間來學習。2. 優化新的計算單元可能會比較麻煩,backend修改起來會比較麻煩(這一點我不還确定)。              總結一下:caffe是CNN模型的非常好的架構,友善、易用;torch7是機器學習一個非常好的架構,但是,學習曲線比caffe要陡峭一些。torch7更靈活,能搞定更多的機器學習算法模型。

連結:http://www.zhihu.com/question/34789475/answer/66375006

來源:知乎

我在剛開始用torch 7時也遇到過答主的這些問題,以下是我的一點心得。

1. 變量不檢查,執行到中間某一步才報錯。這有兩種可能:張量尺寸不比對,或者變量在使用前沒有合适初始化/定義。首先,這兩種錯誤都可以通過簡單的調試排除(推薦環境:zbs-torch + mobdebug),而且他們很常見——即使經驗豐富的研究者或程式員也會時不時掉坑裡,是以不必對此過度擔憂和困擾;其次,這兩種錯誤在任何基于動态語軟體包裡面都難以避免——如果非要像C++那樣引入靜态類型檢查,就失去了動态語言的靈活性。另外,恐怕caffe也沒法在編譯期捕捉張量尺寸不比對這種錯誤(這個不太肯定,對caffe沒有實際使用經驗)。最後,如果答主實在喜歡謹慎,那就在lua代碼裡顯式的assert好了:

assert(a) -- detect if a is defined
assert( a:size(2) == 4 ) -- a must have 4 columns (size in dim 2)

           

2. dp(dpnn)包的問題。 這樣的包雖然很傻瓜化,但是很多功能比如experiment感覺擴充性比較差,不能适應active learning甚至是reinforcement learning的場景。

Torch 7是一系列功能互相正交的包的總稱,例如torch包封裝了張量和運算,nn封裝了神經網絡, optim封裝了優化算法...而dp并不是“官方”釋出的包。個人認為dp有些設計過度。從程式設計角度來說,機器學習的業務邏輯比較簡單,沒必要引入那麼多設計模式去表達;另外偏研究的代碼需求變化太劇烈,引入那些設計模式也沒法重用代碼,比如答主所說的reinforcement learning,以及deep learning作為其它高層任務子子產品的任何場景...這時,不如發揮lua腳本語言的優勢,寫一些糙快猛的代碼迅速的得到結果評估效用——你會發現先前的好多想法根本行不通,業務邏輯代碼又要大量修改...

3. Torch 7的張量操作複雜。這個沒辦法,要支援各種索引操作,肯定會複雜。

4. 字元串操作。類似于字元串分割這種任務,可以用penlight庫的stringx(Torch 7安裝時自帶了),例如:

stringx = require('pl.stringx')
str = 'one two thress'
words = stringx.split(str)

           

如果還需要更複雜的自定義操作,lua的string和torch的tensor都可以暴露資料裸指針,可以在lua語言中對其直接操作,效率和手寫C語言相差無幾。

連結:http://www.zhihu.com/question/34789475/answer/60708085

來源:知乎

個人認為單從構模組化型來說,torch已經是非常簡便的了。CNN大概像這樣就搭起來了(來源: tutorial_supervised_2_model ):

-- parameters
nstates = {16,256,128}
fanin = {1,4}
filtsize = 5
poolsize = 2
normkernel = image.gaussian1D(7)

-- Container:
model = nn.Sequential()

-- stage 1 : filter bank -> squashing -> L2 pooling -> normalization
model:add(nn.SpatialConvolutionMap(nn.tables.random(nfeats, nstates[1], fanin[1]), filtsize, filtsize))
model:add(nn.Tanh())
model:add(nn.SpatialLPPooling(nstates[1],2,poolsize,poolsize,poolsize,poolsize))
model:add(nn.SpatialSubtractiveNormalization(16, normkernel))

-- stage 2 : filter bank -> squashing -> L2 pooling -> normalization
model:add(nn.SpatialConvolutionMap(nn.tables.random(nstates[1], nstates[2], fanin[2]), filtsize, filtsize))
model:add(nn.Tanh())
model:add(nn.SpatialLPPooling(nstates[2],2,poolsize,poolsize,poolsize,poolsize))
model:add(nn.SpatialSubtractiveNormalization(nstates[2], normkernel))

-- stage 3 : standard 2-layer neural network
model:add(nn.Reshape(nstates[2]*filtsize*filtsize))
model:add(nn.Linear(nstates[2]*filtsize*filtsize, nstates[3]))
model:add(nn.Tanh())
model:add(nn.Linear(nstates[3], noutputs))

           

簡單總結一下torch的優勢:

1. 構模組化型簡單,一層層搭積木即可。

2. 高度子產品化,一層就是一個子產品,寫新子產品也友善,套用接口就行,用tensor運算不必寫cuda也能用GPU。

3. 底層的tensor由C和cuda實作,速度不會比caffe差,甚至某些運算可能更快。

4. 使用GPU友善,把tensor資料送到GPU隻要簡單的 "tensor:cuda()"。

5. lua入門快,堪比python。

6. 很重要的一點,nngraph,理論上可以用nn裡的子產品實作任何DAG構造的網絡,當然也包括RNN、LSTM之類的。

至于劣勢:

1. 對于不少人來說,lua要新學。

2. 除了deep learning方面,其他好用的機器學習library較少。

3. 資料檔案格式比較麻煩,一般原始資料沒有torch專用的t7格式檔案,需要通過mat等格式中轉轉換。

Lua這個腳本語言debug起來感覺非常吃力。現在的各種庫代碼還非常缺乏魯棒性,對于輸入往往沒有任何assert檢查,最後很可能是執行到某一步加法或者copy的時候才出現錯誤,使用者隻能根據錯誤的stack recall 一步步地推測自己的代碼到底是為什麼出了問題(雖然知道自己代碼是哪一行出了錯)

目前深度學習領域的學術研究可以包含四部分:優化(Optimization),泛化(Generalization),表達(Representation)以及應用(Applications)。除了應用(Applications)之外每個部分又可以分成實踐和理論兩個方面。