深度學(xué)習(xí)中Dropout原理解析(10X單細(xì)胞和10X空間轉(zhuǎn)錄組)

1. Dropout簡介

1.1 Dropout出現(xiàn)的原因

在機(jī)器學(xué)習(xí)的模型中,如果模型的參數(shù)太多,而訓(xùn)練樣本又太少,訓(xùn)練出來的模型很容易產(chǎn)生過擬合的現(xiàn)象。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時候經(jīng)常會遇到過擬合的問題,過擬合具體表現(xiàn)在:模型在訓(xùn)練數(shù)據(jù)上損失函數(shù)較小,預(yù)測準(zhǔn)確率較高;但是在測試數(shù)據(jù)上損失函數(shù)比較大,預(yù)測準(zhǔn)確率較低。

過擬合是很多機(jī)器學(xué)習(xí)的通病。如果模型過擬合,那么得到的模型幾乎不能用。為了解決過擬合問題,一般會采用模型集成的方法,即訓(xùn)練多個模型進(jìn)行組合。此時,訓(xùn)練模型費(fèi)時就成為一個很大的問題,不僅訓(xùn)練多個模型費(fèi)時,測試多個模型也是很費(fèi)時。

綜上所述,訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的時候,總是會遇到兩大缺點(diǎn):

(1)容易過擬合

(2)費(fèi)時

Dropout可以比較有效的緩解過擬合的發(fā)生,在一定程度上達(dá)到正則化的效果。

1.2 什么是Dropout

在2012年,Hinton在其論文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。當(dāng)一個復(fù)雜的前饋神經(jīng)網(wǎng)絡(luò)被訓(xùn)練在小的數(shù)據(jù)集時,容易造成過擬合。為了防止過擬合,可以通過阻止特征檢測器的共同作用來提高神經(jīng)網(wǎng)絡(luò)的性能。

在2012年,Alex、Hinton在其論文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用于防止過擬合。并且,這篇論文提到的AlexNet網(wǎng)絡(luò)模型引爆了神經(jīng)網(wǎng)絡(luò)應(yīng)用熱潮,并贏得了2012年圖像識別大賽冠軍,使得CNN成為圖像分類上的核心算法模型。

隨后,又有一些關(guān)于Dropout的文章《Dropout:A Simple Way to Prevent Neural Networks from Overfitting》、《Improving Neural Networks with Dropout》、《Dropout as data augmentation》。

從上面的論文中,我們能感受到Dropout在深度學(xué)習(xí)中的重要性。那么,到底什么是Dropout呢?

Dropout可以作為訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的一種trick供選擇。在每個訓(xùn)練批次中,通過忽略一半的特征檢測器(讓一半的隱層節(jié)點(diǎn)值為0),可以明顯地減少過擬合現(xiàn)象。這種方式可以減少特征檢測器(隱層節(jié)點(diǎn))間的相互作用,檢測器相互作用是指某些檢測器依賴其他檢測器才能發(fā)揮作用。

Dropout說的簡單一點(diǎn)就是:我們在前向傳播的時候,讓某個神經(jīng)元的激活值以一定的概率p停止工作,這樣可以使模型泛化性更強(qiáng),因為它不會太依賴某些局部的特征,如圖1所示。


圖片.png

圖1:使用Dropout的神經(jīng)網(wǎng)絡(luò)模型

2. Dropout工作流程及使用

2.1 Dropout具體工作流程

假設(shè)我們要訓(xùn)練這樣一個神經(jīng)網(wǎng)絡(luò),如圖2所示。


圖片.png

圖2:標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)

輸入是x輸出是y,正常的流程是:我們首先把x通過網(wǎng)絡(luò)前向傳播,然后把誤差反向傳播以決定如何更新參數(shù)讓網(wǎng)絡(luò)進(jìn)行學(xué)習(xí)。使用Dropout之后,過程變成如下:

(1)首先隨機(jī)(臨時)刪掉網(wǎng)絡(luò)中一半的隱藏神經(jīng)元,輸入輸出神經(jīng)元保持不變(圖3中虛線為部分臨時被刪除的神經(jīng)元)


圖片.png

圖3:部分臨時被刪除的神經(jīng)元

