yolo中增加L1及L2正則化

2021-09-11 08:38:45 字數 1391 閱讀 2277

動量更新:

動量更新的公式為:

case caffe::cpu:
轉化成yolo裡對應的數學公式就是: 

與動量更新的公式對應,參照此,去看yolo的**

事實上,yolo**weights的更新預設就是l2正則化的,因此為了首先說明動量的問題,先以bias的更新**為例:

axpy_cpu(l.n, learning_rate/batch, l.bias_updates, 1, l.biases, 1);

scal_cpu(l.n, momentum, l.bias_updates, 1);

轉化成數學公式是:

現在整合一下,成為最開始的數學形式:

和caffe所差的地方也就是前面選項中多乘了乙個learn_rate

然後再看w的更新方式,這是加了l2正則化的

axpy_cpu(l.nweights, -decay*batch, l.weights, 1, l.weight_updates, 1);

axpy_cpu(l.nweights, learning_rate/batch, l.weight_updates, 1, l.weights, 1);

scal_cpu(l.nweights, momentum, l.weight_updates, 1);

轉化成數學形式並整合:

相比caffe版本,多了乙個moment處乘learn_rate, 因此每次更新中其實如果learn_rate太小的話,yolo的動量性質沒那麼好的

yolo的l1正則化:

有了l2正則化,加l1就很簡單了,**如下:

cuda_pull_array(l.weights_gpu, l.weights, l.size*l.size*l.n*l.c); //比較懶,就不寫乙個kernel函式了,而且計算量也用不到  

l.sign_weights[i]= l.weights > 0 ? 1:-1; //求取w處的符號

cuda_push_array(l.sign_weights_gpu, l.sign_weights, l.size*l.size*l.n*l.c); //只有push之後才能在gpu中運算

axpy_gpu(l.n, -decay*batch, l.sign_weights, 1, l.weight_updates, 1); //求此處的l1正則化梯度

axpy_gpu(size, learning_rate/batch, l.weight_updates_gpu, 1, l.weights_gpu, 1);

scal_gpu(size, momentum, l.weight_updates_gpu, 1);

L1和L2正則化

l1和l2正則化 l1與l2正則化都是防止模型過擬合,其方式略有不同。具體請見下文。1 l1 正則化l1正則化 1範數 是指,各權值 變數 特徵 絕對值之和。其作用是產生權值的稀疏模型,也就是讓大部分權值為0.為什麼能產生權值稀疏模型?因為如下圖所示,各權值絕對值之和後得到乙個矩陣,很容易在矩陣的頂...

L1以及L2正則化

機器學習中幾乎都可以看到損失函式後面會新增乙個額外項,常用的額外項一般有兩種,一般英文稱作 1 norm和 2 norm,中文稱作l1正則化 和l2正則化 或者l1範數 和l2範數 l1正則化和l2正則化可以看做是損失函式的懲罰項。所謂 懲罰 是指對損失函式中的某些引數做一些限制。對於線性回歸模型,...

L1與L2正則化

在機器學習中,我們茶廠聽到l1和l2正則化,用他們來防止過擬合,但是在什麼情況下使用它們和它們的原理是什麼樣的可能一知半解。所以在本部落格中將對l1和l2做簡單的介紹和應用場景。如果引數過多,模型過於複雜,容易造成過擬合 overfit 即模型在訓練樣本資料上表現的很好,但在實際測試樣本上表現的較差...