1. 程式人生 > >Stanford CS231n Notes

Stanford CS231n Notes

一、文章來由

二、cs231n 課程

第二講:資料驅動的影象分類方式:K最近鄰與線性分類器

(1)經典影象識別演算法不可擴充套件,data-driven的方式更科學
早期沒有使用的原因是早期沒有這麼多data,訓練的模型是一個類

(2)nearest neighbor classifier
記住所有training images和他們的label,找一個最相近的label
這種方法簡單,但是應用時效率低
CNN相對於這個方法反過來,不論訓練資料多少,分類時間都是固定的

KNN是nearest neighbor classifier的一種,找到最近K個images,have them vote on the label
5個最近點,分界線變得平滑

超引數:
1)最好的距離選取標準
2)k如何選

(3)5折理論
將所有data5折,其中一折用於超引數的設定
迴圈驗證,選取不同的折來設定超參

(4)線性分類器
類似於filter或者模板
f = Wx+b
將x展平,相乘於W,再加上b
所有的分數都是所有畫素點值的加權和

W和b要訓練出來

(5)為了定量選擇的模型或者權值,定義了loss函式
為了讓loss函式最小化

第三講: 線性分類器損失函式與最優化

(1)計算loss,採用multiclass SVM loss

相當於單個相減,然後加安全係數1(可以是任意正數),hinge loss

這裡寫圖片描述

full training loss就是在其上除以總數

這裡寫圖片描述

程式碼實現

這裡寫圖片描述

但這個裡面有一個bug
如果double每個值,其實結果沒有影響,但是會使資料間的差值越來越大

(2)正則化,給每個數字的權值儘量平均
分散權值
這裡寫圖片描述

(3)softmax classifier

這裡寫圖片描述

(4)不同的loss函式的比較

這裡寫圖片描述

最大化log概率比直接最大化概率好

最大不同:
SVM比softmax穩定,就算slightly提高值也不會變化(前提條件是誤分類評分小於正確評分減一),softmax不然,將所有樣本點納入考量

這裡寫圖片描述

(5)梯度下降法

計算複雜,且如果引數很多的時候,每個都要計算不太可能
用微積分求解
要檢查,寫起來簡單
並不是全部資料,而是抽樣

SGD是一種常用的更新W的方法

(6)經典方法是用 特徵+線性分類器 的方法

比如顏色直方圖+hog邊緣特徵,這樣線性分類器就有辦法處理,通常是將一幅圖人為拆分成多個特徵的組合
=== 某種程度上的統計特徵

傳統方法 vs 深度學習

這裡寫圖片描述

第四講:反向傳播與神經網路初步

1、求偏導
反向傳播
在正向計算的時候,每個引數就能夠把其對最後的結果偏導公式計算出來
導數的意義是,因變數的增量與自變數增量的比值

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

正向和反向傳播的時間差不多相同。

2、反向傳播門的性質

這裡寫圖片描述

加法門:梯度分配器,將梯度分配到前面的門
max門:梯度路由,將最大梯度放入路由,反向傳播的時候只分配給最大的那個(因為不是最大的,對結果產生不了影響)
乘法門:梯度開關

沒有迴路

3、正向傳播與反向傳播

1、總結前饋和反饋
對於每次更新,都要進行一次完整的前饋與反饋:
前饋計算loss,反饋計算梯度,update在負權值上權值微調
雅可比矩陣是一階偏導組成的矩陣
特殊情況下,不必計算雅可比行列式所有值

每一層之間都是通過矩陣連線

2、神經網路

隱含層可以有多個數,自己定義
隱含層引入多樣化

換算成公式太複雜,反向傳播簡化計算

每個單個的neuron都可以看作一個線性分類器

各種啟用函式

這裡寫圖片描述

relu會讓神經網路快很多,預設啟用函式首選
算神經網路的層數是算有權值的層數

正則化係數越低,擬合程度越高,也越容易過擬合
幾條線就大概是幾條邊界,所以對於circle data來說,3條就好

三條邊的組合,第二層只是把這些組合拼在一起

這裡寫圖片描述

網路中的neuron越多越好,但是要選擇合適的正則化項,而不是減少neuron,但可能有沒時間訓練等因素,所以選用更小的network

如果網路很小,有一種網路優化演算法L-BFGS,mini-batch好用,通常用不上

