深度學習面試準備

 

1.反捲積(deconv)與轉置卷積(transposed conv)是同一種卷積形式,對圖像的上採樣,卷積的逆過程

規範表達:

DL中的deconv,是一種上採樣過程;卷積的輸入input  通過卷積得到輸出output, 而從output到input就是反捲積。反捲積等於將將卷積的卷積核水平翻轉再垂直翻轉得到的卷積核作用於卷積的操作的ouput上,得到卷積操作的input。

2.L1 與L2 損失,以及其正則化

L0損失定義爲:向量中非零元素的個數,常常用於壓縮感知,壓縮傳感計劃試圖找到欠定線性系統(under-determinedlinear system)最稀疏的解(sparsest solution)。最稀疏的解意味着解有最少的非零元素。

L1 損失:

L2損失(歐幾里得範數):

作爲損失函數: 用 L2 一定只有一條最好的預測線,L1 則因爲其性質可能存在多個最優解;L1魯棒性 (Robust) 更強,對異常值更不敏感

作爲正則項:

 L1 最重要的一個特點,輸出稀疏,會把不重要的特徵直接置零,而 L2 則不會;L1一個天然的特徵選擇器;L2 有唯一解,而 L1 不是

爲什麼輸出稀疏特徵??

3.常用模型壓縮方法

模型壓縮的方法:對模型預測精度無明顯影響,壓縮模型的參數數量,深度來降低模型空間的複雜度,不顯著提高訓練時間複雜度,降低預測時間的複雜度。

(1)更精細的模型設計

  • 將3x3卷積核替換爲1x1卷積核(1個1x1卷積核的參數是3x3卷積核參數的1/9,這一改動理論上可以將模型尺寸壓縮9倍)。
  • 減小輸入到3x3卷積核的輸入通道數
  • 儘可能的將降採樣放在網絡後面的層中
  • 借鑑ResNet思想,對原始網絡結構做了修改,增加了旁路分支,將分類精度提升了約3%。
  • 借鑑mobileNet的思想(借鑑factorized convolution的思想),將普通卷積操作分成兩部分:深度卷積(每個卷積核濾波器只針對特定的輸入通道進行卷積操作)和逐點卷積(採用1x1大小的卷積核將depthwise convolution層的多通道輸出進行結合)
  • shuffleNet :基於MobileNet的group思想,將卷積操作限制到特定的輸入通道。而與之不同的是,ShuffleNet將輸入的group進行打散,從而保證每個卷積核的感受野能夠分散到不同group的輸入中,增加了模型的學習能力。

(2)模型的裁剪(剪枝)

挑選出模型中不重要的參數將其剔除而不會對模型的效果造成太大的影響。在剔除不重要的參數之後,通過一個retrain的過程來恢復模型的性能。如何找到一個有效的對參數重要性的評價手段基於模型裁剪的方法是最爲簡單有效的模型壓縮方式

a)單個權重剪枝(非結構化):定義:任意權重被看作是單個參數並進行隨機非結構化剪枝。

b)核內權重剪枝(核稀疏化)(結構化):對權重的更新加以正則項進行限制,使其更加稀疏,使大部分的權值都爲0。

c)卷積核/特徵圖/通道剪枝(結構化):減去第i層的filter,進而減去第i層產生的部分特徵圖和第i+1層的部分kernel。

d)中間隱層剪枝:刪除一些層,即改變網絡結構

(3)網絡分解(zhang laing)(張量分解)

方法:a)將三維張量鋪展成二維張量,使用標準SVD;b)使用多個一維張量外積求和逼近

通常基於張量的低秩近似理論和方法,將原始的權重張量分解爲兩個或者多個張量,並對分解張量進行優化調整;

優缺點:

低秩方法很適合模型壓縮和加速。

低秩方法的實現並不容易,因爲它涉及計算成本高昂的分解操作

目前的方法逐層執行低秩近似,無法執行非常重要的全局參數壓縮,因爲不同的層具備不同的信息

分解需要大量的重新訓練來達到收斂

(4)權值共享

1)結構化矩陣:如果一個 m x n 階矩陣只需要少於 m×n 個參數來描述,就是一個結構化矩陣。通常這樣的結構不僅能減少內存消耗,還能通過快速的矩陣-向量乘法梯度計算顯著加快推理和訓練的速度

2)哈希:將參數映射到相應的哈希桶內,在同一個哈希桶內的參數則共享同一值

(5)權重量化

思想:通過減少表示每個權重所需的比特數來壓縮原始網絡。

(6)遷移學習/網絡精餾

遷移學習:將一個模型的性能遷移到另一個模型上

網絡精餾:在同一個域上遷移學習的一種特例

(7)計算加速

(8)對數據進行轉換

4.softmax 的公式以及反向傳遞

自己手推

5.mobileNet :深度可分離卷積,shuffleNet

MobileNets:

移動和嵌入式設備提出的高效模型,MobileNets基於流線型架構(streamlined),使用深度可分離卷積(depthwise separable convolutions,即Xception變體結構)來構建輕量級深度神經網絡

MobileNet描述了一個高效的網絡架構,允許通過兩個超參數直接構建非常小、低延遲易滿足嵌入式設備要求的模型

現階段在建立小型高效的神經網絡工作:

(1)壓縮預訓練模型。獲得小型網絡的一個辦法是減小、分解或壓縮預訓練網絡,例如量化壓縮(product quantization)、哈希(hashing )、剪枝(pruning)、矢量編碼( vector quantization)和霍夫曼編碼(Huffman coding)等;此外還有各種分解因子(various factorizations )用來加速預訓練網絡一種訓練小型網絡的方法叫蒸餾(distillation ),使用大型網絡指導小型網絡;

(2)直接訓練小模型:Flattened networks利用完全的因式分解的卷積網絡構建模型,顯示出完全分解網絡的潛力;Factorized Networks引入了類似的分解卷積以及拓撲連接的使用。

Depthwise Separable Convolution

MobileNet是基於深度可分離卷積的, 深度可分離卷積乾的活是:把標準卷積分解成深度卷積(depthwise convolution)和逐點卷積(pointwise convolution)。這麼做的好處是可以大幅度降低參數量和計算量;這麼做的好處是可以大幅度降低參數量和計算量;

https://blog.csdn.net/u011974639/article/details/79199306:深度卷積和逐點卷積的推導;深度卷積負責濾波作用, 逐點卷積負責轉換通道;如果是需要下采樣,則在第一個深度卷積上取步長爲2.;MobileNet模型幾乎將所有的密集運算放到1×1 卷積上,這可以使用general matrix multiply (GEMM) functions優化。在MobileNet中有95%的時間花費在1×1 1×11×1卷積上,這部分也佔了75%的參數:剩餘的其他參數幾乎都在FC層上了。

論文提出了一種基於深度可分離卷積的新模型MobileNet,同時提出了兩個超參數用於快速調節模型適配到特定環境。實驗部分將MobileNet與許多先進模型做對比,展現出MobileNet的在尺寸、計算量、速度上的優越性。寬度因子α \alphaα(Width multiplier )
 分辨率因子ρ \rhoρ(resolution multiplier ).


shuffleNet:https://blog.csdn.net/u014380165/article/details/75137111

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

一個效率極高的CNN架構ShuffleNet,專門應用於計算力受限的移動設備。新的架構利用兩個操作:逐點羣卷積(pointwise group convolution)和通道混洗(channel shuffle);該文章主要採用channel shuffle、pointwise group convolutions和depthwise separable convolution來修改原來的ResNet單元,接下來依次講解。

ShuffleNet的核心就是用pointwise group convolution,channel shuffle和depthwise separable convolution代替ResNet block的相應層構成了ShuffleNet uint,達到了減少計算量和提高準確率的目的。channel shuffle解決了多個group convolution疊加出現的邊界效應,pointwise group convolution和depthwise separable convolution主要減少了計算量。

6.python 的多進程與多線程(進程和現成的區別)

進程:是系統進行資源分配和運行調用的獨立單位。可以簡單地理解爲操作系統中正在執行的程序,每個應用程序都有一個自己的進程

每一個進程啓動時都會最先產生一個線程,即主線程。然後主線程會再創建其他的子線程

線程:線程是一個基本的 CPU 執行單元。它必須依託於進程存活。一個線程是一個execution context(執行上下文),即一個 CPU 執行時所需要的一串指令;

進程和線程的區別:

  • 線程必須在某個進行中執行。
  • 一個進程可包含多個線程,其中有且只有一個主線程。
  • 多線程共享同個地址空間、打開的文件以及其他資源。
  • 多進程共享物理內存、磁盤、打印機以及其他資源。

線程主要可以劃分爲:主線程,子線程,後臺線程(守護線程),前臺線程

Python的多線程:其他語言,CPU 是多核時是支持多個線程同時執行。但在 Python 中,無論是單核還是多核,同時只能由一個線程在執行。其根源是 GIL 的存在

GIL 的全稱是 Global Interpreter Lock(全局解釋器鎖),來源是 Python 設計之初的考慮,爲了數據安全所做的決定。某個線程想要執行,必須先拿到 GIL,我們可以把 GIL 看作是“通行證”,並且在一個 Python 進程中,GIL 只有一個。拿不到通行證的線程,就不允許進入 CPU 執行。

GIL 只在 CPython 中才有,而在 PyPy 和 Jython 中是沒有 GIL 的。每次釋放 GIL鎖,線程進行鎖競爭切換線程,會消耗資源。這就導致打印線程執行時長,會發現耗時更長的原因。

Python提供兩個模塊進行多線程的操作,分別是threadthreading前者是比較低級的模塊,用於更底層的操作,一般應用級別的開發不常用。