(2) 然后把輸入x通過修改后的網(wǎng)絡(luò)前向傳播,然后把得到的損失結(jié)果通過修改的網(wǎng)絡(luò)反向傳播。一小批訓(xùn)練樣本執(zhí)行完這個過程后,在沒有被刪除的神經(jīng)元上按照隨機(jī)梯度下降法更新對應(yīng)的參數(shù)(w,b)。

(3)然后繼續(xù)重復(fù)這一過程:
. 恢復(fù)被刪掉的神經(jīng)元(此時被刪除的神經(jīng)元保持原樣,而沒有被刪除的神經(jīng)元已經(jīng)有所更新)
. 從隱藏層神經(jīng)元中隨機(jī)選擇一個一半大小的子集臨時刪除掉(備份被刪除神經(jīng)元的參數(shù))。
. 對一小批訓(xùn)練樣本,先前向傳播然后反向傳播損失并根據(jù)隨機(jī)梯度下降法更新參數(shù)(w,b) (沒有被刪除的那一部分參數(shù)得到更新,刪除的神經(jīng)元參數(shù)保持被刪除前的結(jié)果)。

不斷重復(fù)這一過程。

2.2 Dropout在神經(jīng)網(wǎng)絡(luò)中的使用

Dropout的具體工作流程上面已經(jīng)詳細(xì)的介紹過了,但是具體怎么讓某些神經(jīng)元以一定的概率停止工作(就是被刪除掉)?代碼層面如何實(shí)現(xiàn)呢?

下面,我們具體講解一下Dropout代碼層面的一些公式推導(dǎo)及代碼實(shí)現(xiàn)思路。

(1)在訓(xùn)練模型階段

無可避免的,在訓(xùn)練網(wǎng)絡(luò)的每個單元都要添加一道概率流程。


圖片.png

圖4:標(biāo)準(zhǔn)網(wǎng)絡(luò)和帶有Dropout網(wǎng)絡(luò)的比較

對應(yīng)的公式變化如下:

. 沒有Dropout的網(wǎng)絡(luò)計算公式:

圖片.png

. 采用Dropout的網(wǎng)絡(luò)計算公式:
圖片.png

上面公式中Bernoulli函數(shù)是為了生成概率r向量,也就是隨機(jī)生成一個0、1的向量。
代碼層面實(shí)現(xiàn)讓某個神經(jīng)元以概率p停止工作,其實(shí)就是讓它的激活函數(shù)值以概率p變?yōu)?。比如我們某一層網(wǎng)絡(luò)神經(jīng)元的個數(shù)為1000個,其激活函數(shù)輸出值為y1、y2、y3、......、y1000,我們dropout比率選擇0.4,那么這一層神經(jīng)元經(jīng)過dropout后,1000個神經(jīng)元中會有大約400個的值被置為0。

注意: 經(jīng)過上面屏蔽掉某些神經(jīng)元,使其激活值為0以后,我們還需要對向量y1……y1000進(jìn)行縮放,也就是乘以1/(1-p)。如果你在訓(xùn)練的時候,經(jīng)過置0后,沒有對y1……y1000進(jìn)行縮放(rescale),那么在測試的時候,就需要對權(quán)重進(jìn)行縮放,操作如下。
(2)在測試模型階段
預(yù)測模型的時候,每一個神經(jīng)單元的權(quán)重參數(shù)要乘以概率p。


圖片.png

圖5:預(yù)測模型時Dropout的操作
測試階段Dropout公式:


圖片.png

3. 為什么說Dropout可以解決過擬合?

(1)取平均的作用: 先回到標(biāo)準(zhǔn)的模型即沒有dropout,我們用相同的訓(xùn)練數(shù)據(jù)去訓(xùn)練5個不同的神經(jīng)網(wǎng)絡(luò),一般會得到5個不同的結(jié)果,此時我們可以采用 “5個結(jié)果取均值”或者“多數(shù)取勝的投票策略”去決定最終結(jié)果。例如3個網(wǎng)絡(luò)判斷結(jié)果為數(shù)字9,那么很有可能真正的結(jié)果就是數(shù)字9,其它兩個網(wǎng)絡(luò)給出了錯誤結(jié)果。這種“綜合起來取平均”的策略通??梢杂行Х乐惯^擬合問題。因為不同的網(wǎng)絡(luò)可能產(chǎn)生不同的過擬合,取平均則有可能讓一些“相反的”擬合互相抵消。dropout掉不同的隱藏神經(jīng)元就類似在訓(xùn)練不同的網(wǎng)絡(luò),隨機(jī)刪掉一半隱藏神經(jīng)元導(dǎo)致網(wǎng)絡(luò)結(jié)構(gòu)已經(jīng)不同,整個dropout過程就相當(dāng)于對很多個不同的神經(jīng)網(wǎng)絡(luò)取平均。而不同的網(wǎng)絡(luò)產(chǎn)生不同的過擬合,一些互為“反向”的擬合相互抵消就可以達(dá)到整體上減少過擬合。

