MXNET:權重衰減

來源:互聯網
上載者:User

標籤:http   ddn   loss   cal   output   常用方法   net   size   backward   

權重衰減是應對過擬合問題的常用方法。

\(L_2\)範數正則化

在深度學習中,我們常使用L2範數正則化,也就是在模型原先損失函數基礎上添加L2範數懲罰項,從而得到訓練所需要最小化的函數。

L2範數懲罰項指的是模型權重參數每個元素的平方和與一個超參數的乘積。如:\(w_1\),\(w_2\)是權重參數,b是偏差參數,帶\(L_2\)範數懲罰項的新損失函數為:

\[\ell(w_1, w_2, b) + \frac{\lambda}{2}(w_1^2 + w_2^2),\]

\(\lambda\)調節了懲罰項的比重。

有了\(L_2\)範數後,在隨機梯度下降中,以單層神經網路為例,權重的迭代公式變更為:

\[w_1 \leftarrow w_1 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_1^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) - \lambda w_1,\]

\[w_2 \leftarrow w_2 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_2^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) - \lambda w_2.\]

\(\eta\)為學習率,\(\mathcal{B}\)為樣本數目,可見:\(L_2\)範數正則化令權重的每一步更新分別添加了\(-\lambda w_1\)和\(\lambda w_2\)。這就是\(L_2\)範數正則化被稱為權重衰減(weight decay)的原因。

在實際中,我們有時也在懲罰項中添加偏差元素的平方和

假設神經網路中某一個神經元的輸入是\(x_1,x_2\),使用啟用函數\(\phi\)並輸出\(\phi(x_1w_1+x_2w_2+b)\)。假設啟用函數\(\phi\)是ReLU、tanh或sigmoid,如果\(w_1,w_2,b\)都非常接近0,那麼輸出也接近0。也就是說,這個神經元的作用比較小,甚至就像是令神經網路少了一個神經元一樣。這樣便有效降低了模型的複雜度,降低了過擬合。

高維線性迴歸實驗

我們通過高維線性迴歸為例來引入一個過擬合問題,並使用L2範數正則化來試著應對過擬合。

產生資料集

設資料樣本特徵的維度為p。對於訓練資料集和測試資料集中特徵為\(x_1,x_2,…,x_n\)的任一樣本,我們使用如下的線性函數來產生該樣本的標籤:

\[y = 0.05 + \sum_{i = 1}^p 0.01x_i + \epsilon,\]

其中噪音項?服從均值為0和標準差為0.1的常態分佈。

為了較容易地觀察過擬合,我們考慮高維線性迴歸問題,例如設維度p=200;同時,我們特意把訓練資料集的樣本數設低,例如20。

n_train = 20n_test = 100num_inputs = 200true_w = nd.ones((num_inputs, 1)) * 0.01true_b = 0.05features = nd.random.normal(shape=(n_train+n_test, num_inputs))labels = nd.dot(features, true_w) + true_blabels += nd.random.normal(scale=0.01, shape=labels.shape)train_features, test_features = features[:n_train, :], features[n_train:, :]train_labels, test_labels = labels[:n_train], labels[n_train:]
初始化模型參數
def init_params():    w = nd.random.normal(scale=1, shape=(num_inputs, 1))    b = nd.zeros(shape=(1,))    params = [w, b]    for param in params:        param.attach_grad()    return params
定義L2範數懲罰項
def l2_penalty(w):    return (w**2).sum() / 2
定義訓練和測試
batch_size = 1num_epochs = 10lr = 0.003net = gb.linregloss = gb.squared_lossdef fit_and_plot(lambd):    w, b = params = init_params()    train_ls = []    test_ls = []    for _ in range(num_epochs):        for X, y in gb.data_iter(batch_size, n_train, features, labels):            with autograd.record():                # 添加了 L2 範數懲罰項。                l = loss(net(X, w, b), y) + lambd * l2_penalty(w)            l.backward()            gb.sgd(params, lr, batch_size)        train_ls.append(loss(net(train_features, w, b),                             train_labels).mean().asscalar())        test_ls.append(loss(net(test_features, w, b),                            test_labels).mean().asscalar())    gb.semilogy(range(1, num_epochs+1), train_ls, 'epochs', 'loss',                range(1, num_epochs+1), test_ls, ['train', 'test'])    return 'w[:10]:', w[:10].T, 'b:', b

設定lambd=0,訓練誤差遠小於測試(泛化)誤差,這是典型的過擬合現象。

fit_and_plot(lambd=0)# output('w[:10]:', [[ 0.30343655 -0.08110731  0.64756584 -1.51627898  0.16536537  0.42101485   0.41159022  0.8322348  -0.66477555  3.56285167]]<NDArray 1x10 @cpu(0)>, 'b:', [ 0.12521751]<NDArray 1 @cpu(0)>)

使用正則化,過擬合現象得到一定程度上的緩解。然而依然沒有學出較準確的模型參數。這主要是因為訓練資料集的樣本數相對維度來說太小

fit_and_plot(lambd=5)# output('w[:10]:', [[ 0.01602661 -0.00279179  0.03075662 -0.07356022  0.01006496  0.02420521   0.02145572  0.04235912 -0.03388886  0.17112994]]<NDArray 1x10 @cpu(0)>, 'b:', [ 0.08771407]<NDArray 1 @cpu(0)>)

MXNET:權重衰減

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.