Kaldi中的L2正則化

2022-09-06 15:47:03 字數 2496 閱讀 1836

steps/nnet3/train_dnn.py

--l2-regularize-factor

影響模型引數的l2正則化強度的因子。要進行l2正則化,主要方法是在配置檔案中使用'l2-regularize'進行配置。l2正則化因子將乘以元件中的l2正則化值,並且可用於通過模型平均化以校正與並行化帶來的影響。(float,預設值= 1)

src/nnet3/nnet-utils.cc:2030

//nnet是更新前的神經網路

const component *src_component_in = nnet.getcomponent(c);

//delta_nnet是進行更新後的神經網路

updatablecomponent *dest_component =

dynamic_cast(delta_nnet->

getcomponent(c));

//delta_nnet->c -= 2.0 * l2_regularize_scale * alpha * eta * nnet.c

// alpha為l2正則化常數

// eta為學習率

// nnet.c為該nnet的component(應該是權重)

// l2_regularize來自於l2regularization(),該函式返回updatablecomponent中的l2

正則化常量(通常由配置檔案設定)。

// 根據steps/libs/nnet3/xconfig/basic_layers.py:471

// 可以xconfig中指定l2-regularize(預設為0.0)

basefloat scale = -2.0 * l2_regularize_scale * lrate * l2_regularize;

// nnet3/nnet-******-component.cc:1027

// linear_params_.addmat(alpha, other->linear_params_);

// bias_params_.addvec(alpha, other->bias_params_);

/*...*/}

//輸出的統計數值

cuvectorvalue_sum_;

//非線性(神經元)的微分的統計數值(只適用於以向量元素為單位的非線性,不適用於softmax)

cuvectorderiv_sum_;

//objective derivative function sum square

//目標函式微分的平方和,用於診斷

cuvectoroderiv_sumsq_;

//oderiv_sumsq_中stats數量

double oderiv_count_;

對於神經網路中的每個可更新元件c,假設它在元件中設定了l2正則化常量alpha(請參閱updatablecomponent::l2regularization())和學習率eta,那麼此函式為(偽**):

對求w偏導:

可以發現l2正則化項對b的更新沒有影響,但是對於w的更新有影響:

nnet.c即w

;eta為學習率

因子-1.0(-=,減等於)是為了最大化正則化項;

因子2.0來自引數平方的導數。該函式使用了"l2_regularize_scale"因子,請參閱下面的說明。

注意:由於與自然梯度的相互作用,kaldi的l2正則化是普通方法的近似。問題在於普通梯度乘以經過近似化、平滑化、比例縮放的fisher矩陣的逆,但是l2梯度不是。這意味著我們正在優化的不是常規的"目標函式+ l2正則化項"這種形式,我們可以將其視為"常規目標函式+ l2正則化項× fisher矩陣",前提是引數變化量不受到fisher矩陣縮放的影響,所以這不會影響l2的整體強度,只會影響是方向(direction-wise)權重。實際上,在大的fisher矩陣的變換方向上,相對於梯度,l2項的貢獻將更大。這可能並不理想,但如果沒有實驗就很難判斷。無論如何,l2的影響足夠小,並且fisher矩陣根據identity進行了充分的平滑,我懷疑這會產生很大的差別。

要為nnet3設定l2正則化,可以呼叫nnet3/xconfig_to_configs.py:

L1正則化和L2正則化

為了降低過擬合風險,需要控制模型複雜度,自然想到減少引數個數,但是這個問題不易直接解決,可以通過放寬條件控制。新增優化條件 這會使引數條件空間有明顯的凸角,這些突出點顯然會成為聯合優化時的最優解,但同時這些這些凸點中又會有較多的0值 由其限制條件可見,凸點都在座標軸上 因此l1範數會更易得到稀疏解,...

L1正則化和L2正則化

l1標準化與l2標準化 參考 l1 l2標準化及其python 實現 我們知道,正則化的目的是限制引數過多或者過大,避免模型更加複雜。l1 與 l2 解的稀疏性 以二維情況討論,上圖左邊是 l2 正則化,右邊是 l1 正則化。從另乙個方面來看,滿足正則化條件,實際上是求解藍色區域與黃色區域的交點,即...

L1正則化和L2正則化

摘自 深度學習 l1正則化和l2正則化 在機器學習中,我們非常關心模型的 能力,即模型在新資料上的表現,而不希望過擬合現象的的發生,我們通常使用正則化 regularization 技術來防止過擬合情況。正則化是機器學習中通過顯式的控制模型複雜度來避免模型過擬合 確保泛化能力的一種有效方式。如果將模...