優化神經網路模型結構新方法
回顧姚期智院士雲棲大會演講乾貨:姚期智雲棲大會首日演講:為什麼我說現在是金融科技的「新」黃金時代
10月14日的阿里雲棲大會機器學習峰會專場上,與會嘉賓共同探討機器學習的前沿與挑戰。清華大學自動化系張長水教授為大家帶來「神經網路模型結構優化」的主題演講,分享了神經網路模型結構優化的新辦法,並解析實驗過程、效果及應用案例。
張長水,智能技術與系統國家重點實驗室學術委員會委員,清華大學自動化系教授、博士生導師,清華-青島數據科學研究院二維碼安全技術研究中心主任。主要從事機器學習與人工智慧、計算機視覺等研究工作。
以下是張長水教授演講實錄:
今天我和大家分享的主題是「神經網路模型的結構優化」。我大概會講這麼幾點:
研究背景
子模函數和超模函數
神經網路結構的優化
實驗部分
研究背景
當前,深度神經網路模型給我們帶成了很大的影響,深度學習模型在傳統的很多機器學習問題上,都取得了令人矚目的突破和進展。
我舉一個例子,比如圖像識別。圖像識別是這樣一個問題:有一張圖像,需要識別這個圖像是貓、是狗、是計算機、是羽毛球拍?在2012年,深度學習網路用於解決該問題時,有了很大的突破。
除此之外還有其他的問題,比如圖像描述、機器翻譯、語音識別。機器翻譯我們知道過去幾十年發展也很慢,基本上沒有辦法應用實際,也是因為深度學習方法的應用,使得機器翻譯有了一個很大的突破。百度因為這個方面的工作,大概在去年獲得了一個國家科技進步二等獎,是王海峰帶領他的團隊的成果。此外,語音識別,大家都知道,以前也是沒有到應用的水平,而現在我們就可以用。比如說大家用微信,就可以用語音輸入。目前為止性能還不錯的語音識別系統,全部都是用深度學習方法去做的。除此以外還有很多,比如醫療。還比如大家都知道的下棋。
深度學習方法應用有很多好處,同時也有很多問題。比如說,深度學習網路模型計算量特別大、模型特別複雜。模型複雜導致兩個問題,第一是訓練上的困難,第二個是測試上的困難。
訓練上的困難在於它需要大量的時間,而且一個深度學習網路要想在某個問題上達到特別好的實用化性能,需要特別多的數據。而這對於機器計算的要求、對於數據的要求,通常來說不是我們在高校擅長做的。因此,工業界就顯得很有優勢,他們有數據、有計算資源。
現在深度學習的技術進步了,但是訓練模型依然要花費很長時間。像我們實驗室動不動訓練一個模型就要一兩天的時間。另外測試時間也很長,我給一個數據,跑神經網路,最後從末端給出一個結果。這個過程看起來只有一遍過程,但是由於中間計算過於複雜,所以時間仍然很長。比如給一張圖像,通常來說如果代碼寫的不夠好,大概需要幾秒的時間,如果寫的特別糟也可能一分鐘的時間。可是我們知道有些應用問題不允許你這樣做,它需要你實時地識別圖像。
還有就是對內存有要求。神經網路模型有大量的參數都要存到計算機里去。如果你用的是伺服器,這就沒問題,但當你的這個技術走嚮應用變成產品,這就不一樣了。比如說無人駕駛車,我們希望無人駕駛車上裝的攝像頭能夠識別路上的情況、標識一些物體,你如果這麼做,就要在無人駕駛車上有一個識別設備。我們知道無人駕駛車是一個那麼有限的環境,它不太可能讓你放一個伺服器或GPU,所以它的計算能力很弱。
還有就是它對於電的要求高,我們知道GPU特別費電,車上不太可能放一個幾百瓦、上千瓦的供電系統。所以有人對AlphaGo的一個批評就是,你和人去比賽,人靠的是什麼,喝一杯牛奶、一片麵包、一個雞蛋就來參加比賽;AlphaGo靠什麼,後面有那麼大的一個供電系統。還有一個特別理想的狀況,既然深度學習做圖像識別已經有了很多突破,為什麼不用在手機上?可是一旦考慮用在手機上,就發現有一堆的問題:內存太小、計算能力太弱、耗電太厲害,所有這些東西都導致了神經網路現在在應用階段有非常大的困難。
因此就提出這樣的問題,我們怎麼樣讓深度學習網路緊湊、小型化。在實際中,我們做深度學習的時候有一個很重要的問題,就是要調參數。首先,給你一個問題,你有了數據,選擇了一個基本模型,但是這個模型結構到底怎麼設置,層有多少,每層寬度多少?這樣一些參數怎麼去定?有很多的因素會影響我們學習的性能。
有人做過一項這樣的研究,你能夠把網路學的好,學習率(learning rate)是最重要的一個因素。學習率就是我們求偏導的時候,會對導數的權重調整的係數,這個係數特別重要,有相當多的研究工作關注在這個地方,這個地方任何一個突破對所有人都是至關重要的,這裡「所有人」是指對神經網路使用的那部分研究人員。此外,每層的寬度也是一個重要的參數。我今天的報告主要講如何選擇每層寬度。
神經網路結構優化,有哪些已有的方法?
貝葉斯方法
權重參數是我們在訓練階段要學習的一個參數,此外我們需要提前確定的參數我們叫超參數。我們在超參數這個問題上怎麼去做?這是我們傳統的深度學習、機器學習比較關注的問題。我們假設有一個要學習的參數,有的時候我們給這個參數假設一個形式,例如:高斯分布,那這個高斯分布就是你的先驗,你再想辦法確定這個高斯分布的均值、方差。這就是貝葉斯方法。但是這樣的方法裡面,你需要先確定先驗。
導數的方法
優化目標函數通常的做法是通過求導完成的。我們往往對神經網路的權重進行求導。既然你的學習率是一個超參數,我們為什麼不能夠對它進行學習?所以如果你能夠建立你要優化的這個損失函數和你現在要學習的超參數之間的函數關係,建立這個函數關係以後,就可以去求梯度、求導。這個方法的優點是很明顯的,但是缺點就是,可能需要你把這兩者之間的函數關係理清楚。第二個,對於離散的問題,這種辦法就不好用。
網格搜索
超參數還怎麼優化?在實際過程中我們還有一些經驗上的做法,比如說網格搜索。大家去設想一下,在神經網路之前我們大家學過支持向量機。支持向量機的目標函數有兩項:是間隔項和懲罰項。這兩項之間會有一個C來平衡大的間隔和錯分樣本的懲罰。這裡 C是需要提前定的。但是實際中我們不知道C是多少。實際做的過程就是,我們通過網格搜索把這C等間隔取值,分別優化SVM,使得我能夠得到一個特別好的結果。調好參數很重要,一來你要去發文章的時候,把你的參數調的儘可能好,和其它最好的方法去比較。另一個就是調系統和產品,我們希望自己的系統性能儘可能好,去賣個好價錢。
假如我們要優化一個神經網路,而我只關心這兩層的寬度。所謂的網格搜索就是,讓每層的寬度取值5、10、15、20、25個節點,然後兩層一起考慮,遍歷所有的組合。這樣做保證不丟掉一些重要的結構。可想而知,這種做法非常慢,而且我們神經網路往往會很多很多層,所以這是一個很頭疼的事。
即使採用遍歷的方法,網格搜索的方法後來也被認為不太好。在2012年Bengio在 「The Journal of Machine Learning Research」發表的工作告訴我們,假設你要優化的那兩個參數,可能有一個很重要而另一個不那麼重要,網格搜索就意味著構成一個這樣的搜索點的分布,這個分布向兩個方向投影,就意味著你搜索了9個點,而在每個方向上都有一些搜索點重複。如果我們採用隨機採樣的方式,而不是網格搜索的話,就有可能會充分利用這九個點採到這個特別重要的點。他們做了一些理論的和實驗的分析,說明隨機搜索效果往往會更好。而比較有意思的,隨機搜索本身其實是一個很簡單的過程,不需要那麼多的預備知識和技術,所以是一件挺好的事。
結構優化是一個離散優化問題,所以我們用前邊很多的貝葉斯方法、求導方法不能用,所以通常情況下,都是人工做的。如果我們在座的有老師,讓你的學生去調參,說你要網格搜索,他可能會拒絕,他說這事我搞不定,這個參數組合太多了,另外,我們機器承受不了,我算一次就要1天、2天,我這樣一組合可能要幾百次、幾萬次人工調參數。所以人工調參數費時費力。
此外,就是需要特別多的知識,你要有很多的知識和經驗才能調好參數,對專家的依賴性很強。更關鍵的問題是,我好不容易花一個月把參數調好,現在換一個數據集,我還需要再花半個月時間調參。另外是當你的應用場景發生變化的時候,新的客戶來了,這個時候你不得不調,非硬著頭皮做不可,所以熬夜就成了家常便飯。
其它優化手段
其一,低秩近似。我們把神經網路這些權列成一個矩陣,假設這個矩陣是低秩的,加上低秩正則以後,去優化這個網路結構。換句話說,在你優化整個目標函數的時候,同時希望這個秩要低。如果把約束加在全連接層上,效果就比較好。
其二,去掉無用的連接和節點。神經網路每相鄰層之間都是連接,我們有的時候會問,所有這些連接都有用嗎,是不是有的連接沒有用?如果是這樣的話,我們是不是可以把沒有用的連接去掉。換句話說,看起來那個權重是有,但是其實很小,我們總覺得特別小的權重起的作用很弱,我們就把它去掉。
這種想法有人做過,就是我先訓練一個網路,訓練好以後,我看哪個權重特別小,把它去掉,然後再重新訓練。訓練穩定了以後,看哪個權重又小,再把它去掉,一點點這麼去做。好像2015年NIPS會議上就有這樣一個文章發表,大概用的是這樣的思路。當然也有人說,我對於你們的權重加一個稀疏的正則,去優化。當然這樣從做法上更流暢、更漂亮。後來有人說,除了連接很重要,中間有幾十萬個節點,每個節點都很重要嗎,能不能把某個節點去掉,這個做法就是節點稀疏。
其三,量化權重。現在整個權訓練好了,但是因為有很多權,我要存這些權就很麻煩,因此大家想,這個權重不用浮點數,用整數行不行?整數做的一種辦法就是,把所有的權重都聚類,在聚集多的地方取值,其它的用近似。還有一種做法就是,把所有的權重量化成幾個等級,比如有4個等級。一個極端是兩個等級,有和沒有,有的話就是1,沒有的話就是0。在這種情況下你會發現,整個神經網路計算就變得非常非常的容易,只存在有和沒有,就變得非常的簡單和快速。
當然,所有這些方法都會帶來副作用,就是你的識別率會下降。有的時候我們會說,我們關注這個演算法能不能放手機里去,因為通常來說,放到手機里的很多應用程序對識別率沒有那麼高的影響,認為大眾對有些識別問題的要求可能沒有那麼高。這樣識別率降一點也沒有特別大的關係。
子模函數和超模函數
子模函數和超模函數是後邊的網路結構優化要用到的知識。介紹的時候我先說明,這裡面大概有10頁左右的PPT是從這個網站上拿過來的(網址:http://www.select.cs.cmu.edu/tutorials/icml08submodularity.html)。在2008年國際機器學習大會有一個特別好的tutorial,就是關於子模函數和超模函數。那個報告給我印象深刻,所以我就把其中的幾頁拿過來在上面做了一些改動。不管怎麼說,謝謝這兩個作者。課後大家如果對這個有興趣,可以去看看他們很完整的PPT。他們對子模函數和超模函數介紹非常詳細,很感謝他們。
子模函數和超模函數,是關於集合函數的一些性質。集合函數是指,這個函數是定義在它的子集上的函數,這個函數在每個子集上的取值。通常我們認為空集函數是對應的是0。
什麼是子模函數?子模函數是怎麼形成的,我們不去管它,可以把它看成一個黑箱(black box),但是我們希望這個函數具有一個這樣的性質:對於任給的A、B兩個子集, F(A)+F(B) ≥ F(A ∪ B)+F(A ∩ B)。
如果它滿足這個條件,就說它是一個子模函數。這樣的性質也等價於這個性質:有兩個集合,一個是A,一個是B,A集合是B集合的一部分。這種情況下如果在A集合上加上一個元素,這個集合就變大一點,變大了以後,這個函數會比原來A集合函數增加了一部分,在小的集合上增加的量要更大大。換句話說,小集合加上一個元素帶來的改進更大,而在大的集合上增加同樣的元素以後,它帶來的影響會比較小一些。
什麼是超模函數?如果F是一個子模函數,前面加一個負號,那就是超模函數。
這件事有點太抽象,我們舉一個具體的問題,這樣大家就會有很直觀理解。假設,現在有一個房間,我們需要在房間裡布置一些感測器,布置感測器是為了對整個房間進行數據採樣。每個每個感測器會有一個覆蓋面積。我們希望放上有限的感測器,覆蓋的面積越大越好。在這樣一個問題裡邊,對於任何一個集合,F(A)=A能夠覆蓋的面積。所謂的A是什麼呢?就是你放的感測器,因為每個感測器會放在一個位置上。
這個問題里的F是一個子模函數(我定義F是它覆蓋的那個面積)。為什麼呢?可以設想,我有兩種情況,一種情況是我放2個感測器,還有一種情況是,我放4個感測器,其中包含了剛才的兩個感測器。我在2和4個感測器的布局裡,分別再加上同一個位置的1個感測器,那麼你會發現上面小的集合情況(2個感測器)下帶來的面積增加量比較大。而原來4個感測器的集合增加的面積部分比較小。這是一個非常直觀的例子。
子模函數有一個很有意思的性質:假如Fi是子模函數,這個λi>0,它的正的線性疊加仍然是子模函數。就是在正的這種線性組合的意義上它是封閉的。
我們怎麼去理解子模函數?對子模函數的尋優對應的是一個離散的優化問題,我們可能知道更多的是連續的優化問題。在連續優化問題裡邊我們比較喜歡的一個問題叫凸問題,就是說白一點,我們只有一個單峰。這種情況下找最大值相對比較容易。我們通過求偏導,原則上一定能找到最優值。但是到離散問題以後,什麼是凸我們就不知道了。而子模函數類似於我們在連續問題里的凸函數。下面這個例子會呈現子模函數與凸問題的關係。
假設有一個這樣的函數g,它是從整數到實數的一個映射,函數F定義在A集合上,這個子模函數怎麼定義呢?它就定義成我這個集合的「大小」,把集合別的因素都去掉,只考慮它的大小。這樣如果兩個集合a是b的子集,那麼 a的大小 < b的大小。這個函數的特點就在於,在小的地方增加一點所帶來的增益,和在大的地方同樣增加一點所帶來的增益,前者要大。所以你也可以認為,子模函數是離散函數的一種凸性質。
當然你會說我們還有別的運算,比如說兩個子模函數F1、F2,求最大,那還是子模函數嗎?它的最大max(F1,F2)不一定是子模函數。它的最小,就是這兩個子模函數取最小,min(F1,F2)一般來說也不一定是子模函數。
神經網路結構優化
我們做的這個神經網路結構優化工作的想法就是,希望讓演算法來優化網路寬度,而不是不要讓人工來調。我們怎麼做這個事呢?
首先,把我們剛才的結構優化問題變成一個子集上的優化問題,這樣就往我們剛才談到的子模函數靠近。我們再分析一下我們要優化神經網路的目標函數,它有什麼樣的性質?是一個子模函數嗎?這裡我們關心它的單調性和子模性。把這兩個問題解決掉以後,我們再給優化一個演算法,這個演算法又簡單、效果又好。這就是我們大致的思路。
1. 離散向量優化問題轉化為子集選擇問題
第一個要說明的是,我們優化的一個神經網路,不局限於一定是個全連接網路,它可以是一個CNN,也可以是一個RNN,也可以是一個LSTM。在實驗部分我們對這些模型都做了實驗。
我們假設神經網路里每一層都有一個寬度,第一層的寬度W1,第二層的寬度W2……寬度表示這個隱含層的節點數。對於一個神經網路而言,我們關心的是要優化這個寬度參數,使得在一定計算量的要求下神經網路的識別率儘可能高,也就是性能儘可能好()。或者,在識別率比較高的前提下,計算量要儘可能地小()。當知道這個網路大概是什麼樣, 就是一個確定了寬度的網路結構。
我們把具有不同寬度的網路結構優化問題看做一個自己選擇問題。
2. 分析目標函數的性質
我們看目標函數有什麼樣的性質。首先它具有單調性:A?B,那麼(SA)
如果是這樣的我們就有這樣的性質,小的網路性能比大的網路性能來的差。這件事證明起來不困難。基本的證明想法就是,如果你在一個小模型得到了特別好的結果,然後我就把小模型放在大模型裡面去,大模型其它地方都填0,從這個時候開始作為初始化重新優化,一定能夠優化一個比它更好的結果。另外一個就是,大模型比小模型計算時間更多:SA ? B,那麼T(SA) >(B)。
我們希望這個函數是子模函數,但是這不一定。因此,我們分析一下,什麼樣的條件可以保證一個函數是子模函數。
我們做了一件事:用一個樣條函數,由已知的離散點插出這樣一個連續函數。我們要求,在取到的整數離散點處和它的值是一樣的。第二,它是單調的,中間光滑的。第三,它的二階導數存在。這樣要求,從技術上說並不困難滿足。
下邊我們說,就是性能和時間具有什麼樣的性質。我們看一下這兩層的情況,假設我們可能只有這兩層,包括x層和y這一層。假如我們要求P這個函數是一個子模函數,那麼下面這個定理告訴我們這個函數應該要滿足什麼樣的條件:
這個定理告訴你,對於任意的兩層x、y,它的二階導數(這個Pxx就是對x求二階導數,這個Pyy是對y求二階導數),都要小於0,如果滿足這個條件就具備子模性。Px是什麼意思?就是對x求導,這表示x這層的節點增加以後P的性能的變化。P的性能我們剛才已經說了,是單調的。也就是說,這一層網路變寬了以後,網路的識別率會好一點,所以這個Px表示的就是性能增加的程度。
Pxx是對Px求導。Pxx
我們同樣可以把這件事用於時間這個函數。同樣我們也可以得到一個對稱的性質,這個性質是超模性,因為時間和剛才的準確率剛好是反的。
我們直觀理解上面這個事是對的。但是這還不夠,因為我們還沒有證明。但是我們希望這件事是對的,怎麼辦呢?我們就這樣去做,你這個P導致那個插值函數未必是滿足條件的,我們能不能對這個P做一個變換,變換以後的那個函數成為子模函數。
所以我們就做了一個函數變換,函數變換實際是在原來的函數上乘一個正數1,作用於這個函數,把它變換成一個子模函數。如果這個函數選擇的好,例如是個單調函數,那麼,P()和P1這兩個函數是單調的,所以在相同的地方取最大值,因此不影響我們優化問題結果。這個裡面, 1, 2 正整數,1 , 2單調遞增函數。
這個變換是什麼樣呢?我們先對這個函數計算二階導數:
我們首先希望這個東西,令和。根據這個結果,我們就可以確定係數1。我們不僅對Pxx有要求,同時Pxy也要小於等於0,Pyy也要小於等於0,所以你選擇的這個 1應該大於等於所有三個比值中最大的那個。我們有了這個式以後就知道了,這個變換應該怎麼取。這麼做就保證隨便給我一個這樣單調遞增的函數就可以把它變成子模函數,這是一個有意思的事。
和這個變換對應的是一個飽和加強變換,就是說我能夠使這個函數變得儘可能像一個子模函數,當然我們還有一種飽和減弱變換,就是如果你特彆強,我們也可以讓它變得弱一點。這裡用了這樣一個函數。
同樣我們還得到了兩個函數:發散加強變換和發散減弱變換。所以我們可以把一個函數變成子模函數,也可以變成超模函數。
我們怎麼去估計值呢?因為剛才說了,我們用樣條函數回歸,從而得到插值函數。具體做法就是,已經知道了在某些點上P的值,用一個局部加權二次回歸的辦法得到一個連續函數:
這種連續的形式能保證剛才那幾個條件,就是在那幾個離散點上是和它值相等的,單調遞增的,二階導數是存在的。我們要優化的是這樣的目標函數,我們希望這個目標函數最優。這是一個簡單的回歸問題,這個問題有一個閉式解。最後的解很簡潔。
這件事告訴我們說,當你已經有了幾個點以後,你可以非常明確地把這樣的值算出來,你的變換是指定的,所以這個變換函數就已經有了,有了以後就告訴你說,你能保證這個P是子模函數、T是超模函數。
3. 提出演算法並給出解的性質
在連續函數情況下,如果函數是凸的,優化的時候比較簡單,就是你只要求偏導,就能得到一個最優值。離散情況下有點類似,如果它是一個子模函數,你用一個貪婪演算法求解就可以。不一樣的地方是,在連續問題下你能得到一個最優解,而在離散情況下你不一定能得到最優解。儘管這樣,但是你能得到一個不錯的解,你能得到一個性能有保障的解,這對我們來說已經很好了。比如我們前邊給了大家幾種優化的策略,那些優化策略,有的時候好、有的時候不好,好到什麼程度你也不知道,差到什麼程度你也不清楚,但是我們用這個方法就會有理論保證。
我們現在要優化這個問題,這裡的優化的函數是子模函數,約束是一個超模函數。我們的演算法是這樣的,初始化可以從空集開始。所謂的空集並不是真的空,是我已經假設這一層最少比如說有10個節點,是從10開始的,而在這個地方空集就意味著從10開始的意思。我從空集開始往上加節點。我在當前的情況下去考慮增加一個節點或者幾個節點,我增加進來以後,我看這個性能是多少,這個性能比剛才相比增加了多少,我算這個增加量。
算了增加量以後,你要考慮它有好幾個可能性,我選一個最好的,比如我有三層,每一層都增加一個試一試,看在哪一層增加效果最好,你選出增加量最大的出來。這就是我在當前這一步選擇的優化方向。你把這個放進來以後,你的子集就變得大一點,第一輪迭代就結束了。下面繼續迭代。當然做這個事的時候,你要檢查你增加進來這個節點以後,時間是不是小於這個B,是不是滿足你的時間約束,不滿足也不行。就這樣逐步增加節點。這個演算法是不是很簡單?就是在各層上找一個節點,看看哪一個使得網路性能變革的最厲害,增加的量最大。
因為它是子模函數,所以我們就可以來分析它的性質。這個就是做機器學習的人特別關心的一件事,就是最好不要只給這個演算法,說我這個演算法好。你做一些實驗是迫不得已的辦法,如果你能給出一些理論分析就會覺得比較放心。我們這個定理就是這樣的:
我有兩個解,一個是整個網路能達到最好的解(全局最優),一個是我這個演算法給出一個最優,這兩個最優解之間差一個倍數關係,這個倍數關係你可以算一下。當然我們經驗上來看,實際的優化的結果非常好。我們試過用這樣的方法去解不同的問題。這個解是在滿足這個約束時的解。這個約束的閾值B前面還有一個係數,這個係數通常來說是小於1的,也就是說它給出的這個解是比這個時間約束要更嚴格的一個情況下得到一個解,換句話說,這個解還沒有那麼好。如果時間多一點,解的性能可能會更好。
下面我們還可以給另一個演算法,同樣的問題,我們做法是這樣的:
在這個演算法中,不僅僅要算P的增加量,還要考慮時間的增加量,用這個比值來衡量那個增加哪個節點更划算。同樣要求增加了節點,以後時間是滿足這個要求的。
對於剛才這個演算法我們也有一個類似的性能。當這個時間滿足這個條件的時候,剛才的演算法給出最優解S*,這個S*和全局最優解之間是這樣的關係。這個解會比剛才演算法的解更好。
這是剛才在有約束的情況下的演算法。解這樣優化問題的時候,其實還可以換一種思路去解,就是我們剛才那個約束優化問題寫成這樣一個形式。
就是把這個約束以一種這樣的形式加到目標函數上去,如果是這樣我們給這樣一個結論,如果S*是原始優化問題的全局最優解,我們就知道S*同時也是這個無約束形式問題的全局最優解。
如果都是全局最優解,那麼λ怎麼取?如果我有兩個λ,一個小一點,另外一個大一點,現在S1是這個問題的全局最優解,S2是這個問題的全局最優解,我們知道λ小的時候所對應的時間閾值更大。看這個圖,λ變得越來越大的時候,上限會這樣去降,剛開始會降的很厲害,到一定程度以後就已經降不大了。
在這種情況下,我們給出一個確定性的貪婪演算法。這個演算法是這樣:剛開始是空集,增加一個節點,這個節點增加的時候,加進來算一算增加量是多少。我們還要考慮假設在整個節點上,性能減掉多少。相比一下看是不是值得增加,如果增加量這個a比較大,那就加上去。我們同樣的得到一個和它對應的是另外一個演算法,這個演算法是我們需要算一個a的增加量和b的減少量,到底我要不要接收這個S,要以一定的概率來考慮,怎麼叫以一定的概率呢?我們對於一個給Y變數,讓它服從均勻分布,如果這個均勻分布採樣得到這個值小於這個東西把這個加進去,這是一個隨機的演算法。
下面這個結論告訴說,剛才這裡有兩種演算法,我可以給它一個理論保障,這個理論保障是這樣的。如果這個So是整個這個問題的全局最優解,剛才第一個確定性的演算法給出的解S1大於它的1/2, 2.4這個演算法給出的解的數學期望是也是大於最優解的1/2。這樣一來我們就知道這個演算法有理論的下界,這件事告訴我們什麼?你可以放心大膽的用這個演算法。
看起來我們把所有事情都做完了。其實還差一點,我們要知道我們剛才一直在優化什麼?我們剛才一直優化的全是這個東西,就是P1,把P做了一個子模變換以後的東西。其實我們訓練一個網路,更關心的是原來的那個P。不過,因為這兩者是一個一一對應關係。所以通過P1,P的對應關係,就可以得到真正的P。這件事情告訴我們什麼呢?在這個函數變換中要乘1,可以乘得很大,也可以乘得很小。
如果乘的很小意味著你沒有太多的變換因素。如果很大意味著增加了太多的變換因素,使得它變成一個子模函數,但是其代價是,得到的理論的下界變小了。所以1的取值不要那麼任意,不要說越大越好,越大越是一個子模函數,對P1來說很好,但對於P來說沒那麼好。第一個極限的性質說,當1趨向於0的時候,就是一個最優值,如果1趨向於無窮,沒有什麼意義。
這裡總結了一下,不論原函數是不是具有子模性還是超模性,你這個函數都可以做變換,使得變換以後的函數接近模函數。
當然還有其他的技術,例如使用替代函數加速探索新的區域。
實驗部分
我們關心的是,在已有的數據集上我們的方法是不是比人工調出那個結構好。我們去看一下這個實驗。在MNIST數據集上實驗,也就是做手寫數字識別。比較有意思的是,我們看這條虛線,對應的是LeNet,就是人們已經在數據集上仔細調出來的一個網路。我們可以知道我們的這些網路結構的準確率還能超過它。人調了半天得到一個結構,我們告訴你調的還是不夠好,演算法可以調的比你更好,就是這個意思。這個更好體現在什麼地方?在同樣的運行時間情況下,我得到的結構的識別率比你好。如果看相同的識別率的結構,我的結構比你少很多。
我們還是和已有的工作去比。在text8這個數據集上去做比較。
有人在這個上面去做識別率,它的網路結構是[256,256,256],時間是144.5,單位時間是e的-5次方秒,它的性能,這個指標越小越好。我們用我們的演算法自動調出一個結構,可以得到一個更快的模型,這個模型會比它更小,大概快了20%多。識別率差不多,因為我們要求速度要快。我們還有一個識別率更好的模型,就是時間和你差不多。
下面是在另外一個數據集上WMT,我們的演算法和剛才是一樣,要麼同樣的時間比你性能好,要麼同樣的性能下時間短。
下面是我們在做的另外兩個問題,一個是交通標識識別。交通標識識別就是一個這樣的問題,我們有一張圖像,這些是我們關心的交通標識,我們需要識別這個交通標識的含義,比如這個是轉彎、限速、往前走、停車等等。在交通標識這個問題上,其實如果你有了足夠多的數據標註得很好,這個性能應該能達到還不錯的性能,現在大家都能夠做到。
但是這裡邊有一個問題,就是因為我們深度網路計算量特別大,而交通標識識別要用在無人車上。無人車要求演算法一定要快。因為車以很快的速度往前跑,如果演算法太慢的話,這個標誌都過去了你才告訴我說「禁止停車」,這不讓我犯錯誤嘛。我們說快到什麼程度?原則上我們認為1秒鐘15張圖以上就算比較快。當然這依賴於你的車速,如果你的車開的速度更快,那麼要求你每幀都識別出來了。
我們知道讓演算法識別一個標識,其實也不太慢。可是你面對的是整張圖,通常來說你的視野下很多很多物體,有行人、有車、有交通標識,可能還有路面,還有樹,還有商場。如果我們用現在的這種演算法,我們需要先猜什麼地方是交通標識,然後再去識別。比如說我們現在會有這樣一個演算法,先猜出2千個左右的候選,然後一個一個去識別。
假設1秒鐘識別一個標識,那麼這2千秒鐘過去了。在這個應用中時間是大問題,就是怎麼去加速是很重要的問題。可是這裡邊你又不太好去用GPU,因為汽車可能沒有那麼大的供電能力,他要求你的用電最好10瓦—20瓦。這個問題裡邊它對時間要求特別高。我們以前做過這個事,我們的演算法非常快速,1秒鐘能識別20張圖像(不是20個標識)。
我們看看人工模型,人工模型【70、110、180、200】,計算時間是這樣的,現在它的正確率是99.65%。我們的演算法給出了兩個更好的模型,一個是識別率更高,一個是速度更快。
再看另外一個問題,基於遞歸神經網路的圖像描述演算法。
圖像描述是這樣一個問題,給你一張圖像,你給我生成一個句子來描述這個圖像。原來的圖像分類可以說是一個詞,現在必須是一個句子。這兩個其實會有本質的差異,後者更關注物體之間的關係。以前分類只是說,有人、有筆記本、有隻鳥、有電線杆,僅此而已,但是並沒有區分他們之間是什麼關係。圖像描述要說他們的關係,而且說關係的時候要自然語言描述,所以有很多不一樣的地方。
解這個問題的模型非常複雜。這和我們做圖像識別不一樣。做圖像識別我們有一些經驗,大概知道怎麼調參數,而這個問題其實我們根本不知道怎麼調,我們都不知道哪個因素更關鍵,所以我們以前人工調的時候基本上不考慮時間,只要性能好就行。後來當然我們不斷去調,調的還不錯。現在可以用演算法來調參數,給一個更準的模型,或更快的模型。
下面這是我生成的句子,你看看還是不錯的,A man sitting at a table using a laptop,他坐在桌子上有一個筆記本電腦。這個a white plate topped with a half eaten sandwich,不僅僅說一個白盤子上面有一個三明治,還告訴你是咬了一半的三明治,這些細節都能抓得住。我們提出一個神經網路結構優化方法,這個方法比人工調整好,可以得到一個更好的模型,根據你的要求也許更快、也許準確率更高。
大家可能問,你們這個工作還不錯,但是看起來很複雜,你有源代碼嗎?我們這個代碼也準備公布,但是還沒做好,估計我們要有一兩個月能做好,到時會把它公布放在網上。這樣大家去實驗會更簡單一點,讓機器調參數,你用省下來的時間做更重要的事。
我今天就說這麼多。謝謝大家!
※獨家 手把手教TensorFlow
※語義視角下的跨學科與跨界數據認知講座
※開發者必看:超全機器學習術語辭彙表!
※清華大學文化經濟研究院成立 李嵐清篆章相贈:文化自信,經濟騰飛
※數據蔣堂 有序分組
TAG:數據派THU |