雷鋒網按:本文譯者劉翔宇,中通軟開發工程師,關注機器學習、神經網絡、模式識别。
在yoshua bengio開始的講座上,他說“這是我重點講述的幻燈片”。下圖就是這張幻燈片:
假設你有一個分類器,需要分類人們是男性還是女性,佩戴眼鏡還是不佩戴眼鏡,高還是矮。如果采用非分布式表示,你就在處理2*2*2=8類人。為訓練精準度高的分類器,你需要為這8類收集足夠的訓練資料。但是,如果采用分布式表示,每一個屬性都會在其他不同次元中有所展現。這意味着即使分類器沒有碰到佩戴眼鏡的高個子,它也能成功地識别他們,因為它學會了從其他樣本中單獨學習識别性别,佩戴眼鏡與否和身高。
yoshua bengio的團隊通過實驗發現,優化高次元神經網絡參數時,就沒有局部最小。相反,在某些次元上存在鞍點,它們是局部最小的,但不是全局最小。這意味着,在這些點訓練會減慢許多,直到網絡知道如何離開這些點,但是我們願意等足夠長的時間的話,網絡總會找到方法的。
下圖展示了在網絡訓練過程中,兩種狀态的震動情況:靠近鞍點和離開鞍點。
給定一個指定的次元,小機率p表示點是局部最小的可能性,但不是此次元上全局最小。在1000次元空間裡的點不是局部最小的機率和就會是,這是一個非常小的值。但是,在某些次元裡,這個點是局部最小的機率實際上比較高。而且當我們同時得到多元度下的最小值時,訓練可能會停住直到找到正确的方向。
另外,當損失函數接近全局最小時,機率p會增加。這意味着,如果我們找到了真正的局部最小,那麼它将非常接近全局最小,這種差異是無關緊要的。
leon bottou列出了一些有用的表格,關于激活函數,損失函數,和它們相應的導函數。我将它們先放在這裡以便後續使用。
更新:根據評論指出,斜率公式中的最小最大函數應該調換。
目前在神經網絡中建議使用的權重初始化政策是将值歸一化到範圍[-b,b],b為:
由hugo larochelle推薦,glorot和bengio釋出(2010)。
hugo larochelle給出的一些實用建議:
歸一化實值資料。減去平均值,再除以标準差。
降低訓練過程中的學習率。
更新使用小批量資料,梯度會更穩定。
使用動量,通過停滞期。
如果你手動實作了反向傳播算法但是它不起作用,那麼有99%的可能是梯度計算中存在bug。那麼就用梯度檢測來定位問題。主要思想是運用梯度的定義:如果我們稍微增加某個權重值,模型的誤差将會改變多少。
這裡有更詳細的解釋:gradient checking and advanced optimization。
人體動作跟蹤可以達到非常高的精準度。下圖是來自graham taylor等人(2010)發表的論文dynamical binary latent variable models for 3d human pose tracking中的例子。該方法使用的是條件受限的玻爾茲曼機。
chris manning和richard socher已經投入了大量的精力來開發組合模型,它将神經嵌入與更多傳統的分析方法組合起來。這在recursive neural tensor network這篇論文中達到了極緻,它使用加法和乘法的互動将詞義與文法解析樹組合。
然後,該模型被paragraph向量(le和mikolov,2014)打敗了(以相當大的差距),paragraph向量對語句結構和文法完全不了解。chris manning将這個結果稱作“創造‘好的’組合向量的一次失敗”。
然而,最近越來越多的使用文法解析樹的工作成果改變了那一結果。irsoy和cardie(nips,2014)在多元度上使用更深層的網絡成功地打敗了paragraph向量。最後,tai等人(acl,2015)将lstm網絡與文法解析樹結合,進一步改進了結果。
這些模型在斯坦福5類情感資料集上結果的精準度如下:
從目前來看,使用文法解析樹的模型比簡單方法更勝一籌。我很好奇下一個不基于文法的方法何時出現,它又将會如何推動這場比賽。畢竟,許多神經模型的目标不是丢棄底層的文法,而是隐式的将它捕獲在同一個網絡中。
chris manning本人澄清了這兩個詞之間的差別。
分布式:在若幹個元素中的連續激活水準。比如密集詞彙嵌入,而不是1-hot向量。
配置設定式:表示的是使用上下文。word2vec是配置設定式的,當我們使用詞彙的上下文來模組化語義時,基于計數的詞彙向量也是配置設定式的。
penn treebank中的依賴分析器比較:
最後一個結果是從谷歌“提取出所有stops”得到的,将海量資料源來訓練斯坦福神經文法解析器。
我之前對theano有所了解,但是我在暑期學校學習到了更多。而且它實在是太棒了。
由于theano起源自蒙特利爾,直接請教theano的開發者會很有用。
關于它大多數的資訊都可以在網上找到,以互動式python教程的形式。
英偉達有一個叫做digits的工具包,它可以訓練并可視化複雜的神經網絡模型而不需要寫任何代碼。并且他們正在出售devbox,這是一款定制機器,可以運作digits和其他深度學習軟體(theano,caffe等)。它有4塊titan x gpu,目前售價15,000美元。
fuel是一款管理資料集疊代的工具,它可以将資料集切分成若幹小部分,進行shuffle操作,執行多種預處理步驟等。對于一些建立好的資料集有預置的功能,比如mnist,cifar-10和谷歌的10億詞彙語料庫。它主要是與blocks結合使用,blocks是使用theano簡化網絡結構的工具。
記得“國王-男性+女性=女王”嗎?事實上圖檔也能這麼處理(kiros等人,2015)。
當我們在點處,向移動時,那麼我們可以通過計算導函數來估計函數在新位置的值,我們将使用泰勒級數逼近:
同樣地,當我們将參數更新到時,我們可以估計損失函數:
其中g是對θ的導數,h是對θ的二階hessian導數。
這是二階泰勒逼近,但是我們可以通過采用更高階導數來增加準确性
adam coates 提出了一種分析gpu上矩陣操作速度的政策。這是一個簡化的模型,可以顯示花在讀取記憶體或者進行計算的時間。假設你可以同時計算這兩個值,那麼我們就可以知道那一部分耗費時間更多。
假設我們将矩陣和一個向量相乘:
如果m=1024,n=512,那麼我們需要讀取和存儲的位元組數是:
4 bytes ×(1024×512+512+1024)=2.1e6 bytes
計算次數是:
2×1024×512=1e6 flops
如果我們有塊6tflop/s的gpu,帶寬300gb/s的記憶體,那麼運作總時間是:
max{2.1e6 bytes /(300e9 bytes/s),1e6 flops/(6e12 flop/s)}=max{7μs,0.16μs}
這意味着處理過程的瓶頸在于從記憶體中複制或向記憶體中寫入消耗的7μs,而且使用更快的gpu也不會提升速度了。你可能會猜到,在進行矩陣-矩陣操作時,當矩陣/向量變大時,這一情況會有所好轉。
adam同樣給出了計算操作強度的算法:
強度= (#算術操作)/(#位元組加載或存儲數)
在之前的場景中,強度是這樣的:
強度= (1e6 flops)/(2.1e6 bytes)= 0.5flops/bytes
低強度意味着系統受記憶體大小的牽制,高強度意味着受gpu速度的牽制。這可以被可視化,由此來決定應該改進哪個方面來提升整體系統速度,并且可以觀察最佳點的位置。
繼續說說計算強度,增加網絡強度的一種方式(受計算而不是記憶體限制)是,将資料分成小批量。這可以避免一些記憶體操作,gpu也擅長并行處理大矩陣計算。
然而,增加批次的大小的話可能會對訓練算法有影響,并且合并需要更多時間。重要的是要找到一個很好的平衡點,以在最短的時間内獲得最好的效果。
據最近資訊顯示,神經網絡很容易被對抗樣本戲弄。在下面的案例中,左邊的圖檔被正确分類成金魚。但是,如果我們加入中間圖檔的噪音模式,得到了右邊這張圖檔,分類器認為這是一張雛菊的圖檔。圖檔來自于andrej karpathy的部落格 “breaking linear classifiers on imagenet”,你可以從那了解更多。
噪音模式并不是随機選擇的,而是為了戲弄網絡通過精心計算得到的。但是問題依然存在:右邊的圖像顯然是一張金魚而不是雛菊。
顯然,像內建模型,多掃視後投票和無監督預訓練的政策都不能解決這個漏洞。使用高度正則化會有所幫助,但會影響判斷不含噪聲圖像的準确性。
ian goodfellow提出了訓練這些對抗樣本的理念。它們可以自動的生成并添加到訓練集中。下面的結果表明,除了對對抗樣本有所幫助之外,這也提高了原始樣本上的準确性。
最後,我們可以通過懲罰原始預測分布與對抗樣本上的預測分布之間的kl發散來進一步改善結果。這将優化網絡使之更具魯棒性,并能夠對相似(對抗的)圖像預測相似類分布。
phil blunsom 提出,幾乎所有的nlp都可以建構成語言模型。我們可以通過這種方式實作,将輸出與輸入連接配接,并嘗試預測整個序列的機率。
翻譯:
p(les chiens aiment les os || dogs love bones)
問答:
p(what do dogs love? || bones .)
對話:
p(how are you? || fine thanks. and you?)
後兩個必須建立在對世界已知事物了解的基礎上。第二部分甚至可以不是詞語,也可以是一些标簽或者結構化輸出,比如依賴關系。
當frederick jelinek 和他在ibm的團隊在1988年送出了關于統計機器翻譯第一批之一的論文時,他們的到了如下的匿名評審:
正如作者提到的,早在1949年weaver就肯定了統計(資訊論)方法進行機器翻譯的有效性。而在1950年被普遍認為是錯誤的(參見hutchins, mt – past, present, future, ellis horwood, 1986, p. 30ff 和參考文獻)。計算機的暴力解決并不是科學。該論文已經超出了coling的範圍。
顯然,一個非常簡單的神經網絡模型可以産生出奇好的結果。下圖是phil blunsom的一張幻燈片,将中文翻譯成英文的例子:
在這個模型中,漢字向量簡單地相加在一起形成一個語句向量。解碼器包含一個條件性語言模型,将語句向量和兩個最近生成的英語單詞中的向量結合,然後生成譯文中下一個單詞。
然而,神經模型仍然沒有将傳統機器翻譯系統性能發揮到極緻。但是它們已經相當接近了。sutskever等人(2014)在“sequence to sequence learning with neural networks”中的結果:
更新:@stanfordnlp指出,最近一些結果表明,神經模型确實會将傳統機器翻譯系統性能發揮到極緻。檢視這篇論文“effective approaches to attention-based neural machine translation”(luong等人,2015)
richard socher示範了偉大人物圖像分類例子,你可以自己上傳圖像來訓練。我訓練了一個可以識别愛迪生和愛因斯坦(不能找到足夠的特斯拉個人相片)的分類器。每個類有5張樣本圖檔,對每個類測試輸出圖像。似乎效果不錯。
mark schmidt給出了兩份關于在不同情況下數值優化的報告。
在确定性梯度方法中,我們在整個資料集上計算了梯度,然後更新它。疊代成本與資料集大小呈線性關系。
在随機梯度方法中,我們在一個資料點上計算了梯度,然後更新它。疊代成本與資料集大小無關。
随機梯度下降中的每次疊代要快許多,但是它通常需要更多的疊代來訓練網絡,如下圖所示:
為了達到這兩者最好效果,我們可以用批量處理。确切的說,我們可以對資料集先進行随機梯度下降,為快速達到右邊的部分,然後開始增加批大小。梯度誤差随着批大小的增加而減少,然而最終疊代成本大小還是會取決于資料集大小。
随機平均梯度(sag)可以避免這樣的情況,每次疊代隻有1個梯度,進而得到線性收斂速度。不幸的是,這對于大型神經網絡是不可行的,因為它們需要記住每一個資料點的梯度更新,這就會耗費大量記憶體。随機方差降低梯度(svrg)可以減少這種記憶體耗費的情況,并且每次疊代(加上偶然全部通過)隻需要兩次梯度計算。
mark表示,他的一位學生實作了各種優化方法(adagrad,momentum,sag等)。當問及在黑盒神經網絡系統中他會使用什麼方法時,這位學生給出了兩種方法:streaming svrg(frostig等人,2015),和一種他們還沒釋出的方法。
如果你将“profile=true”指派給theano_flags,它将會分析你的程式,然後顯示花在每個操作上的時間。對尋找性能瓶頸很有幫助。
繼ian goodfellow關于對抗性樣本的演講之後,yoshua bengio 談到了用兩個系統互相競争的案例。
系統d是一套判别性系統,它的目的是分類真實資料和人工生成的資料。
系統g是一套生成系統,它試圖生成可以讓系統d錯誤分類成真實資料的資料。
當我們訓練一個系統時,另外一個系統也要相應的變的更好。在實驗中這的确有效,不過步長必須保持十分小,以便于系統d可以更上g的速度。下面是“deep generative image models using a laplacian pyramid of adversarial networks”中的一些例子——這個模型的一個更進階版本,它試圖生成教堂的圖檔。
arxiv編号包含着論文送出的年份和月份,後面跟着序列号,比如論文1508.03854表示編号3854的論文在2015年8月份送出。很高興知道這個。
本文作者:csdn