對於更深還是更寬也沒有一個確定的答案,對於圖片來說,層數更重要
對於其他問題,是data相關的

不同層用不同的啟用函式
通常不會這樣做,通常是選一個啟用函式,整個網路都用,不同層中換不同啟用函式一般並沒有什麼好處

第五講:神經網路訓練細節

講述步驟

這裡寫圖片描述

激勵函式

(1)sigmoid function

這裡寫圖片描述

梯度消失問題

問題很多,飽和的神經元要麼非常接近0,要不非常接近1
—>反向的時候,梯度趨於0

這裡寫圖片描述

問題1:local梯度很小
只在sigmoid的啟用區域才會有用

問題2:
不關於原點中心對稱,輸出值都在0,1之間
w的梯度要麼全正要麼全負,收斂速度很慢

問題3:
exp()耗時

但在rnn中用到,因為特殊原因

(2)tanh(x)

這裡寫圖片描述

(3)ReLU

這裡寫圖片描述

網路收斂速度快,之前的6倍
問題:不中心對稱

如果ReLU從未被啟用,那反向的時候就會梯度消失,不啟用就不能進行反向傳播(不更新權值,可以說什麼都不做)
如果激活了,因為區域性梯度是1,所以都是將梯度傳遞給前面的
如果在x為0的時候,梯度未定義,隨便選一個對結果也不會有很大影響

dead relu問題:
永遠不啟用,也不更新
這裡寫圖片描述
學習率過高也會出現這個問題
解決方法:可以給一個小的bias,重新啟用已死的神經元,但是講者認為這個方法沒什麼用

(3)Leaky ReLU

這裡寫圖片描述

也不一定是0.01,可以是任意值,這個α可以被學習,反饋學到
計算圖中的每個神經元都有α,可以通過學習學到

還是relu最常用

(4)ELU

這裡寫圖片描述

(5)maxout

這裡寫圖片描述

資料處理

PPT中介紹了很多資料處理方法,但在影象處理中歸一化不常用,但0中心化應用很多,均值中心化

這裡寫圖片描述

每個畫素減去均值image或者減去per channel 均值,後者更常用

權重初始化

過去人們常用全0初始化,但是效果不好,因為所有神經元的計算完全相同,反向的時候梯度也相同。最好採用隨機小值。

如果初始化不好,很可能飽和,反向不了

策略也已經有了,2010年提出的Glorot提出的Xavier初始化
但是這個用於tanh,不用於relu
但新發論文引入因數2
但這就是一個data-driven的活,不同批資料效果不同

還有方法是通過一個公式,能夠將資料高斯分佈化

這裡寫圖片描述

這裡寫圖片描述

BN有很多優點,如下:

這裡寫圖片描述

代替了一部分正則化的工作

Note: at test time BatchNorm layer
functions differently:
The mean/std are not computed
based on the batch. Instead, a single
fixed empirical mean of activations
during training is used.
(e.g. can be estimated during training
with running averages)

會稍稍延長一點時間

Babysitting the Learning Process

正確性檢查,非常重要
為了確保神經網路工作正常:
step1:初始化2層神經網路,weights和bias用最簡單的初始值
step2:two_layer_net那句是train這個網路,最重要的是關注要返回的loss和梯度,講者取消了正則化,以確保損失值正確

這裡寫圖片描述

step3:估算,softmax是-log(1/10)

這裡寫圖片描述

step4:對於小資料,能夠達到過飽和說明具有合理性(反向傳播+update+學習率OK,演算法沒有大問題),然後才考慮增大訓練集。所以不應該擴大訓練集直到完全通過測試。

step5:擴大訓練集,在找到好的learning rate,從小的learning rate開始

這裡寫圖片描述

learning rate太小的情況,這種假設是要建立在完成了正確性檢查之後,因為檢查無誤才能大膽判斷

但如果rate太大,cost就爆炸了
cost: NaN almost
always means high
learning rate…

超引數優化

粗糙—>精細的過程
超引數優化要隨機取樣超引數,網格取比隨機取差

這裡寫圖片描述

一些可優化的超參

這裡寫圖片描述

學會解讀不同的圖形

這裡寫圖片描述

也要關注一些其他的引數,比如準確率

總結:
這裡寫圖片描述

