能不能給神經網路計算一個「學習進度」的指標?
「如何避免人肉調參」是深度學習的重要問題。 其中一個對解決有幫助的方向,似乎是用某些方法量度學習的「進度」。 例如說,我的網路本身深度不夠,或者某些層的神經元不夠,整個網路不足以學習目標函數,這時,每個神經元的 local gradient 會不會上下跳動而不收歛? 能不能綜合出一些統計數字,反映網路的學習是「有希望」還是「沒希望」的? 我覺得如果能做到這種量度,會是重要的一步。 歡迎討論。
有什麼參數?
- network topology
- learning rate
- 激活函數的形狀可以有參數,例如 sigmoid 的斜度可以調較,rectifier 可以有 leakage 項,我還嘗試過用多項式……
- 輸入的 normalization
- 權重初始值的範圍,例如 [0,1] 或 [-1,1]
- etc...
一個有趣的問題就是為什麼要調較參數? 對某一實驗問題來說,參數「不好」時究竟發生了什麼現象?
「如何避免人肉調參」是深度學習的重要問題么?
不是。難道你就沒聽過「調參聖手」這種角色設定么。
深度學習之所以能效果好,很多時候和網路複雜起來的技巧(Trick)和參數相關。沒調參的網路一般效果都比較慘,很多優質結果都是精細調參後的結構。甚至還有很多早期論文,當時很多人不能復現的原因就是作者沒公布參數,一旦使用作者的參數,效果就能大幅提升。
你的想法我們都懂,既然調參很重要,那自動調參豈不美哉?
但你要知道,現在人工智慧有一個段子叫「有多少人工就有多少智能」。高手調參效果絕對要比機器自動調參好很多。你要認為調參就是瞎蒙試錯,那我只能說你的參數真的有倒懸之急。高手調參不僅是嘗試,更在於理解。理解為什麼性能會隨著參數波動,理解參數到底表明了問題和數據的哪些性態,諸如此類的這些問題,不但可以使我們調出最好的參數,還能進一步啟發我們提升網路結構,此非天心人意乎?你要知道,一個網路的參數也是智能的一部分,如果智能演算法有知識產權,很可能網路參數就是申請熱點!這個被你看到的不足,有一定可能成為大家以後吃飯的本錢。我們要安邦輔國,不能反助逆賊。(大霧)
其中一個對解決有幫助的方向,似乎是用某些方法量度學習的「進度」?
看了一下你下面的分析,我個人覺得你想表達的可能是「泛化」這個概念。說白了就是怎麼學習神經網路結構才能讓網路性能好。神經網路的結構學習很早就有,但一直發展不起來。原因是結構和參數很難同時學習又不導致過擬合。結構和參數同時學習會使得訓練集誤差快速下降,然而測試集誤差飛速提高,這就是神經網路結構學習面臨的挑戰之一。也就是說你下面提出的那些統計量,很有可能只是導致訓練集誤差下降,測試一看,錯了一堆。
近年來有很多人利用非參貝葉斯來研究神經網路的結構學習,引用文獻太麻煩我就不找了,你可以自己到 ICML/NIPS 上看看,我記得是朱軍老師的一篇論文。這類方法的抑制過擬合的方式,就是加入先驗,比如比較基礎的中國餐館過程(CRP)這種。
下面說的這些參數,都得審時度勢地分析才能發現規律。- network topology:這個課題就是神經網路結構學習。
- learning rate:這個沒什麼好學的吧,你試試 AdaGrad 這類方法,基本學習率的調參能省一些功夫。硬要研究學習率的話,必須從凸分析的角度來思考。
- 激活函數:性質相同的激活函數差別不大,比如 很多時候差別不是很大。性質不同的有效激活函數,解析地講,能被我們利用的也不多。你總不至於弄一個 9 次多項式做激活吧。雖然聽上去也挺好,但實際用起來感覺不那麼靠譜。
- Trick:剩餘的那些,輸入的歸一化,初始化範圍,都是技巧(Trick),很重要,但總的來說,也不多,你挨個試一下就好。
可能你覺得我太過悲觀,上述四點都基本採用的是否定態度。但這個問題的本質可能不在於統計量,而在於我們對神經網路泛化的理解。說白了,我們對神經網路的運行機制還有待更深層次的解讀,所以結構學習現在暫且還進展有限。
關於通用的神經網路設計方法論。實際上,初學者往往希望「一口吃個胖子」,而這恰恰是不現實的。去年夏天,我開始學德語,名詞詞性(陰陽中)真的很麻煩,我真心想找到一種通用的記法。但很遺憾,我們對這個世界的理解還很淺薄,很多學科我們都無法給出通用的統一理論體系,只能一個一個地積累。現在的智能科學發展程度要給出一個通用的神經網路的設計方法論是不切實際的。我們只能把自己看過的每個神經網路都研究透徹,理解更為深層次的設計原則,不斷的積累。這些積累就是我們說的「知識」,這些「知識」再次大量凝結會誕生「原理」,而後是制轄「原理」的更上層「原理」,再來不斷提高,最終才能到達理解所有智能現象的幾條簡單的「法則」,就如同牛頓定律系統一樣。人工智慧才剛開始還沒過百年,當下要立刻給出「法則」對大家也是強人所難,所以我們只能一步步積累「知識」,提高對智能「原理」和之上體系的理解。小時候候學英語,你是不是也很煩那些不規則變化,而現在呢?再看到這些不規則變換,你會覺得很「自然」,不斷積累每一個神經網路結構,我相信就能到達「自然而然」地設計網路的理解才能。神經網路現階段還處於工具使用階段,相信到一定時期就會積累出相應的科學,神經網路相關的可解釋理論還需要更多科學家去探索,希望不遠的將來能夠看到
為什麼用這個結構,為什麼用這樣的參數還沒有理論解釋,但是Lecun說神經網路有許許多多的等效局部最優解,所以一個網路,雖然每次優化得到的參數不盡相同,但是最終的識別誤差卻是相近甚至一樣。現在有些人避開用vapnik的VC維去分析神經網路,改用泛函這類工具,但是這些工作進展也比較緩慢,畢竟這是個賺錢的行業,少有人去搞理論研究了,都去業界撈金了。沒有人跟這個時代過不去的,哈哈。至於學習進度指標,可以從訓練集中分出一部分數據進行驗證,當識別錯誤率出現上升時停止訓練,這時候網路的泛化能力是最強的,這是最基本的驗證方法。
你說的那些叫超參數,也就是不能通過訓練獲取的參數。
調參是超參數優化里的重要問題,比如scikitlearn里的格點搜索,隨機搜索,都是有相關論文的。但在機器學習里,應該還不算是重要問題。
(因為計算機博士生很便宜,讓他們去手動調就可以了)你問有沒有相關的統計量來評價超參數的好壞?這個在實際操作中,使用模型的預測誤差來評價。( 當然這個並不能算作嚴格意義上的統計量,因為在機器學習里,這個誤差不僅僅依賴於超參數和數據)
也就是通常把數據分成訓練集和測試集,憑藉在測試集上的效果來反應這一組超參數的好壞。在統計里也是用類似的方法的,比如嶺回歸。但統計里對統計模型的參數(不是超參數),通常有很好的辦法判斷顯著性。比如嶺回歸里,可以通過計算AIC或者BIC構造統計量進行假設檢驗。如果模型顯著,就接受這個模型。
但是對機器學習模型,並不能構造對應的統計量。因為AIC/BIC有意義要求Fisher信息矩陣正定,通常對於簡單模型這個是容易滿足的,但機器學習里的模型往往只能滿足非負定。
統計里也有相關的方法把"不好"的參數消除,但流程過於複雜,沒辦法應用到動輒幾千萬參數的機器學習模型里來。題主,你在嘗試用一群弱邏輯的指標去衡量一個強邏輯的演算法。
推薦閱讀:
※沒有GPU可以做深度學習嗎?
※如何看待Google的AutoML 已經學會自己編寫機器學習代碼?
※北京深鑒科技基於FPGA平台的DPU架構如何?
※如果兩個Alphago對下,可以根據結果測試出黑棋貼多少目才最公平嗎?
※向量 L1 範數最小化問題?
TAG:演算法 | 神經網路 | 人工智慧演算法 | 深度學習DeepLearning |