天天看點

機器學習、深度學習面試知識點彙總

作者:機器視覺知識推薦官

作者丨Oldpan

來源丨oldpan部落格

編輯丨極市平台

導讀

本文總結了一些秋招面試中會遇到的問題和一些重要的知識點,适合面試前突擊和鞏固基礎知識。

前言

最近這段時間正臨秋招,這篇文章是老潘在那會找工作過程中整理的一些重要知識點,内容比較雜碎,部分采集于網絡,簡單整理下發出來,适合面試前突擊,當然也适合鞏固基礎知識。另外推薦大家一本叫做《百面機器學習》的新書,2018年8月份出版的,其中包括了很多機器學習、深度學習面試過程中會遇到的問題,比較适合需要準備面試的機器學習、深度學習方面的算法工程師,當然也同樣适合鞏固基礎~有時間一定要需要看的書籍:

  • 程式員的數學系列,适合重溫知識,回顧一些基礎的線性代數、機率論。
  • 深度學習花書,總結類書,有基礎知識的講解,比較全面。
  • 統計學習方法,總結類書,篇幅不長,都是核心。
  • Pattern Recognition and Machine Learning,條理清晰,用貝葉斯的方式來講解機器學習。
  • 機器學習西瓜書,适合當教材,内容較廣但是不深。
機器學習、深度學習面試知識點彙總

百翻不爛的百面機器學習

常見的常識題

  • L1正則可以使少數權值較大,多數權值為0,得到稀疏的權值;L2正則會使權值都趨近于0但非零,得到平滑的權值;
  • 在AdaBoost算法中,被錯分的樣本的權重更新比例的公式相同;
  • Boosting和Bagging都是組合多個分類器投票的方法,但Boosting是根據單個分類器的正确率決定其權重,Bagging是可簡單地設定所有分類器權重相同;
  • EM算法不能保證找到全局最優值;
  • SVR中核函數寬度小欠拟合,寬度大容易過拟合
  • PCA和LDA都是經典的降維算法。PCA是無監督的,也就是訓練樣本不需要标簽;LDA是有監督的,也就是訓練樣本需要标簽。PCA是去除掉原始資料中備援的次元,而LDA是尋找一個次元,使得原始資料在該次元上投影後不同類别的資料盡可能分離開來。

PCA是一種正交投影,它的思想是使得原始資料在投影子空間的各個次元的方差最大。假設我們要将N維的資料投影到M維的空間上(M<N),根據PCA,我們首先求出這N維資料的協方差矩陣,然後求出其前M個最大的特征值所對應的特征向量,那麼這M個特征向量即為所求的投影空間的基。LDA投影後類内方差最小,類間方差最大。如下圖所示有兩種投影方式,左邊的投影後紅色資料和藍色資料還有重疊部分,右邊的投影後紅色資料和藍色資料則剛好被分開。LDA的投影即類似右邊的投影方式,投影後使得不同類别的資料盡可能分開,而相同類别的資料則盡可能緊湊地分布。

機器學習、深度學習面試知識點彙總

PCA和LDA

  • 參考連結:PCA和LDA的對比

KNN K近鄰

關于K近鄰算法的知識有很多,比如算法執行的步驟、應用領域以及注意事項,不過相信很多人對K近鄰算法的使用注意事項不是很清楚。在這篇文章中我們針對這個問題進行解答,帶大家來好好了解一下k近鄰算法的注意事項以及K近鄰算法的優點與缺點。

  • K近鄰算法的注意事項

K近鄰算法的使用注意事項具體就是使用距離作為度量時,要保證所有特征在數值上是一個數量級上,以免距離的計算被數量級大的特征所主導。在資料标準化這件事上,還要注意一點,訓練資料集和測試資料集一定要使用同一标準的标準化。其中的原因總的來說就有兩點内容,第一就是标準化其實可以視為算法的一部分,既然資料集都減去了一個數,然後除以一個數,這兩個數對于所有的資料來說,就要一視同仁。第二就是訓練資料集其實很少,在預測新樣本的時候,新樣本就更少得可憐,如果新樣本就一個資料,它的均值就是它自己,标準差是0,這根本就不合理。

  • K近鄰算法的優點是什麼呢?

K近鄰算法的優點具體展現在四方面。第一就就是k近鄰算法是一種線上技術,新資料可以直接加入資料集而不必進行重新訓練,第二就是k近鄰算法理論簡單,容易實作。第三就是準确性高,對異常值和噪聲有較高的容忍度。第四就是k近鄰算法天生就支援多分類,差別與感覺機、邏輯回歸、SVM。

  • K近鄰算法的缺點是什麼呢?

K近鄰算法的缺點,基本的 k近鄰算法每預測一個“點”的分類都會重新進行一次全局運算,對于樣本容量大的資料集計算量比較大。而且K近鄰算法容易導緻次元災難,在高維空間中計算距離的時候,就會變得非常遠;樣本不平衡時,預測偏差比較大,k值大小的選擇得依靠經驗或者交叉驗證得到。k的選擇可以使用交叉驗證,也可以使用網格搜尋。k的值越大,模型的偏差越大,對噪聲資料越不敏感,當 k的值很大的時候,可能造成模型欠拟合。k的值越小,模型的方差就會越大,當 k的值很小的時候,就會造成模型的過拟合。

二維高斯核函數

如果讓你寫一個高斯模糊的函數,你該怎麼寫呢?

`def gaussian_2d_kernel(kernel_size = 3,sigma = 0):
kernel = np.zeros([kernel_size,kernel_size])  
center = kernel_size // 2  


if sigma == 0:  
    sigma = ((kernel_size-1)*0.5 - 1)*0.3 + 0.8  


s = 2*(sigma**2)  
sum_val = 0  
for i in range(0,kernel_size):  
    for j in range(0,kernel_size):  
        x = i-center  
        y = j-center  
        kernel[i,j] = np.exp(-(x**2+y**2) / s)  
        sum_val += kernel[i,j]  
        #/(np.pi * s)  
sum_val = 1/sum_val  
return kernel*sum_val  


`           

訓練采樣方法

  • 交叉驗證
  • 留一法
  • 自助法(bootstrap):有放回的抽樣方法,可能會抽到重複的樣本

Kmean和GMM原理、差別、應用場景

kmeans的收斂性?

  • 可以看這裡 https://zhuanlan.zhihu.com/p/36331115
  • 也可以看百面機器學習P93、P102

如何在多台計算機上做kmeans

其實是這樣的,先分布到n台機器上,要保證k個初始化相同,經過一次疊代後,拿到k*n個新的mean,放到一台新的機器上,因為初始化相同,是以mean的排列相同,然後對屬于每個類的n個mean做權重平均,再放回每台機器上做下一步疊代。

KNN算法以及流程

K值的選擇:

  • K值較小,則模型複雜度較高,容易發生過拟合,學習的估計誤差會增大,預測結果對近鄰的執行個體點非常敏感。
  • K值較大可以減少學習的估計誤差,但是學習的近似誤差會增大,與輸入執行個體較遠的訓練執行個體也會對預測起作用,使預測發生錯誤,k值增大模型的複雜度會下降。
  • 在應用中,k值一般取一個比較小的值,通常采用交叉驗證法來來選取最優的K值。

