"Édition pratique de Deep Learning Pytorch" 4.5 Dégradation du poids

4.5.1 Norme et perte de poids

Pour toute la section théorique, voir le livre pour plus de détails.

4.5.2 Régression linéaire de grande dimension

%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l
# 生成一些数据,为了使过拟合效果更明显,将维数增加到 200 并使用一个只包含 20 个样本的小训练集。
n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05  # 设置真实参数
train_data = d2l.synthetic_data(true_w, true_b, n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)

4.5.3 Implémentation à partir de zéro

  1. Initialiser les paramètres du modèle
def init_params():
    w = torch.normal(0, 1, size=(num_inputs, 1), requires_grad=True)
    b = torch.zeros(1, requires_grad=True)
    return [w, b]
  1. Définir L 2 L_2L2pénalité de norme
def l2_penalty(w):
    return torch.sum(w.pow(2)) / 2
  1. Définir la mise en œuvre du code de formation

    La fonction de perte est importée directement via le package d2l et la perte inclut le terme de pénalité.

def train(lambd):
    w, b = init_params()
    net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss
    num_epochs, lr = 100, 0.003
    animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',
                            xlim=[5, num_epochs], legend=['train', 'test'])
    for epoch in range(num_epochs):
        for X, y in train_iter:
            # 增加了L2范数惩罚项,
            # 广播机制使l2_penalty(w)成为一个长度为batch_size的向量
            l = loss(net(X), y) + lambd * l2_penalty(w)
            l.sum().backward()
            d2l.sgd([w, b], lr, batch_size)
        if (epoch + 1) % 5 == 0:
            animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),
                                     d2l.evaluate_loss(net, test_iter, loss)))
    print('w的L2范数是:', torch.norm(w).item())
  1. Ignorer la régularisation et s'entraîner directement
train(lambd=0)
w的L2范数是: 14.042692184448242

Insérer la description de l'image ici

  1. Utiliser la perte de poids
train(lambd=3)
w的L2范数是: 0.35160931944847107

Insérer la description de l'image ici

4.5.4 Mise en œuvre simple

def train_concise(wd):
    net = nn.Sequential(nn.Linear(num_inputs, 1))
    for param in net.parameters():
        param.data.normal_()
    loss = nn.MSELoss(reduction='none')
    num_epochs, lr = 100, 0.003
    trainer = torch.optim.SGD([
        {
    
    "params":net[0].weight,'weight_decay': wd},  # PyTorch默认同时衰减权重和偏置,此处使用 weight_decay指定仅权重衰减
        {
    
    "params":net[0].bias}], lr=lr)
    animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',
                            xlim=[5, num_epochs], legend=['train', 'test'])
    for epoch in range(num_epochs):
        for X, y in train_iter:
            trainer.zero_grad()
            l = loss(net(X), y)
            l.mean().backward()
            trainer.step()
        if (epoch + 1) % 5 == 0:
            animator.add(epoch + 1,
                         (d2l.evaluate_loss(net, train_iter, loss),
                          d2l.evaluate_loss(net, test_iter, loss)))
    print('w的L2范数:', net[0].weight.norm().item())
train_concise(0)
w的L2范数: 12.836501121520996

Insérer la description de l'image ici

train_concise(3)
w的L2范数: 0.3978956639766693

Insérer la description de l'image ici

pratique

(1) Utilisez λ \lambda dans le problème d'estimation de cette sectionExpérimentez avec la valeur de λ . Tracer la précision de la formation et la précision des tests par rapport àλ \lambdaQue peut-on observer sur le graphique d'une fonction de λ ?

Avec λ \lambdaL’augmentation de λ peut améliorer le phénomène de surapprentissage, maisλ \lambdaUn λ trop grand

for i in (0, 2, 8, 32, 128, 256):
    train_concise(i)
w的L2范数: 0.008308843709528446

Insérer la description de l'image ici

Insérer la description de l'image ici