(2)減少神經(jīng)元之間復(fù)雜的共適應(yīng)關(guān)系: 因為dropout程序?qū)е聝蓚€神經(jīng)元不一定每次都在一個dropout網(wǎng)絡(luò)中出現(xiàn)。這樣權(quán)值的更新不再依賴于有固定關(guān)系的隱含節(jié)點(diǎn)的共同作用,阻止了某些特征僅僅在其它特定特征下才有效果的情況 。迫使網(wǎng)絡(luò)去學(xué)習(xí)更加魯棒的特征 ,這些特征在其它的神經(jīng)元的隨機(jī)子集中也存在。換句話說假如我們的神經(jīng)網(wǎng)絡(luò)是在做出某種預(yù)測,它不應(yīng)該對一些特定的線索片段太過敏感,即使丟失特定的線索,它也應(yīng)該可以從眾多其它線索中學(xué)習(xí)一些共同的特征。從這個角度看dropout就有點(diǎn)像L1,L2正則,減少權(quán)重使得網(wǎng)絡(luò)對丟失特定神經(jīng)元連接的魯棒性提高。

(3)Dropout類似于性別在生物進(jìn)化中的角色:物種為了生存往往會傾向于適應(yīng)這種環(huán)境,環(huán)境突變則會導(dǎo)致物種難以做出及時反應(yīng),性別的出現(xiàn)可以繁衍出適應(yīng)新環(huán)境的變種,有效的阻止過擬合,即避免環(huán)境改變時物種可能面臨的滅絕。

4. Dropout在Keras中的源碼分析

下面,我們來分析Keras中Dropout實(shí)現(xiàn)源碼。

Keras開源項目GitHub地址為:

https://github.com/fchollet/keras/tree/master/keras

其中Dropout函數(shù)代碼實(shí)現(xiàn)所在的文件地址:

https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py

Dropout實(shí)現(xiàn)函數(shù)如下:

圖6:Keras中實(shí)現(xiàn)Dropout功能

我們對keras中Dropout實(shí)現(xiàn)函數(shù)做一些修改,讓dropout函數(shù)可以單獨(dú)運(yùn)行。

# coding:utf-8
import numpy as np
 
# dropout函數(shù)的實(shí)現(xiàn)
def dropout(x, level):
    if level < 0. or level >= 1: #level是概率值,必須在0~1之間
        raise ValueError('Dropout level must be in interval [0, 1[.')
    retain_prob = 1. - level
 
    # 我們通過binomial函數(shù),生成與x一樣的維數(shù)向量。binomial函數(shù)就像拋硬幣一樣,我們可以把每個神經(jīng)元當(dāng)做拋硬幣一樣
    # 硬幣 正面的概率為p,n表示每個神經(jīng)元試驗的次數(shù)
    # 因為我們每個神經(jīng)元只需要拋一次就可以了所以n=1,size參數(shù)是我們有多少個硬幣。
    random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即將生成一個0、1分布的向量,0表示這個神經(jīng)元被屏蔽,不工作了,也就是dropout了
    print(random_tensor)
 
    x *= random_tensor
    print(x)
    x /= retain_prob
 
    return x
 
#對dropout的測試,大家可以跑一下上面的函數(shù),了解一個輸入x向量,經(jīng)過dropout的結(jié)果  
x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
dropout(x,0.4)

函數(shù)中,x是本層網(wǎng)絡(luò)的激活值。Level就是dropout就是每個神經(jīng)元要被丟棄的概率。

注意: Keras中Dropout的實(shí)現(xiàn),是屏蔽掉某些神經(jīng)元,使其激活值為0以后,對激活值向量x1……x1000進(jìn)行放大,也就是乘以1/(1-p)。