KNN中的K值選取對分類的結果影響至關重要,K值選取的太小,模型太複雜。K值選取的太大,導緻分類模糊。那麼K值到底怎麼選取呢?有人用Cross Validation,有人用貝葉斯,還有的用bootstrap。而距離度量又是另外一個問題,比較常用的是選用歐式距離。可是這個距離真的具有普适性嗎?《模式分類》中指出歐式距離對平移是敏感的,這點嚴重影響了判定的結果。在此必須選用一個對已知的變換(比如平移、旋轉、尺度變換等)不敏感的距離度量。書中提出了采用切空間距離(tangent distance)來替代傳統的歐氏距離。

無監督學習和有監督學習的差別

有監督:

  • 感覺機
  • K近鄰法
  • 樸素貝葉斯
  • 決策樹
  • 邏輯回歸
  • 支援向量機
  • 提升方法
  • 隐馬爾科夫模型
  • 條件随機場

無監督:

  • 聚類-kmeans
  • SVD奇異值分解
  • PCA主成分分析

生成式模型:LDA KNN 混合高斯 貝葉斯 馬爾科夫 深度信念 判别式模型:SVM NN LR CRF CART

邏輯回歸與SVM差別

邏輯回歸即LR。LR預測資料的時候,給出的是一個預測結果為正類的機率,這個機率是通過sigmoid函數将wTx映射到[0,1]得到的,對于wTx正的很大時(可以認為離決策邊界很遠),得到為正類的機率趨近于1;對于wTx負的很大時(可以認為離決策邊界很遠),得到為正類的機率趨近于0。在LR中,跟“與決策邊界距離”扯得上關系的僅此而已。在參數w求解過程中完全沒有與決策邊界距離的影子,所有樣本都一視同仁。和感覺機的不同之處在于,LR用到與決策邊界的距離,是用來給預測結果一個可以看得到的置信區間。感覺機裡面沒有這一考慮,隻根據符号來判斷。而SVM更進一步,在參數的求解過程中,便舍棄了距離決策邊界過遠的點。LR和感覺機都很容易過拟合,隻有SVM加入了L2範數之後的結構化風險最小化政策才解決了過拟合的問題。總結之:

  • 感覺機前後都沒有引入與超平面“距離”的概念,它隻關心是否在超平面的一側;
  • LR引入了距離,但是在訓練模型求其參數的時候沒有距離的概念,隻是在最後預測階段引入距離以表征分類的置信度;
  • SVM兩個地方有距離的概念:其一,在求超平面參數的時候有距離的概念,其表現為在與超平面一定距離内的點着重關注,而其他的一切點都不再關注。被關注的點稱之為“支撐向量”。其二,預測新樣本的時候,和LR一樣,距離代表置信度。

邏輯回歸隻能解決二分類問題,多分類用softmax。相關參考連結

  • https://blog.csdn.net/maymay_/article/details/80016175
  • https://blog.csdn.net/jfhdd/article/details/52319422
  • https://www.cnblogs.com/eilearn/p/9026851.html

bagging boosting 和 提升樹

  • bagging是通過結合幾個模型降低泛化誤差,分别訓練幾個不同的模型,然後讓所有的模型表決測試樣例的輸出。模型平均奏效的原因是不同的模型通常不會在測試集上産生完全相同的誤差。從原始樣本集中抽取訓練集.每輪從原始樣本集中使用Bootstraping的方法抽取n個訓練樣本(在訓練集中,有些樣本可能被多次抽取到,而有些樣本可能一次都沒有被抽中).共進行k輪抽取,得到k個訓練集.(k個訓練集互相獨立)
  • Bagging是并行的學習算法,思想很簡單,即每一次從原始資料中根據均勻機率分布有放回的抽取和原始資料集一樣大小的資料集合。樣本點可以出現重複,然後對每一次産生的資料集構造一個分類器,再對分類器進行組合。對于分類問題,将上步得到的k個模型采用投票的方式得到分類結果;對回歸問題,計算上述模型的均值作為最後的結果.
  • Boosting是一族可将弱學習器提升為強學習器的算法.Boosting的每一次抽樣的樣本分布是不一樣的,每一次疊代,都是根據上一次疊代的結果,增加被錯誤分類的樣本的權重。使模型在之後的疊代中更加注重難以分類的樣本。這是一個不斷學習的過程,也是一個不斷提升的過程,這就是Boosting思想的本質所在。疊代之後,将每次疊代的基分類器進行內建,那麼如何進行樣本權重的調整和分類器的內建是我們需要考慮的關鍵問題。

Bagging和Boosting的差別:

  • 1)樣本選擇上:Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的. Boosting:每一輪的訓練集不變,隻是訓練集中每個樣例在分類器中的權重發生變化.而權值是根據上一輪的分類結果進行調整.
  • 2)樣例權重:Bagging:使用均勻取樣,每個樣例的權重相等 Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大.
  • 3)預測函數:Bagging:所有預測函數的權重相等. Boosting:每個弱分類器都有相應的權重,對于分類誤差小的分類器會有更大的權重.
  • 4)并行計算:Bagging:各個預測函數可以并行生成 Boosting:各個預測函數隻能順序生成,因為後一個模型參數需要前一輪模型的結果.

Bagging 是 Bootstrap Aggregating 的簡稱,意思就是再取樣 (Bootstrap) 然後在每個樣本上訓練出來的模型取平均,是以是降低模型的 variance. Bagging 比如 Random Forest 這種先天并行的算法都有這個效果。Boosting 則是疊代算法,每一次疊代都根據上一次疊代的預測結果對樣本進行權重,是以随着疊代不斷進行,誤差會越來越小,是以模型的 bias 會不斷降低High variance 是model過于複雜overfit,記住太多細節noise,受outlier影響很大;high bias是underfit,model過于簡單,cost function不夠好。boosting是把許多弱的分類器組合成一個強的分類器。弱的分類器bias高,而強的分類器bias低,是以說boosting起到了降低bias的作用。variance不是boosting的主要考慮因素。bagging是對許多強(甚至過強)的分類器求平均。在這裡,每個單獨的分類器的bias都是低的,平均之後bias依然低;而每個單獨的分類器都強到可能産生overfitting的程度,也就是variance高,求平均的操作起到的作用就是降低這個variance。Bagging算法的代表:RandomForest随機森林算法的注意點:

  • 在建構決策樹的過程中是不需要剪枝的。
  • 整個森林的樹的數量和每棵樹的特征需要人為進行設定。
  • 建構決策樹的時候分裂節點的選擇是依據最小基尼系數的。