下節課繼續:
這裡寫圖片描述

第六講:神經網路訓練細節 part2

如何訓練神經網路

這裡寫圖片描述

為什麼要用啟用函式?

答:如果不用,不論多少層,如上圖,也只是一個三層的三明治,還是相當於一個線性分類器,使用線性分類器記憶data

如果初始權重太小,在網路中activate,權值更新就會趨於0;如果太大,就會梯度爆炸
—>那麼將會以超飽和的網路或者全0結束
–>選擇一個合理的初始化範圍很重要

batch normalization減輕初始化權重設定的麻煩

這裡寫圖片描述

dx是梯度

原來只是用簡單的梯度與learning rate相乘,現在要更復雜一點
對於gsd,在豎直方向上比較快,在水平方向上比較慢,所以會震盪,有一種方法就是用momentum方法

這裡寫圖片描述

mu在0與1之間,通常取0.5~0.9
v通常初始化為0

不同引數更新方法

(1)nesterov momentum

這裡寫圖片描述

original的方法是建立了一個actual向量,但是現在要做的是想一步超前,計算下一步的梯度,會有一點點的不同

這裡寫圖片描述

動量法的出現也不是因為有區域性最小值,當網路規模越來越大的時候,區域性最小值的問題不用特別關心

(2)AdaGrad update自適應梯度法

這裡寫圖片描述

凸優化理論的成熟拿過來的
用一個cache(梯度的平方和構成,聯合向量,每個維度記錄相應梯度的平方和,有時叫做 second momentum),per parameter adaptive learning rate,儲存引數空間的每一維都有不同的learning rate,比如上面那張圖,垂直方向的learning rate會遞減,水平方向的會增大

反對有個問題:learning步長會減少,最終停止

(3)RMSProp update

Hinton做了一個小的改動,將上面的那個問題解決了,不會更新停止,而是不斷帶來更新

這裡寫圖片描述

這裡寫圖片描述

梯度大的地方減慢速度才是最好的

(4)Adam update

ada和momentum的結合
動量用於穩定梯度方向

這裡寫圖片描述

beta1和2是超引數
beta1通常是0.9,beta2通常是0.995

這裡寫圖片描述

Adam很好用,通常講者使用Adam

learning rate 怎麼設定更好

這裡寫圖片描述

其實這裡很難說,開始的時候最好使用大一點的learning rate,但是到後期可以使用小一點的rate,因為系統能量太大不容易settle down

另一些凸優化方法,但是不細講

這裡寫圖片描述

Hessian Matrix,又譯作海森矩陣、海瑟矩陣、海塞矩陣等,是一個多元函式的二階偏導數構成的方陣,描述了函式的局部曲率。黑塞矩陣最早於19世紀由德國數學家Ludwig Otto Hesse提出,並以其名字命名。黑塞矩陣常用於牛頓法解決優化問題。

這裡寫圖片描述

這裡寫圖片描述

  • Adam is a good default choice in most cases
  • If you can afford to do full batch updates then try out
    L-BFGS (and don’t forget to disable all sources of noise)
    In practice

實際的大資料集不會採用 L-BFGS

adam 不會讓你學習率變為0,因為他說leaky gradient;如果用adagrad就不一樣了,learning rate可能降到0。

Evaluation: Model Ensembles

  1. Train multiple independent models
  2. At test time average their results
    Enjoy 2% extra performance

這裡寫圖片描述

這裡x_test是對於現在引數x的一個指數衰減,使用資料集和測試集,結果總比x要好,像引數進行加權的集合(不好解釋,想象碗狀函式優化問題,在最低點周圍不停跳動,最後做一個對這些值的,能夠更接近最低點)

Regularization (dropout)

涉及small samples,在前向的時候,要隨機將一些神經元置0
不僅在前向的時候,反向的時候也要用

這裡寫圖片描述

都要乘以U1和U2,隨機失活過濾器

防止過擬合,如果只用一半網路,表達能力就變弱了,偏差-方差均衡

這裡寫圖片描述

一旦dropout,沒有失活的神經元引數或者說神經元梯度才會被更新,因為一旦神經元被關閉,把輸出值固定為0,就不會有梯度經過他,他對應的上一層神經元的權值也不會更新,相當於是sub-sampling

