文章目錄
1
欠擬合
模型雖然捕獲了數據的一部分特徵,但是不能很好地對新數據進行準確預測。
(1)增加特徵項:在模型中加入更多的和原數據有重要相關性的特徵來訓練搭建的模型,得到的模型可能會有更好的泛化能力。
(2)構造複雜的多項式:增加函數中的次項來增強模型的變化能力,提升其泛化能力。
(3)減少正則化參數:正則化參數目的其實是防止過擬合,但是模型已經出現了欠擬合,就通過減少正則化參數 來消除欠擬合。
過擬合
模型過度捕獲了原數據的特徵。
(1)增大訓練的數據量:用於模型訓練的數據量太小,搭建的模型過度捕獲了數據的有限特徵,會出現過擬合,在增加參與模型訓練的數據量後,模型自然就能捕獲數據的更多特徵,模型就不會過於依賴數據的個別特徵。
(2)採用正則化方法:正則化一般指在目標函數之後加上範數, 用來防止模型過擬合的發生,在實踐中最常用到的正則化方法有L0正 則、L1正則和L2正則。
(3)Dropout方法:在神經網絡模型進行前向傳播的過程中,隨機選取和丟棄指定層次之間的部分神經連接,因爲整個過程是隨機的,所以能有效防止過擬合的發生
2
組合函數
向量 映射到 標量,作爲下一層神經元的網絡輸入變量
激活函數
將一維向量的網絡輸入變量通過一個函數映射到另外一個一維向量的數值。
通常將一個實數域得的值映射到有限域上。
主要作用:給神經元引入了非線性因素,使得神經網絡可以任意逼近任何非線性函數
一個只有線性關係隱含層的多層神經網絡不會比一般的只包含輸入層和輸出層的兩層神經網絡更加強大,因爲線性函數的函數仍然是一個線性函數。但是加入非線性以後,多層神經網絡的預測能力就得到了顯著提高。
1 Sigmoid函數
logistic、tanh、高斯函數等,統稱爲Sigmoid函數
優:連續可微,參數的一點變化就會帶來輸出變化。有助於判斷參數的變動是否有利於最終目標函數的優化。
劣:存在梯度消亡(Gradient Vanishing):梯度(誤差的信號)隨隱藏層數的增加成指數減小。
在後向傳播算法中,對梯度的計算使用鏈式法則,因此在第n層時需要將前面各層的梯度都相乘,但是由於sigmoid函數的值域在(-1,1)或者(0,1)之間,因此多個很小的數相乘以後第n層的梯度就會接近於0,
造成模型訓練的困難。
Sigmoid
Sigmoid函數的輸出值恆大於0,會導致模型在優化的過程中收斂速度變慢
tanh
tanh函數的輸出結果是零中心數據,解決了激活函數在模型優化過程中收斂速度變慢的問題
2 threshold函數
誤差函數是逐級常數(Stepwise Constant),一階導數要麼不存在要麼爲0,不能使用後向傳播算法計算一階導數。微小變化並不能在輸出中產生變動,算法收斂會慢很多。
RELU(Rectified Linear Unit,修正線性單元)
f(x)=max(0,x)
ReLU函數的收斂速度非常快,其計算效率遠遠高於Sigmoid和tanh
ReLU的輸出不是零中心數據,可能會導致某些神經元永遠不會被激活,並且這些神經元對應的參數不能被更新。
選擇激活函數
對於只有0,1取值的雙值因變量,logistic函數是一個較好的選擇。
對於有多個取值的離散因變量,比如0到9數字的識別,softmax激活函數是logistic激活函數的自然衍生。對於有有限值域的連續因變量,logistic或者tanh激活函數都可以用,但是需要將因變量的值域伸縮到logistic或者tanh對應的值域中。
如果因變量取值爲正,但是沒有上限,那麼指數函數是一個較好的選擇。
如果因變量沒有有限值域,或者雖然是有限值域但是邊界未知,那麼最好採用線性函數作爲激活函數
ps
f(x)=tanh(x)或者f(x)=(1+e−x)−1。就梯度下降法的訓練時間而言,這些飽和非線性函數比非飽和非線性函數如f(x)=max(0,x)f(x)=max(0,x)慢得多。
誤差函數
均方差(MSE)[外鏈圖片轉存失敗(img-BHOFdGoE-1564145426306)(d3.jpg)]
用在實數值域連續變量的迴歸問題上
平均絕對值(MAE)[外鏈圖片轉存失敗(img-wuGplqSv-1564145426306)(d4.jpg)]
每個誤差點對總體誤差的貢獻與其誤差絕對值成線性比例關係
交叉熵損失(Cross-Entropy)
爲映射到最可能的類別的概率的對數。當預測值的分佈和實際因變量的分佈儘可能一致時,交叉熵最小。
優化函數
梯度下降(Gradient Descent,GD)
如果學習速率過快,參數的更新跨步就會變大,極易出現局部最優和抖動;
如果學習速率過慢,梯度更新的迭代次數就會增加,參數更新、優化的時間也會變長。
因爲模型的訓練依賴於整個數據集,所以增加了計算損失值的時間成本和模型訓練過程中的複雜度
批量梯度下降(Batch Gradient Descent,BGD)
對於訓練數據集,我們首先將其分成 n 個 batch,每個 batch 包含 m 個樣本。我們每次更新都利用一個 batch 的數據,以這個批量計算得到的損失值爲基準來對模型中的全部參數進行梯度更新,而非整個訓練集
當訓練數據太多時,利用整個數據集更新往往時間上不現實。batch的方法可以減少機器的壓力,並且可以更快地收斂。
當訓練集有很多冗餘時(類似的樣本出現多次),batch 方法收斂更快。以一個極端情況爲例,若訓練集前一半和後一半梯度相同,那麼如果前一半作爲一個 batch,後一半作爲另一個 batch,那麼在一次遍歷訓練集時,batch 的方法向最優解前進兩個 step,而整體的方法只前進一個 step
隨機梯度下降(Stochastic Gradient Descent,SGD)
自適應時刻估計方法(Adaptive Moment Estimation,Adam)
在模型訓練優化的過程中通過讓每個參數獲得自適應的學習率,來達到優化質量和速度的雙重提升
目標函數
在訓練階段直接最小化的那個函數。
若採用正則項,則是誤差函數與正則函數的和。
反向傳播
隱藏層的誤差
)
3
批量算法 遞增算法
批量算法 ,一次處理所有的數據;
遞增算法,每處理一個或者數個觀測值就要更新一次參數。
在後向傳播算法中,“處理”對應的具體操作就是計算損失函數的梯度變化曲線。
如果是批量算法,則計算平均或者總的損失函數的梯度變化曲線。
如果是遞增算法,則計算損失函數僅在對應於該觀測值或者數個觀測值時的梯度變化曲線。
在線學習和離線
離線學習中,所有的數據都可以被反覆獲取 批量學習就是離線學習的一種。
在線學習中,每個觀測值在處理以後會被遺棄,同時參數得到更新。
在線學習永遠是遞增算法的一種,但是遞增算法卻既可以離線學習也可以在線學習
離線學習有如下幾個優點:
對於任何固定個數參數,目標函數可以直接被計算出來,容易驗證模型訓練是否在朝着所需要的方向發展。
計算精度可以達到任意合理的程度。
可以使用各種不同的算法來避免出現局部最優的情況。
可以採用訓練、驗證、測試三分法對模型的普適度進行驗證。
可以計算預測值及其置信區間
在線學習,因爲數據並沒有被存儲,不能反覆獲取,因此對於任何固定的參數集,無法在訓練集上計算損失函數,也無法在驗證集上計算誤差。
標準化
(1)重放縮(Rescaling):通常指將一個向量加上或者減去一個常量,再乘以或者除以一個常量。比如將華氏溫度轉換爲攝氏溫度就是一個重放縮的過程。
(2)規範化(Normalization):通常指將一個向量除以其範數,比如採用歐式空間距離,則用向量的方差作爲範數來規範化向量。在深度學習中,規範化通常採用極差爲範數,即將向量減去最小值,併除以其極差,從而使數值範圍在0到1之間。
(3)標準化(Standardization):通常指將一個向量移除其位置和規模的度量。比如一個服從正態分佈的向量,可以減去其均值,併除以其方差來標準化數據,從而獲得一個服從標準正態分佈的向量。
4 pytorch
x=torch.Tensor(3,4) #指定維度的隨機數
from torch.autograd import Variable
x=Variable(torch.ones(2,2)) print(x.data,x.grad) #x.grad:導數
x=Variable(torch.ones(2,2),requires_grad=True) #[[1,1],[1,1]]
y=x+2 # [[3,3],[3,3]]
z=y*y*3 # [[27,27],[27,27]]
out=z.mean() #27
out.backward() #反向傳播,求導
print(x.grad) #[[4.5000,4.5000],[4.5000,4.5000]]
#z=(x+2)*(x+2)*3 導數3*(x+2)/2 , 4.5是x=1時的導數值
#權值更新: weight=weight+learning_rate*gradient
learning_rate=0.1 #學習速率,步長
for f in model.parameters():
f.data.sub_(f.grad*learning_rate)
損失函數
import torch.nn as nn
import torch.nn.functional as F
sample=Variable(torch.ones(2,2)) #[[1,1],[1,1]]
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target=Variable(a) #[[0,1],[2,3]]
1 nn.L1Loss
絕對誤差的平均數
criterion=nn.L1Loss()
loss=criterion(sample,target) #1 : (|0-1|+|1-1|+|2-1|+|3-1|)/4
2 nn.SmoothL1Loss (Huber Loss)
誤差在 (-1,1) 上是平方損失,其他情況是 L1 損失
criterion = nn.SmoothL1Loss()
loss = criterion(sample, target) #0.625
**3 nn.MSELoss ** 平方損失函數。
[外鏈圖片轉存失敗(img-BbDBKdNk-1564145426311)(d15.jpg)] 預測值和真實值之間的平方和的平均數
criterion = nn.MSELoss()
loss = criterion(sample, targe)#1.5
4 nn.BCELoss 二分類用的交叉熵
criterion = nn.BCELoss()
loss = criterion(sample, target) #-13.8155
5 nn.CrossEntropyLoss 交叉熵損失函數
[外鏈圖片轉存失敗(img-vykV11Jc-1564145426312)(d17.jpg)]
6 nn.NLLLoss (Negative Log Likelihood) 負對數似然損失函數
[外鏈圖片轉存失敗(img-L85JOeEW-1564145426312)(d18.jpg)]
優化函數
SGD
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
# momentum:大於 0 的浮點數,動量參數。
5經典網絡
LeNet 1989 歷史上第一個真正意義的卷積神經網絡模型。最初的模型已不被使用。1998 LeNet-5 (6層)
AlexNet 2012 ILSVRC比賽冠軍 (8層)
VGGNet 2014 ILSVRC定位第一,分類第二 (VGG16 16層)
GoogleNet 2014 ILSVRC 分類第一 (22層)
ResNet 2015 ILSVRC 分類第一 (34層)
LeNet-5
論文說:
1.下采樣,降低特徵圖的分辨率,降低輸出對移位和失真的敏感性。
2.使平均輸入近似爲零,方差近似爲一,可以加速學習
3.C3的前6個特徵圖以S2中3個相鄰的特徵圖子集爲輸入。接下來6個特徵圖以S2中4個相鄰特徵圖子集爲輸入。然後的3個以不相鄰的4個特徵圖子集爲輸入。最後一個將S2中所有特徵圖爲輸入。可訓練參數:6*(35*5+1)+6(4*5*5+1)+3*(4*5*5+1)+1*(6*5*5+1)=1516
爲了破壞網絡對稱性
4.OUTPUT層:徑向基函數(RBF)的網絡連接方式:
[外鏈圖片轉存失敗(img-6WekgSMd-1564145426312)(C:/Users/Afeier/Desktop/DL/1563850639941.png)]
上式w_ij 的值由i的比特圖編碼確定,i從0到9,j取值從0到7*12-1。RBF輸出的值越接近於0,則越接近於i,即越接近於i的ASCII編碼圖,表示當前網絡輸入的識別結果是字符i。
AlexNet
在CNN中成功應用了ReLU、Dropout和LRN等Trick
1. Relu
f(x) = tanh(x)
或f(x) = (1 + e−x)−1
----飽和的非線性
f(x) = max(0,x) —非飽和非線性 , 梯度下降的訓練時間更快
2. 重疊池化
s=2,z=3 ,降低了top-1 0.4%
,top-5 0.3%
的錯誤率,並且更難過擬合。
3. 數據增強
第一種:圖像平移和水平翻轉
第二種:改變RGB通道的強度。光照的顏色和強度發生變化時,目標身份是不變的。減少了top 1
錯誤率1%以上
在整個ImageNet訓練集上對RGB集合執行PCA,對於每一個訓練圖片,加上主成分的倍數,大小成正比地乘一個隨機變量(隨機變量通過mean=0,stv=0.1的高斯分佈得到)
對於每個RGB [外鏈圖片轉存失敗(img-u3TdiqNH-1564145426313)(wps1.png)]加上[外鏈圖片轉存失敗(img-0Qj3CBsu-1564145426315)(wps2.png)]
[外鏈圖片轉存失敗(img-EdVzhsIr-1564145426315)(wps5.png)]分別是RGB像素值3*3協方差矩陣的第i個特徵向量和特徵值,對於某個訓練圖片的所有像素,隨機變量只獲取一次,直到下次訓練重新獲取。
4. 多GPU訓練
上下兩個GPU分別運行在部分層上。GPU只在特定的層進行通信。
The network’s input is 150,528-dimensional, and the number of neurons in the network’s remaining layers is given by 253,440–186,624–64,896–64,896–43,264– 4096–4096–1000. ???????????
5. LRN 局部響應歸一化
[外鏈圖片轉存失敗(img-boujuDeH-1564145426315)(1563841938432.png)]
i:第i個核在位置(x,y)運用激活函數Relu後的輸出
n:同一位置上臨近的kernel map的數目
N:kernel的總數
參數K,n,alpha,beta都是超參數,一般設置k=2,n=5,alpha=1e-4,beta=0.75
VGG16
相對於AlexNet,統一了卷積中使用的參數。參數量減少了 81%(相比AlexNet),而感受野保持不變
例:卷積核 3*3 ,步長1 ,padding=1
最大池化 2*2 步長2
1.堆疊較小的卷積核
小而深的卷積核可以使模型性能提升。
3個3*3的卷積層串聯相當於一個7*7的卷積層,但是擁有更少的參數。(3*3*3)/(7*7)=55%
2.唯一的預處理
RGB通道各自減去對應通道的均值。
3.帶動量的min-batch梯度下降法
動量0.9
4.測試時將全連接改成卷積
全連接層轉化爲卷積層的規則是: 將卷積核大小設置爲輸入的空間大小.
好處:卷積層對輸入大小沒有限制,可以高效地對圖像做滑動窗口式的預測
5.全連接轉卷積
在測試階段把網絡中的三個全連接層依次變爲 1個conv7*7,2個conv1*1.改變之後,整個網絡沒有全連接層,網絡中間的feature map不會固定,所以網絡對任意大小的輸入都可以處理
GoogleNet
引入Inception單元
Naive Inception結構
假設 previous layer 32*32*456 複製成四份 傳至接下來的四部分
四部分對應滑動窗口均爲 3*3 , 步長均爲1 ,
前三部分卷積padding分別爲0,1,2 . 要求輸出特徵圖深度分別爲128,192,96 (無特殊含義)
最大池化padding=1
四部分輸出的特徵圖爲 32*32*128 , 32*32*192 , 32*32*96 , 32*32*256
合併:將各個部分輸出的特徵圖相加 ,最後這個 Naive Inception單元輸出維度爲 32*32*672
Naive Inception 的兩個問題:
1.所有卷積層直接和前一層輸入的數據對接,卷積層中的計算量很大
2.最大池化層保留了輸入數據特徵圖的深度,總的輸出深度增加,增加了網絡結構計算量
1*1 卷積層的作用
1.完成特徵圖的聚合或發散。
假設有一個維度 50*50*100 的特徵圖 ,定義卷積核1*1*100 ,若想輸出深度爲90的特徵圖 ,則通過90次卷積操作,完成了特徵圖通道的聚合;同理,若110次操作,完成發散。
2.間接影響了卷積參數數量,提高模型性能。
將32*32*10的特徵圖輸入到3*3的卷積層中,要求輸出特徵圖深度20,需要用到卷積參數3*3*10*20=1800個;
若先輸入到1*1*5卷積層中,變成32*32*5,再輸入到3*3卷積層中,參數減少至1*1*5*10+3*3*5*20=950個。
v1: Going Deeper with Convolutions
v2:Batch Normalization
[外鏈圖片轉存失敗(img-IZCAF0V0-1564145426317)(1563873618601.png)]
1.加入了BN層,使每一層的輸出都規範化到一個N(0, 1)的高斯,增加了模型的魯棒性,可以以更大的學習速率訓練,收斂更快,初始化操作更加隨意,同時作爲一種正則化技術,可以減少dropout層的使用。
BN層使得可以使用更大的學習效率進行訓練,避免梯度彌散或者梯度爆炸現象的發生。
(x-mean)/MSE ---->均值0 方差1
2.學習VGG用2個3x3的conv替代inception模塊中的5x5,既降低了參數數量,也加速計算。
3.internal covariate shift:訓練過程中深度網絡內部子網絡的輸入數據的分佈變化。batch normalization方法可以減弱這些變化。
梯度爆炸
神經網絡中,由於梯度反向傳播到當前層時會乘以後面所有層權重的乘積,當網絡層數很多時,如果後面層的權重參數大多使用幅值大於1的參數會造成梯度的爆炸現象,如果大多使用幅值小於1的參數會造成梯度彌散現象。
學習率較大,會有很大概率發生梯度爆炸。
v3:Rethinking the Inception Architecture for Computer Vision
將7x7分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1)。既可以加速計算(多餘的計算能力可以用來加深網絡),又可以將1個conv拆成2個conv,使得網絡深度進一步增加,增加了網絡的非線性,還有值得注意的地方是網絡輸入從224x224變爲了299x299,更加精細設計了35x35/17x17/8x8的模塊。
v4:
重點有兩部分,一部分是對inception-v3進行架構的細化與改進,inception模塊中嵌入inception模塊,但是總的來看模型是一致的。另一部分便是結合了微軟的resnet,也就是殘差網絡,使用了新的inception模塊,也就是inception-resnet模塊,相較於傳統的inception-v4模型inception-resnet-v2計算量更小,能達到相差不多的效果。
GoogleNet網絡架構
三大塊:模型的起始部分 , Inception單元堆疊部分 ,模型最後分類輸出部分
若想增加或減少模型深度,只需增加或減少相應的Inception單元
爲避免深層次模型中梯度消失問題,增加了兩個額外的輔助Softmax函數
ResNet
shortcut或者skip connections
殘差模塊的最終輸出結果=輸入數據X經過兩個卷積之後的輸出F(x)加上輸入數據的恆等映射。
殘差模塊的輸入數據X若和輸出結果一致,直接相加;若不一致,先進行線性投影得到一致維度或維度不一致的部分用0填充。
不會給整個ResNet模型增加額外的參數和計算量,卻能加快模型的訓練速度。
常規殘差模塊,瓶頸殘差模塊(bottleneck residual block):
Bottleneck
Bottleneck 三步走:先對數據進行降維,再進行常規卷積核的卷積,最後對數據進行升維。
Xception(極致的Inception)
Inception-v3的另一種改進。
通道之間的相關性 與 空間相關性 應分開處理。採用Separable Convolution 替換 inception-v3中卷積操作。
方法
早停法 early_stop
在訓練中計算模型在驗證集上的表現,當模型在驗證集上的表現開始下降的時候,停止訓練,這樣就能避免繼續訓練導致過擬合的問題。
- 將原始的訓練數據集劃分成訓練集和驗證集
- 只在訓練集上進行訓練,並每個一個週期計算模型在驗證集上的誤差,例如,每15次epoch(mini batch訓練中的一個週期)
- 當模型在驗證集上的誤差比上一次訓練結果差的時候停止訓練
- 使用上一次迭代結果中的參數作爲模型的最終參數
但是模型在驗證集上的表現可能在短暫的變差之後有可能繼續變好。
早停法主要是訓練時間和泛化錯誤之間的權衡。
找到適合的停止標準可以幫助找到更好的平衡。
ModelCheckpoint
語法keras.callbacks.ModelCheckpoint(filepath,monitor=‘val_loss’,verbose=0,save_best_only=False, save_weights_only=False, mode=‘auto’, period=1)
參數說明:
filename:字符串,保存模型的路徑
monitor:需要監視的值
verbose:信息展示模式,0或1(checkpoint的保存信息,類似Epoch 00001: saving model to …)
save_best_only:當設置爲True時,監測值有改進時纔會保存當前的模型( the latest best model according to the quantity monitored will not be overwritten)
mode:‘auto’,‘min’,‘max’之一,在save_best_only=True時決定性能最佳模型的評判準則,例如,當監測值爲val_acc時,模式應爲max,當監測值爲val_loss時,模式應爲min。在auto模式下,評價準則由被監測值的名字自動推斷。
save_weights_only:若設置爲True,則只保存模型權重,否則將保存整個模型(包括模型結構,配置信息等)
period:CheckPoint之間的間隔的epoch數
雜
關於權重
**初始化權重值不能相同,否則網絡會變爲對稱的。**也就是說,如果權重初始化爲同一值,則對於任何輸入X,每個隱藏層對應的每個神經元的輸出都是相同的,這樣即使梯度下降訓練,無論訓練多少次,這些神經元都是對稱的,無論隱藏層內有多少個結點,都相當於在訓練同一個函數。
關於Maxpool
max-pooling更容易捕捉圖像上的變化,梯度的變化,帶來更大的局部信息差異性,更好地描述邊緣、紋理等構成語義的細節信息
。。。
feature map維度的整體變化過程是:先將local(width,height)信息壓縮,並分攤到channel(depth)層級