神經網絡實踐經驗(1)
前言
本系列是本人記錄在自己實踐中遇到的很多讀死書無法學習到的經驗,不完全脫離理論,甚至說是超過理論之外的東西。
本人水平很差(深度學習之恥),有些說的簡陋的東西也當是獻丑了。
1. 神經網絡的輸入最好有一定相關性,否則很容易產生過擬合的效果
所謂的過擬合,就是模型學習到本應該學習到的特征之外的特征。
如圖,本來模型只應該學習到x,x2 和常數項的特征,但是由于模型的容量(capacity)太大,模型學習到了x3 和x4的特征。所以造成最后模型的扭曲。
過擬合的問題大家肯定都懂,模型在testing數據集和training數據集的差異會非常大,在training集上表現非常好的數據在testing集上會非常差。
在神經網絡中最常用的正則化方法是Dropout。
同時我們應該去了解一下神經網絡中的全連接層。全連接層在數據于數據之中找關系,提取輸入數據的淺層特征與深層特征并且將這些特征映射到類別中(此處我只說的是多分類,其他的工作暫時不講)。也就是說在全連接層中它尋找的輸入每個神經元與神經元之間的聯系。
從某種意義上來說,神經網絡就是個高超的特征工程器。
在某些時候,我們為了去做多分類,會去試著去找無關(前置知識)的特征然后作為輸入扔給神經網絡。甚至是兩個相互無關(前置知識)的向量拼接之后扔給神經網絡。
不得不說,這是非常蠢的想法。
我們迫使神經網絡去找到已知無關的數據的聯系特征,這本身就可能然神經網絡產生過擬合。
就比如,我現在用多層感知機(MLP)做推薦系統,有user向量u也有item向量i ,user和item沒有直接關聯,我們將u與i拼接并直接扔給MLP。MLP學習到了user的特征還有item的特征,還有user中某個神經元和item某個神經元的聯系。
單單用腦子想想就知道,我們會學習到很多在推薦系統中一點用都沒有的,在由user的輸入神經元與item的輸入神經元構成的特征,相當于神經網絡瞎做特征工程,然后過擬合了,即時加了Dropout也沒用。
為什么使用神經網絡去處理圖像的效果好?因為本身圖像就是一個上下文相關的數據,很多像素點的集合不叫有意義的圖像,像素點與像素點連接所構成的有意義的數據才能叫有意義的圖像。但是圖像本身是局部相關,我左下角的像素點可能和右上角的像素點一點關系都沒有,但是左下角的像素點只與它周圍一圈的像素點有關,所以CNN較MLP更適合Computer Vision。
NLP同理(雖然我不懂XD)。
這個時候我們應該做什么呢?
本人認為,應該試著使用CNN這種局部特征網絡。并且可以試著在u和i拼接處加上少許的0(數量大概是filter的大小減一),這樣可以減少兩個向量無用的特征。
或者你試著做一下特征工程,雖然對于end-to-end模型來說特征工程比較少見。而且這個特種工程可以做的人頭大。如果你非要做特征工程,你為什么不試試傳統機器學習呢?
當然你說你數據量大你頭鐵那我也沒辦法,畢竟在深度學習中數據量大是可以為所欲為的。
圖片來源:
圖一:https://blog.csdn.net/willduan1/article/details/53070777
圖二:圖書 deep learning