咱們機器學習更新版的随機森林章節,我用白闆寫了寫這個公式:p = 1 - (1 - 1/N)^N,其意義是:一個樣本在一次決策樹生成過程中,被選中作為訓練樣本的機率,當N足夠大時,約等于63.2%。簡言之,即一個樣本被選中的機率是63.2%,根據二項分布的的期望,這意味着大約有63.2%的樣本被選中。即有63.2%的樣本是不重複的,有36.8%的樣本可能沒有在本次訓練樣本集中。随機森林是一個包含多個決策樹的分類器,并且其輸出的類别是由個别樹輸出的類别的衆數而定。随機森林的随機性展現在每顆樹的訓練樣本是随機的,樹中每個節點的分裂屬性集合也是随機選擇确定的。有了這2個随機的保證,随機森林就不會産生過拟合的現象了。随機森林是用一種随機的方式建立的一個森林,森林是由很多棵決策樹組成的,每棵樹所配置設定的訓練樣本是随機的,樹中每個節點的分裂屬性集合也是随機選擇确定的。

SVM

相關的notebook除了cs231n也可以看這裡。

https://momodel.cn/workspace/5d37bb9b1afd94458f84a521?type=module

凸集、凸函數、凸優化

面試見得比較少,感興趣的可以看下:

https://blog.csdn.net/feilong_csdn/article/details/83476277

為什麼深度學習中的圖像分割要先編碼後解碼

降采樣是手段不是目的:

  • 降低顯存和計算量,圖小了顯存也小,計算量也小;
  • 增大感受野,使用同樣3x3的卷積能在更大的圖像範圍上進行特征提取。大感受野對分割很重要,小感受野做不了多分類分割,而且分割出來很粗糙
  • 多出幾條不同程度額下采樣分支,可以友善進行多尺度特征的融合。多級語義融合會讓分類更加準确。

降采樣的理論意義,我簡單朗讀一下,它可以增加對輸入圖像的一些小擾動的魯棒性,比如圖像平移,旋轉等,減少過拟合的風險,降低運算量,和增加感受野的大小。相關連結:為什麼深度學習中的圖像分割要先編碼再解碼?

(全局)平均池化average pooling和(全局)最大池化max pooling的差別

  • 最大池化保留了紋理特征
  • 平均池化保留整體的資料特征
  • 全局平均池化有定位的作用(看知乎)

最大池化提取邊緣等“最重要”的特征,而平均池化提取的特征更加smoothly。對于圖像資料,你可以看到差異。雖然兩者都是出于同樣的原因使用,但我認為max pooling更适合提取極端功能。平均池有時不能提取好的特征,因為它将全部計入并計算出平均值,這對于對象檢測類型任務可能不好用但使用平均池化的一個動機是每個空間位置具有用于期望特征的檢測器,并且通過平均每個空間位置,其行為類似于平均輸入圖像的不同平移的預測(有點像資料增加)。Resnet不是采用傳統的完全連通層進行CNN分類,而是直接從最後一個mlp轉換層輸出特征圖的空間平均值,作為通過全局平均合并層的類别置信度,然後将得到的矢量輸入到 softmax層。相比之下,Global average更有意義且可解釋,因為它強制實作了feature和類别之間的對應關系,這可以通過使用網絡的更強大的本地模組化來實作。此外,完全連接配接的層易于過拟合并且嚴重依賴于 dropout 正則化,而全局平均池化本身就是起到了正則化作用,其本身防止整體結構的過拟合。

  • https://zhuanlan.zhihu.com/p/42384808
  • https://www.zhihu.com/question/335595503/answer/778307744
  • https://www.zhihu.com/question/309713971/answer/578634764

全連接配接的作用,與1x1卷積層的關系

在實際使用中,全連接配接層可由卷積操作實作:對前層是全連接配接的全連接配接層可以轉化為卷積核為1x1的卷積;而前層是卷積層的全連接配接層可以轉化為卷積核為hxw的全局卷積,h和w分别為前層卷積結果的高和寬使用 global average pooling 全局平均池化來代替卷積

  • 全連接配接層(fully connected layers,FC)在整個卷積神經網絡中起到“分類器”的作用。如果說卷積層、池化層和激活函數層等操作是将原始資料映射到隐層特征空間的話,全連接配接層則起到将學到的“分布式特征表示”映射到樣本标記空間的作用。在實際使用中,全連接配接層可由卷積操作實作:對前層是全連接配接的全連接配接層可以轉化為卷積核為1x1的卷積;而前層是卷積層的全連接配接層可以轉化為卷積核為hxw的全局卷積,h和w分别為前層卷積結果的高和寬

那麼,1*1卷積的主要作用有以下幾點:

  • 降維( dimension reductionality )。比如,一張500x500且厚度depth為100的圖檔在20個filter上做1*1的卷積,那麼結果的大小為500*500*20。
  • 加入非線性。卷積層之後經過激勵層,1*1的卷積在前一層的學習表示上添加了非線性激勵( non-linear activation ),提升網絡的表達能力,但是也可以這樣說:使之由單純的線性變換,變為複雜的feature map之間的線性組合,進而實作特征的高度抽象過程。這一過程視為由線性變換為非線性,提高抽象程度。而非加入激活函數的作用。
  • 個人應該是降維或者升維來減小參數個數和增加網絡深度,以及跨通道的特征聚合
  • 可以代替全連接配接層

看這個問題的回答 https://www.zhihu.com/question/56024942/answer/369745892

看這個問題的回答 https://www.zhihu.com/question/41037974/answer/150522307

concat與add(sum)的差別

對于兩路輸入來說,如果是通道數相同且後面帶卷積的話,add等價于concat之後對應通道共享同一個卷積核。下面具體用式子解釋一下。由于每個輸出通道的卷積核是獨立的,我們可以隻看單個通道的輸出。假設兩路輸入的通道分别為X1, X2, ..., Xc和Y1, Y2, ..., Yc。那麼concat的單個輸出通道為(*表示卷積):

而add的單個輸出通道為:

是以add相當于加了一種prior,當兩路輸入可以具有“對應通道的特征圖語義類似”(可能不太嚴謹)的性質的時候,可以用add來替代concat,這樣更節省參數和計算量(concat是add的2倍)。FPN[1]裡的金字塔,是希望把分辨率最小但語義最強的特征圖增加分辨率,從性質上是可以用add的。如果用concat,因為分辨率小的特征通道數更多,計算量是一筆不少的開銷。https://www.zhihu.com/question/306213462/answer/562776112

  • concat改成sum确實會好很多,這兩個都是特征融合,到底有什麼本質差別呢?我用的時候也沒什麼原則就是兩個都試一下(其實更喜歡用sum,畢竟更省顯存)。
  • 我之前做過類似ASP的實驗,金字塔型空洞卷積融合,最後實驗結果sum比concat要好一些,但是原因不知道怎麼解釋
  • 我看過一些論文是concat比sum好的,可能這跟資料集等具體情況有關吧
  • 不同的特征 sum 了,有什麼意義呢,這些特征又損失了吧;如果直接 concat,讓後面的網絡學習,應該更好啊,用到的特征更多了

SSD怎麼改動變成FasterRCNN

SSD是直接分類,而FasterRcnn是先判斷是否為背景再進行分類。一個是直接細分類,一個是先粗分類再細分類。

反向傳播的原理

反向傳播原理看CS231n中的BP過程,以及Jacobian的傳播。

GD、SGD、mini batch GD的差別

在百面深度學習中有相應的章節。