Python 要進行多進程操作,需要用到muiltprocessing,其中的Process類跟threading模塊的Thread類很相似。所以直接看代碼熟悉多進程。進程之間不共享數據的。如果進程之間需要進行通信,則要用到Queue模塊或者Pipi模塊來實現。

  • CPU 密集型:程序比較偏重於計算,需要經常使用 CPU 來運算。例如科學計算的程序,機器學習的程序等。

  • I/O 密集型:顧名思義就是程序需要頻繁進行輸入輸出操作。爬蟲程序就是典型的 I/O 密集型程序。

如果程序是屬於 CPU 密集型,建議使用多進程。而多線程就更適合應用於 I/O 密集型程序。

7.手寫Resnet的跳轉連接(pytorch),以類的形式封裝好,後續別的網絡模塊可直接調用

已手寫

8.CNN梯度的反向傳播

推薦:https://blog.csdn.net/haolexiao/article/details/72628083

9.怎麼選擇卷積核的大小,以及怎麼選擇全連接層神經元的個數

怎麼選擇卷積核的大小:https://www.zhihu.com/question/38098038

怎麼選擇全聯接層神經元的個數:

10. BN的反向傳遞,BN爲什麼會加入縮放量和偏移量

已經手推

BN層的主要功能總結爲兩點:

1)歸一化scale

沒有BN層時若LR設置較大,在配合ReLU激活函數時,容易出現Dead ReLU問題

2)數據初始化集中,緩解overfitting(這裏還理解得不是很透徹)

Overfitting主要發生在一些較遠的便捷點,BN操作可以使初始化數據在數據內部。

通常提到BN層,我們會想到,若使用sigmoid激活函數時,它可以將數據歸一化到梯度較大的區域,便於梯度更新。
在BN中的gamma對於ReLU的影響很小,因爲數值的收縮,不會影響是否大於0。但是如果沒有偏移量beta,就會出現數據分佈在以0爲中心的位置,強行將一半的神經元輸出置零。因此偏移量beta是必不可少的。

引入gamma和beta兩個參數是爲了避免數據只用sigmoid的線性部分如果不使用gamma和beta,激活值基本上會在[0.1 0.9]這個近似線性的區域中;這與深度神經網絡所要求的“多層非線性函數逼近任意函數”的要求不符,所以引入gamma和beta還是有必要的,深度網絡會自動決定使用哪一段函數。

BN的算法優勢:

(1) 可以使用更高的學習率。如果每層的scale不一致實際上每層需要的學習率是不一樣的,同一層不同維度的scale往往也需要不同大小的學習率,通常需要使用最小的那個學習率才能保證損失函數有效下降Batch Normalization將每層、每維的scale保持一致,那麼我們就可以直接使用較高的學習率進行優化。

(2) 移除或使用較低的dropout。 dropout是常用的防止overfitting的方法,而導致overfit的位置往往在數據邊界處如果初始化權重就已經落在數據內部,overfit現象就可以得到一定的緩解。論文中最後的模型分別使用10%、5%和0%的dropout訓練模型,與之前的40%-50%相比,可以大大提高訓練速度。

(3) 降低L2權重衰減係數(減少對L1和L2正則化的依賴)。 還是一樣的問題,邊界處的局部最優往往有幾維的權重(斜率)較大,使用L2衰減可以緩解這一問題,現在用了Batch Normalization,就可以把這個值降低了,論文中降低爲原來的5倍。

(4) 取消Local Response Normalization層。 由於使用了一種Normalization,再使用LRN就顯得沒那麼必要了。而且LRN實際上也沒那麼work。

(5) 減少圖像扭曲的使用。 由於現在訓練epoch數降低,所以要對輸入數據少做一些扭曲,讓神經網絡多看看真實的數據。

還包括對BN的求導

推薦:https://blog.csdn.net/wfei101/article/details/79997708

11. inception, squeezeNet網絡結構

inception:https://blog.csdn.net/u010402786/article/details/52433324/

神經網絡更深(層數),更寬(神經元個數)的缺點:

1.參數太多,容易過擬合,若訓練數據集有限;

2.網絡越大計算複雜度越大,難以應用;

3.網絡越深,梯度越往後穿越容易消失(梯度彌散),難以優化模型

爲了解決這樣的問題當然是增加網絡深度和寬度的同時,減少參數量

inception v1:

在3x3前,5x5前,max pooling後分別加上了1x1的卷積核起到了降低特徵圖厚度的作用,減少計算量。

inception V2:

加入了BN層,減少了Internal Covariate Shift(內部neuron的數據分佈發生變化),使每一層的輸出都規範化到一個N(0, 1)的高斯;

另外一方面學習VGG用2個3x3的conv替代inception模塊中的5x5,既降低了參數數量,也加速計算 。

inception v3:

v3一個最重要的改進是分解(Factorization),將7x7分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1),這樣的好處,既可以加速計算(多餘的計算能力可以用來加深網絡),又可以將1個conv拆成2個conv使得網絡深度進一步增加,增加了網絡的非線性,還有值得注意的地方是網絡輸入從224x224變爲了299x299,更加精細設計了35x35/17x17/8x8的模塊。