Insérer la description de l'image ici

Insérer la description de l'image ici

Insérer la description de l'image ici

Insérer la description de l'image ici


(2) Utilisez l'ensemble de vérification pour trouver la valeur optimale λ \lambdaλ . Est-ce vraiment la valeur optimale ?

On ne peut pas dire qu'elle soit optimale. Après tout, la distribution de l'ensemble de validation est légèrement différente de celle de l'ensemble d'apprentissage. On peut seulement dire qu'elle est relativement proche de la valeur optimale.


(3) Si on utilise ∑ i ∣ wi ∣ \sum_i|w_i|jewje∣Comme pénalité, nous choisissons (L 1 L_1L1régularisation), à quoi ressemblerait la formule mise à jour ?

Si vous utilisez L 1 L_1L1La régularisation minimise la somme de la perte de prédiction et du terme de pénalité comme :

LR ( w , b ) = 1 n ∑ i = 1 n 1 2 ( w T x ( i ) + b − y ( i ) ) 2 + λ ∑ i = 1 n ∣ wi ∣ LR(\boldsymbol{w}, b)=\frac{1}{n}\sum_{i=1}^n\frac{1}{2}(\boldsymbol{w}^T\boldsymbol{x}^{(i)}+by^ {(i)})^2+\lambda\sum^n_{i=1}|w_i|L R ( w ,b )=n1je = 1n21( wT x( je )+boui( je ) )2+jeje = 1nwje

L 1 L_1 L1La norme a un problème de dérivation : ici, on stipule que le point non différentiable x = 0 x=0X=La dérivée de 0 est 0, alors :

w ← w − η ∂ LR ( w , b ) ∂ w = w − η ∣ B ∣ ∑ je ∈ B x ( je ) ( w T x ( je ) + b − y ( je ) ) − λ η signe ( w ) \boldsymbol{w}\gets\boldsymbol{w}-\eta\ \frac{\partial LR(\boldsymbol{w},b)}{\partial\boldsymbol{w}}=\boldsymbol{w}-\ frac{\eta}{|B|}\sum_{i\in B}\boldsymbol{x}^{(i)}(\boldsymbol{w}^T\boldsymbol{x}^{(i)}+by ^{(i)})-\lambda\ \eta\ \text{sign}(\boldsymbol{w})wwle ∂w _L R ( w ,b )=wB hje ∈B _X( je ) (wT x( je )+boui( je ) )signe λ η ( w )  


(4) Nous savons que ∣ ∣ w ∣ ∣ 2 = w T w ||\boldsymbol{w}||^2=\boldsymbol{w}^T\boldsymbol{w}∣∣ w2=wTw._ __ Pouvez-vous trouver une équation matricielle similaire ? (Voir la norme Frobenius dans la section 2.3.10)

La norme de Frobenius est la racine carrée de la somme des carrés des éléments de la matrice :

∣ ∣ X ∣ ∣ F = ∑ i = 1 m ∑ j = 1 nxij 2 ||\boldsymbol{X}||_F=\sqrt{\sum^m_{i=1}\sum^n_{j=1} x^2_{ij}}∣∣ XF=je = 1mj = 1nXje2

Semblable au carré de la norme L2, le carré de la norme de Frobenius :

∣ ∣ X ∣ ∣ F 2 = XTX ||\boldsymbol{X}||_F^2=\boldsymbol{X}^T\boldsymbol{X}∣∣ XF2=XTX _


(5) Examinez la relation entre l’erreur de formation et l’erreur de généralisation. En plus de la perte de poids, de l'augmentation des données d'entraînement et de l'utilisation de modèles de complexité appropriée, existe-t-il d'autres moyens de gérer le surapprentissage ?

Méthode de retrait temporaire d'abandon, combinaisons de modèles multiples, etc.