偏差、方差

有一篇文章比較好的介紹了,還有在那本電子版CNNbook中也有。

  • http://scott.fortmann-roe.com/docs/BiasVariance.html
  • 泛化誤差可以分解成偏差的平方+方差+噪聲
  • 偏差度量了學習算法的期望預測和真實結果的偏離程度,刻畫了學習算法本身的拟合能力
  • 方差度量了同樣大小的訓練集的變動所導緻的學習性能的變化,刻畫了資料 擾動所造成的幹擾
  • 噪聲表達了目前任務上學習任何算法所能達到的期望泛化誤差下界,刻畫了問題本身的難度。
  • 偏差和方差一般稱為bias和variance,一般訓練誤差越強,偏差越小,方差越大,泛化誤差在中間會有一個最小值。
  • 如果偏差較大,方差較小,此時為欠拟合,而偏差較小,方差較大為過拟合。

為什麼會梯度爆炸,如何防止

多層神經網絡通常存在像懸崖一樣的結構,這是由于幾個較大的權重相乘導緻的。遇到斜率很大的懸崖結構,梯度更新會很大程式地改變參數值,通常會完全跳過這類懸崖的結構。花書P177.

分布式訓練,多卡訓練

http://ai.51cto.com/art/201710/555389.htm

https://blog.csdn.net/xs11222211/article/details/82931120#commentBox

精确率和召回率以及PR曲線

這個講的比較好(TP與FP和ROC曲線):

  • https://segmentfault.com/a/1190000014829322

精确率是指分類正确的正樣本個數占分類器判定為正樣本的樣本個數的比例。召回率是指分類正确的正樣本個數占真正的正樣本個數的比例。Precision值和Recall值是既沖突又統一的兩個名額,為了提高Precision值,分類器需要盡量在“更有把握”時才把樣本預測為正樣本,但此時往往會因為過于保守而漏掉很多“沒有把握”的正樣本,導緻Recall值很低。如何權衡這兩個值,是以出現了PR曲線、ROC曲線以及F1 score等更多的标準來進行判斷。https://www.cnblogs.com/xuexuefirst/p/8858274.html

Yolov2相比Yolov1因為采用了先驗框(Anchor Boxes),模型的召回率大幅提升,同時map輕微下降了0.2。

https://segmentfault.com/a/1190000014829322

https://www.cnblogs.com/eilearn/p/9071440.html

https://blog.csdn.net/zdh2010xyz/article/details/54293298

空洞卷積

空洞卷積一般都伴有padding,如果dilation=6,那麼padding也等于6。通過空洞卷積後的卷積特征圖的大小不變,但是這個卷積的感受野比普通同等大小的卷積大。不過通道數是可以改變的。

  • 在DeepLabv3+中,最後的ASPP層,通過一個1x1卷積和3個3x3的空洞卷積,再concat上一個經過全局平均池化後雙線性采樣到同等次元的特征圖。

但是要注意,由于空洞卷積本身不會增大運算量,但是後續的分辨率沒有減小,後面的計算量就間接變大了。https://zhuanlan.zhihu.com/p/52476083

資料不好怎麼辦,資料不均衡怎麼處理、隻有少量帶标簽怎麼處理

具體問題具體分析。

訓練過程中需要過拟合情況怎麼辦

  • 深度學習-通用模型調試技巧
  • 如何根據訓練/驗證損失曲線診斷我們的CNN
  • 關于訓練神經網路的諸多技巧Tricks(完全總結版)
  • 深度學習中資料集很小是一種什麼樣的體驗

如果模型的實際容量比較大,那麼可以說模型可以完全學習到整個資料集,會發生過拟合。這時候再添加新的資料進去,模型的性能會進一步提升,說明模型還沒有被撐死。期望風險是模型關于聯合分布的期望損失,經驗風險是模型關于訓練資料集的平均損失。根據大樹定律,當樣本容量N趨于無窮時,經驗風險趨于期望風險。但是當樣本的容量比較小的的時候,經驗風險最小化學習的效果未必就會很好,會産生“過拟合”的現象。結構風險最小化是為了防止過拟合而提出的政策。

https://lilianweng.github.io/lil-log/2019/03/14/are-deep-neural-networks-dramatically-overfitted.html

https://www.jianshu.com/p/97aafe479fa1 (重要)

正則化

在Pytorch中隻能在optim中設定weight_decay,目前隻支援L2正則,而且這個正則是針對模型中所有的參數,不論是w還是b,也包括BN中的W和b。

BN層和L2正則化一起有什麼後果

就是因為 batch norm 過後, weight 影響沒那麼重了,是以 l2 weight decay 的效果就不明顯了。證明了L2正則化與歸一化相結合時沒有正則化效應。相反,正則化會影響權重的範圍,進而影響有效學習率。

https://www.cnblogs.com/makefile/p/batch-norm.html?utm_source=debugrun&utm_medium=referral

ROIPooling和ROIAlign的差別

空間金字塔池化(SSP)可以使不同尺寸的圖像産生固定的輸出次元。借題也問個問題,為什麼fast rcnn的roi pooling是一個max pooling呢?roi pooling後面也是做單個roi的classification,為啥不和classification的pooling不同?我直覺是看feature map中的一個channel,提取全局特征(如,做classification)用average pooling,提取提取全局資訊;提取局部特征(如,roi pooling)應該用max pooling,提取局部最明顯的特征,成為7×7的grid後交給後面的fc來做classification。相關介紹:

  • SPPNet-引入空間金字塔池化改進RCNN

自己實作圖像增強算法

https://zhuanlan.zhihu.com/p/71231560

