經過仔細斟酌,江寒確定了“優勝者”模型。
隨後,他就開始考慮,如何進一步優化這個網絡的性能。
像是網絡的主體結構、權重初始化方案、數據正則化的方法、激活函數的選擇……
這類關鍵因素,在之前的第一輪訓練中,就已經確定了下來,無需再做調整。
但除此之外,可以優化的地方依然不少。
比如稍微改變一點學習率,少量增加或減少隱藏神經元的個數,微調一下Mini Batch的大小……
這些都有可能對網絡的性能,產生微妙的影響。
而且,每一點細微的調整,會產生什麼樣的效果,不實際訓練、測試一番,是無法預估的。
所以接下來,江寒將“優勝者”代碼複製了100份。
這樣一來,這個“優勝者”就擁有了100多個“雙胞胎兄弟”,或者說:分身。
隨後,他就採用不同的方案,對這100多份代碼,逐一進行了微調。
等到進行完第二輪訓練後,從中再次選出唯一優勝者。
有點類似“養蠱”。
策略已經定下了,但江寒並沒有馬上開啓第二輪訓練。
他還打算再做一個比較重要的實驗,那就是增廣數據。
KAGGLE 官方提供了20萬條訓練數據,理論上說,對於絕大多數機器學習模型,這個數據量已經足夠使用了。
但誰會嫌棄數據太多呢?
能提供的數據越多,神經網絡的學習效果就越好,訓練得越充足,性能自然也就越強。
反正一般來說,不會變得更糟。
所以,何樂而不爲?
所謂數據增廣,就是在不改變圖像類別的前提下,人爲地擴充數據。
這樣做,常常可以有效地提高模型的泛化能力。
常用的數據增廣方式,包括水平翻轉、旋轉、縮放、平移、裁剪、顏色抖動……
當然,也可以將多種操作組合起來,從而獲得更多的數據。
例如,同時做小角度的旋轉和隨機尺度變換,再微調一下像素在HSV顏色空間中的飽和度、亮度、色調……
江寒很快用Python編寫了一份代碼,對訓練數據集進行了擴充。
原本的18萬條訓練數據,經過各種運算,足足演變出了將近200萬條數據。
這樣,第二輪訓練終於可以開始了。
江寒將100個“優勝者”分身依次啓動。
隨後,他琢磨了一下,又將剛纔排名前15的模型,全都拉了過來。
包括上次排名第一的“書呆子”、排名第三的“黑馬中等生”,以及排位在4~15名的“其他學生”。
反正算力夠用,索性再給這些準“優秀生”一次機會,看看它們在增廣數據集上,又會有怎樣的表現。
當然,在開啓第二輪訓練之前,第一輪訓練出來的權重數據,必須先備份一下……
將這裏的事情全部處理利索,時間已經接近中午11點。
江寒當下鎖門離開。
先去接夏雨菲放學,再順便做一頓豐盛的午飯。
除了正常的兩菜一湯,他還額外加了一道“紅燒冰島紅極參”,以慰勞自己操勞過度的大腦。
……
下午和晚上,江寒沒有出門。
主要在家看書、找資料,學習各種逆向、破解、黑客知識。
想要繼續領悟《數字混淆技術》,比較依賴數學水平和逆向技術。
江寒的數學水平已經很不弱了,知識儲備不比一般的數學系本科畢業生少,解決問題的能力猶有過之。
但在逆向和黑客技術上,他距離真正的頂級高手,還有不小的差距。
所以,江寒就決定抓緊時間,儘快補上這一課。
學習之餘,當然有了閒暇,就遠程登錄一下服務器,關注一下神經網絡的訓練情況。
13日清晨,第二批114個模型,全部訓練完成。
江寒又去了一次車庫,翻閱了一下訓練記錄,並對這114個神經網絡模型,加載驗證集進行測試。
“優勝者”的那100個分身,表現都很不錯,其中成績最好的一個,在訓練集和驗證集上的準確率,都超過了98%。
說實話,如果不經過特別的訓練,一般的人類在這個項目上的表現,差不多也就這樣了。
畢竟KAGGLE提供的這些數據裏,有一些筆跡實在太潦草了。
比如,有好幾個圖片,江寒怎麼看怎麼像7,標籤上卻硬說是1,這怎麼破?
此外,江寒還有一個令人欣喜的發現。
使用了擴充數據集,並進行了更高強度的訓練之後,“書呆子”在訓練集上,成績再次提高了少許,識別準確率達到了驚人的99.9%;
而且在驗證集上的表現,也有了較大幅度的提高,達到了95%的及格線。
“黑馬中等生”和原本排名4~15的“普通學生”,這次也有了長足的進步,成績不比原本的“優勝者”差到哪裏去。
所以說,要想提高神經網絡的性能,擴充數據規模纔是第一祕訣。
不管是人工收集更多數據,還是用數據增廣的辦法來僞造數據……
接下來就簡單了,只要從“優勝者”的100個分身裏,挑選出最強的一個,強化訓練一番,再稍微打磨一下,就可以提交上去了。
接近99%的識別正確率,說高不高,說低不低。
去年在imagenet舉辦的世界機器學習大師賽中,冠軍是KNN算法的一個變種。
別看那種算法極其簡單,一點也不智能,但作者通過巧妙的構思,赫然將識別失誤率壓縮到了驚人的0.63%!
但那是頂級大能們的競技場,這次KAGGLE舉辦的,只是一場業餘級別的比賽,參與的大多是民間愛好者。
所以自己手裏的這個“最終優勝者”,多了不敢說,前三還是比較穩的。
至於想要奪得冠軍,那就需要拼一點運氣了,除非能進一步提高在陌生數據上的準確率。
畢竟真正的測試集,誰也沒見過,會變態到什麼程度,誰也沒法預估。
江寒反覆分析、測試着已經訓練好的幾個模型。
第二輪的“唯一優勝者”,以及進化後的“書呆子”、“中等生”……
忽然,他又有了一個巧妙的發現。
對於那些容易誤測的圖片,優勝者、書呆子、中等生……它們的判斷往往不盡相同。
同樣一個圖片,比如數字“5”,由於書寫不規範,導致極難識別。
有點像6,又有點像s,甚至就算將其當成0,也不會多麼違和。
這種無法妥善處理的數據,一般的做法是當做“噪聲”,在訓練時加以排除。
免得對網絡的訓練產生干擾,讓網絡學到錯誤的“知識”,導致“越學越懵”。
江寒在分析這類疑難圖片時,卻忽然有了一個奇妙的發現。
對於這樣的圖片,優勝者偶爾也會識別錯誤,但神奇的是,書呆子偶爾卻可以識別正確。
有些圖片書呆子和優勝者都不認識,中等生或者普通學生,反而往往有獨到的見解……
然後,這些結構不同的神經網絡,它們識別錯誤的那部分圖片,很少出現交集。
也就是說,這些疑難圖片之中,絕大多數都會被部分“學生”正確識別。
這就很有趣了。
如果能把這十幾個神經網絡的識別能力結合到一起,豈不是可以進一步提高準確率?
江寒經過仔細思考、認真分析,最後做出了一個大膽的決定。
那就是:集成學習。