因為他的值在計算損失函式中沒有用到,所以他的權值也就不更新了
在多次迴圈中我們會用相同的資料點訓練不同的共有引數的模型—>這就是隨機失活
每次前向的時候,我們sample,就會得到一個子網路

每一次迴圈中,我們先得到一個mini-batch,然後在神經網路中取樣,得到那些沒有失活的神經元,形成子網,然後前向+後向,然後得到梯度,一直重複這個過程

是否可以在不同層失活不同的比例,可以的,如果想更強的正則化,就失活多一點,比如一層有很多神經元,就可以多失活一點

也可以對每一個神經元進行一定概率的失活,叫做drop connect

這裡寫圖片描述

這裡需要補足training的0.5那部分系數,需要在test時啟用函式也乘上這個係數,以減小輸出值

這裡寫圖片描述

這裡寫圖片描述

也有一種方法是在training中將啟用函式輸出變大

這裡寫圖片描述

inverted dropout實際中應用很多
這裡的0.5不是絕對的,是期望

CNN

進入正題了,目前有一些很有名的網路,比如:
AlexNet,VGG-Net,LeNet,GoogleNet,ConvNet

AlexNet是2012年提出,但是跟1998年提出的LeNet差不多,差別就是一個用sigmoid一個用relu,而且更大更深,用gpu計算。

ConvNet對影象分類在行

第七講:卷積神經網路詳解

這裡寫圖片描述

用一個5*5*3的卷積和做運算
—>得到一個28*28*3的卷積激勵map
—>用不同卷積filter做運算,可以得到一個多層的卷積組,比如6個,就得到28*28*6的卷積組
—>這些會被feed到下一個卷積層

當然這個過程中要經過激勵函式
通常filter都很小,一般3*3或者5*5等等

這裡寫圖片描述

上圖中,第二層卷積層的大小變成5*5*6,有10個,所以得到一個24*24*10的卷積組

這裡寫圖片描述

在每一層這會得到不同的特徵。

這裡寫圖片描述

就是不同層的組合

這裡寫圖片描述

步長不能是任意的,3的時候不允許

這裡寫圖片描述

這裡寫圖片描述

有時候會對影象做填補
作用就是,如果7*7的影象,用3*3的來filter,尺寸不會縮小

這裡寫圖片描述

因為可能有很多層,如果縮小的太快,是不好的性質

這裡寫圖片描述

這裡寫圖片描述

引數還要加上bias

總結一下:

這裡寫圖片描述

K總要是2的指數,為了方便計算,有些程式對於2指數有特殊優化

這裡寫圖片描述

1*1的filter也是OK的,因為不僅是一個的,而是整個深度都參與卷積
filter總是偶數,奇數尺寸的濾波器有更好的表達,2*2也不是不行,但沒3*3好

為什麼填充的時候,只填充0,因為這樣filter只會考慮輸入的資料,點乘的時候,0不會對輸出有貢獻。即便是填充附近的資料。

每一層一般也不會用不同size的filter。

只有第一個卷積層能接觸到原始資料,後面的都是接觸前一個的資料
filter === kernel

在主流深度學習框架中也有體現:

這裡寫圖片描述

這裡寫圖片描述

站在神經元的角度來看這個問題:

每個神經元只管自己的一小塊區域(對應於一個kernel),一塊板上的所有neuron在一個啟用對映中都share一個weight

這裡寫圖片描述

一塊版上的neuron有兩個重要特性:
共享引數+局域連線

對於多個kernel可以理解為:
所有神經元全部以一個局域模式,共享引數,並關注著同一個資料體

這裡寫圖片描述

如上圖的5個neuron都看著同一塊資料
共享引數+局域連線的作用:
從視覺上控制模型的能力,神經元平面上希望計算相似的東西,例如小的邊緣,這樣的功能是有意義的,也是一種控制過擬合的方式

pooling就是一種下采樣

這裡寫圖片描述

max pooling就是用幾個裡面的最大值代替,來進行下采樣
當然也是有average pooling
這就是兩種最常見的pooling技術

這裡寫圖片描述

與Conv layer類似的是,pooling layer也有自己的定義,如下圖

這裡寫圖片描述

這裡只有兩個引數,另外有輸入輸出的定義

fc層就是一個neuron來計算分類得分

98年提出的LeNet

這裡寫圖片描述

