第1章 CS231n課程介紹
---1.1 計算機視覺概述
- 這門課的主要內容是計算機視覺.它是一門需要涉及很多其他科目知識的學科.
- 視覺數據占據了互聯網的絕大多數,但是它們很難利用.
---1.2 計算機視覺歷史背景
- 為了獲得一副3D圖像,我們需要經歷原始圖像(端點,曲線,邊緣)->2.5維草圖(場景的不連續性)->3D圖像幾個過程.
- 70年代:每個對象由簡單的幾何圖單位組成
- 80年代:如何識別由簡單物體構成的視覺空間
- 如果目標識別太難了,應該先進行圖像分割.
- 可以使用圖片中的特征來進行圖像識別.
- 圖像特征的維度一般很高,因此算法很容易過擬合.
- ImageNet是一個很大的目標識別數據集,相關比賽往往使用top5標准來衡量.
---1.3 課程后勤
- 介紹了本門課的內容:圖像識別,目標檢測,風格遷移,如何從零開始構建CNN,以及tensorflow等框架的使用等.
- 深度學習流行的主要原因是計算能力的提高和數據量的增長.
第2章 圖像分類
---2.1 圖像分類-數據驅動方法
- 計算機存儲圖像的方式是二維或三維矩陣.一個物體與計算機實際看到的像素值之間的差距稱為語義鴻溝.
- 一個具有魯棒性的圖像識別算法應該能從不同角度,光照條件,變形,遮擋,類內條件差異等條件下識別出物體類別.
- 邊緣對於視覺識別是十分重要的.但是基於邊緣的規則識別算法不是一種好方法.
- 數據驅動的分類方法是指:
- 收集具有標注的圖片數據集(CIFAR10).
- 使用機器學習來訓練分類器.
- 使用模型來預測新的圖片.
- 最近鄰(Nearest Neighbors)算法:
- 不進行訓練,只是單純地存儲所有的數據集,然后對於要預測的圖片,從數據集中找出與它最相似的圖片的標簽作為輸出.
- 訓練時間很短,預測時間很長.這與我們理想中的圖像識別算法相反.
- 最近鄰算法很容易出現誤分類,因此出現了K近鄰(K-Nearest Neighbors)算法:選出K個最近點,然后進行多數投票決定輸出.
---2.2 圖像分類-K近鄰算法
- 距離函數是K近鄰算法的關鍵.常用的有L1距離,L2距離等.通過不同的距離函數還可以將K近鄰算法泛化到任何類型的數據上.
- K近鄰算法中的K值和距離函數就是典型的超參數:需要人為設置,而不能由算法學習得到.選擇超參數的常見作法就是將數據集分為訓練集,驗證集,測試集.使用驗證集來選擇超參數,並在測試集得到結果.如果數據集較小,還可以采用交叉驗證的方法進行選擇.
- 實際上K近鄰算法很少在圖像數據中應用,因為它預測時間很長,而且距離函數很難度量圖像數據.
---2.3 圖像分類-線性分類I
- 線性分類器是參數模型中最簡單的例子.它實際上是關於輸入數據x和權重W的函數,輸出代表了預測的類別.
- 線性分類器實際上是用一個模版來匹配圖像,所以它對於多模態類別的預測能力較差.另外從幾何角度上看,線性分類器是用一個線性平面來將某一類別與其他類別划分開來,因此很難處理奇偶或多分類問題.
第3章 損失函數和優化
---3.1 損失函數
- 為了得到線性分類器的權重,引入了損失函數來定量地衡量權重的好壞.最小化損失函數的過程是一個優化過程.
- 損失函數就是一個關於預測值和真實值的函數.
- 多分類SVM
- 損失函數:如果真實分類的分數大於其他分數+邊界(margin),則損失=0,否則損失=其他分數-真實分數+邊界.邊界的值可以任意選擇,因為這個參數最終會消失.用公示表示為
,
,也稱為hinge損失.
- 初次迭代時損失函數的值應該約為分類的數量減去1.
- 假如有一組W使得損失函數為0,那么2W的損失函數也應該為0.這就使得有無窮多組權重,分類器將無法抉擇.因此需要加入超參數λR(W)作為正則化項,R(W)有L2范數,L1范數,彈性網絡,最大規范等正則化選項.正則化的目的就是減輕模型復雜度.
- SVM只關心正確分類是否比其他分類高出一個邊界.
- Softmax:
- 數據的softmax值是
- 對應的損失函數值是
,也稱為交叉熵損失.
-
初次迭代時損失函數的值應該約為log(C),C為分類數.
-
softmax會不斷提高正確分類的概率分布.
---3.2 優化
- 優化的過程可以想象為在一座山中尋找山谷.
- 梯度下降法是最常用的優化方法.
- 負梯度方向是函數下降最快的方向.
- 首先隨機初始化權重,然后計算梯度,接着朝梯度最小的方向前進一小步.
- 步長是一個超參數,最好在初始時選擇較大步長,然后逐漸縮小.
- 隨機梯度下降(SGD)只選取小批量(minibatch)數據進行估算,可以提升速度.
- 梯度可由解析梯度(先計算出梯度公式,再代入數值)和數值梯度(代入一個δ和數值計算)計算,數據維度高時前者速度較快.
- 圖像分類直接輸入原始像素值並不好,常用方式是計算圖片的特征代表,然后將這些特征向量合在一起,傳入線性分類器.常用的特征表示有顏色直方圖,方向梯度直方圖,詞袋等.這種方式與神經網絡有些相似,區別是我們的數據划分方式將由神經網絡學習得到.
第4章 介紹神經網絡
---4.1 反向傳播
- 反向傳播:
- 給定輸入值后,進行前向傳播,可以得到輸出值.
- 反向傳播實際上是鏈式法則的遞歸調用,逐層從后往前,可以求出輸出值對每個輸入的導數.
- 反向傳播的連續節點可以任意組合,只要對這個整體求導即可.
- max門的后向傳播與前向傳播類似,它只將梯度傳遞給最大值對應的節點.
- 沿着梯度方向前進一個步長,就更新了權重.
---4.2 神經網絡
- 通過不同的函數疊加,就可以使單層的線性分類器變為多層的神經網絡乃至深度網絡.
--- 作業2
-
Fully-Connectd Neural Nets:
- 將每一種層的類型通過前向傳播和反向傳播來實現模塊化
- 全連接層前向傳播:將輸入x通過reshape展開后,和權重w點乘並加上偏差b.
- 全連接層后向傳播:分別對wx+b求導,得到dx是上層梯度dout和權重w轉置后的點乘,再通過reshape轉換為x的shape.dw是x通過reshape展開后的轉置和上層梯度dout的點乘,db就是上層梯度在縱軸方向上的和.
- relu層前向傳播:使用np.maximum(0,x)求出x中的每個元素和0之間的最大值.
- relu層后向傳播:對於大於0的輸出值,相當於y=x,因此求導后就是自身.對於小於0的輸出值,相當於y=0,因此求導后還是0.所以令dx=上層梯度dout,然后用dx[x<=0]=0來實現.
- 全連接層+relu層是常用組合
第5章 卷積神經網絡
---5.1 歷史
- 卷積神經網絡就是擁有卷積層的神經網絡.
---5.2 卷積和池化
- 全連接層的每一個結點都與上一層的所有結點相連.
- 卷積層:
- 可以保持空間結構
- 卷積層的權重叫做卷積核(濾波器,感受野),將卷積核在圖像上滑動並計算每一次滑動的點積.滑動的步長是可以選擇的.更大的步長意味着降采樣.
- 卷積核的深度一般默認與輸入圖像相同.
- 實際應用中一般會在邊角用零填充,這樣可以保持全尺寸輸出.
- 一般會用多個卷積核(2的次方).
- 滑動卷積核會造成輸入和輸出的尺寸不同.
- 在卷積層后一般會跟隨一個激活層.
- 每幾個卷積層之間會有一個池化層.
---5.3 視覺之外的卷積神經網絡
- 池化層:
- 作用是使生成的表示更小且更容易控制.
- 池化層的步長一般設置為避免重疊,並且一般不使用零填充,因為目的是降采樣.
- 最常見的方法是最大池化:取卷積核中的最大值.濾波器一般設置為2*2.
- 小尺寸卷積核和棄用池化是一種趨勢.
第6章 訓練神經網絡(上)
---6.1 激活函數
- sigmoid:
- 可以將數據壓縮到[0,1]范圍內.
- 看作神經元的飽和放電率.
- 神經元飽和(絕對值很大)時,由於sigmoid函數的導數為0,經過鏈式法則后梯度也將變為0,會造成梯度消失.
- 由於sigmoid函數不是以0為中心的,因此它不會改變輸入值的正負.這意味着梯度下降法將進行得十分緩慢.(這也是我們要使用均值為0的數據的原因)
- tanh:
- 數據被壓縮到[-1,1]范圍內.
- 以0為中心,但是當輸入飽和時仍會出現梯度消失.
- ReLU:
- 將負數變為0,正數保持不變.
- 不會在正的區域產生飽和現象.
- 計算速度快,因此收斂也很快.
- 比sigmoid函數更具有神經科學的相似性.
- 負的區域仍會飽和,並且導致梯度消失.這被稱為dead ReLU.因此使用時一般用較小的正偏置進行初始化.
- Leaky ReLU:
- 與ReLU的區別是負區域有一個微小的斜率.
- 輸出均值接近0.
- 計算速度仍較快,並且不會發生飽和.
- ELU(Exponential Linear Units):
- 具有ReLU的優點.
- 輸出的均值接近0.
- 負區域較容易飽和.
- Maxout:
- 可以看做是ReLU和Leaky ReLU的泛化.
- 不會飽和也不會發生梯度消失.
- ReLU是較為通用的方法,Leaky ReLU/Maxout/ELU可以嘗試使用,但它們更偏向於實驗性.tanh也可以嘗試.最好不要使用sigmoid.
- 數據預處理是一個重要環節.
- 零中心化(Zero-centered):
- X -= np.mean(X, axis=0)
- 目的的使輸入數據有正有負,從而避免所有梯度的正負性相同.可以加快優化速度.
- 在圖像處理中較常用.可以減去整張圖像的均值圖像(AlexNet),或者只減去單通道平均值(VGGNet).
- 一般在訓練集中計算出均值后,會將該均值應用到測試數據中.
- 歸一化(Normalization):
- X /= np.std(X, axis=0)
- 使得所有特征處於一個范圍內,貢獻相同.
- 在圖像處理中較少用,因為圖像中的數值已經有一定范圍限制.
- 權重初始化:
- 全零初始化會使所有的神經元將做相同的事情,稱為參數對稱.
- 如果使用較小的隨機參數初始化,當網絡較深時,所有的激活值都將趨向於0.
- 如果使用較大的隨機參數初始化,會發生飽和.
- Xavier初始化是根據輸入來得到初始化權重的一種方法.
---6.2 批量歸一化
- 批量歸一化(Batch Normalization)也就是BN操作,目的是讓每個隱層節點的激活輸入分布縮小到(-1,1).
- 假設有N個D維訓練樣本,我們將對每個維度獨立計算經驗均值和方差.
- 批量歸一化層通常是在全連接層或卷積層之后插入的.
- 計算過程:
- 計算小批量均值:
- 計算小批量方差:
- 歸一化:
- 縮放和平移因子(由學習得到):
- 優點是縮小輸入空間,從而降低調參難度.還可以防止梯度爆炸/消失,從而加速網絡收斂.
- 在選取超參數時,可以用隨機搜索或網格搜索.隨機搜索的優點是可以對超參數空間覆蓋的更好.
第7章 訓練神經網絡(下)
---7.1 更好的優化
- 零中心化,歸一化等數據預處理的好處是可以使分類器對參數值中的小擾動不那么敏感.
- SGD的缺陷:
- 如果目標函數的梯度方向與最小值並不在一條線上,那么SGD將會呈"之"字形波動.
- 如果有目標函數存在鞍點(局部最小點),SGD將卡在里面或前進非常緩慢.
- SGD有隨機性,所以噪點的存在會讓SGD運行十分緩慢.
- 動量(Momentum)SGD:可以解決上述問題.也就是保持一個不隨時間變化的速度,並且將梯度變化增加到這個速度上,然后在這個速度的方向上前進而不是在梯度方向前進.每一步都用摩擦系數和梯度來更新速度.速度可以初始化為0.
- Nesterov acceletared gradient(NAG):Momentum的改進.先在原速度方向上前進一步,計算此時的梯度后,回到原來的位置,結合這個梯度和原速度決定本次前進的方向.
- 上述兩種方法對於極端極值點的效果可能一般,但事實是極端極值點意味着訓練可能過擬合了,平滑極值點更具魯棒性.
- AdaGrad:在訓練時一直累積一個梯度平方項,用步長*梯度/梯度平方項來前進.它的效果是加速小梯度方向的學習速度,減小大梯度方向的學習速度.並且因為梯度單調遞增,因此步長會越來越小,有利於接近極值點,但同時會帶來鞍點的問題.式中的1e-7是為了除數不為0.
- RMSProp:是AdaGrad的改進.仍計算梯度平方項,但讓它按一定衰減率指數下降,可以解決AdaGrad算法學習率下降過快的問題.
- Adam:可以看做是Momentum和RMSProp的結合.其中第一動量是速度,第二動量是梯度平方項.如果將第二動量初始化為0,那么一開始的步長會很大,因此需要加入偏置項,並使用動量的無偏估計來代替動量.
- 學習率是優化函數的一個重要超參數,推薦先使用較大的學習率,然后隨着訓練迭代逐漸減小.但是在剛建立模型時最好使用一個固定的學習率.
- 以上優化算法都是一階逼近的,二階逼近的缺陷是計算量太大.可以用擬牛頓法代替牛頓法,但它們在深度學習中的使用並不多,因為並沒有太多處理隨機的方法.
- Adam(beta1=0.9,beta2=0.999,學習率=1e-3或5e-4)是首選優化算法,但是如果問題並沒有太多隨機性,且能承受計算量的情況下(如風格遷移),可以嘗試L-BFGS.
- 如果訓練准確率已經很高,可以使用模型集成(Ensembles)來提高測試准確率.一種簡單的集成方法是對不同獨立模型的結果采用投票法或平均法.也可以使用一個模型在訓練中多個不同時期的結果來進行集成.
---7.2 正則化
- 正則化是一種通過防止過擬合來提高單一模型表現的方法.一般是在損失函數中加入正則項來實現.
- 一般采用的正則化方法都是在訓練時加入某種隨機性,然后在測試時抵消掉它們,由此來抑制過擬合.比如batch normalization和dropout.
- Dropout:每一次前向傳播時,隨機將一部分神經元的激活函數置0(一般將置0率設為0.5).它可以看作是避免了特征間的相互適應來抑制過擬合,或者是單一模型的一種集成學習.一個問題是dropout中存在隨機性,因此在測試時會采取乘以期望概率的形式來實現.由此產生的一種稱為反轉dropout的技巧,就是指在訓練階段將權重除以概率,這樣在測試階段就不用再乘以概率.
- 數據增強(Data Augmentation)是指在訓練過程中以某種方式隨機地轉換圖像(翻轉,裁剪,色彩抖動)來增加隨機性.
- DropConnect和dropout類似,區別是它將權重矩陣的一些值置0.
- 部分最大池化(Fractional Max Pooling)是指在池化層中隨機池化部分區域.
- 隨機深度(Stochastic Depth)是指在訓練時隨機丟棄一些層,只用部分層.然后在測試時使用全部的網絡.
- 大多數情況下單獨使用batch normalization就足夠了,如果仍存在過擬合的情況,可以嘗試dropout或其他方法.
---7.3 遷移學習
- 遷移學習(Transfer Learning)是另一種抑制因為數據不夠而產生的過擬合的方法.
- 基本思想是先在大數據集上訓練出一個神經網絡,然后將這個神經網絡的最后一層重新在小數據集上進行訓練.
- 目前大部分的計算機視覺任務都采用在ImageNet等大數據集上進行訓練的預訓練集,然后再精調網絡或重新初始化部分網絡的方式進行.
第8章 深度學習軟件
---8.1 Caffe,Torch,Theano,TensorFlow,Keras,PyTorch等
- CPU vs GPU:NVIDIA的GPU在深度學習中占主導地位.GPU有更多的核,因此更適合並行計算任務,比如矩陣乘法和卷積.一般建議使用NVIDIA的CUDA和CUDNN庫來進行運算.
- 深度學習框架的優點:
- 輕松地構建一個龐大的計算圖
- 輕松地計算計算圖中的梯度
- 在GPU上高效地運行
- tensorflow中的計算一般分為兩個階段,上半部分是定義計算圖,然后是運行計算圖:
- 使用tf.placeholder()建立輸入槽用於輸入常量,tf.Variable()用於輸入變量(如權重).變量可以存在計算圖中,避免了每次都需要從內存中讀取.變量需要聲明初始化.
- 建立激活函數,預測值,損失函數的表達式來完善計算圖.
- 使用optimizer=tf.train.GradientDescentOptimizier(learning_rate)來構建一個優化器.
- 使用updates=optimizer.minimize(loss)來讓tensorflow更新梯度.(這兩步相當於使用tf.gradients()計算反向傳播中的梯度,設定learning_rate,用assign()函數來表示權重更新的表達式.注意即使我們不需要輸出梯度,但也要在run的參數中加入梯度,否則tensorflow不會更新梯度.這里可以使用tf.group()的小技巧,將需要更新但不需要返回的值放入group中)
- 使用with tf.Session() as sess:來建立會話.
- 使用sess.run(tf.global_variables_initializer())來初始化全局參數.
- 向會話中加入常量的具體數據.
- 使用sess.run()來運行計算圖.
- 循環sess.run,即可實現學習.
- 上例是tensorflow的一個非常簡單的實例.實際上可以使用多種高級庫來進行權重初始化,激活函數的選擇等等操作.Keras就是其中一個著名的高級庫.
- Tensorflow采用靜態計算圖,而PyTorch采用動態計算圖.前者的優勢是可以復用很多次,並且可以在磁盤中序列化.后者的優勢是可以很方便地進行條件選擇和循環.
第9章 CNN架構
---9.1 AlexNet,VGG,GoogLeNet,ResNet等
- AlexNet:ImageNet比賽中第一個基於深度學習的圖像識別網絡框架
- ZFNet:改進了AlexNet的超參數
- VGGNet:更深的網絡(16或19層),保持小的卷積核(3*3,多層小卷積核和單層大卷積核有一樣的感受野,但加深了網絡的深度,可以進行更多非線性操作)
- GoogleNet:更深的網絡(22層),使用inception模塊(對進入相同層的相同輸入並行應用不同類別的濾波操作,使用零填充保持尺寸一致,瓶頸層加速計算,然后串行輸出它們),沒有全連接層.
- ResNet:152層的殘差網絡.普通網絡可能出現網絡更深表現卻更差的情況,因為深層網絡更難優化.ResNet的解決方案是讓每層都學習一些所需函數的底層映射,並嘗試擬合殘差映射.同樣會使用瓶頸層來加速運算.
第10章 循環神經網絡
---10.1 RNN,LSTM,GRU
- 相比CNN的輸入有着固定的尺寸,RNN可以實現一對多,多對一,多對多的模型,輸入和輸出都可以是可變長度.
- 每個RNN網絡都有一個循環核心單元,它把x作為輸入傳入RNN的內部隱藏態(internal hidden state),它在每次讀取新的輸入時更新,然后將結果反饋至模型.
- 多對多的RNN一般在每個時間步都將進行輸出.注意這里的權重矩陣是不變的,最終的梯度和損失是所有時間步下計算出的梯度之和以及損失之和.
- 多對一的RNN會根據最終的隱層狀態做出決策.
- 一對多的RNN則接收固定長的輸入項,然后輸出不定長的輸出項.
- 機器翻譯之類的任務則需要一個多對一的RNN x加上一個一對多的RNN,類似編碼器與解碼器.
---10.2 語言模型
- 單詞一般用獨熱編碼向量表示.針對字符級的語言模型,我們可以用不同的單詞去訓練一個RNN網絡,這樣它將會學習到一個字符之后最可能出現地其他字符是什么.
- 沿時間的截斷反向傳播是指前向計算若干步子序列的損失值,然后沿着這個子序列反向傳播,並計算梯度更新參數.
---10.3 圖像標注,視覺問答,Soft attention模型
- 圖像標注(Image Captioning)輸入一個圖像,輸出自然語言的圖像語義信息.它是由CNN和RNN組合而成的.COCO是最大的圖像標注數據集.
- 注意力模型是指在生成與圖像對應的文字時,可以允許模型將注意力放到圖像的不同部分.也就是CNN在圖像中每一個特殊的地方都用一個向量表示,當模型向前傳遞時會產生一個分布,對應圖像的不同位置.
- 視覺問答(Visual Question Answering)輸入一張圖像和一段自然語言的提問(一般直接將圖像向量和問題向量連接起來),輸出一些自然語言的答案.它同樣是由CNN和RNN連接而成的.
- 一般RNN在反向傳播時會不斷乘以相同的權重矩陣,因此容易發生梯度爆炸或梯度消失.
- 梯度截斷是防止梯度爆炸的一種方法:如果梯度的L2范式大於某個閾值,就將梯度乘上閾值除以梯度的L2范式來減小梯度.
- 防止梯度消失的一種辦法是換一種RNN結構.
- LSTM(長短期記憶網絡)被設計用來緩解梯度消失和梯度爆炸問題.
- 每個時間步中都維持兩個隱藏狀態,一個是類似RNN中的隱藏狀態(ht),一個是單元狀態(ct).
- 將上一時間步的隱藏狀態和當前的輸入堆疊在一起,乘上一個權重矩陣w,得到四個不同的門向量ifog(input gate表示要接受多少新的輸入信息,forget gate表示要遺忘多少之前的單元記憶,output gate表示要展現多少信息給外部,gate gate表示有多少信息要寫到輸入單元中).ifo門都使用sigmoid激活函數,含義是0丟棄全部,1接受全部.而g門使用tanh激活函數,含義是單元狀態最多自增或自減1.
- 更新隱藏狀態和單元狀態.
- LSTM反向傳播的優點在於f門進行的是矩陣元素相乘,而且每個f門都不同,因此不容易發生梯度爆炸或消失.這是一種利用加法連接和乘法門來管理梯度流的概念.
- GRU(門控循環單元)也是一種類似LSTM的結構.
第11章 圖像識別和分割
---11.1 分割
- 語義分割(Semantic Segmentation)是指輸入圖像,並對圖像中的每個像素進行分類.語義分割並不區分同類目標.
- 滑動窗口是一種方案,但復雜度太高,一般不使用.
- 全連接卷積網絡和補零法(使圖像尺寸不會被改變)是另一種方案,但是需要的層數太多.
- 一般會在前半部分使用卷積結合下采樣(池化或跨卷積),然后在后半部分使用上采樣(去池化,轉置卷積,一般和池化過程對稱)來恢復圖像的清晰度.
---11.2 定位
- 定位(Classification plus Localization)是指預測分類,並找到一個邊界包裹該物體.
- 一般用卷積網絡處理輸入圖像,得到一些向量,並由這些向量得到分類概率.同時有另一個全連接層從這些向量輸出四個數字,代表邊界框坐標.有兩組損失函數,一組用softmax計算分類得分,另一種計算預測坐標的准確率(如L1損失,L2損失),因此需要對它們加權求和來做反向傳播.
- 一種技巧是凍結網絡,分開訓練這兩個網絡直到收斂,然后再調試整個系統.
- 這種網絡同樣可以用於姿態估計(Human Pose Estimation).例如用14個關節點來定義人的姿態,網絡將輸出14個坐標.
---11.3 識別
- 對象識別(Object Detection)是指根據輸入的圖像確認分類,並標注邊界框.它與定位的區別是輸入圖像中物體的個數是不確定的,因此需要預測的參數數量也不確定.
- 滑動窗口(Sliding Window)將輸入對象切分為小塊,然后將它輸入到卷積網絡中,輸入對應分類結果(如果沒有分類目標,則屬於背景).它的缺陷是窗口的大小和位置難以抉擇.
- R-CNN采用信號處理,圖像處理等方法來建立候選清單,然后將圖像切分為上千個候選區域(Region Proposals),再對這些區域應用卷積網絡.候選區域可能有不同的尺寸,因此在傳入網絡前需要將它們切分至固定尺寸.最后使用SVM分類,同時有一個用於預測邊界的補償值,所以這是一個多任務損失.它的缺陷是仍需要傳入大量候選區域,並且這些候選區域是由固定算法得到的,無法學習參數.
- Fast R-CNN通過卷積網絡得到圖像的高分辨率特征映射,切分圖像的像素,基於備選區域投影到卷積特征映射,從中提取屬於備選區域的卷積塊.然后用興趣區域池化層(ROI pooling layer)來使卷積塊變為固定尺寸,輸入全連接層進行分類.同樣有一個多任務損失,需要基於全局反向傳播同時學習.它可以重復運用卷積計算,因此時間主要消耗在尋找備選區域.
- Faster R-CNN讓卷積網絡去預測備選區域,其余與Fast R-CNN相同.神經網絡同時處理四件事:
- 備選區域是否是待識別物體
- 校正包圍盒
- 最終物體識別的損失
- 最終包圍盒補償的損失
- YOLO(You Only Look Once)和SSD(Single Shot Detection)這類模型的思想是利用大型卷積網絡當成回歸問題處理.將輸入圖像分為網格,每個網格都有一系列的基本邊界框.對每個網格和每個基本邊界框預測邊界框偏移和目標對應類別的分數.
- 物體分割(Instance Segmentation)是給定一張輸入圖像,預測出圖像中每個物體的具體像素.
- Mask R-CNN將整張輸入圖像送入卷積網絡和訓練好的候選框生成網絡,然后將候選框投射到卷積特征圖上,然后產生兩個分支,一個預測出分類類別分數和邊界框的坐標,另一個是一個語義分割的微型網絡.
第12章 可視化和理解卷積神經網絡
---12.1 特征可視化,倒置,對抗樣本
- 對第一層卷積層可視化,得到的特征圖像一般是不同顏色,不同角度的有向邊.但是對較深的卷積層可視化得到的圖像則沒有明顯含義.
- 降維(如t-SNE,PCA)可以將高維特征映射為二維圖像.
- 排除實驗用平均像素遮擋圖像中的一部分,然后觀察圖像分類概率的變化值,得到概率熱力圖.由此可以判斷圖像中的哪些部分對分類起關鍵作用.
- 顯著圖(Saliency Map)對每個像素做輕微擾動,然后計算像素對分類預測概率的影響,從而得到哪些像素是影響分類的關鍵部分.
- 梯度上升(Gradient Ascent)修正訓練的神經網絡的權重,並改變圖像的某些像素,來最大化某些中間神經元和類的分值.為了讓生成圖像符合自然圖像,需要加入正則項(圖像的L2范數,高斯模糊處理).
---12.2 DeepDream和風格遷移
- 提取輸入圖像,通過神經網絡運行到某一層,使得該層的梯度等於激活值,然后反向傳播到圖像.這樣就放大了神經網絡在圖像中檢測到的特征.
- 特征反演(Feature Inversion)通過神經網絡運行一張圖像,記錄其中一個特征值,然后根據它的特征表示重構該圖像.
- 紋理合成(Texture Synthesis)給定一些紋理的輸入圖像塊,輸出更大塊的紋理圖像.神經網絡的紋理合成方法是將紋理輸入神經網絡,輸出一個H*W的C維特征.然后選取輸入特征的兩個不同列得到C*C的矩陣,反映了哪些特征傾向於在空間的不同位置一起激活.
- 風格遷移(Neural Style Transfer)選用藝術畫作進行紋理合成,再使用特征反演生成具有藝術風格的圖像.
第13章 生成模型
---13.1 Pixel RNN/CNN
- 生成模型是指在給定訓練數據下從相同的數據分布中生成新的樣本.它可以解決密度估計問題.
- Pixle RNN/CNN屬於全可見信念網絡.它對一個密度分布顯式建模.使用鏈式法則來將似然分解為一維分布的乘積,然后只要在該定義下最大化訓練數據的似然即可訓練模型.
- 用神經網絡來表達概率分布函數p(xi),其中xi的順序由像素擴散的順序決定,並傳入LSTM/CNN中.訓練圖片的每個像素值可以充當訓練標簽,所以可以使用softmax函數進行訓練.
---13.2 變分自編碼器
- 自動編碼器(Autoencoders)是一種無監督學習方法,將輸入數據通過編碼器生成一些特征.編碼器的映射函數一般是ReLU+CNN.生成的特征一般比輸入數據的維度小,所以這是一種生成重要特征的降維方法.利用生成的特征和解碼器(解卷積網絡)輸出與輸入數據維度相同的數據,並利用L2損失函數來計算原數據和生成數據之間的誤差.訓練好模型后去掉解碼器,就可以有一個用於生成重要特征的模型.
- 變分自編碼器定義一個不易處理的密度函數,通過附加的隱變量z對其建模.它通過向自動編碼器中加入隨機因子從而生成新數據,自動編碼器生成的特征就是隱變量z.首先選一個簡單的關於z的先驗分布,然后用神經網絡計算條件概率p(x|z),並用解碼器生成圖像.直接計算數據的最大似然很難,所以使用一個額外的編碼器來給出條件概率.
---13.3 生成式對抗網絡
- 生成式對抗網絡(Generative Adversarial Networks)采用博弈論的方法,從一個簡單分布中采樣(如隨機噪聲),然后用神經網絡學習從簡單分布到想要的分布的一個變換.
- 把訓練過程看作兩個玩家博弈的過程,生成器網絡試圖生成圖像來騙過判別器網絡,判別器網絡試圖把真假圖片區分開來.
- 優化目標是使判別器的目標函數盡可能大,生成器的目標函數盡可能小.首先對判別器進行梯度上升,從而學習thetad來最大化.接着對生成器進行梯度下降,從而學習thetag來最小化.但這種方法的生成器目標函數效果不好,因為它的梯度和自身效果成正比,所以一開始訓練會很困難.因此采用相反的想法,轉而用梯度上升最大化生成器網絡的目標函數的相反值,訓練過程將交替進行.
第14章 深度增強學習
---14.1 策略梯度,硬注意
- 強化學習(Reinforcement Learning)有一個代理和一個環境,環境賦予代理一個狀態,代理將采取行動,環境將回饋一個獎勵.這一過程將一直進行下去,直到環境給出終端狀態.這可以作用於游戲或棋類AI.
- 馬爾可夫決策過程(Markov Decision Process)是強化學習問題的數學表達.它滿足馬爾可夫性:當前狀態完全刻畫了世界的狀態.它由S(所有可能狀態的集合),A(所有行動的集合),R(獎勵的分布函數),P(下一個狀態的轉移概率分布)和γ(獎勵因子)定義.它的工作方式是令初始時間步t=0,環境從初始狀態分布p(s)中采樣,並將一些初始狀態設為0,然后開始以下循環:
- 代理選擇一個動作.
- 環境從該狀態和動作獲得獎勵.
- 抽樣下一個狀態.
- 代理收到獎勵,進入下一狀態.
- 基於上述循環,目標就是找到一個最佳策略(指定了每個狀態下要采取的行動),使得獎勵之和最大.因為MDP中含有隨機性,所以要最大化預期獎勵之和.
- 任何狀態下的價值函數(Value function)都是從狀態s的決策到現在的決策之后的期望累積獎勵.任何狀態行動組的Q值函數(Q-value function)遵守在狀態s下采取行動a的期望累積獎勵.
- Bellman等式意味着給定任何狀態動作組s和a,這一對的價值就是回饋r加上最終進入的任何狀態動作組s'和a'的價值.它的問題在於必須計算每一個狀態動作組,這是一個巨大的狀態空間,因此不可行.
---14.2 Q-Learning,Actor-Critic算法
- 使用深度神經網絡來估計動作值函數,這稱作深度強化學習.
- 決策梯度是指對策略參數進行梯度評估.
- 將深度強化學習和決策梯度結合,就得到了Actor-Critic算法.