一、優(yōu)化器
1、SGD是什么?
- 批梯度下降(Batch gradient descent):遍歷全部數(shù)據(jù)集算一次損失函數(shù),計算量開銷大,計算速度慢,不支持在線學(xué)習(xí)。
- 隨機梯度下降(Stochastic gradient descent,SGD)每次隨機選擇一個數(shù)據(jù)計算損失函數(shù),求梯度并更新參數(shù),計算速度快,但收斂性能可能不太好。
- 批量隨機梯度下降(Min-batch SGD):用小批量樣本來近似全部,將樣本分為m個mini-batch,每個mini-batch包含n個樣本。
- 使用動量(Momentum)的隨機梯度下降法(SGD): 在隨機梯度的學(xué)習(xí)算法中,每一步的步幅都是固定的,而在動量學(xué)習(xí)算法中,每一步走多遠不僅依賴于本次的梯度大小還取決于過去的速度。速度是累積各輪訓(xùn)練參數(shù)的梯度。動量主要解決SGD的兩個問題:一是隨機梯度方法引入的噪聲;二是Hessian矩陣病態(tài)問題,可以理解為SGD在收斂過程中和正確梯度相比來回擺動比較大的問題。
2、簡單介紹下Adam算法
RMSprop將學(xué)習(xí)率分解成一個平方梯度的指數(shù)衰減的平均。Adam中動量直接并入了梯度一階矩(指數(shù)加權(quán))的估計。其次,相比于缺少修正因子導(dǎo)致二階矩估計可能在訓(xùn)練初期具有很高偏置的RMSProp,Adam還包括偏置修正,修正從原點初始化的一階矩(動量項)和(非中心的)二階矩估計。本質(zhì)上是帶有動量項的RMSProp,它利用梯度的一階矩估計和二階矩估計動態(tài)調(diào)整每個參數(shù)的學(xué)習(xí)率。Adam的優(yōu)點主要是經(jīng)過偏置校正后,每一次迭代學(xué)習(xí)率都有個確定范圍,使得參數(shù)比較平穩(wěn)。
3、Adam和SGD的區(qū)別
- SGD缺點是其更新方向完全依賴于當前batch計算出的梯度,因而十分不穩(wěn)定。
- Adam的優(yōu)點主要在于:①考慮歷史步中的梯度更新信息,能夠降低梯度更新噪聲。②此外經(jīng)過偏差和校正后,每一次迭代學(xué)習(xí)率都有個確定單位,使得參數(shù)比較平穩(wěn)。
- 但Adam可能對前期出現(xiàn)的特征過擬合,后期才出現(xiàn)的特征很難糾正前期的擬合效果。且SGD和Adam都沒法很好的避免局部最優(yōu)問題。
二、過擬合
1、過擬合指什么?造成的原因是什么?解決方法有哪些?
- 定義:模型在訓(xùn)練集上表現(xiàn)很好,但在測試集和新數(shù)據(jù)上表現(xiàn)很差。
- 出現(xiàn)的原因:①模型的復(fù)雜度過高、參數(shù)過多②訓(xùn)練數(shù)據(jù)比較小 ③訓(xùn)練集和測試集的分布不一致④樣本里面的噪聲數(shù)據(jù)干擾過大,導(dǎo)致模型過分記住了噪聲特征
- 解決方法:①降低模型的復(fù)雜度 ②數(shù)據(jù)增強 ③正則化(l1, l2, dropout)④早停
2、過擬合與欠擬合的比較
過擬合:模型在訓(xùn)練集上表現(xiàn)很好,但在測試集和新數(shù)據(jù)上表現(xiàn)很差。輸出結(jié)果高方差Variance,模型很好的適配訓(xùn)練樣本,但在測試集上表現(xiàn)很糟,有一個很大的方差。?
欠擬合:模型在訓(xùn)練集和測試機上的性能都較差,輸出結(jié)果高偏差bias,模型不能適配訓(xùn)練樣本,有很大的偏差。
3、偏差和方差的區(qū)別
- 偏差:偏差度量了學(xué)習(xí)算法的期望預(yù)測和真實結(jié)果的偏離程度,刻畫了學(xué)習(xí)算法本身的擬合能力。
- 方差:方差度量了同樣大小的訓(xùn)練集的變動所導(dǎo)致的學(xué)習(xí)性能的變化,即刻畫了數(shù)據(jù)擾動所造成的影響。
三、歸一化
1、批量歸一化(BN)是什么?有什么作用?
- 批量歸一化(BN)的計算公式如下:
- 作用:加快網(wǎng)絡(luò)的訓(xùn)練與收斂的速度;控制梯度爆炸,防止梯度消失。
2、訓(xùn)練與推理時BN中的均值、方差計算差異是什么?
- 訓(xùn)練時,均值、方差分別是該批次內(nèi)數(shù)據(jù)相應(yīng)維度的均值和方差。
- 推理時,均值、方差是基于所有批次的期望計算得到的。其中在推理時所用的均值和方差時通過移動平均計算得到的,可以減少存儲每個batch均值方差的內(nèi)存。
3、LN(layer normalization)和BN的區(qū)別
LN和BN相比,只考慮單個sample內(nèi)的統(tǒng)計變量,因此也不用使用BN實現(xiàn)中的running mean, running var。LN也完全不用考慮輸入batch_size的問題。
4、transformer中為什么不適用BN歸一化?
- 一種解釋是,cv和nlp數(shù)據(jù)特性不同,對于nlp數(shù)據(jù),前向和反向傳播中,batch統(tǒng)計量及其梯度都不太穩(wěn)定,一個batch中每個句子對應(yīng)位置分量不一定有意義。
- 要能在某個維度做獨立同分布假設(shè),才能合理歸一化。對于cv來說,batch之間的圖像是獨立的,但nlp的文本本質(zhì)上可以看成一個時間序列,而時間序列是不定長的,長度不同的序列原則上屬于不同的統(tǒng)計對象,所以很難得到穩(wěn)定的統(tǒng)計量,得不到穩(wěn)定的統(tǒng)計量,BN就無法成立,因為BN依靠滑動平均來獲得一組預(yù)測用的統(tǒng)計量。
5、梯度消失和梯度爆炸的主要原因
- 梯度消失:主要是網(wǎng)絡(luò)層較深,其次是采用了不合適的損失函數(shù),會使得靠近輸入層的參數(shù)更新緩慢。導(dǎo)致在訓(xùn)練時,只等價于后面幾層的淺層網(wǎng)絡(luò)的學(xué)習(xí)。
- 梯度爆炸:一般出現(xiàn)在深層網(wǎng)絡(luò)和權(quán)值初始化值太大的情況下。在深層神經(jīng)網(wǎng)絡(luò)或循環(huán)神經(jīng)網(wǎng)絡(luò)中,誤差的梯度可在更新中累積相乘。如果網(wǎng)絡(luò)層之間的梯度值大于1.0,那么重復(fù)相乘會導(dǎo)致梯度呈指數(shù)級增長,梯度會變得非常大,然后導(dǎo)致網(wǎng)絡(luò)權(quán)重的大幅更新,并因此使網(wǎng)絡(luò)變得不穩(wěn)定。梯度爆炸會使得訓(xùn)練過程中,權(quán)重的值變得非常大,以至于溢出,導(dǎo)致模型損失變成NaN等。
- 解決方法:梯度剪切,對梯度設(shè)定閾值,權(quán)重正則化,BN,殘差網(wǎng)絡(luò)的捷徑(shortcut)
6、Pytorch中的乘法
- 數(shù)乘運算:torch.mul
- 向量點積:torch.dot,計算兩個張量的點乘積(內(nèi)積),兩個張量都為一維向量。
- 矩陣乘運算:torch.mm, 輸入的兩個tensor shape分別使n x c, c x m,輸出使n x m;
- torch.matmul,對二維張量執(zhí)行的操作就是torch.mm, 此外還可以用于高維張量運算。
- @符號乘法相當于矩陣乘torch.mm,嚴格按照第一個參數(shù)的列數(shù)要等于第二個參數(shù)的行數(shù)。
四、神經(jīng)網(wǎng)絡(luò)
1、什么是卷積網(wǎng)絡(luò)?
對圖像和濾波矩陣做內(nèi)積的操作就是卷積操作。
其中圖像是指不同的數(shù)據(jù)窗口數(shù)據(jù);濾波矩陣是指一組固定的權(quán)重,因為每個神經(jīng)元的多個權(quán)重固定,所以又可以看作一個恒定的濾波器fliter;內(nèi)積是指逐個元素相乘再求和的操作。
2、什么是CNN的池化pooling層?
池化是指取區(qū)域平均或者最大,即平均池化或最大池化。
上圖所展示的是取區(qū)域最大,即上圖左邊部分中 左上角2x2的矩陣中6最大,右上角2x2的矩陣中8最大,左下角2x2的矩陣中3最大,右下角2x2的矩陣中4最大,所以得到上圖右邊部分的結(jié)果:6 8 3 4
3、如何確定CNN的卷積核通道數(shù)和卷積輸出層的通道數(shù)?
CNN的卷積核通道數(shù) = 卷積輸入層的通道數(shù)
CNN的卷積輸出層通道數(shù) = 卷積核的個數(shù)
4、簡述下什么是生成對抗網(wǎng)絡(luò)(GAN)?
假設(shè)有兩個模型,一個是生成模型(Generative Model,下文簡寫為G),一個是判別模型(Discriminative Model,下文簡寫為D),判別模型(D)的任務(wù)就是判斷一個實例是真實的還是由模型生成的,生成模型(G)的任務(wù)是生成一個實例來騙過判別模型(D),兩個模型相互對抗,最終使得生成模型生成的實例域真實的沒有區(qū)別,判別模型無法區(qū)分自然的還是模型生成的。
5、簡要介紹下tensorflow的計算圖?
?tensorflow的計算圖也叫數(shù)據(jù)流圖。數(shù)據(jù)流圖用節(jié)點(nodes)和邊(edges)的有向圖來描述數(shù)學(xué)計算。節(jié)點一般用來表示施加的數(shù)學(xué)操作,但也可以表示數(shù)據(jù)輸入(feed in)的起點和輸出(push out)的終點,或者是讀取/寫入持久變量(persistent variable)的終點?!斑叀北硎尽肮?jié)點”之間的輸入/輸出關(guān)系,這些數(shù)據(jù)“邊”可以輸運“size可動態(tài)調(diào)整”的多維數(shù)據(jù)數(shù)組,即“張量tensor”。張量從圖中流過的直觀圖像是這個工具取名為“tensorflow"的原因。一旦輸入端的所有張量都準備好,節(jié)點將被分配到各種計算設(shè)備完成異步并行地執(zhí)行運算。
6、有哪些深度學(xué)習(xí)(RNN、CNN)調(diào)參的經(jīng)驗?
CNN調(diào)參主要是在優(yōu)化函數(shù)、emdbedding 的維度、以及殘差網(wǎng)絡(luò)的層數(shù)幾個方面。
- 優(yōu)化函數(shù)方面有兩個選擇:SGD,Adam,相對來說Adam要簡單很多,不需要設(shè)置參數(shù),效果也還不錯。
- embedding隨著維度的增大會出現(xiàn)一個最大值點,也就是開始時是隨維度的增加效果逐漸比那好,到達一個點后,而后隨維度的增加,效果會變差。
- 殘差網(wǎng)絡(luò)的層數(shù)與embedding的維度有關(guān)系,隨層數(shù)測增加,效果變化也是一個凸函數(shù)。
- 可能包含激活函數(shù)、dropout層和BN層的使用。激活函數(shù)推薦使用relu, dropout層數(shù)不宜設(shè)置過大,過大會導(dǎo)致不收斂,調(diào)節(jié)步長可以是0.05,一般調(diào)整到0.5或0.5就可以找到最佳值。
7、為什么不同的機器學(xué)習(xí)領(lǐng)域都可以使用CNN,CNN解決了這些領(lǐng)域哪些共性問題?他是如何解決的?
CNN的關(guān)鍵是卷積運算,卷積核和卷積輸入層進行局部連接可以獲取整個輸入的局部特征信息或者說是每個輸入特征的組合特征。所以CNN的本質(zhì)是完成了特征提取或者說是對原始特征的特征組合工作,從而增加模型的表達能力。不同領(lǐng)域的機器學(xué)習(xí)都是通過數(shù)據(jù)的特征進行建模,從而解決該領(lǐng)域的問題。故CNN解決了不同領(lǐng)域的特征提取問題,所用的方法是基于局部連接/權(quán)值共享/池化操作/多層次結(jié)構(gòu)。
8、LSTM結(jié)構(gòu)為什么比RNN好?
LSTM有forget gate,?input gate, cell state, hidden information等的變化;因為LSTM有進有出,且當前的cell information是通過input gate控制之后疊加的,RNN是疊乘,因此LSTM可以防止梯度小時或者爆炸。
9、Sigmoid, Tanh, Relu這三個激活函數(shù)有什么有優(yōu)點和缺點?
- sigmoid函數(shù),①優(yōu)點:輸出范圍在(0,1)之間,適合用于二分類問題,可以將輸出解釋為概率;具有平滑的導(dǎo)數(shù),可以利用梯度下降等優(yōu)化算法進行訓(xùn)練。②缺點:sigmoid函數(shù)存在梯度飽和問題,當輸入很大或很小時,梯度接近于零,導(dǎo)致梯度消失,訓(xùn)練速度變慢;且sigmoid輸出不是以零為中心的,這可能導(dǎo)致神經(jīng)網(wǎng)絡(luò)在訓(xùn)練過程中不穩(wěn)定;計算sigmoid函數(shù)的指數(shù)運算較為昂貴。
- Tanh函數(shù):①優(yōu)點:輸出范圍在(-1,1),相對于sigmoid,均值更接近零,有助于減輕梯度消失問題;具有平滑的導(dǎo)數(shù),可用于梯度下降等優(yōu)化算法。②缺點:仍然存在梯度飽和的問題,當輸入很大或很小時,梯度接近于零,導(dǎo)致梯度消失。計算Tanh函數(shù)的指數(shù)運算也較為昂貴。
- Relu函數(shù)(Rectified Linear Unit):①優(yōu)點:計算簡單,只需比較輸入是否大于零,因此訓(xùn)練速度快。相比于前兩種激活函數(shù),relu函數(shù)激活時不會飽和,避免了梯度消失問題。②缺點:部分神經(jīng)元可能會“死亡”(輸出始終為零,不更新),這會導(dǎo)致網(wǎng)絡(luò)的稀疏性;Relu對于負數(shù)輸入的梯度為零,這可能導(dǎo)致梯度爆炸問題,輸出不受限制,可能會導(dǎo)致梯度爆炸問題。
- 為了克服以上缺點,研究人員開發(fā)了各種改進的激活函數(shù),如Leaky Relu, Parametric Relu,ELU和Swish等。這些函數(shù)在一定程度上解決了梯度飽和、梯度爆炸和神經(jīng)元死亡等問題。
10、為什么引入非線性激勵函數(shù)?
深度學(xué)習(xí)的前提是神經(jīng)網(wǎng)絡(luò)的隱層加上了非線性激活函數(shù),提升了模型的非線性表達能力,使得神經(jīng)網(wǎng)絡(luò)可以逼近任意復(fù)雜的函數(shù)。假設(shè)有一個100層的全連接神經(jīng)網(wǎng)絡(luò),其隱層的激活函數(shù)都是線性的,則從輸入層到輸出層實際上可以用一層全連接來等價替換,這樣無法實現(xiàn)真正的深度學(xué)習(xí)。舉例:線性函數(shù) f(x)=2x+3 對 x 經(jīng)過三次相同的線性變換等價于對 x 只進行一次線性變換:f(f(f(x)))=2(2(2x+3)+3)+3=8x+21。
11、為什么LSTM模型既存在sigmoid又存在tanh兩種激活函數(shù),而不是選擇統(tǒng)一一種sigmoid或者tanh?這樣做的目的是什么?
- sigmoid函數(shù)用在了各種gate上,產(chǎn)生0-1之間的值,這個一般只有sigmoid最直接了,相當于要么是1被記住,要么是0被忘帶。
- tanh用在了狀態(tài)和輸出上,是對數(shù)據(jù)的處理,這個用其他激活函數(shù)或許可以。
12、如何解決RNN梯度爆炸和彌散的問題?
為了解決梯度爆炸問題,Thomas Mikolov首先提出了簡單的啟發(fā)性解決方案,就是當梯度大于定閾值時,將它截斷為一個較小的數(shù)。
13、什么樣的數(shù)據(jù)集不適合用深度學(xué)習(xí)?
- 數(shù)據(jù)集太小,數(shù)據(jù)集樣本不足時,深度學(xué)習(xí)相比于其他機器學(xué)習(xí),沒有明顯優(yōu)勢
- 數(shù)據(jù)集沒有局部相關(guān)特性,目前深度學(xué)習(xí)表現(xiàn)比較好的領(lǐng)域主要是圖像/語音/自然語言處理等,這些領(lǐng)域的一個共性是局部相關(guān)性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數(shù)據(jù)中單詞組合成句子,這些特征元素的組合一旦被打亂,表示的含義同時也被改變。對于沒有這樣的局部相關(guān)性的數(shù)據(jù)集,不適于使用深度學(xué)習(xí)算法進行處理。舉個例子:預(yù)測一個人的健康狀況,相關(guān)的參數(shù)會有年齡、職業(yè)、收入、家庭狀況等各種元素,將這些元素打亂,并不會影響相關(guān)的結(jié)果。
14、廣義線性模型是怎樣應(yīng)用在深度學(xué)習(xí)中的?
深度學(xué)習(xí)從統(tǒng)計學(xué)角度,可以看作遞歸的廣義線性模型。廣義線性模型相對于經(jīng)典的線性模型,核心在于引入了連接函數(shù)g(.),形式變?yōu)閥=g?1(wx+b)。深度學(xué)習(xí)時遞歸的廣義線性模型,神經(jīng)元的激活函數(shù),即廣義線性模型的連接函數(shù)。邏輯回歸(廣義線性模型的一種)的Logistic函數(shù)即為神經(jīng)元激活函數(shù)中的sigmoid函數(shù),很多類似的方法在統(tǒng)計學(xué)和神經(jīng)網(wǎng)絡(luò)中的名稱不一樣,容易引起困惑。
15、神經(jīng)網(wǎng)絡(luò)的簡單發(fā)展史
- sigmoid會飽和,造成梯度消失。于是有了ReLU。
- ReLU負半軸是死區(qū),造成梯度變0。于是有了LeakyReLU,PReLU。
- 強調(diào)梯度和權(quán)值分布的穩(wěn)定性,由此有了ELU,以及較新的SELU。
- 太深了,梯度傳不下去,于是有了highway。
- 干脆連highway的參數(shù)都不要,直接變殘差,于是有了ResNet。
16、神經(jīng)網(wǎng)絡(luò)中激活函數(shù)的真正意義?
- 非線性:即導(dǎo)數(shù)不是常數(shù)。這個條件是多層神經(jīng)網(wǎng)絡(luò)的基礎(chǔ),保證多層網(wǎng)絡(luò)不退化成單層線性網(wǎng)絡(luò)。這也是激活函數(shù)的意義所在。
- 幾乎處處可微:可微性保證了在優(yōu)化中梯度的可計算性。傳統(tǒng)的激活函數(shù)如sigmoid等滿足處處可微。對于分段線性函數(shù)比如ReLU,只滿足幾乎處處可微(即僅在有限個點處不可微)。對于SGD算法來說,由于幾乎不可能收斂到梯度接近零的位置,有限的不可微點對于優(yōu)化結(jié)果不會有很大影響。
- 計算簡單:非線性函數(shù)有很多。極端的說,一個多層神經(jīng)網(wǎng)絡(luò)也可以作為一個非線性函數(shù),類似于Network In Network[2]中把它當做卷積操作的做法。但激活函數(shù)在神經(jīng)網(wǎng)絡(luò)前向的計算次數(shù)與神經(jīng)元的個數(shù)成正比,因此簡單的非線性函數(shù)自然更適合用作激活函數(shù)。這也是ReLU之流比其它使用Exp等操作的激活函數(shù)更受歡迎的其中一個原因。
17、深度神經(jīng)網(wǎng)絡(luò)容易收斂到局部最優(yōu),為什么應(yīng)用廣泛?
深度神經(jīng)網(wǎng)絡(luò)“容易收斂到局部最優(yōu)”,很可能是一種想象,實際情況是,我們可能從來沒有找到過“局部最優(yōu)”,更別說全局最優(yōu)了。很多人都有一種看法,就是“局部最優(yōu)是神經(jīng)網(wǎng)絡(luò)優(yōu)化的主要難點”。這來源于一維優(yōu)化問題的直觀想象。在單變量的情形下,優(yōu)化問題最直觀的困難就是有很多局部極值。
18、如何確定是否出現(xiàn)梯度爆炸?
- 模型無法從訓(xùn)練數(shù)據(jù)中獲得更新,如低損失
- 模型不穩(wěn)定,導(dǎo)致更新過程中損失出現(xiàn)顯著變化
- 訓(xùn)練過程中,模型損失變?yōu)镹aN
19、GRU和LSTM的區(qū)別??文章來源:http://www.zghlxwxcb.cn/news/detail-696900.html
GRU是Gated Recurrent Units,是循環(huán)神經(jīng)網(wǎng)絡(luò)的一種。文章來源地址http://www.zghlxwxcb.cn/news/detail-696900.html
- GRU只有兩個門(update和reset),GRU直接將hidden state 傳給下一個單元。
- LSTM有三個門(forget,input,output),LSTM用memory cell 把hidden state 包裝起來。
到了這里,關(guān)于深度學(xué)習(xí)面試八股文(2023.9.06持續(xù)更新)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!