轉自:AI算法與圖像處理
dropout的原理
- 可以把dropout看成是 一種ensemble方法,每次做完dropout相當于從原網絡中找到一個更瘦的網絡
- 強迫神經元和其他随機挑選出來的神經元共同工作,減弱了神經元節點間的聯合适應性,增強泛化能力
- 使用dropout得到更多的局部簇,同等資料下,簇變多了,因而區分性變大,稀疏性也更大
維數災難
- 高維空間訓練得到的分類器相當于低維空間的一個複雜非線性分類器,這類分類器容易産生過拟合
- 如果一直增加次元,原有的資料樣本會越來越稀疏,要避免過拟合就需要不斷增加樣本
- 資料的稀疏性使得資料的分布在空間上是不同的,在高維空間的中心比邊緣區域具有更大的稀疏性(舉例,正方體和内切圓到超立方體和超球面,随着次元趨于無窮,超球面體積趨向于0而超立方體體積永遠是1)
僞标簽技術
- 将test資料集中的資料加入到train資料集中,其對應的标簽為基于原有資料集訓練好的模型預測得到的
- 僞标簽技術在一定程度上起到一種正則化的作用。如果訓練開始就直接使用該技術,則網絡可能會有過拟合風險,但是如果經過幾輪訓練疊代後(隻是用原有訓練集資料)将訓練集和未打标簽的資料一起進行訓練,則會提升網絡的泛化能力
- 操作過程中一般每個batch中的1/4到1/3的資料為僞标簽資料
為什麼SSD對小目标檢測效果不好
- 小目标對應的anchor比較少,其對應的feature map上的pixel難以得到訓練,這也是為什麼SSD在augmentation之後精确度上漲(因為crop之後小目标就變為大目标)
- 要檢測小目标需要足夠大的feature map來提供精确特征,同時也需要足夠的語義資訊來與背景作區分
Xception,ResNext和ShuffleNet
- ResNext中,作者提到cardinality的概念,表示對通道進行分組
- Xception中,卷積對每一個通道進行單獨計算,也就是cardinality等于通道數,如果有N維通道輸出,那麼Cardinality就等于N(depth-wise separable convolution)
- group convolution的優點:卷積操作把所有的通道資訊考慮在内,可能是一種資訊浪費,卷積參數有限,産生的結構難免會有一定相關性,有可能造成過拟合(類似于全連接配接層)
- ShuffleNet就對group conv後的通道進行交換,得到更加均勻融合後的通道
繪制ROC的标準和快速方法以及ROC對比PR曲線的優勢
- 标準方法:橫坐标為FPR, 縱坐标為TPR, 設定一個區分正負預測結果的門檻值并進行動态調整,從最高得分(實際上是正無窮)開始逐漸下降,描出每個門檻值對應的點最後連接配接
- 快速方法:根據樣本标簽統計出正負樣本數,将坐标軸根據樣本數進行機關分割,根據模型預測結果将樣本進行排序後,從高到低周遊樣本,每遇到一個正樣本就沿縱軸方向繪制一個機關長度的曲線,反之則沿橫軸,直到周遊完成
- PR曲線的橫坐标是Recall,縱坐标是Precision,相對于PR曲線來說,當正負樣本發生劇烈變化時,ROC曲線的形狀能夠基本保持不變,而PR曲線的形狀會發生劇烈改變
核函數
- 核函數并不是一種映射,它隻是用來計算映射到高維空間後資料内積的一種方法
- 在低維空間中線性不可分的資料集在高維空間中存線上性可分的超平面(這點可以和維數災難中高維空間形成的分類器相當于低維空間中一個非常複雜的非線性分類器産生過拟合聯系起來),但在特征空間中仍要計算内積,是以在原計算式子中代入的不再是x而是φ(x)。計算核函數K時不需要知道具體φ(x)的定義和計算過程。核函數定義為(滿足一定條件)
K(x1, x2) = φ(x1)'φ(x2)
L0、L1和L2範數
- L0範數:很難優化求解(NP難問題)
- L1範數:是L0的最優凸近似(L1是L0的最緊的凸放松),且具有特征自動選擇和使得模型更具解釋性的優點
- L2範數:使得權重接近于0但是不等于0,有利于處理條件數不好情況下矩陣求逆問題(條件數用來衡量病态問題的可信度,也就是當輸入發生微小變化的時候,輸出會發生多大變化,即系統對微小變動的敏感度,條件數小的就是well-conditioned的,大的就是ill-conditioned的),對于線性回歸來說,如果加上L2規則項,原有對XTX(轉置)求逆就變為可能,而目标函數收斂速率的上界實際上是和矩陣XTX的條件數有關,XTX的 condition number 越小,上界就越小,也就是收斂速度會越快;另外從優化的角度來看,加入規則項實際上是将目标函數變成λ強凸,這樣可以保證函數在任意一點都存在一個非常漂亮的二次函數下界,進而能通過梯度更快找到近似解。總結就是:L2範數不但可以防止過拟合,還可以讓我們的優化求解變得穩定和快速。