使用3×3的已經很小了,那麼更小的2×2呢?2×2雖然能使得參數進一步降低,但是不如另一種方式更加有效,那就是Asymmetric方式,即使用1×3和3×1兩種來代替3×3的卷積核。這種結構在前幾層效果不太好,但對特徵圖大小爲12~20的中間層效果明顯。 

inception v4:

v4研究了Inception模塊結合Residual Connection能不能有改進?發現ResNet的結構可以極大地加速訓練,同時性能也有提升,得到一個Inception-ResNet v2網絡,同時還設計了一個更深更優化的Inception v4模型,能達到與Inception-ResNet v2相媲美的性能。 
 

Squeeze and Excitation Net(SENet):https://blog.csdn.net/wangkun1340378/article/details/79092001

Squeeze(擠壓) 和 Excitation(激勵) 是兩個非常關鍵的操作;希望顯式地建模特徵通道之間相互依賴關係;我們並不打算引入一個新的空間維度來進行特徵通道間的融合,而是採用了一種全新的「特徵重標定」策略。通過學習的方式來自動獲取到每個特徵通道的重要程度,然後依照這個重要程度去提升有用的特徵並抑制對當前任務用處不大的特徵

首先是 Squeeze 操作,我們順着空間維度來進行特徵壓縮,將每個二維的特徵通道變成一個實數,這個實數某種程度上具有全局的感受野,並且輸出的維度和輸入的特徵通道數相匹配。它表徵着在特徵通道上響應的全局分佈,而且使得靠近輸入的層也可以獲得全局的感受野,這一點在很多任務中都是非常有用的。

其次是 Excitation 操作,它是一個類似於循環神經網絡中門的機制。通過參數 w 來爲每個特徵通道生成權重,其中參數 w 被學習用來顯式地建模特徵通道間的相關性

最後是一個 Reweight 的操作,我們將 Excitation 的輸出的權重看做是進過特徵選擇後的每個特徵通道的重要性,然後通過乘法逐通道加權到先前的特徵上,完成在通道維度上的對原始特徵的重標定

12.可變形卷積網絡--Deformable Convolutional Networks

參考博客:https://blog.csdn.net/zhangjunhit/article/details/67638559

本文可以看做是對 Spatial Transformer Networks 工作的深入,通過 deformable convolution deformable RoI pooling提升當前CNN網絡的空間信息建模能力。Spatial Transformer Networks建立的是 global、sparse transformation本文的Deformable Convolutional Networks建立的是 local and dense transformation。

上圖顯示可變形卷積可以提高模型對 scale, aspect ratio and rotation 等映射的泛化能力。這個偏移量是可以通過學習得到並不需要額外的監督。因爲是對網絡內部結構進行了改進。因此新的module可以應用在很多vision tasks上,本文拿segmentation和detection進行舉例。

卷積該具體怎麼deformable,這個可以通過一個卷積層來學習;對於輸入的一張feature map,假設原來的卷積操作是3*3的,那麼爲了學習offset,我們定義另外一個3*3的卷積層,輸出的offset field其實就是原來feature map大小,channel數等於2*3*3=18(分別表示後面feature map上某點對應前一張feature map上9個採樣點的x,y方向的偏移)。這樣的話,有了輸入的feature map,有了和feature map一樣大小的offset field,我們就可以進行deformable卷積運算。所有的參數都可以通過反向傳播學習得到。

deformable RoI pooling這個 offsets 通過一個全鏈接層學習 ;offset通常不是整數,因此我們需要用雙線性插值的方法確定偏移之後的採樣點的值;假設對於一個ROI,需要pooling成spatial size爲3*3大小。爲了獲得3*3個bin對應的offset,首先正常roi pooling一下,然後接上一個全連接層學習這9個offset,然後再reshape。所有的參數也是可以學習得到的。

比較同類方法:可以用幾何變換增強數據集,或者設計一些transformation invariant的描述子這些方法都是建立在我們已經知道數據集裏面存在哪些幾何變換的基礎上,對於未知的變換無法適應

爲什麼提出可變形卷積網絡?

同一層的激活單元的感受野是一樣大的,這對於目標檢測來說就是不太合理的,因爲不同位置對應的目標大小是不一樣的。如果能夠使得感受野在不同位置的大小進行自適應調整,那麼對於目標檢測語義分割等等任務的幫助必然很大。

13.常用的數據增強方法有哪些?

爲什麼要進行數據增強

比較成功的神經網絡需要大量的參數,許許多多的神經網路的參數都是數以百萬計,而使得這些參數可以正確工作則需要大量的數據進行訓練,而實際情況中數據並沒有我們想象中的那麼多

數據增強的作用:

  1. 增加訓練的數據量提高模型的泛化能力
  2. 增加噪聲數據提升模型的魯棒性

數據增強的分類:

