下面要說的基本都是《動手學深度學習》這本花書上的內容,圖也采用的書上的
首先說的是訓練誤差(模型在訓練數據集上表現出的誤差)和泛化誤差(模型在任意一個測試數據集樣本上表現出的誤差的期望)
模型選擇
驗證數據集(validation data set),又叫驗證集(validation set),指用於模型選擇的在train set和test set之外預留的一小部分數據集
若訓練數據不夠時,預留驗證集也是一種luxury。常采用的方法為K折交叉驗證。原理為:把train set分割成k個不重合的子數據集(SubDataset),然后做k次模型訓練和驗證。每次訓練中,用一個SubDataset作為validation set,其余k-1個SubDataset作為train set。最后對k次訓練誤差和驗證誤差求平均(mean)
欠擬合:模型無法得到較低的訓練誤差,即訓練誤差降低不了
過擬合:模型訓練誤差遠小於在測試集上的誤差
解決欠擬合和過擬合的方法有二:其一,針對數據選擇合適的復雜度模型(模型復雜度過高,易出現過擬合;否則易出現欠擬合)。其二,訓練數據集大小(train set過少,則容易過擬合。沒有否則)
torch.pow():求tensor的冪次(pow是power(有冪次的意思)的縮寫),比如求tensor a的平方,則torch.pow(a,2)
torch.cat((A,B),dim):cat是concatenate(拼接,連接在一起)的縮寫,參考博客 https://www.cnblogs.com/JeasonIsCoding/p/10162356.html 解釋的很好,感謝博主。我多加一句:連接tensor A和B,就是擴增dim維,比如兩個矩陣,dim=1,則擴增列,即橫着拼接
torch.utils.data.TensorDataset(x,y):大概意思是整合x和y,使其對應。即x的每一行對應y的每一行。
torch.utils.data.DatasetLoader(dataset=dataset,batch_size=batch_size,shuffle=True,num_workers=2):dataset(通過TensorDataset整合的);batch_size(批量大小);shuffle(是否打亂);num_workers(線程數)
權重衰減(weight decay)
權重衰減又叫L2范數正則化,即在原損失函數基礎上添加L2范數懲罰項。
范數公式$ ||x|| _{p}= (\sum_{i=1}^{n}|x_{i}|^{p})^{1/p} $ L2范數為:$ ||x||_{2} = (\sum_{i=1}^{n}|x_{i}|^{2})^{1/2} $
帶L2范數懲罰項的新損失函數為:$ \iota (w_{1},w_{2},b) + \frac{\lambda }{2n}||x||^2 $ torch.norm(input, p=)求范數
丟棄法(dropout)
隱藏單元采用一定的概率進行丟棄。使用丟棄法重新計算新的隱藏單元公式為
$ h_{i}^{'} = \frac{\xi _{i}}{1-p}h_{i} $
其中$ h_{i}$ 為隱藏單元$ h_{i} = \O (x_{1}w_{1i} + x_{2}w_{2i} + x_{3}w_{3i} + x_{4}w_{4i} + b_{i}) $,隨機變量$\xi_{i}$取值為0(概率為p)和1(概率為1-p)
def dropout(X, drop_prob):
X = X.float()
assert 0 <= drop_prob <= 1 #drop_prob的值必須在0-1之間,和數據庫中的斷言一個意思
#這種情況下把全部元素丟棄
if keep_prob == 0: #keep_prob=0等價於1-p=0,這是$\xi_{i}$值為1的概率為0
return torch.zeros_like(X)
mask = (torch.rand(X.shape) < keep_prob).float() #torch.rand()均勻分布,小於號<判別,若真,返回1,否則返回0
return mask * X / keep_prob # 重新計算新的隱藏單元的公式實現
model.train():啟用BatchNormalization和Dropout
model.eval():禁用BatchNormalization和Dropout
正向傳播和反向傳播
在深度學習模型訓練時,正向傳播和反向傳播之間相互依賴。下面1和2看不懂的可先看《動手學深度學習》3.14.1和3.14.2
1.正向傳播的計算可能依賴模型參數的當前值,而這些模型參數是在反向傳播的梯度計算后通過優化算法迭代的。
如正則化項$ s = ({\lambda }/{2})(\left \| W^{(1)} \right \|_{F}^{2} + \left \| W^{(2)} \right \|_{F}^{2}) $依賴模型參數$W^{(1)}$和$W^{(2)}$的當前值,而這些當前值是優化算法最近一次根據反向傳播算出梯度后迭代得到的。
2.反向傳播的梯度計算可能依賴於各變量的當前值,而這些變量的當前值是通過正向傳播計算得到的。
如參數梯度$ \frac{\partial J}{\partial W^{(2))}} = (\frac{\partial J}{\partial o}h^{T} + \lambda W^{(2)}) $的計算需要依賴隱藏層變量的當前值h。這個當前值是通過從輸入層到輸出層的正向傳播計算並存儲得到的。