AlexNet,圖顯示不全,而且有兩條路的原因是因為當時gpu發展沒有那麼好,就分了兩個

這裡寫圖片描述

第一層應該是227,而不是224,Alex原作者說的有問題

這裡寫圖片描述

pooling layer沒有引數,只有卷積層有引數

這裡寫圖片描述

AlexNet完整的架構

這裡寫圖片描述

依次為卷積-池化-norm,norm層是一個進行規範化的層,2012年前經常使用,現在不用了,因為對結果沒有幫助

也會對整個BP

BP的時候特別注意:
因為引數共享,當用filter做卷積的時候,所有neuron共享引數,所有濾波器梯度都彙總到一個weight blob

第一次使用relu
用了data 增強,拿到影象後不是直接用,而是先預處理
用了dropout 0.5,只在最後幾層用了
在監控準確率達到平臺期,學習率就除以10,基本減少一兩次,神經網路就收斂了

2013年冠軍是ZFNet,也是在Alexnet上改進的

這裡寫圖片描述

fc7已經成為一個名詞:代表統計分數之前的最後一層
當然在每一個卷積層後有一個relu層
在fc層後也應該有一個relu層

2014年VGG提出,將top5 error率一下子刷到7%
全部的架構只使用 3*3 conv layer
2*2 max pooling layer
重複堆疊到16層,效果不錯

架構如下圖

這裡寫圖片描述

我們注意到,過濾器在增加(更深),每個feature map在變小

224*224 —> 7*7
但是這一層深度不再是3通道,而是512個啟用通道(通過512個過濾器得到)
最後是每張圖片向前需要93m的記憶體,我們需要儲存這個值,因為要做BP,回來需要update,所以要double這個值,組後是最小200m左右

記憶體消耗主要在前期,見下圖,同時引數最多的時候在fc的時候

這裡寫圖片描述

現在代替全連結層有—>average pooling技術
不直接全連結,而是改變他,成512個數,是通過average pooling對每個(feature map)取平均值得到512個數,效果幾乎一樣好,可以避免使用大量引數

GoogleNet使用這個方法

VGG有個很簡單的線性結構,GoogleNet就複雜化了
其最大創新點是加入了inception module

這裡寫圖片描述

GoogleNet用inception layer取代了卷積層

這裡寫圖片描述

將7*7*1024降到1*1*1024
但是還是更多的人使用VGG,因為更好更統一的結構,人類的錯誤率差不多是5%,如果訓練人可以降低到2%~3%

2015年的冠軍是3.6%,來自於MSRA的residual network。

當然層數是越多越好
不過不是簡單的堆疊

這裡寫圖片描述

上圖說明了,如果要增加層數,不要用naive方法,要用resnet方法

這裡寫圖片描述

微軟亞研院的resNet有152層,訓練時間比較久,但是跑起來比VGGNet快

這裡寫圖片描述

resnet,採用跳躍的連線,會通過一個大的因子壓縮到一層 56*56的空間,剩下的150多層,都只作用在56*56的數組裡,將很多資訊打包到如此小的空間

這裡寫圖片描述

resnet的工作原理如上圖,需要加上輸入的殘差

原因就是,加法在BP的時候,梯度是直接分發給孩子,這樣跳躍的網路就可以幫助跳過很多中間層,因此可以訓練一個與原影象很像的影象,中間的層可以學習如何加入訊號使得更有效

如何訓練一個殘差網路:

這裡寫圖片描述

Alexnet用了0.01的初始學習率,因為殘差網路有batch normalization,所以可以提高一點,沒有使用dropout

殘差網路也不用在加上的那個部分加權,最開始可以直接對結果產生影響

第八講:遷移學習之物體定位與檢測

localization可以看作迴歸問題。迴歸就是輸出一組數,而不是分類label了
選框可以用四個變數描述:左上角xy座標+長寬
類似分類問題:也有前向傳播+BP

loss可以選用標準的歐式距離loss

一個簡單的定位+分類recipe(固定種類)

這裡寫圖片描述

pre-train就是先前有訓練的模型
簡單來說就是分別輸出框和分類結果

sliding window:overfeat

如果想識別圖中的物體,通常還有一種做法就是嘗試各種不同的框
重複上面的定位+分類操作,再將不同位置的結果進行聚合

將全連線層視為一個conv層