圖像分類的tricks

  • 亞馬遜:用CNN進行圖像分類的Tricks(https://mp.weixin.qq.com/s/e4m_LhtqoUiGJMQfEZHcRA)

消融實驗(Ablation experiment)

因為作者提出了一種方案,同時改變了多個條件/參數,他在接下去的消融實驗中,會一一控制一個條件/參數不變,來看看結果,到底是哪個條件/參數對結果的影響更大。下面這段話摘自知乎,@人民藝術家:你朋友說你今天的樣子很帥,你想知道發型、上衣和褲子分别起了多大的作用,于是你換了幾個發型,你朋友說還是挺帥的,你又換了件上衣,你朋友說不帥了,看來這件衣服還挺重要的。

手撸NMS與soft-NMS

https://oldpan.me/archives/write-hard-nms-c

邏輯回歸和線性回歸

線性回歸:通過均方誤差來尋找最優的參數,然後通過最小二乘法來或者梯度下降法估計:

機器學習、深度學習面試知識點彙總

而邏輯回歸的原型:對數幾率回歸:邏輯回歸和對數幾率回歸是一樣的,通過變形就可以得到,另外邏輯回歸使用極大似然機率進行估計。簡單總結:

  • 線性回歸和邏輯回歸都是廣義線性回歸模型的特例
  • 線性回歸隻能用于回歸問題,邏輯回歸用于分類問題(可由二分類推廣至多分類)
  • 線性回歸無聯系函數或不起作用,邏輯回歸的聯系函數是對數幾率函數,屬于Sigmoid函數
  • 線性回歸使用最小二乘法作為參數估計方法,邏輯回歸使用極大似然法作為參數估計方法
  • 兩者都可以使用梯度下降法

注意:

  • 線性回歸的梯度下降法其實和我們訓練神經網絡一直,首先需要對參數進行初始化,然後使用随機梯度下降的方式對參數進行更新:https://zhuanlan.zhihu.com/p/33992985
  • 線性回歸與最小二乘法:https://zhuanlan.zhihu.com/p/36910496
  • 最大似然 https://zhuanlan.zhihu.com/p/33349381

來源文章:

  • https://segmentfault.com/a/1190000014807779
  • https://zhuanlan.zhihu.com/p/39363869
  • https://blog.csdn.net/hahaha_2017/article/details/81066673

對于凸函數來說,局部最優就是全局最優,相關連結:http://sofasofa.io/forum_main_post.php?postid=1000329

http://sofasofa.io/forum_main_post.php?postid=1000322Logistic classification with cross-entropy

什麼是attention,有哪幾種

https://zhuanlan.zhihu.com/p/61440116

https://www.zhihu.com/question/65044831/answer/227262160

深度學習的線性和非線性

  • 卷積是線性的
  • 激活函數是非線性的

梯度消失和梯度爆炸的問題

機器學習、深度學習面試知識點彙總

Batch-norm層的作用

不看必進坑~不論是訓練還是部署都會讓你踩坑的Batch Normalization

Batch size過小會使Loss曲線振蕩的比較大,大小一般按照2的次幂規律選擇,至于為什麼?沒有答出來,面試官後面解釋是為了硬體計算效率考慮的,海哥後來也說GPU訓練的時候開的線程是2的次幂個神經網絡的本質是學習資料的分布,如果訓練資料與測試資料的分布不同則會大大降低網絡的泛化能力。随着網絡訓練的進行,每個隐層的變化使得後一層的輸入發生變化,進而每一批訓練的資料的分布也會變化,緻使網絡在每次疊代過程中都需要拟合不同的資料分布,增加資料訓練的複雜度和過拟合的風險。

機器學習、深度學習面試知識點彙總

對資料的劇烈變化有抵抗能力。

機器學習、深度學習面試知識點彙總

要注意BN在卷積網絡層中,因為參數的共享機制,每一個卷積核的參數在不同位置的神經元當中是共享的,是以也應該被歸一化。(具體看一下實作過程)https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/batch_norm_layer.html但是在訓練過程中如果batch-size不大的話,可以不使用BN(MaskRcnn這樣說的)。至此,關于Batch Normalization的理論與實戰部分就介紹道這裡。總的來說,BN通過将每一層網絡的輸入進行normalization,保證輸入分布的均值與方差固定在一定範圍内,減少了網絡中的Internal Covariate Shift問題,并在一定程度上緩解了梯度消失,加速了模型收斂;并且BN使得網絡對參數、激活函數更加具有魯棒性,降低了神經網絡模型訓練和調參的複雜度;最後BN訓練過程中由于使用mini-batch的mean/variance作為總體樣本統計量估計,引入了随機噪聲,在一定程度上對模型起到了正則化的效果。

  • https://zhuanlan.zhihu.com/p/34879333

BN與貝葉斯的關系:

  • 從Bayesian角度淺析Batch Normalization

BN跨卡訓練怎麼保證相同的mean和var

在實踐中,我發現,跨卡同步的BN對于performance相當有用。尤其是對于detection,segmentation任務,本來Batch size較小。如果Batch Norm能跨卡同步的話,就相當于增大了Batch Norm的batch size 這樣能估計更加準确的mean和variance,是以這個操作能提升performance。

如何實作SyncBN

跨卡同步BN的關鍵是在前向運算的時候拿到全局的均值和方差,在後向運算時候得到相應的全局梯度。最簡單的實作方法是先同步求均值,再發回各卡然後同步求方差,但是這樣就同步了兩次。實際上隻需要同步一次就可以,我們使用了一個非常簡單的技巧,改變方差的公式(公式是圖檔,具體大家自己網上搜一下SyncBN)。這樣在前向運算的時候,我們隻需要在各卡上算出與,再跨卡求出全局的和即可得到正确的均值和方差, 同理我們在後向運算的時候隻需同步一次,求出相應的梯度與。我們在最近的論文Context Encoding for Semantic Segmentation 裡面也分享了這種同步一次的方法。有了跨卡BN我們就不用擔心模型過大用多卡影響收斂效果了,因為不管用多少張卡隻要全局的批量大小一樣,都會得到相同的效果。

ResNet為什麼好用

出現因素:

  • 随着網絡的加深,優化函數越來越陷入局部最優解
  • 随着網絡層數的增加,梯度消失的問題更加嚴重,因為梯度在反向傳播的時候會逐漸衰減

原因,誤差傳播公式可以寫成參數W和導數F連乘的形式,當誤差由第L層傳播到輸入以外的第一個隐含層的時候,會涉及到很多很多的參數和導數的連乘,這時誤差很容易産生消失或者膨脹,導緻不容易學習,拟合能力和泛化能力較差。殘差層中的F層隻需要拟合輸入x與目标輸出H的殘差H-x即可,如果某一層的輸出已經較好地拟合了期望結果,那麼多一層也不回使得模型變得更差,因為該層的輸出直接被短接到兩層之後,相當于直接學習了一個恒等映射,而跳過的兩層隻需要拟合上層輸出和目标之間的殘差即可。

  • https://zhuanlan.zhihu.com/p/42706477
  • https://zhuanlan.zhihu.com/p/31852747
機器學習、深度學習面試知識點彙總

Resnet的缺點

resnet其實無法真正的實作梯度消失,這裡面有很強的先驗假設,并且resnet真正起作用的層隻在中間,深層作用比較小(到了深層就是恒等映射了),feature存在利用不足的現象,add的方式阻礙了梯度和資訊的流通。

L1範數和L2範數 應用場景

L1正則可以使少數權值較大,多數權值為0,得到稀疏的權值;L2正則會使權值都趨近于0但非零,得到平滑的權值;https://zhuanlan.zhihu.com/p/35356992

網絡初始化有哪些方式,他們的公式初始化過程

目前的權重初始化分為三類:

  • 全置為0 - 幾乎不會使用
  • 随機初始化(均勻随機、正态分布)
  • Xavier 作者 Glorot 認為,優秀的初始化應該使得各層的激活值和狀态梯度的方差在傳播過程中保持一緻。适合sigmoid,但是不适合Relu。
  • He初始化适用于Relu。

初始化,說白了就是建構一個平滑的局部幾何空間進而使得優化更簡單xavier分布解析:

  • https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/

假設使用的是sigmoid函數。當權重值(值指的是絕對值)過小,輸入值每經過網絡層,方差都會減少,每一層的權重和很小,在sigmoid函數0附件的區域相當于線性函數,失去了DNN的非線性性。當權重的值過大,輸入值經過每一層後方差會迅速上升,每層的輸出值将會很大,此時每層的梯度将會趨近于0. xavier初始化可以使得輸入值x 方差經過網絡層後的輸出值y方差不變。

  • https://blog.csdn.net/winycg/article/details/86649832
  • https://zhuanlan.zhihu.com/p/57454669

在pytorch中預設的權重初始化方式是何凱明的那個,舉個例子:

resnet中權重的初始化

for m in self.modules():
    if isinstance(m, nn.Conv2d):
        nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
    elif isinstance(m, nn.BatchNorm2d):
        nn.init.constant_(m.weight, 1)
        nn.init.constant_(m.bias, 0)


# Zero-initialize the last BN in each residual branch,
# so that the residual branch starts with zeros, and each residual block behaves like an identity.
# This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
if zero_init_residual:
    for m in self.modules():
        if isinstance(m, Bottleneck):
            nn.init.constant_(m.bn3.weight, 0)
        elif isinstance(m, BasicBlock):
            nn.init.constant_(m.bn2.weight, 0)           

求解模型參數量

def model_info(model):  # Plots a line-by-line description of a PyTorch model
    n_p = sum(x.numel() for x in model.parameters())  # number parameters
    n_g = sum(x.numel() for x in model.parameters() if x.requires_grad)  # number gradients
    print('\n%5s %50s %9s %12s %20s %12s %12s' % ('layer', 'name', 'gradient', 'parameters', 'shape', 'mu', 'sigma'))
    for i, (name, p) in enumerate(model.named_parameters()):
        name = name.replace('module_list.', '')
        print('%5g %50s %9s %12g %20s %12.3g %12.3g' % (
            i, name, p.requires_grad, p.numel(), list(p.shape), p.mean(), p.std()))
    print('Model Summary: %d layers, %d parameters, %d gradients' % (i + 1, n_p, n_g))
    print('Model Size: %f MB parameters, %f MB gradients\n' % (n_p*4/1e6, n_g*4/1e6))           

卷積計算量

差不多這幾個懂了就OK。

  • 普通卷積
  • 可分離卷積
  • 全連接配接
  • 點卷積

可以看老潘的這篇文章:

  • 你的模型能跑多快???

多标簽和多分類

那麼,如何用softmax和sigmoid來做多類分類和多标簽分類呢?

1、如何用softmax做多分類和多标簽分類 現假設,神經網絡模型最後的輸出是這樣一個向量logits=[1,2,3,4], 就是神經網絡最終的全連接配接的輸出。這裡假設總共有4個分類。用softmax做多分類的方法: tf.argmax(tf.softmax(logits))首先用softmax将logits轉換成一個機率分布,然後取機率值最大的作為樣本的分類,這樣看似乎,tf.argmax(logits)同樣可以取得最大的值,也能得到正确的樣本分類,這樣的話softmax似乎作用不大.那麼softmax的主要作用其實是在計算交叉熵上,首先樣本集中y是一個one-hot向量,如果直接将模型輸出logits和y來計算交叉熵,因為logits=[1,2,3,4],計算出來的交叉熵肯定很大,這種計算方式不對,而應該将logits轉換成一個機率分布後再來計算,就是用tf.softmax(logits)和y來計算交叉熵,當然我們也可以直接用tensorflow提供的方法sofmax_cross_entropy_with_logits來計算 這個方法傳入的參數可以直接是logits,因為這個根據方法的名字可以看到,方法内部會将參數用softmax進行處理,現在我們取的機率分布中最大的作為最終的分類結果,這是多分類。我們也可以取機率的top幾個,作為最終的多個标簽,或者設定一個門檻值,并取大于機率門檻值的。這就用softmax實作了多标簽分類。

2、如何用sigmoid做多标簽分類 sigmoid一般不用來做多類分類,而是用來做二分類的,它是将一個标量數字轉換到[0,1]之間,如果大于一個機率門檻值(一般是0.5),則認為屬于某個類别,否則不屬于某個類别。那麼如何用sigmoid來做多标簽分類呢?其實就是針對logits中每個分類計算的結果分别作用一個sigmoid分類器,分别判定樣本是否屬于某個類别。同樣假設,神經網絡模型最後的輸出是這樣一個向量logits=[1,2,3,4], 就是神經網絡最終的全連接配接的輸出。這裡假設總共有4個分類。tf.sigmoid(logits)sigmoid應該會将logits中每個數字都變成[0,1]之間的機率值,假設結果為[0.01, 0.05, 0.4, 0.6],然後設定一個機率門檻值,比如0.3,如果機率值大于0.3,則判定類别符合,那這裡,樣本會被判定為類别3和類别4都符合。

資料的輸入為什麼要歸一化

為了消除資料特征之間的量綱影響在實際應用中,通過梯度下降法求解的模型通常是需要資料歸一化的,包括線性回歸、邏輯回歸、支援向量機、神經網絡等,但是決策模型不是很适用。

為什麼說樸素貝葉斯是高偏差低方差?

首先,假設你知道訓練集和測試集的關系。簡單來講是我們要在訓練集上學習一個模型,然後拿到測試集去用,效果好不好要根據測試集的錯誤率來衡量。但很多時候,我們隻能假設測試集和訓練集的是符合同一個資料分布的,但卻拿不到真正的測試資料。這時候怎麼在隻看到訓練錯誤率的情況下,去衡量測試錯誤率呢?

由于訓練樣本很少(至少不足夠多),是以通過訓練集得到的模型,總不是真正正确的。(就算在訓練集上正确率100%,也不能說明它刻畫了真實的資料分布,要知道刻畫真實的資料分布才是我們的目的,而不是隻刻畫訓練集的有限的資料點)。而且,實際中,訓練樣本往往還有一定的噪音誤差,是以如果太追求在訓練集上的完美而采用一個很複雜的模型,會使得模型把訓練集裡面的誤差都當成了真實的資料分布特征,進而得到錯誤的資料分布估計。這樣的話,到了真正的測試集上就錯的一塌糊塗了(這種現象叫過拟合)。但是也不能用太簡單的模型,否則在資料分布比較複雜的時候,模型就不足以刻畫資料分布了(展現為連在訓練集上的錯誤率都很高,這種現象較欠拟合)。過拟合表明采用的模型比真實的資料分布更複雜,而欠拟合表示采用的模型比真實的資料分布要簡單。

在統計學習架構下,大家刻畫模型複雜度的時候,有這麼個觀點,認為Error = Bias + Variance。這裡的Error大概可以了解為模型的預測錯誤率,是有兩部分組成的,一部分是由于模型太簡單而帶來的估計不準确的部分(Bias),另一部分是由于模型太複雜而帶來的更大的變化空間和不确定性(Variance)。

是以,這樣就容易分析樸素貝葉斯了。它簡單的假設了各個資料之間是無關的,是一個被嚴重簡化了的模型。是以,對于這樣一個簡單模型,大部分場合都會Bias部分大于Variance部分,也就是說高偏差而低方差。

在實際中,為了讓Error盡量小,我們在選擇模型的時候需要平衡Bias和Variance所占的比例,也就是平衡over-fitting和under-fitting。

Canny邊緣檢測,邊界檢測算法有哪些

https://zhuanlan.zhihu.com/p/42122107

https://zhuanlan.zhihu.com/p/59640437

傳統的目标檢測

傳統的目标檢測一般分為以下幾個步驟:

  • 區域選擇:一幅圖像通過selective search的方法,首先對原圖進行分割(聚類),然後通過計算相鄰區域的相似度,最終找到2000個框,同樣要與GT進行正例和負例的判斷。
  • 特征提取:通過SIFT或者其他的特征提取方法,将2000個轉化為特征向量
  • 分類器分類:将特征向量放入SVM中進行分類訓練,同時将父類也放入分類器中進行訓練。

經典的結構:

  • HoG + SVM

傳統方法的缺點:

  • 基于滑窗的區域選擇政策沒有針對性,時間複雜度高,視窗備援
  • 手工設計的特征對環境多樣性的變化并沒有很好的魯棒性

腐蝕膨脹、開運算閉運算

可以看學習OpenCV第三版中的相關内容,搜尋erode、dilation

一些濾波器

  • https://blog.csdn.net/qq_22904277/article/details/53316415
  • https://www.jianshu.com/p/fbe8c24af108
  • https://blog.csdn.net/qq_22904277/article/details/53316415
  • https://blog.csdn.net/nima1994/article/details/79776802
  • https://blog.csdn.net/jiang_ming_/article/details/82594261
  • 圖像中的高頻、低頻資訊以及高通濾波器、低通濾波器
  • 在圖像中,邊緣資訊等比較明顯的變化比較劇烈的像素點就是圖像中的高頻資訊。而除了邊緣部分,比較平緩的像素點變化不是很劇烈的内容資訊就是低頻資訊。
  • 高通濾波器就是突出變化劇烈(邊緣),去除低頻部分,也就是當做邊緣提取器。而低通濾波器主要是平滑該像素的亮度。主要用于去噪和模糊化,高斯模糊是最常用的模糊濾波器(平滑濾波器)之一,它是一個削弱高頻信号強度的低通濾波器。

Resize雙線性插值

在網絡結構進行特征融合的時候,雙線性插值的方式比轉置卷積要好一點。因為轉置卷積有一個比較大的問題就是如果參數配置不當,很容易出現輸出feature map中帶有明顯棋盤狀的現象。

  • 需要注意的,最近鄰插值的效果是最不好的。

雙線性插值也分為兩類:

  • align_corners=True
  • align_corners=False

一般來說,使用align_corners=True可以保證邊緣對齊,而使用align_corners=False則會導緻邊緣突出的情況。這個講的非常好:

  • https://blog.csdn.net/qq_37577735/article/details/80041586

代碼實作的講解:

  • https://blog.csdn.net/love_image_xie/article/details/87969405
  • https://www.zhihu.com/question/328891283/answer/717113611 看這裡的圖像展示:https://discuss.pytorch.org/t/what-we-should-use-align-corners-false/22663

gradient clipping 梯度裁剪

為了避免梯度爆炸而做出的改進,注意要和提前終止差別開來。(提前終止是一種正則化方法,因為當訓練有足夠能力表示甚至會過拟合的大模型時,訓練誤差會随着時間的推移逐漸降低但驗證集的誤差會再次上升。這意味着隻要我們傳回使驗證集誤差最低的參數設定即可)第一種做法很容易了解,就是先設定一個 gradient 的範圍如 (-1, 1), 小于 -1 的 gradient 設為 -1, 大于這個 1 的 gradient 設為 1.

機器學習、深度學習面試知識點彙總
  • https://wulc.me/2018/05/01/%E6%A2%AF%E5%BA%A6%E8%A3%81%E5%89%AA%E5%8F%8A%E5%85%B6%E4%BD%9C%E7%94%A8/

實作一個簡單的卷積

實作卷積一般用的是im2col的形式,但是面試中我們簡單實作一個滑窗法就行了。比如:用3x3的卷積核(濾波盒)實作卷積操作。NCNN中在PC端卷積的源碼也是這樣的。

`/*
輸入:imput[IC][IH][IW]
IC = input.channels
IH = input.height
IW = input.width
卷積核: kernel[KC1][KC2][KH][KW]
KC1 = OC
KC2 = IC
KH = kernel.height
KW = kernel.width
輸出:output[OC][OH][OW]
OC = output.channels
OH = output.height
OW = output.width
其中,padding = VALID,stride=1,
OH = IH - KH + 1
OW = IW - KW + 1
也就是先提前把Oh和Ow算出來,然後将卷積核和輸入資料一一對應即可
*/
for(int ch=0;ch<output.channels;ch++)
{
for(int oh=0;oh<output.height;oh++)
{
for(int ow=0;ow<output.width;ow++)
{
float sum=0;
for(int kc=0;kc<kernel.channels;kc++)
{
for(int kh=0;kh<kernel.height;kh++)
{
for(int kw=0;kw<kernel.width;kw++)
{
sum += input[kc][oh+kh][ow+kw]*kernel[ch][kc][kh][kw];
}
}
}
//if(bias) sum +=bias[]
output[ch][oh][ow]=sum;
}
}
}
`           

參考:

  • https://www.cnblogs.com/hejunlin1992/p/8686838.html

卷積的過程

看看Pytorch的源碼與caffe的源碼,都是将卷積計算轉化為矩陣運算,im2col,然後gemm。https://blog.csdn.net/mrhiuser/article/details/52672824

轉置卷積的計算過程

https://cloud.tencent.com/developer/article/1363619

1*1的卷積核有什麼用,3*3的卷積核和一個1*3加一個3*1的有什麼差別

1x1卷積可以改變上一層網絡的通道數目。卷積核大于1x1,意味着提特征需要鄰域資訊。

  • 若提取橫向紋理,則橫向鄰域資訊密度比縱向資訊密度高。
  • 核扁橫着最科學。若提縱向紋理,同理,瘦高豎着最好。
  • 若你想提取的紋理種類豐富,那橫向鄰域資訊密度的期望~=縱向資訊密度期望

是以對懶人來說,最優核的尺寸的期望是正方形。至于1*n和n*1,它們一般是搭配使用的,進而實作n*n卷積核的感受野,可以在減少參數的同時增加層數,在CNN的較高層中使用可以帶來一定的優勢。卷積核并非都是正方形的,還可以是矩形,比如3*5,在文本檢測和車牌檢測當中就有應用,這種設計主要針對文本行或者車牌的形狀,能更好的學習特征。其實我覺得方形矩形影響不大,網絡的學習能力是非常強的。當然我們也可以學習卷積的形狀,類似于deformable convolution,老潘後續會講下。

ResNet中bottlenet與mobilenetv2的inverted結構對比

注意,resnet中是先降維再升維,而mobilenetv2中是先升維後降維(是以稱之為inversed)。

  • https://zhuanlan.zhihu.com/p/67872001
  • https://zhuanlan.zhihu.com/p/32913695

卷積特征圖大小的計算

很簡單但是也很容易錯的問題:

  • Conv2D

動态圖和靜态圖的差別

  • 靜态圖是建立一次,然後不斷複用;靜态圖可以在磁盤中序列化,可以儲存整個網絡的結構,可以重載,在部署中很實用,在tensorflow靜态圖中條件和循環需要特定的文法,pytorch隻用python的文法就可以實作
  • 而動态圖是每次使用的時候建立,不容易優化,需要重複之前的代碼,但是動态圖比靜态圖代碼更簡潔

依據采用動态計算或是靜态計算的不同,可以将這些衆多的深度學習架構劃分成兩大陣營,當然也有些架構同時具有動态計算和靜态計算兩種機制(比如 MxNet 和最新的 TensorFlow)。動态計算意味着程式将按照我們編寫指令的順序進行執行。這種機制将使得調試更加容易,并且也使得我們将大腦中的想法轉化為實際代碼變得更加容易。而靜态計算則意味着程式在編譯執行時将先生成神經網絡的結構,然後再執行相應操作。從理論上講,靜态計算這樣的機制允許編譯器進行更大程度的優化,但是這也意味着你所期望的程式與編譯器實際執行之間存在着更多的代溝。這也意味着,代碼中的錯誤将更加難以發現(比如,如果計算圖的結構出現問題,你可能隻有在代碼執行到相應操作的時候才能發現它)。盡管理論上而言,靜态計算圖比動态計算圖具有更好的性能,但是在實踐中我們經常發現并不是這樣的。

曆年來所有的網絡

這個可以看CS231n中的第九課以及

  • https://ucbrise.github.io/cs294-ai-sys-sp19/assets/lectures/lec02/classic_neural_architectures.pdf
  • https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202

正式總結下:

  • LeNet-5:第一個卷積,用來識别手寫數組,使用的卷積大小為5x5,s=1,就是普通的卷積核池化層結合起來,最後加上全連接配接層。
  • AlexNet:在第一個卷積中使用了11x11卷積,第一次使用Relu,使用了NormLayer但不是我們經常說的BN。使用了dropout,在兩個GPU上進行了訓練,使用的訓練方式是模型并行、
  • ZFNet:AlexNet的加強版,将11x11卷積改成了7x7,也在AlexNet的基礎上将卷積的通道深度加深。是以在分類比賽中比之前的效果好了些。
  • VGGNet:隻使用了小卷積3x3(s=1)以及正常的池化層,不過深度比上一個深了一些,最後幾層也都是全連接配接層接一個softmax。為什麼使用3x3卷積,是因為三個3x3卷積的有效感受野和7x7的感受野一緻,而且更深、更加非線性,而且卷積層的參數也更加地少,是以速度更快也可以适當加深層數。
  • GoogleNet:沒有使用FC層,參數量相比之前的大大減少,提出了Inception module結構,也就是NIN結構(network within a network)。但是原始的Inception module計算量非常大,是以在每一個分支加了1x1 conv "bottleneck"結構(具體細節看圖)。googlenet網絡結構中為了避免梯度消失,在中間的兩個位置加了兩個softmax損失,是以會有三個loss,整個網絡的loss是通過三個loss乘上權重相加後得到 相關文章:https://zhuanlan.zhihu.com/p/42704781 inception結構的特點:1、增加了網絡的寬度,同時也提高了對于不同尺度的适應程度。2、使用 1x1 卷積核對輸入的特征圖進行降維處理,這樣就會極大地減少參數量,進而減少計算量。3、在V3中使用了多個小卷積核代替大卷積核的方法,除了規整的的正方形,我們還有分解版本的 3x3 = 3x1 + 1x3,這個效果在深度較深的情況下比規整的卷積核更好。4、發明了Bottleneck 的核心思想還是利用多個小卷積核替代一個大卷積核,利用 1x1 卷積核替代大的卷積核的一部分工作。也就是先1x1降低通道然後普通3x3然後再1x1回去。
  • Xception:改進了inception,提出的 depthwise Separable Conv 讓人眼前一亮。https://www.jianshu.com/p/4708a09c4352
  • ResNet:越深的網絡越難進行優化,有一個特點需要搞明白,越深的層最起碼表現應該和淺層的一樣,不能比淺層的還差。對于更深的Resnet(50+),這裡采用bottleneck層(也就是兩個1x1分别降維和升維)去提升網絡的效率。更詳細的描述可以看百面機器學習和ppt。相關講解:https://zhuanlan.zhihu.com/p/42706477
  • DenseNet 不能簡單說densenet更好,二者比較,ResNet是更一般的模型,DenseNet是更特化的模型。DenseNet用于圖像處理可能比ResNet表現更好,本質是DenseNet更能和圖像的資訊分布特點比對,是使用了多尺度的Kernel。但是也有缺點最直接的計算就是一次推斷中所産生的所有feature map數目。有些架構會有優化,自動把比較靠前的層的feature map釋放掉,是以顯存就會減少,或者inplace操作通過重新計算的方法減少一部分顯存,但是densenet因為需要重複利用比較靠前的feature map,是以無法釋放,導緻顯存占用過大。正是這種_concat_造成densenet能更密集的連接配接。
  • SeNet:全稱為Squeeze-and-Excitation Networks。屬于注意力特征提取的範疇,加了GP(Global pooling)和兩個FC再加上sigmoid和scale。也就是生成注意力掩膜,去乘以輸入的x得到新的x。核心思想就是去學習每個特征通道的重要程度,然後根據這個重要程度去提升有用的特征并抑制對目前任務用處不大的特征。這個給每一個特征層通道去乘以通過sigmoid得到的重要系數,其實和用bn層去觀察哪個系數重要一樣。缺點:由于在主幹上存在 0~1 的 scale 操作,在網絡較深 BP 優化時就會在靠近輸入層容易出現梯度消散的情況,導緻模型難以優化。http://www.sohu.com/a/161633191_465975
  • Wide Residual Networks
  • ResNeXt:是resnet和inception的結合體,旁邊的residual connection就是公式中的x直接連過來,然後剩下的是32組獨立的同樣結構的變換,最後再進行融合,符合split-transform-merge的模式。雖然分了32組,都是先點卷積降維,然後3x3普通卷積,然後1x1卷積升維(與Mobilenetv2中的相反) 相關介紹:https://zhuanlan.zhihu.com/p/51075096
  • Densely Connected Convolutional Networks:有利于減輕梯度消失的情況,增強了特征的流動。

shufflenet:https://blog.csdn.net/u011974639/article/details/79200559

一些統計知識

正太分布:https://blog.csdn.net/yaningli/article/details/78051361

關于如何訓練(訓練過程中的一些問題)

MaxPool導緻的訓練震蕩(通過在MaxPool之後加上L2Norm):https://mp.weixin.qq.com/s/QR-KzLxOBazSbEFYoP334Q

全連接配接層的好伴侶:空間金字塔池化(SPP)

https://zhuanlan.zhihu.com/p/64510297

感受野計算

感受野計算有兩個公式,一個普通公式一個通項公式:

機器學習、深度學習面試知識點彙總

需要注意,卷積和池化都可以增加感受野。

http://zike.io/posts/calculate-receptive-field-for-vgg-16/

—版權聲明—

僅用于學術分享,版權屬于原作者。

—THE END—

繼續閱讀