江寒在這個FCN網絡中,實現了一種新的訓練策略,也就是迷你批次訓練法。
簡單地說,就是每次在18萬個訓練數據中,隨機抽取若干條數據,組成一個小包,作爲訓練的樣本。
然後,若干個小包組成一個完整的批次,訓練若干個批次後,訓練過程就宣告結束。
顯而易見,相較於一次訓練全部數據,這樣做既節省了資源,又能提高訓練速度。
這裡涉及到3個超參數:每個小包的數據條數n,每批次包含的小包數量m,以及訓練的總批次s。
神經網絡裡,每個神經元的偏置和權重,都是在訓練中獲得的,稱作參數。
而學習速率、隱藏層神經元的數量,隱藏層的層數,權重初始化方案的選擇、激活函數的選擇、損失函數的選擇……
這些都是超參數,必須在神經網絡訓練之前指定。
但由於缺乏理論指導,沒有人知道這些超參數,到底如何選取才是最合理的。
所以在實踐中,往往先根據經驗,暫時預設一個差不多的,然後在訓練的過程中,根據反饋結果,慢慢進行調整。
打造神經網絡的過程中,最困難的就是超參數的選擇,這往往意味着巨大的工作量。
每次調整超參數,都要重新訓練一次神經網絡,才能知道這次調整是否成功。
更麻煩的是,超參數之間並不是相互獨立的,經常會調整了某一個,就會影響到另一個。
極端情況下,就會像多米諾骨牌一樣,一個影響一個,最後導致全盤重來。
在原來的世界,機器學習算法工程師們經常爲此撓破了頭皮。
所以他們又自嘲或者被戲稱爲“調參狗”……
這個問題的解決,往往取決於網絡設計者的經驗。
一名合格的調參狗……咳,算法工程師,往往能憑經驗和直覺,大體確定超參數的取值範圍,然後根據實際情況逐步優化,直到取得近似最優解。
江寒當然算不上經驗豐富,但前世玩神經網絡的時候,也接觸過不少討論超參數選擇的文章。
以權重初始化舉例,就有不少可行的方案:初始化爲0值、隨機初始化、Xavier初始化、HE方法等。
其中,Xavier初始化又包含許多種做法。
比如將權重w的隨機初始化區間,設爲正負sqrt(6/(n0+n1))之間。
其中,n0是上一層神經元的個數,n1是本層神經元的個數。
這是一個經驗公式,很多時候都很好用,江寒還記得這個公式。
其他超參數的選擇,激活函數的選擇、損失函數的選擇……也有諸多可用的方法、方案。
除了一些前世接觸過的方法,江寒自己也有過許多奇思妙想,琢磨出來不少亂七八糟的超參數選擇方案。
這次做FCN模板,索性將它們全都編寫成函數,塞到了模板代碼中,用以備選。
除此之外,還要解決過擬合問題。
過擬合是機器學習的一道難關,一旦發生這種現象,就會導致訓練好的模型,在訓練集上表現優秀,而在陌生數據集上表現欠佳。
這是無論如何都要避免的。
要想避免過擬合,通常的做法有:擴大學習規模、降低網絡規模、對權重參數規範化,以及非常激進的Dropout方法等。
擴大學習規模,就是儘可能收集更多數據,進行訓練。
Kaggle的這場比賽中,官方提供了足足20萬條訓練數據,這意味着不怎麼需要在這方面下功夫了。
如果提供的訓練數據較少,那麼往往就需要人爲擴展訓練數據。
比如:將圖像略微旋轉、平移、翻轉、縮放、加入噪點像素……
降低網絡規模,的確可以減輕過擬合,但同時也削弱了學習能力,所以一般不作爲優先選項。
權重正規化也叫正則化(regularization),就是在未規範化的代價函數上,附加一個權重絕對值的和,使得網絡傾向於學習少量的、重要度較高的權重。
這一辦法,江寒在這個模板中,也作爲備選項加以實現了。
至於Dropout方法,做法是按照給定的概率P,隨機刪除全連接網絡中部分隱藏神經元,以達到簡化網絡,降低過擬合的效果。
雖然挺簡單,但江寒並不準備現在就用出來。
這至少也價值一篇三區以上的論文,用在這種小比賽中,未免有些浪費。
江寒將自己知道的、能想到的方法、方案,全都羅列出來,編製成函數,放進了模板代碼中。
然後將代碼複製了130份,稍作修改,讓它們分別使用不同的超參數設定策略。
這樣,就出爐了130種候選的訓練方案。
江寒將這些方案連同訓練數據包,一起上傳到了自己放在車庫中的服務器和五臺工作站中,然後指揮它們開足馬力,同步進行訓練。
如果光靠筆記本電腦,這130份代碼一個一個訓練過去,怕不得兩、三個月之後,才能輪一遍?
現在就簡單了,大約明天晚上,這130多份方案,就能得到初步的訓練結果。
到時候根據反饋,從中選擇一個表現最好的,全力訓練就可以了。
這種做法,和有些人選男/女朋友的原則差不多。
廣泛培養,層層選拔,然後擇優錄取。
至於選剩下的怎麼辦?
先備着唄,反正又不吃草料……
搞定這些事情之後,時間已經夜裡10點半。
江寒站起來,活動了一下筋骨,然後上牀休息。
剛鑽進被窩,夏雨菲就依偎了過來。
安靜地躺了一會兒後。
“你……”夏雨菲欲言又止。
“怎麼了?”江寒溫和地問。
“那個……那個鮑魚,還、還沒過勁兒嗎?”
江寒搖了搖頭,實話實說:“已經沒事了。”
夏雨菲自責地說:“都怪我……”
江寒笑了笑,促狹地問:“要是今晚上都過不了勁兒,你還想負責是怎麼的?”
夏雨菲咬了咬嘴脣,把頭埋在他胸口裡,一聲不吭。
這樣江寒就明白了。
她沒準真有那個意思,雖然不可能動真格的,但很可能會……
嘖,早知道就不逞英雄了,偶爾裝一次可憐,又不會傷筋動骨。
嗯……
不知道現在把話收回去重說,還來不來得及?
在線等,挺急的。
……
不知過了多久,兩人先後入睡。
江寒摟着小媳婦,美美地睡了一覺。
第二天早上,仍然是五點左右,精神抖擻地起牀。
洗漱完畢後,江寒先遠程登錄了一下服務器,查看了一下訓練進度。
可惜沒什麼驚喜。
和他預計的差不多,今天白天肯定是訓練不完的了。
所以,暫時只能耐心等候。
關掉筆記本電腦,看了眼還躺在被窩裡,睡得死沉死沉的夏雨菲,江寒不禁啞然失笑。
昨天夏雨菲可能有點累到了,今早不出所料地賴牀了。
好吧,就讓她好好休息休息吧……
江寒這麼想着,輕手輕腳地出門。
先自己下樓,去餐廳吃了個早餐,然後步行去賽場。
香格里拉的學城店,距離工大附中本來就不算遠,走了10來分鐘也就到了。
今天是NOIP複賽的Day2,只要搞定今天的三道題,這場比賽對江寒來說,也就宣告落幕了。
來到賽場外時,時間剛7點半出頭,大多數選手和他們的指導教師,已經來到場地外等候。
到處人聲鼎沸,江寒找到了高老師,並再次看到了李山河和朱達昌。
熊磊和他的指導教師賀紋章也在一旁。
老高和賀老師湊在一起聊天。
江寒也和三個戰友兼競爭對手,在一邊互相鼓勵了一番。
閒聊中,熊磊忽然提議:“等下午成績公佈了,咱們一起去唱k或者打檯球,放鬆一番,怎麼樣?”
“成績最差的請客嗎?”李山河角度刁鑽。
“可以考慮啊……”朱達昌也有點意動。
大家紛紛看向江寒,只有他還沒表態了。
江寒想了想,說:“去玩玩也行,不過我最多隻能陪你們玩到晚上七、八點鐘,再晚就不行了。”
一起出來比賽的,怎麼也得照顧一下同伴的情緒。
但也不能浪費太多時間,晚上還得抓緊時間,弄KAGGLE的比賽……