神经网络相关的笔试题目集合(一)
在找工作的過程中發(fā)現(xiàn)好多公司沒有專門的、傳統(tǒng)的圖像處理崗位,所以只能參加算法類的筆試甚至AI類的筆試。在AI的筆試中幾乎全是關(guān)于神經(jīng)網(wǎng)絡(luò)的問題,其實也都是很基礎(chǔ)的一些問題,如果事先做了準備,可以從容應對。而對于我這種從傳統(tǒng)圖像處理算法向深度學習靠攏的新手,不失為一種很好的入門方法。
既然是考察神經(jīng)網(wǎng)絡(luò),激活函數(shù)activation function作為模擬人腦中神經(jīng)元之間的激活/抑制的關(guān)鍵,經(jīng)常會被考察。問:常用的激活函數(shù)有什么,各自有什么特點。關(guān)于這個問題可以從網(wǎng)上找到很多答案,比如參考鏈接1和2,主要講了常見的激活函數(shù)Sigmoid、tanh、ReLu、Leaky ReLus。Sigmoid范圍在0~1(這也是具有壓縮數(shù)據(jù)功能的原因),所以Tanh=2*Sigmoid(2x)-1的范圍在[-1,1],tanh讀作Hyperbolic Tangent,解決了Sigmoid的均值非0的問題(這會導致后一層的神經(jīng)元將得到上一層輸出的非0均值的信號作為輸入),但是梯度消失的問題更加嚴重(紅色梯度曲線下降得更快,參數(shù)的學習要靠梯度的后向傳播)。而ReLU=max(0,x),在輸入很大的情況下梯度也不會像Sigmoid一樣飽和,且由于計算簡單,利用SGD(隨機梯度下降)算法收斂速度更快,但缺點是在輸入為復數(shù)的時候激活函數(shù)直接為0,造成所謂的神經(jīng)元壞死,不能給之后的神經(jīng)元傳遞信息,這時就必須十分小心learning Rate的選取,步長不能太大,也可以使用adagrad自動調(diào)節(jié)learningrate,同時參數(shù)的初始化也很重要,一般使用Xavier初始化。Leaky ReLU是為了解決ReLU神經(jīng)元壞死的問題的,在輸入小于0時,輸出不再是0,而是一條斜率較小(a)的通過原點的直線。但是現(xiàn)在還沒有足夠的理論證明Leaky ReLU一定好于ReLU。也可以將斜率a也作為參數(shù)進行訓練,即PReLU,kaiming He在2015年的論文中就使用了Parametric ReLU。
?
Randomized Leaky ReLU. Randomized Leaky ReLU 是 leaky ReLU 的random 版本, 其核心思想就是,在訓練過程中,a是從一個高斯分布中隨機出來的,然后再在測試過程中進行修正。
這么多的激活函數(shù)都有一個共同點,就是他們都是非線性的。拋開用激活函數(shù)去模擬神經(jīng)元的仿生想法,激活函數(shù)的作用在數(shù)學上到底有什么意義呢?從網(wǎng)上資料看就是為了加入非線性因素。因為感知機其實是最原始的神經(jīng)網(wǎng)絡(luò),同時感知機是一個判別模型,可用于分類,如果沒有激活函數(shù),我們就無法實現(xiàn)線性不可分問題,包括簡單的異或XOR問題。如果沒有激活函數(shù),多個感知機的組合得到的仍然是一個線性分類器,仍然無法解決非線性問題。
參考鏈接2中知乎有人的回答中提到Google的論文Batch normalization: Accelerating deep network training by reducing internal covariate shift盡可能保證每一層網(wǎng)絡(luò)的輸入具有相同的分布,解決了Sigmoid的saturate的問題,但效果仍然沒有ReLU好。正好筆試過程中也遇到了Batch Normalization的問題,那么接下來就看一下它到底為何物。
先來說歸一化,歸一化是對于輸入特征來說的,特征可能是多維的,同時他們之間的量綱可能不一樣,就會造成不同維度的大小存在很大的差異,這對于訓練來說不太友好,因為我們設(shè)置的learning rate不可能適應所有的維度,會導致訓練過慢。
歸一化不僅能加快訓練速度(最快梯度下降法的求解),有時候還可以提高精度。比如KNN分類器中要求樣本之間的距離,歸一化使得不同維度對距離造成的影響大小相同,而不會使得結(jié)果主要取決于某一維度。
歸一化常用方法有最大最小歸一化(線性歸一化),max和min值不穩(wěn)定時可以取常數(shù);z-score標準化(均值方差標準化),歸一化后的數(shù)據(jù)符合標準正態(tài)分布,即進行白化whiten;函數(shù)轉(zhuǎn)化(非線性歸一化,函數(shù)可使用對數(shù)、正切等)。
其實之前提到的歸一化是相對于機器學習領(lǐng)域說的。在深度學習中由于涉及到了多層的網(wǎng)絡(luò)模型,歸一化會顯得更加重要,因為機器學習中有一個數(shù)據(jù)之間是獨立同分布IID的假設(shè)(這樣才能通過訓練樣本預測新的數(shù)據(jù)),而神經(jīng)網(wǎng)絡(luò)中由于底層參數(shù)的更新會影響之后高層的輸入,這在paper中被稱為Internal Covariate Shift(ICS)問題。所以我們就需要對每一層的輸出都進行歸一化。但是底層的輸出被歸一化也意味著之前學到的特征分布被破壞了,所以batch Normalization(BN)又加入了變換重構(gòu),引入了可學習參數(shù)縮放因子和平移因子。
這里簡單介紹一下batch的概念。首先,我們的訓練數(shù)據(jù)集是有限的,我們會使用這一訓練數(shù)據(jù)集訓練多次,相對于鞏固學習,但訓練太多次又會導致過擬合。每次訓練后參數(shù)完成一次更新,稱這一過程是一個epoch。而在每次epoch中,我們把訓練數(shù)據(jù)集分成幾個較小的子集,這就是batch,子集的大小是batch_size。數(shù)據(jù)集較大不利于通過訓練網(wǎng)絡(luò),分成子集有利于加快訓練。訓練數(shù)據(jù)集分成子集,epoch也分成了幾個iteration。根據(jù)batch_size的選擇,可以把訓練情況分成三種,第一種是batch取最大值,即Full Batch Learning,一次性將訓練數(shù)據(jù)通過訓練網(wǎng)絡(luò),這只適用于訓練數(shù)據(jù)少的情況。第二種是另外一個極端,batch_size取1,即Online Learning在線學習/Stochastic隨機學習,這種情況難以收斂,因為每次梯度方向以各自樣本的梯度方向收斂。我們看到batch_size其實是在內(nèi)存利用率和內(nèi)存容量之間的平衡,增大了batch_size,相對于通過并行化提高了內(nèi)存利用率,但占用的內(nèi)存也變大。第三種是Mini-batch,在之前兩個極端情況下選擇一個平衡點。BN就是基于了Mini-batch SGD。BN適用于mini-batch樣本量較大且與各mini-batch分布相近似的場景下(訓練前需進行充分的shuffle)。不適用于動態(tài)網(wǎng)絡(luò)結(jié)構(gòu)和RNN。
結(jié)合前面講到的激活函數(shù),BN在歸一化的同時還可以解決Sigmoid函數(shù)的梯度飽和的問題。因為經(jīng)過BN后,通過激活函數(shù)的輸入是標準正態(tài)分布,經(jīng)過非線性變換時的輸入大概率保持在0均值附近,反向傳播時梯度值較大,從而避免了梯度消失。BN增加scale和shift的原因也可以通過對激活函數(shù)的輸入的處理來說明。因為在進入激活函數(shù)之前進行了歸一化,將輸入集中在了Sigmoid中心附近,而Sigmoid函數(shù)雖然本身是非線性函數(shù),但是中心附近是接近線性的,這樣一來我們就失去了非線性函數(shù)的優(yōu)勢,而補救措施就是增加scale和shift元素。BN的細節(jié)還是要看論文《Batch Normalization: Accelerating Deep Network Training by? Reducing Internal Covariate Shift》。
總結(jié)一下BN的優(yōu)勢:1.提升了訓練速度(避免了梯度雙端飽和,保證了IID)2.類似于Dropout,可以防止過擬合(加入了隨機性的scale、shift?)3.對初始化的要求沒有那么高(因為不必使用ReLU?即使使用ReLU也可以避免梯度為0),可以使用較大的學習率。
除了BN,還有其他的歸一化方式。BN針對的是單一的神經(jīng)元,Layer Normalization考慮一層的信息,并將該層的均值和方差作為歸一化標準。weight normalization則將參數(shù)也進行了規(guī)范化。
Reference:
總結(jié)
以上是生活随笔為你收集整理的神经网络相关的笔试题目集合(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【每日SQL打卡】
- 下一篇: 阈值分割与区域分割