這裡寫圖片描述

如上圖的5*5*1024 —> 被個4096個5*5的核conv
這樣就統一了計算,大大減少計算量

這裡寫圖片描述

微軟2015年沒有靠的不只是更深層的特徵,而是發明了RPN—Region Proposal Network

L2 loss 有極端值的問題,L1沒有,所以可以用L1
有時有人會同時訓練迴歸與分類;有時分開

object detection

輸出的數量不定,也可以用不同的區域不停的試,試不同大小的視窗

加入兩個新東西:
(1)可以加入一個背景類,代表啥都沒有;
(2)多標籤分類,不用softmax loss,而是用獨立的迴歸loss,多個類可能在同一個點上

hog是用線性分類器,方向梯度直方圖,DPM類似CNN

當然不可能嘗試出所有的區域,所以用region proposal演算法

這裡寫圖片描述

輸出可能含有物體的區域,不關心具體類別,只是告訴這個區域可能有物體,很快。在影象中找整塊的區域

最著名的Region proposal演算法有selective search — 將類似顏色+紋理進行融合成框,再用這些合成的框進行檢測
講者推薦edgebox

這裡寫圖片描述

很快,1/3s一張圖

R-CNN Region based CNN

有了Region Proposal,有了CNN,就有了R-CNN

step1:執行selective search 到大噶2k個不同大小、不同位置的框
step2:每個框剪裁出來,調整到固定大小
step3:cnn分類 —> cnn網路分別連接回歸端+SVM分類端,迴歸端可以對目標框進行糾正

這裡寫圖片描述

R-CNN Training 過程
step1:下載一個已有的對於imageNet資料集分類的模型比如Alexnet
step2:finetune用於檢測,因為原模型是用於1000類分類的,可以在後面加上幾層用於分類自己的資料
step3:提取特徵,存在磁碟上—對於每張圖片,執行selective search 演算法,送到CNN,把特徵存在磁碟
step4:訓練二分類SVM,回答是否包含特定物體
step5:box的迴歸,希望從特徵推回到box,有特徵+目標==訓練線性迴歸

測試標準

這裡寫圖片描述

缺點:訓練有點麻煩,且費記憶體,慢,離線操作(不能update)

Fast R-CNN

swap提取出的區域再執行CNN,類似與overfeat滑動視窗

先高解析度影象輸入,卷積,得到高解析度卷積特徵
再用Region Proposal的方法, 即ROI分離區域特徵
投入全連線層
用分類端+迴歸端

這裡寫圖片描述

這裡寫圖片描述

解決了R-CNN在test和train時候的問題

Region of Interest Pooling
給出目標框,投影到conv feature空間,將conv feature分成小塊
再做max pooling,這樣也是可以BP

這裡寫圖片描述

這裡寫圖片描述

為什麼不用CNN做Region Proposal呢

Faster R-CNN

不用推薦區域的卷積,而是整張圖片卷積,使用RPN Region Proposal Network

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

做了和fast-RCNN相反的事情,用anchor框對特徵圖進行滑動,映射回原影象,特徵圖譜上的點和原影象有關聯,用這個就減少了計算量

這裡寫圖片描述

原論文將RPN與Fast-RCNN訓練重合了,這樣就節省了很大的計算量

對於Faster的區域推薦只用通過一個3*3和一些1*1的卷積核,計算量很小,就基本不用花什麼時間了
速度對比:

這裡寫圖片描述

授課時(2016.1)最好的組合還是 resNet101+faster RCNN

one-stage方法

YOLO:you only look once
將檢測問題直接當作迴歸來做

分離空間網格,他們7*7,對於網格中的每個元素,我們得到固定數目的bounding boxes,他們大部分實驗用B=2個

每個grid,預測2個B bounding boxes — 也就是4個數,還要預測一個score來表示可信度

現在還有SSD做實時的

問題:模型輸出數有限,速度快,但是不準,於是有fast YOLO

Object Detection 程式碼:

第九講:卷積神經網路的視覺化與進一步理解

conv層weights(過濾器)如下

這裡寫圖片描述

視覺化只能在第一層做,跟原圖有關

整個神經網路可微才能夠計算梯度
要想計算特定神經元的梯度,將這個神經元設定梯度為1.00,然後其餘的設定為0,做BP
用解析梯度法而不用數值梯度法的原因是,數值法更慢

