動量更新:
動量更新的公式為:
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 即模型在訓練樣本資料上表現的很好,但在實際測試樣本上表現的較差...