思考:上面我們介紹了兩種方法進(jìn)行Dropout的縮放,那么Dropout為什么需要進(jìn)行縮放呢?

因為我們訓(xùn)練的時候會隨機(jī)的丟棄一些神經(jīng)元,但是預(yù)測的時候就沒辦法隨機(jī)丟棄了。如果丟棄一些神經(jīng)元,這會帶來結(jié)果不穩(wěn)定的問題,也就是給定一個測試數(shù)據(jù),有時候輸出a有時候輸出b,結(jié)果不穩(wěn)定,這是實(shí)際系統(tǒng)不能接受的,用戶可能認(rèn)為模型預(yù)測不準(zhǔn)。那么一種”補(bǔ)償“的方案就是每個神經(jīng)元的權(quán)重都乘以一個p,這樣在“總體上”使得測試數(shù)據(jù)和訓(xùn)練數(shù)據(jù)是大致一樣的。比如一個神經(jīng)元的輸出是x,那么在訓(xùn)練的時候它有p的概率參與訓(xùn)練,(1-p)的概率丟棄,那么它輸出的期望是px+(1-p)0=px。因此測試的時候把這個神經(jīng)元的權(quán)重乘以p可以得到同樣的期望。

總結(jié):

當(dāng)前Dropout被大量利用于全連接網(wǎng)絡(luò),而且一般認(rèn)為設(shè)置為0.5或者0.3,而在卷積網(wǎng)絡(luò)隱藏層中由于卷積自身的稀疏化以及稀疏化的ReLu函數(shù)的大量使用等原因,Dropout策略在卷積網(wǎng)絡(luò)隱藏層中使用較少??傮w而言,Dropout是一個超參,需要根據(jù)具體的網(wǎng)絡(luò)、具體的應(yīng)用領(lǐng)域進(jìn)行嘗試。

10X單細(xì)胞(10X空間轉(zhuǎn)錄組)與dropout的關(guān)系

dropout是scRNASeq數(shù)據(jù)的一大特點(diǎn),就是很多基因在某些細(xì)胞根本就不表達(dá),但是在另外的細(xì)胞卻高表達(dá)

目前單細(xì)胞數(shù)據(jù)挑選高變基因的方法

目前已有的尋找單細(xì)胞轉(zhuǎn)錄組測序數(shù)據(jù)中的重要基因(feature selection)的方法都不夠好,比如 scLVM 主要是根據(jù)先驗基因集,比如cell-cycle or apoptosis來區(qū)分細(xì)胞。與此相反,基于 highly variable genes (HVG) 的方法挑選到的變化量大的那些基因很可能是技術(shù)帶來的誤差。而且低表達(dá)量基因的變動往往大于高表達(dá)量基因,而且所謂的表達(dá)變化大也并沒有很好的生物學(xué)解釋。
一個比較好理解的概念是差異基因,但是需要預(yù)先把細(xì)胞群體分組后進(jìn)行比較才能得到,而很多時候細(xì)胞太相似了,沒辦法很好的分開。像PCA或者t-SNE這樣的降維方法也可以用來挑選重要基因,但它們也受制于系統(tǒng)誤差或者批次誤差等等。
dropout是scRNASeq數(shù)據(jù)的一大特點(diǎn),就是很多基因在某些細(xì)胞根本就不表達(dá),但是在另外的細(xì)胞卻高表達(dá)。
單細(xì)胞轉(zhuǎn)錄組數(shù)據(jù)里面的dropouts可以達(dá)到50%,但是通常認(rèn)為這個dropouts是因為在文庫構(gòu)建的過程中,有部分基因沒有被成功的反轉(zhuǎn)錄,是一個酶促反應(yīng)。(這個作者也不知道是真是假)!
而且單細(xì)胞轉(zhuǎn)錄組數(shù)據(jù)的batch effects有時候比較嚴(yán)重,所以 feature selection 過程的一個主要目的就是降低技術(shù)誤差的影響,集中在有生物學(xué)意義的差異上面。

那么dropout現(xiàn)象如何影響我們單細(xì)胞的聚類以及如何規(guī)避,我們下一篇文章分享

生活很好,有你更好

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    余生動聽閱讀 10,918評論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,501評論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,943評論 2 7

友情鏈接更多精彩內(nèi)容