當前位置:
首頁 > 知識 > 清華大學張長水教授:神經網路模型的結構優化

清華大學張長水教授:神經網路模型的結構優化

張長水教授,清華大學自動化系教授、博士生導師,智能技術與系統國家重點實驗室學術委員會委員,智能技術與系統國家重點實驗室副主任。主要從事機器學習、模式識別、人工智慧、計算機視覺等領域的教學和科研工作。

以下是根據張長水教授現場分享整理的文字報告.

今天我和大家分享的主題是「神經網路模型的結構優化」。我大概會講這麼幾點:

研究背景

子模函數和超模函數

神經網路結構的優化

實驗部分

Part 1: 研究背景

當前,深度神經網路模型的出現給我們帶成了很大的影響,這個影響大部分都是積極正面的,但是同時也存在一些不同看法。不管怎麼說,深度學習模型在傳統的很多機器學習問題和相關問題上,都取得了令人矚目的突破和進展。

我舉幾個例子,比如圖像識別。圖像識別是這樣一個問題:有一張圖像,需要識別這個圖像是貓、是狗、是計算機、是羽毛球拍?在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。在這種情況下你會發現,整個神經網路計算就變得非常非常的容易,只存在有和沒有,就變得非常的簡單和快速。

當然,所有這些方法都會帶來副作用,就是你的識別率會下降。有的時候我們會說,我們關注這個演算法能不能放手機里去,因為通常來說,放到手機里的很多應用程序對識別率沒有那麼高的影響,認為大眾對有些識別問題的要求可能沒有那麼高。這樣識別率降一點也沒有特別大的關係。

Part 2: 子模函數和超模函數

子模函數和超模函數是後邊的網路結構優化要用到的知識。介紹的時候我先說明,這裡面大概有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的大小

當然你會說我們還有別的運算,比如說兩個子模函數F1、F2,求最大,那還是子模函數嗎?它的最大max(F1,F2)不一定是子模函數。它的最小,就是這兩個子模函數取最小,min(F1,F2)一般來說也不一定是子模函數。

文章來自:Frontiers

推薦《人工智慧系列課》

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI講堂 的精彩文章:

全球第一個法定數字貨幣首日募集7.35億美元!

TAG:AI講堂 |