對於一個任意的神經元,他的梯度並不是很容易看出是什麼,有個deconv的方法 guided BP

relu是阻斷為負數的BP
guided BP—只傳遞正數的梯度的部分,用relu;並且還阻斷梯度為負數的

這裡寫圖片描述

這裡寫圖片描述

只通過有正影響的,不通過有負影響的
普通的看起來不明顯的原因,是因為每個畫素點到目標神經元的影響有正有負,在GBP的只通過正值,就能看到清晰的圖片

Optimization to Image

另外通過優化的方法,對某一類物體儘可能高的提高得分,最大程度的啟用網路中某些單元的影象

這裡寫圖片描述

無論梯度正負,只取最大值效果,不考慮符號
暗色的地方說明:這塊地方出現的東西,神經網路不care對結果的影響,但是如果改變白色部分,就會影響結果

開始的時候,kernel很小,比如3*3,但是後面層的畫素對結果的影響就可以組合了,變大很多,所以在底層就是一些片段的組合,但是到高層了會成團,到高層之後一個neuron就可能是整張圖片的函數了

這裡寫圖片描述

增強跟目標相似的東西,做BP增強原圖
因為資料中狗很多,所以整個網路比較關注狗的特徵

損失要和這裡的啟用匹配,比如啟用和放進甘道夫的啟用類似

如何去fool一個分類器

其實可以將一張圖“變成”另外一張圖,對於分類器來說。

在高層中將梯度設定成另一個類別,然後反向傳播,得到原影象的改變

這裡寫圖片描述

只是把畫素向置信度高的方向移動一點點,對於分類器來說就成了另一張圖,這是因為前向傳播中的函式線性的特點,因為在網路的頂端加了一個線性分類器,對於高維空間,只需要對每個維度順著結果遞增的梯度方向做微小改變,這個分類器就會被fool。

這裡寫圖片描述

這裡寫圖片描述

對抗樣本(adversarial example)—這是一種脆弱性,這和影象也沒關,任何data都可以做對抗樣本,目前沒有好的解決方法,是一個好的課題

如果人臉識別被做對抗樣本就可以變成任意一個人

第十講、RNN

RNN因為是不同做重複操作:
所以結果容易要麼爆炸,要麼消失
小技巧控制梯度爆炸:如果梯度大於5,就逐元素裁剪為5 — 梯度裁剪

  • RNN有梯度彌散問題
  • LSTM能很好的抑制梯度彌散,因為高速細胞只改變了加法運算,不會消失,每次都乘以相同的矩陣

第十一講、cnn實戰

data augmentation

  • 翻轉是最常見的augment
  • random crops

  • test的時候,10-crops

    上下左右中*2(水平翻轉),這十個位置得分取均值

  • 顏色改變,如:對比度,但並不一定常見;還可以對每個畫素做PCA主成分分析,遍歷所有畫素後得到訓練集中的主要顏色有哪些,PCA給出顏色空間中3個主要顏色在哪個方向中變化最劇烈

  • 防止過擬合,可以在forward的時候加一些隨機擾動,比如augment就是一種;還可以dropout+dropconnect;還有Batch Normalization(任一張圖片,因為在不同的batch中,會不同,相當於引入了隨機噪聲)

transfer learning

1、如果自己訓練資料真的很少,可以把pre-trained的網路,當作一個特徵提取器,只train最後一層

2、對於從scratch開始學的層:一般學習率較高,但也不能太高(比如原來網路的1/10);對於finetune的層:就需要更小的learning rate(比如原來的1/100)

3、一般情況下,用同類型的訓練資料好,但是前幾層的feature很general,幾乎所有的影象資料都需要,所以不用太擔心

4、finetune步驟:

step1. 把網路固定,只train後面幾層
step2. 當最後幾層快收斂之後,再對中間層微調

這裡寫圖片描述

一般來說都不應該從scratch開始訓練,多用finetuning,除非有很大很大dataset

5、(1)三層3*3的layer疊起來,一個neuron可以看到多大
5*5

(2)三個加起來呢?
7*7

(3)引數數量比較

這裡寫圖片描述

(4)浮點運算量比較

更深的網路,更少的計算就有更強的非線性

這裡寫圖片描述

6、bottleneck技巧—ch