數據增強可以分爲兩類,一類是離線增強,一類是在線增強

離線增強 : 直接對數據集進行處理,數據的數目會變成增強因子 x 原數據集的數目 ,這種方法常常用於數據集很小的時候
在線增強 : 這種增強的方法用於,獲得 batch 數據之後,然後對這個 batch 的數據進行增強,如旋轉、平移、翻折等相應的變化,由於有些數據集不能接受線性級別的增長,這種方法長用於大的數據集,很多機器學習框架已經支持了這種數據增強方式,並且可以使用 GPU 優化計算。

常用的數據增強技術:

1)翻轉 2)旋轉 3)縮放 4)裁剪 5)平移

6)添加噪聲:過擬合通常發生在神經網絡學習高頻特徵的時候 (因爲低頻特徵神經網絡很容易就可以學到,而高頻特徵只有在最後的時候纔可以學到) 而這些特徵對於神經網絡所做的任務可能沒有幫助,而且會對低頻特徵產生影響,爲了消除高頻特徵我們隨機加入噪聲數據來消除這些特徵。

7)color jittering

7)gan生成圖像進行數據增強

8)紋理貼圖,自造假數據

推薦博客:https://blog.csdn.net/zhelong3205/article/details/81810743

14. 常見的激活函數有哪些,以及它們的特點,及相應的導數

爲什麼要使用激活函數:

如果不用激勵函數,每一層輸出都是上層輸入的線性函數無論神經網絡有多少層輸出都是輸入的線性組合(感知機就是這樣的)
如果使用的話,激活函數給神經元引入了非線性因素,使得神經網絡可以任意逼近任何非線性函數這樣神經網絡就可以應用到衆多的非線性模型中。

(1)sigmoid

特點:
它能夠把輸入的連續實值變換爲0和1之間的輸出,特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1.
缺點:
sigmoid函數曾經被使用的很多,不過近年來,用它的人越來越少了。主要是因爲它固有的一些 缺點。
缺點1:在深度神經網絡中梯度反向傳遞時導致梯度爆炸和梯度消失其中梯度爆炸發生的概率非常小,而梯度消失發生的概率比較大。首先來看Sigmoid函數的導數(由反向傳播算法的數學推導可知,梯度從後向前傳播時,每傳遞一層梯度值都會減小爲原來的0.25倍,如果神經網絡隱層特別多,那麼梯度在穿過多層後將變得非常小接近於0,即出現梯度消失現象;當網絡權值初始化爲 (1,+∞) (1,+∞)(1,+∞) 區間內的值,則會出現梯度爆炸情況。)

缺點2:Sigmoid 的 output 不是0均值(即zero-centered)。這會導致後一層的神經元將得到上一層輸出的非0均值的信號作爲輸入。產生的一個結果就是:

那麼對w求局部梯度則都爲正,這樣在反向傳播的過程中w要麼都往正方向更新要麼都往負方向更新導致有一種捆綁的效果使得收斂緩慢。 如果按batch去訓練,那麼那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的梯度消失問題相比還是要好很多的。

缺點3:解析式中含有冪運算,計算機求解時相對來講比較耗時對於規模比較大的深度網絡,這會較大地增加訓練時間

(2)tanh 函數

它解決了Sigmoid函數的不是zero-centered輸出問題,然而,梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。

(3)Relu函數

ReLU函數其實就是一個取最大值函數,注意這並不是全區間可導的,但是我們可以取sub-gradient;ReLU雖然簡單,但卻是近幾年的重要成果,有以下幾大優點:

1) 解決了gradient vanishing問題 (在正區間)   2)計算速度非常快,只需要判斷輸入是否大於0   3)收斂速度遠快於sigmoid和tanh

單側抑制;相對廣闊的興奮邊界;稀疏激活(只對部分信號進行響應,提高學習精度,更好地提取稀疏特性);x<0 硬飽和,大於0不飽和,保持梯度不變,從而緩解梯度消息問題;

ReLU也有幾個需要特別注意的問題:
1)ReLU的輸出不是zero-centered
2)Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的算法。

(4)Leaky Relu (PRelu)函數

人們爲了解決Dead ReLU Problem,提出了將ReLU的前半段設爲αx而非0,通常α=0.01 。另外一種直觀的想法是基於參數的方法
理論上來講,Leaky ReLU有ReLU的所有優點,外加不會有Dead ReLU問題,但是在實際操作當中,並沒有完全證明Leaky ReLU總是好於ReLU。

(5)ELU ((Exponential Linear Units))函數

它的一個小問題在於計算量稍大。類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU。

(6)MaxOut函數

如何選擇神經元激活函數:

憑經驗:

1)深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤爲重要的。所以,總體上來講,訓練深度學習網絡儘量使用zero-centered數據 (可以經過數據預處理實現) 和zero-centered輸出。所以要儘量選擇輸出具有zero-centered特點的激活函數以加快模型的收斂速度。
2)如果使用 ReLU,那麼一定要小心設置 learning rate,而且要注意不要讓網絡出現很多 “dead” 神經元,如果這個問題不好解決,那麼可以試試 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.

