這篇文章記錄看dive into pytorch遇到的所有有意義的點,主要是以后可能在吹B或者面試的時候問到的知識點,因此主要以問答的形式記錄。正因為上述原因,本篇文章記錄的主要是較為基礎的,非嚴肅推導性的點。
練習代碼在這里。
Q:為什么需要激活函數(shù)?
Full Connection Layer只是對數(shù)據(jù)的仿射變換,而多個仿射變換的疊加本質上仍然是一個仿射變換,解決的方法就是引入非線性變換,如對隱藏變量使用按元素運算的非線性函數(shù),作為下一個全連接層的輸入。
Q:什么是訓練誤差?什么是泛化誤差?二者關系是什么?
前者指模型在訓練集上表現(xiàn)出來的誤差,后者指模型在任意一個測試數(shù)據(jù)樣本上表現(xiàn)出來的誤差的期望。基于獨立同分布假設,任意一個給定的ML模型,他的訓練誤差和泛化誤差都是相同的。但是實際上,模型的參數(shù)是在訓練集上訓練的,依據(jù)的是最小化訓練誤差,所以訓練誤差的期望小于或等于泛化誤差。因為無法從訓練誤差估計出泛化誤差,所以一味地降低訓練誤差不等于泛化誤差也會降低。
Q:導致過擬合的原因?
1.模型過于復雜。2.訓練集不夠大。
Q:權重衰減(L2正則化)是怎么防止模型過擬合的?
Q:model.eval()的作用?
主要在于關閉Dropout。Dropout的定義為小于某個概率閾值P0的cell清零,大于P0的cell會被除以1-P0做拉伸,這保證了不改變其輸?的期望值。在測試模型的時候,人們期望得到確定性的結果(特定輸入就得到特定輸出),所以要關閉Dropout,這也就是eval模式的作用(之一)。
Q:在深度學習中,卷積和互相關運算的關系?
互相關運算是指以滑動窗口的形式將輸入矩陣和核矩陣對應計算乘積和,得出結果矩陣;卷積運算是指將核矩陣左右翻轉再上下翻轉后得到的新矩陣進行互相關運算。因為卷積核的參數(shù)信息都是不斷更新學習得來的,所以本質上在深度學習中,卷積就是一種互相關運算(最后會收斂到等效的參數(shù)上)。
Q:什么是特征圖?什么是感受野?
二維卷積層輸出的二維數(shù)組可以看做是輸入在空間維度(寬和高)上某一級的表達,叫做特征圖。影響元素x的前向計算的所有可能輸入?yún)^(qū)域(可能大于輸入實際尺寸)叫做x的感受野。
Q:1*1卷積的作用?
因為1*1是卷積的最小窗口,失去了卷積層可以識別高和寬維度上相鄰元素構成模式的功能。實際上1*1卷積的主要計算發(fā)生在通道維度上,通過使用不同數(shù)量的kernel,可以得出不同通道數(shù)量的輸出。假如將通道當做特征維,寬高的元素當做數(shù)據(jù)樣本,那么1*1卷積的作用與全連接層類似。
Q:池化層(pooling)的作用?
緩解卷積層對位置的過度敏感性。使用p*q池化時,只要卷積層的識別模式在高和寬上移動不超過p-1(q-1)個像素,都可以被檢測出來。
Q:LeNet、AlexNet和VGG?
這三個是典型的卷積網(wǎng)絡。卷積層主要解決兩個問題:1.卷積層保留輸入形狀,使圖像在高和寬兩個方向上的相關性均可能被有效識別;2.卷積層使用滑動窗口將同一個卷積核與不同位置的輸入重復計算,避免了參數(shù)尺寸過大。LeNet是最早的卷積網(wǎng)絡,用于10分類,sigmoid為激活函數(shù),具體結構如下:

FashionMINST,GF940MX 2G顯卡 20 sec/epochAlexNet則是第一個深度卷積網(wǎng)絡,他包含5層卷積、2層隱藏層和1層全連接輸出層。因為后面3層全連接參數(shù)過大(接近1GB),Alex設計了雙數(shù)據(jù)流,使得數(shù)據(jù)在兩塊GPU上并行處理(不同硬件上的數(shù)據(jù)是沒辦法交互計算的),這在現(xiàn)在當然不是問題了。AlexNet用了更簡單的ReLU,求導更簡單而且不會出現(xiàn)梯度消失的問題,sigmoid在x值特別大時,對應的導師f`(x)趨向于0,不利于BP。AlexNet使用了Dropout,提升了泛化性的同時,減少了計算量。AlexNet使用了圖像增強,如翻轉裁切和顏色變化,擴大了數(shù)據(jù)集以緩解數(shù)據(jù)過擬合。具體結構如下:

GF940MX 2G顯卡 700 sec/epochAlexNet雖然在網(wǎng)絡結構上只是LeNet的簡單增加,但是科研思路和精度提升卻是有非常重大意義的。AlexNet和LeNet雖然是卷積網(wǎng)絡,但是沒有給后來者提供進一步的研究思路。VGG提出了可以復用簡單模塊來構建深度模型的思路。VGG提出的簡單模塊稱為VGGblock,連續(xù)使用數(shù)個相同的填充為1,窗口形狀為3*3的卷積核,最后接上一個步幅為2,窗口形狀2*2的最大池化。結果就是數(shù)據(jù)每過一個VGG_block,尺寸就減半。VGG-11的結構如下:

這就不難為我的小卡了吧一個224*224的圖像經(jīng)過VGG-11的5個block后,尺寸變化為7*7。
Q:什么是Network in Network(NiN)?
在AlexNet中因為末尾的三個全連接層的參數(shù)太大,Alex做過一些改進。NiN也是改進之一,它兼具VGG的block思想和減少AlexNet參數(shù)的思想,核心做法是用1*1卷積代替全連接層,使用1*1卷積將卷積層通道數(shù)變?yōu)轭悇e數(shù),然后使用全局平均池化(即kernel等于特征size)得出對應輸出。NiN的好處是可以顯著減小模型參數(shù)尺寸,緩解了過擬合問題。但是實際過程中,NiN的收斂時間要長于VGG等全連接輸出層。

哈哈哈 VSC修好了

1*224*224的圖片尺寸變化 629 sec/epoch,訓練的快,收斂的慢
Q:什么是GoogLeNet?
GoogLeNet和VGG-11是2014年imageNet挑戰(zhàn)賽的第一、二名,兩者擁有相似的思想,那就是分塊。相比于VGG-11,GoogLeNet在通道設計和深度上都更復雜,核心在于并行結構的Inception塊。

四路并行

GoogLeNet第一版本架構 大卷積核明顯少雖然模型看著更復雜,但是實際上計算復雜度是更低的,可以說是一個更加精妙的設計。至于Inception塊的通道設計分配比例,則是在ImageNet數(shù)據(jù)集上大量數(shù)據(jù)實驗得來的。
Q:簡單理解Batch Normalization?
訓練時使用BN,不斷調整網(wǎng)絡中間層的輸出,從而使網(wǎng)絡更穩(wěn)定。BN分為對Conv的和對FC的,兩者稍有不同。和Dropout一樣,訓練模式和測試模式下輸出是不同的。因為訓練時用的是一個batch的均值和方差,而測試時用的是移動平均估算整個數(shù)據(jù)集的均值和方差。
Q: 什么是ResNet和DenseNet?
對于NN,原則上對充分訓練的模型添加新的層,訓練誤差都會降低,因為原模型的解空間是新模型解空間的子集。特殊的,如果后添加的層如果能擬合成恒等映射f(x)=x那么新模型和原模型同樣有效。 然而,實際上過深的層使得誤差不降反升。即使BN使得數(shù)值穩(wěn)定性提高,訓練深層模型更容易,但是誤差上升的問題依舊沒有解決。

假設虛線框內為一局部擬合函數(shù),目標是f(x)。那么普通網(wǎng)絡結構的目標是擬合f(x),ResNet則擬合f(x)-x?;谏鲜龅暮愕扔成渌枷?,擬合f(x)-x=0比f(x)=x更容易優(yōu)化。實際上,權重W和偏差b都接近于0,更容易捕捉恒等映射的細微波動。(也不太懂,你說是那就是)具體實現(xiàn)則是依靠殘差塊,以ResNet-18 結構為例:每個 Residual 結構 2 個 conv(Not 1*1)每個 殘差塊(blk) 2 個 Residual 結構共計 4 個 blk 16 個 conv輸入層的 conv + 輸出的 FC共計 18 層

224*224的圖片尺寸和通道變化DenseNet則是將元素相加操作換成了通道連接操作,一個dense塊內的conv會用到前面所有的輸入通道。其中尺寸是相同的,但是通道數(shù)會逐漸加大。所以需要一個1*1卷積層調整通道數(shù),使之不會太夸張,成為過渡層。


96*96的圖片尺寸和通道變化ResNet使用stride=2的殘差塊使feature map的size減半,DenseNet則在過渡層1*1conv之后在接一個kernel=2的池化,使得feature map的size減半。
To Be Continued