(6) Dans les statistiques bayésiennes, nous utilisons le produit du prior et de la vraisemblance, à travers la formule P ( w ∣ x ) ∝ P ( x ∣ w ) P ( w ) P(w|x)\propto P(x |w) P(w)P ( w X )P ( x w ) P ( w ) obtient le postérieur. Comment obtenir leP ( w ) P(w)P ( w )

Voir ci-dessous la vidéo " Explication bayésienne de la " régularisation L1 et L2 " par Wang Mumu , qui est essentiellement l'estimation maximale a posteriori. Comment comprendre en profondeur la formule de Bayes ?

En utilisant l’estimation maximale a posteriori, soit :

w = arg ⁡ max ⁡ w P ( w ∣ x ) = arg ⁡ max ⁡ w P ( x ∣ w ) P ( x ) ⋅ P ( w ) = arg ⁡ max ⁡ w P ( x ∣ w ) ⋅ P ( w ) = arg ⁡ max ⁡ w log ⁡ ( P ( x ∣ w ) ⋅ P ( w ) ) = arg ⁡ max ⁡ w ( log ⁡ P ( x ∣ w ) + log ⁡ P ( w ) ) \begin{align} w&=\mathop{\arg\max}\limits_{w}P(w|x)\\ &=\mathop{\arg\max}\limits_{w}\frac{P(x|w)}{P (x)}\cdot P(w)\\ &=\mathop{\arg\max}\limits_{w}P(x|w)\cdot P(w)\\ &=\mathop{\arg\max }\limits_{w}\log(P(x|w)\cdot P(w))\\ &=\mathop{\arg\max}\limits_{w}(\log P(x|w)+\ log P(w))\\ \end{align}w=war gmaximumP ( w X )=war gmaximumP ( x )P ( x w )P ( w )=war gmaximumP ( X w )P ( w )=war gmaximumjournal g ( P ( x w )P ( w ))=war gmaximum( logo _P ( X w )+salut gP ( w ) )

dans:

  • ( 2 ) ⇒ ( 3 ) (2)\Flèche droite(3)( 2 )( 3 ) est dû au dénominateurP (x) P(x)P ( x ) est identique àwww est une constante non pertinente, elle peut donc être ignorée.
  • ( 3 ) ⇒ ( 4 ) (3)\Flèche droite(4)( 3 )( 4 ) est dû à l'ajout habituel delog ⁡ \logopération de journalisation .

P ( w ) P(w)P ( w ) peut être choisi comme probabilité a priori

  • Si nous prenons la distribution gaussienne w ∼ N ( 0 , σ 2 ) w\sim\mathrm{N}(0,\sigma^2)wN ( 0 ,p2 ), alorsL 2 L_2L2Régularisation :

log ⁡ P ( w ) = log ⁡ ∏ i 1 σ 2 π e − ( wi − 0 ) 2 2 σ 2 = − 1 2 σ 2 ∑ iwi 2 + C \begin{align} \log P(w)&= \log\prod_i\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(w_i-0)^2}{2\sigma^2}}\\ &=-\frac {1}{2\sigma^2}\sum_iw_i^2+C \end{align}salut gP ( w )=salut gjep14h _ 1e14 heures2( wje0 )2=14 heures21jewje2+C

  • Si l'on prend la distribution de Laplace w ∼ L aplace ( 0 , b ) w\sim\mathrm{Laplace}(0,b)wLaplace ( 0 ,b ) , alorsL 1 L_1L1Régularisation :

log ⁡ P ( w ) = log ⁡ ∏ i 1 2 be − ∣ wi − 0 ∣ b = − 1 b ∑ i ∣ wi ∣ + C \begin{align} \log P(w)&=\log\prod_i\ frac{1}{2b}e^{-\frac{|w_i-0|}{b}}\\ &=-\frac{1}{b}\sum_i|w_i|+C \end{align}salut gP ( w )=salut gje2 b1ebwje 0∣=b1jewje+C

Comme c’est incroyable !

Guess you like

Origin blog.csdn.net/qq_43941037/article/details/132799328