逆卷積(或者叫轉置卷積)的實質:
- 一般的卷積運算可以看成是一個其中非零元素為權重的稀疏矩陣C與輸入的圖像進行矩陣相乘,反向傳播時的運算實質為C的轉置與loss對輸出y的導數矩陣的矩陣相乘
- 逆卷積的運算過程與卷積正好相反,是正向傳播時做成C的轉置,反向傳播時左成C
空洞卷積及其優點
- pooling操作雖然能增大感受野,但是會丢失一些資訊。空洞卷積在卷積核中插入權重為0的值,是以每次卷積中會skip掉一些像素點
- 空洞卷積增大了卷積輸出每個點的感受野,并且不像pooling會丢失資訊,在圖像需要全局資訊或者需要較長sequence依賴的語音序列問題上有着較廣泛的應用
Fast RCNN中位置損失為何使用Smooth L1
- 表達式為:
- 作者這樣設定的目的是想讓loss對于離群點更加魯棒,相比于L2損失函數,其對離群點、異常值(outlier)不敏感,可控制梯度的量級使訓練時不容易跑飛
Batch Normalization
- 使用BN的原因是網絡訓練中每一層不斷改變的參數會導緻後續每一層輸入的分布發生變化,而學習的過程又要使每一層去适應輸入的分布,是以不得不降低網絡的學習率,并且要小心得初始化(internal covariant shift)
- 如果僅通過歸一化方法使得資料具有零均值和機關方差,則會降低層的表達能力(如使用Sigmoid函數時,隻使用線性區域)
- BN的具體過程(注意第三個公式中分母要加上epsilon)
- 注意點:在測試過程中使用的均值和方差已經不是某一個batch的了,而是針對整個資料集而言。是以,在訓練過程中除了正常的前向傳播和反向求導之外,我們還要記錄每一個Batch的均值和方差,以便訓練完成之後按照下式計算整體的均值和方差
- 另一個注意點:在arxiv六月份的preprint論文中,有一篇叫做“How Does Batch Normalization Help Optimization?”的文章,裡面提到BN起作用的真正原因和改變輸入的分布進而産生穩定性幾乎沒有什麼關系,真正的原因是BN使對應優化問題的landscape變得更加平穩,這就保證了更加predictive的梯度以及可以使用更加大的學習率進而使網絡更快收斂,而且不止BN可以産生這種影響,許多正則化技巧都有這種類似影響
Dual Path Network
- ResNet結構通過跨層參數共享和保留中間特征的方式,有效較低特征備援度,重複利用已有特征,但難以利用高層資訊再發掘低層特征
- DenseNet每一層都重新在之前所有層的輸出中重新提取有用資訊,可以有效利用高層資訊再次發掘底層新特征,但存在特征備援
- DPN網絡可以了解為在ResNeXt的基礎上引入了DenseNet的核心内容,使得模型對特征的利用更加充分
超參數搜尋方法
- 網格搜尋:在所有候選的參數選擇中,通過循環周遊,嘗試每一種可能性,表現最好的參數就是最終的結果
- 貝葉斯優化:貝葉斯優化其實就是在函數方程不知的情況下根據已有的采樣點預估函數最大值的一個算法。該算法假設函數符合高斯過程(GP)
- 随機搜尋:已經發現,簡單地對參數設定進行固定次數的随機搜尋,比在窮舉搜尋中的高維空間更有效。這是因為事實證明,一些超參數不通過特征變換的方式把低維空間轉換到高維空間,而在低維空間不可分的資料,到高維空間中線性可分的幾率會高一些。具體方法:核函數,如:高斯核,多項式核等等。
- 基于梯度:計算相對于超參數的梯度,然後使用梯度下降優化超參數。
LR如何解決低維不可分問題
- 通過特征變換的方式把低維空間轉換到高維空間,而在低維空間不可分的資料,到高維空間中線性可分的幾率會高一些。具體方法:核函數,如:高斯核,多項式核等等
Boosting和Bagging
- Boosting主要思想是将一族弱學習器提升為強學習器的方法,具體原理為:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對訓練樣本分布進行調整,來訓練下一個基學習器,如此重複進行直至學習器數目達到了事先要求,最終進行學習器的權重結合
- Bagging是并行式內建學習方法最著名的代表,具體做法是對樣本進行有放回的采樣,然後基于每個采樣訓練集得到一個基學習器,再将它們進行組合。在預測時,對于分類任務通常使用簡單投票法,對回歸任務使用簡單平均法
梯度下降和牛頓法的差別
- 梯度下降公式如下
- 牛頓法公式如下,其中H為海塞矩陣,其實就是目标函數對參數θ的二階導數。隻适用于Hessian矩陣是正定的情況
- 牛頓法:二階優化,收斂速度較快,需要更新一個二階矩陣(計算代價大),對初始值有一定要要求,在非凸優化過程中容易陷入鞍點。
- 梯度下降法:一階優化,收斂速度較慢,容易逃離鞍點,優化過程中需要進行步長調整
DenseNet的要點
- 由于前後層之間的Identity function,有效解決了梯度消失問題,并且強化了特征的重用和傳播
- 相比ResNet輸出通過相加的方式結合進而阻礙資訊的傳播,DN通過串聯方式結合
- 串聯要求特征圖大小一緻,故把pooling操作放在transition layer中
- 為防止靠後的串聯層輸入通道過多,引入bottleneck layer,即1x1卷積。文中把引入bottleneck layer的網絡成為DenseNet-B
- 在transition layer中進一步壓縮通道個數的網絡成為DN-C(輸入m個通道,則輸出θm個通道,0<θ≤1)。同時包含bottleneck layer的和壓縮過程的網絡稱為DN-BC
常見激活函數特點
- sigmoid:輸入值很大時對應的函數值接近1或0,處于函數的飽和區,導緻梯度幾乎為0,造成梯度消失問題
- Relu:解決梯度消失問題,但是會出現dying relu現象,即訓練過程中,有些神經元實際上已經"死亡“而不再輸出任何數值
- Leaky Relu:f = max(αx, x),解決dying relu問題,α的取值較大時比較小時的效果更好。它有一個衍生函數,parametric Leaky Relu,在該函數中α是需要去學習的
- ELU:避免dying神經元,并且處處連續,進而加速SGD,但是計算比較複雜
- 激活函數的選擇順序:ELU>Leaky Relu及其變體>Relu>tanh>sigmoid
Softmax交叉熵損失
使用交叉熵損失的原因是它求導結果簡單,易于計算,最後結果中Softmax損失函數對應于每一項機率的偏導即為通過Softmax計算出的機率向量中對應真正結果的那一維減1。比如通過若幹層計算,最後得到某個訓練樣本對應的分類得分為[1, 5, 3],那麼通過Softmax計算得到機率分别為[0.015, 0.886, 0.117],假設樣本正确的分類為第二類,則對應每項的偏導為[0.015, 0.886-1, 0.117],根據這個向量就可以進行反向傳播了
mean pooling和max pooling的反向傳播
主要原則是需要保證傳遞的loss(或者梯度)總和不變。
mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把某個元素的梯度等分為n份配置設定給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變
max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。max pooling操作和mean pooling操作不同點在于需要記錄下池化操作時到底哪個像素的值是最大,也就是max id,這個變量就是記錄最大值所在位置的,因為在反向傳播中要用到
如何了解卷積、池化等、全連接配接層等操作
- 卷積的作用:捕獲圖像相鄰像素的依賴性;起到類似濾波器的作用,得到不同形态的feature map
- 激活函數的作用:引入非線性因素,
- 池化的作用:減少特征次元大小,使特征更加可控;減少參數個數,進而控制過拟合程度;增加網絡對略微變換後的圖像的魯棒性;達到一種尺度不變性,即無論物體在圖像中哪個方位均可以被檢測到
1x1大小的卷積核的作用
- 通過控制卷積核個數實作升維或者降維,進而減少模型參數
- 對不同特征進行歸一化操作
- 用于不同channel上特征的融合
以下網址是一些我覺得非常贊的文章,以目标檢測為主
1.關于Faster RCNN一篇非常精彩的博文解說,來自troy labs團隊:
- tryolabs.com/blog/2018/
2.關于one-shot目标檢測原理一篇非常精彩的綜述博文(不過文章真的很長很長...................)
- machinethink.net/blog/o
3.關于目标檢測的幾篇博文(來自Medium一位我很喜歡的大叔,名字叫
Jonathan Hui,目測應該是華人,目前有1.6k的followers)
- Region based類型:medium.com/@jonathan_hu
- one-shot類型:medium.com/@jonathan_hu
- YOLO各個版本:medium.com/@jonathan_hu
4.關于YOLO的一份PPT,解說非常生動形象(不過是針對v1老版本的)
docs.google.com/present