推薦博客https://blog.csdn.net/u011584941/article/details/71534828

https://blog.csdn.net/tyhj_sf/article/details/79932893

15.mobielNetV2 與V1的對比

爲什麼MobileNetV2會先擴張在壓縮呢?

因爲MobileNet 網絡結構的核心就是Depth-wise此卷積方式可以減少計算量和參數量。而爲了引入shortcut結構,若參照Resnet中先壓縮特徵圖的方式將使輸入給Depth-wise的特徵圖大小太小,接下來可提取的特徵信息少所以在MobileNet V2中採用先擴張後壓縮的策略。

爲什麼在1*1的壓縮卷積後會連接線性激活函數?

因爲在激活函數之前,已經使用1*1卷積對特徵圖進行了壓縮而ReLu激活函數對於負的輸入值,輸出爲0,會進一步造成信息的損失,所以使用Linear激活函數。
推薦博客:https://blog.csdn.net/gbyy42299/article/details/82690105

https://blog.csdn.net/attitude_yu/article/details/82969184

16.傳統的hand-crafted特徵(SIFT、ORB等)與基於學習的ConvNet特徵的對比以及使用場景

???

17.瞭解RNN和LSTM的基本特點和網絡結構,它們之間的區別?LSTM與GRU的原理與區別

已手寫

18.各種優化器的特點

梯度下降法是最基本的一類優化器,目前主要分爲三種梯度下降法:標準梯度下降法(GD, Gradient Descent),隨機梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, Batch Gradient Descent)。

(1)標準SD(梯度下降的算法)

假設要學習訓練的模型參數爲W,代價函數爲J(W),則代價函數關於模型參數的偏導數即相關梯度爲ΔJ(W),學習率爲ηt,則使用梯度下降法更新參數爲:

其中,Wt表示t時刻的模型參數。

基本策略可以理解爲”在有限視距內尋找最快路徑下山“,因此每走一步參考當前位置最陡的方向(即梯度)進而邁出下一步。

標準梯度下降法主要有兩個缺點:

訓練速度慢:每走一步都要要計算調整下一步的方向,下山的速度變慢。在應用於大型數據集中,每輸入一個樣本都要更新一次參數且每次迭代都要遍歷所有的樣本。會使得訓練過程及其緩慢,需要花費很長時間才能得到收斂解
容易陷入局部最優解:由於是在有限視距內尋找下山的反向。當陷入平坦的窪地,會誤以爲到達了山地的最低點,從而不會繼續往下走。所謂的局部最優解就是鞍點落入鞍點,梯度爲0,使得模型參數不在繼續更新。


(2)批量梯度下降(BGD)

(3)SGD 隨機梯度下降

參考自己的筆記

優點:
雖然SGD需要走很多步的樣子,但是對梯度的要求很低(計算梯度快)。而對於引入噪聲,大量的理論和實踐工作證明,只要噪聲不是特別大,SGD都能很好地收斂。
應用大型數據集時,訓練速度很快。比如每次從百萬數據樣本中,取幾百個數據點,算一個SGD梯度,更新一下模型參數。相比於標準梯度下降法的遍歷全部樣本,每輸入一個樣本更新一次參數,要快得多。
缺點
SGD在隨機選擇梯度的同時會引入噪聲,使得權值更新的方向不一定正確。
此外,SGD也沒能單獨克服局部最優解的問題。

(4)動量梯度下降

動量優化方法是在梯度下降法的基礎上進行的改變,具有加速梯度下降的作用。一般有標準動量優化方法Momentum、NAG(Nesterov accelerated gradient)動量優化方法。

Momentum

  • 使用動量(Momentum)的隨機梯度下降法(SGD),主要思想是引入一個積攢歷史梯度信息動量來加速SGD。
  • 動量主要解決SGD的兩個問題一是隨機梯度的方法(引入的噪聲)二是Hessian矩陣病態問題(可以理解爲SGD在收斂過程中和正確梯度相比來回擺動比較大的問題)
    理解策略爲:由於當前權值的改變會受到上一次權值改變的影響,類似於小球向下滾動的時候帶上了慣性。這樣可以加快小球向下滾動的速度。

牛頓加速梯度(NAG, Nesterov accelerated gradient)算法,是Momentum動量算法的變種。

理解策略:在Momentun中小球會盲目地跟從下坡的梯度,容易發生錯誤。所以需要一個更聰明的小球,能提前知道它要去哪裏,還要知道走到坡底的時候速度慢下來而不是又衝上另一個坡。計算Wt−αvt−1Wt−αvt−1可以表示小球下一個位置大概在哪裏。從而可以提前知道下一個位置的梯度,然後使用到當前位置來更新參數。
在凸批量梯度的情況下,Nesterov動量將額外誤差收斂率從O(1/k)(k步後)改進到O(1/k平方)。然而,在隨機梯度情況下,Nesterov動量對收斂率的作用卻不是很大。
 

