在網絡層次較淺時,問題可能還不是很大,網絡層次一深,就容易梯度爆炸或者梯度消失。
江寒在研制OCR軟件的時候,就發現了這個問題,所以這一次,他準備引入ReLU,作為卷積層的激活函數。
ReLU(RectifiedLinearUnit),一般稱作“線性整流函數”,也可以翻譯成“修正線性單元”。
這個函數其實很簡單,表達式為F(x)=max(0,x)。
當自變量大于0時,它就是一個線性函數,相當于一次函數y=x;
當自變量≤0時,y≡0。
這個函數其實不是什么新鮮東西,只是在機器學習中,以前沒人用過罷了。
所以這也算是一點小小的創舉……
要說ReLU的好處嘛,那自然是不少的了。
一方面,可以有效緩解梯度消失、梯度爆炸。
并且,還能讓梯度下降得更快,有效地提高訓練效率。
另一方面,也比較符合仿生學原理。
生物神經細胞的工作模式,就和這個函數差不多……
江寒思考了一下,又在網絡的最后幾個全連接層中,使用了Dropout方法。
所謂Dropout,就是在前向傳導時,以某個概率P,隨機忽略部分神經元。
這樣做,可以有效地避免過擬合。
在編寫池化層時,江寒考慮了一下,使用了重疊的最大池化方法,而沒有使用他此前在論文中提到的平均池化。
因為后者有個副作用,容易導致模糊化。
同時,這樣做還有另外一些好處。
比如,由于有部分重疊和覆蓋,提取出來的特征,往往也會更加豐富……
在編寫標準化層的時候,江寒考慮再三,運用了LRN機制,也就是局部響應歸一化。
這樣做的目的,是讓局部神經元的活動,產生某種競爭機制,使得強者愈強、弱者愈弱。
歸根結底,是為了提高模型的泛化能力。
為了盡可能加快訓練速度,江寒甚至考慮過使用GPU編程。
雖然這個世界的GPU廠商,還沒有發明CUDA技術,但硬件條件已經完全具備了。
畢竟從理論上來說,能挖礦的顯卡,就能用于大數據計算。
只要編寫出合適的驅動和代碼,就能利用GPU,來進行大規模并行運算,顯著地提高神經網絡的訓練速度。
可惜的是,單個顯卡的顯存比較有限,也就是說,可能承載不了太大的人工神經網絡。
而這個深度網絡……
即使最保守的估計,也需要4~5GB的顯存。
這樣一來,就必須用兩塊顯卡,交下火才行了……
江寒在虛擬空間中忙碌了幾十個小時,終于把這個空前巨大的人工神經網絡搭建了起來。
當然,今天是沒法開始訓練了,只能等到明天再說……
江寒想了想,又買了很多空白圖紙,以及一些中性筆,開始草擬論文的初稿。
在這次的比賽中,沒啥意外的話,自己這個“深度卷積神經網絡”,應該能拿到不錯的成績。
到時候,萬一有需要的話,現寫論文就顯得有點不夠從容了。
所以江寒決定,今晚就把這個網絡的框架,寫成論文,保存起來。
等到訓練完成,收集到足夠的數據,再稍微修改下,就可以找個合適的時機,投出去了……