(5)自適應學習率優化算法針對於機器學習模型的學習率,傳統的優化算法要麼將學習率設置爲常數要麼根據訓練次數調節學習率。極大忽視了學習率其他變化的可能性。然而,學習率對模型的性能有着顯著的影響,因此需要採取一些策略來想辦法更新學習率,從而提高訓練速度。

目前的自適應學習率優化算法主要有:AdaGrad算法RMSProp算法Adam算法以及AdaDelta算法。 

推薦博客:https://blog.csdn.net/weixin_40170902/article/details/80092628

20.resnet 的特點,爲什麼要這麼設計?

殘差網絡單元其中可以分解成右圖的形式,從圖中可以看出,殘差網絡其實是由多種路徑組合的一個網絡,直白了說,殘差網絡其實是很多並行子網絡的組合,整個殘差網絡其實相當於一個多人投票系統(Ensembling)。

如果把殘差網絡理解成一個Ensambling系統,那麼網絡的一部分就相當於少一些投票的人,如果只是刪除一個基本的殘差單元,對最後的分類結果應該影響很小;而最後的分類錯誤率應該適合刪除的殘差單元的個數成正比的,論文裏的結論也印證了這個猜測。 

其實ResNet是由大多數中度網絡和一小部分淺度網絡和深度網絡組成的,說明雖然表面上ResNet網絡很深,但是其實起實際作用的網絡層數並沒有很深;大多數的梯度其實都集中在中間的路徑上論文裏稱爲effective path。 從這可以看出其實ResNet只是表面上看起來很深,事實上網絡卻很淺。 所示ResNet真的解決了深度網絡的梯度消失的問題了嗎?似乎沒有,ResNet其實就是一個多人投票系統。

 

 

 

 

由於上下組的卷積層通道數不同(類似於VGG網絡通道數的特點),使得短路連接不能直接相加,故需要在後四組連接上一組的第一個卷積層的短路連接通路添加投影卷積

由於ResNet的結構有別於傳統的卷積結構,使得信號的前向傳播和梯度的反向傳播變得更復雜。爲了穩定訓練時信號的前向傳播和梯度的反向傳播,從ResNet開始,網絡普遍使用Batch Normalization

resnetxt:

出自論文“Aggregated Residual Transformations for Deep Neural Networks”,主要是將殘差塊的中間的3x3卷積層變成group卷積,同時擴大了3x3卷積的輸入輸出通道數,使得在與對應的ResNet網絡的計算量和參數個數相近的同時提高網絡的性能。值得一提的是,ResNeXt與常用的ResNet對應的層數完全相同,都是50、101、152層。ResNeXt已經被很多網絡用來當作backbone,例如Mask RCNN中除了使用ResNet,也嘗試使用了ResNeXt-101和ResNeXt-152。
 

21.過擬合的處理方法?BN爲什麼可以防止過擬合?

BN防止過擬合的原因:在訓練中,BN的使用使得一個mini-batch中的所有樣本都被關聯在了一起,因此網絡不會從某一個訓練樣本中生成確定的結果。意思就是同樣一個樣本的輸出不再僅僅取決於樣本本身,也取決於跟這個樣本屬於同一個mini-batch的其它樣本。同一個樣本跟不同的樣本組成一個mini-batch,它們的輸出是不同的(僅限於訓練階段,在inference階段是沒有這種情況的)。我把這個理解成一種數據增強:同樣一個樣本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同於數據增強的是,這種拉扯是貫穿數據流過神經網絡的整個過程的,意味着神經網絡每一層的輸入都被數據增強處理了。

22. python hash 存儲的內部實現原理; python map reduce函數的作用?

哈希表的定義:哈希存儲的基本思想是以關鍵字Key爲自變量,通過一定的函數關係(散列函數或哈希函數),計算出對應的函數值(哈希地址),以這個值作爲數據元素的地址並將數據元素存入到相應地址的存儲單元中。

查找時再根據要查找的關鍵字採用同樣的函數計算出哈希地址,然後直接到相應的存儲單元中去取要找的數據元素即可。

哈希表(hash table)實現字典操作的一種有效的數據結構。

儘管最壞的情況下,散列表中查找一個元素的時間與鏈表中查找的時間相同,達到了O(n)。在一些合理的假設下,在散列表中查找一個元素的平均時間是O(1)。

建立hash建立的過程

1) step1 取數據元素的關鍵字key,計算其哈希函數值(地址)。若該地址對應的存儲空間還沒有被佔用,則將該元素存入;否則執行step2解決衝突。  

2) step2 根據選擇的衝突處理方法,計算關鍵字key的下一個存儲地址。若下一個存儲地址仍被佔用,則繼續執行step2,直到找到能用的存儲地址爲止。

構造哈希函數的方法有很多,總的原則是儘可能將關鍵字集合空間均勻的映射到地址集合空間中,同時儘可能降低衝突發生的概率

常用的hash函數:

影響哈希查找效率的一個重要因素是哈希函數本身。當兩個不同的數據元素的哈希值相同時,就會發生衝突。爲減少發生衝突的可能性,哈希函數應該將數據儘可能分散地映射到哈希表的每一個表項中。

(1)開放地址法

如果兩個數據元素的哈希值相同,則在哈希表中爲後插入的數據元素另外選擇一個表項。

當程序查找哈希表時,如果沒有在第一個對應的哈希表項中找到符合查找要求的數據元素,程序就會繼續往後查找,直到找到一個符合查找要求的數據元素,或者遇到一個空的表項。 

python中的hash(dict)採用的是開放地址法的雙哈希函數探測法

(2)鏈地址法

將哈希值相同的數據元素存放在一個鏈表中,在查找哈希表的過程中,當查找到這個鏈表時,必須採用線性查找方法。

推薦:https://www.cnblogs.com/5poi/p/7273743.html

python filter map reduce函數的作用:

(1)filter:功能:filter主要作用是過濾掉序列中不符合函數條件的元素,當序列中要刪、減元素時,可以使用filter函數。

格式:fliter(function,sequence)

function可以是匿名函數或者自定義函數,它可以對後面的sequence序列的每個元素判定是否符合條件,返回True或者False,從而留下True的元素;sequence可以是列表、元組或者字符串。

注意:迭代器需要進行列表轉換

(2)map:功能:map主要作用是求一個序列或者多個序列進行函數映射之後的值。

格式:map(function,iterable1,iterable2)

function中參數值可以是一個,也可以是多個;後面的iterable代表function運算中的參數值,有幾個參數值就傳入幾個iterable。

注意:1.迭代器需要進行列表轉換   2.map中如果傳入的序列長度不一,會依據最短的序列計算

(3)reduce:功能:reduce是對一個序列進行壓縮運算,得到一個值。

格式:reduce(function,iterable)

function中必須傳入兩個參數,iterable可以是列表或者元組。

注意:reduce使用前需要導包 from functools import reduce,map和filter是內置函數,所以可以直接調用.

23.反捲積如何實現?

在信號處理上,反轉180度稱作卷積,直接滑動計算稱作自相關,在大部分深度學習框架上都沒有反轉180度的操作,而是直接滑動計算卷積。

目前使用得最多的deconvolution有2種
方法1:full卷積, 完整的卷積可以使得原來的定義域變大
方法2:記錄pooling index,然後擴大空間,再用卷積填充

推薦博客:https://blog.csdn.net/Fate_fjh/article/details/52882134

https://blog.csdn.net/itchosen/article/details/77231207

24.DL數據不平衡怎麼解決的?

處理不平衡的方法總的來說可以分爲兩大類:1. 數據增強,2.損失函數權值均衡

一、數據集方法:1.數據增強,2.過採樣和欠採樣, 3. 人工數據合成

二、損失函數的權值均衡:1.不同類別的loss 權值不一樣,最佳參數需要手動調節  2.focal loss

推薦:https://blog.csdn.net/meccaendless/article/details/87092254

25.softmax 層有什麼缺點?triplet loss的形式,特點原理?

softmax爲什麼要用指數作用與神經元的輸出(指數函數是一種max的行爲可以讓大的輸出更大)

softmax 主要用於多分類,而sigmoid主要用於二分類;softmax建模使用的分佈是多項式分佈,而logistic則基於伯努利分佈

多個logistic迴歸通過疊加也同樣可以實現多分類的效果但是 softmax迴歸進行的多分類類與類之間是互斥的,即一個輸入只能被歸爲一類;多個logistic迴歸進行多分類,輸出的類別並不是互斥的,即"蘋果"這個詞語既屬於"水果"類也屬於"3C"類別。

總結:

Softmax訓練的深度特徵,會把整個超空間或者超球,按照分類個數進行劃分,保證類別是可分的,這一點對多分類任務如MNIST和ImageNet非常合適,因爲測試類別必定在訓練類別中。

但Softmax並不要求類內緊湊和類間分離,這一點非常不適合人臉識別任務,因爲訓練集的1W人數,相對測試集整個世界70億人類來說,非常微不足道,而我們不可能拿到所有人的訓練樣本,更過分的是,一般我們還要求訓練集和測試集不重疊。

所以需要改造Softmax,除了保證可分性外,還要做到特徵向量類內儘可能緊湊,類間儘可能分離
推薦:

https://blog.csdn.net/xiaosongshine/article/details/88826715

triplet loss:

推薦:https://blog.csdn.net/u013082989/article/details/83537370

https://blog.csdn.net/tangwei2014/article/details/46788025

26.CNN的原理?把feature map 映射爲矩陣?

卷積和反捲積的作用:卷積與反捲積操作使得神經網絡可以處理二維以上的數據。它最大的好處在於:1.保持了數據在空間上的位置信息;2.權重共享使得計算複雜度大大降低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章