PyTorch プログラムは L1 および L2 の通常の用語を実装します

正則化は、モデルの過剰適合を防ぐのに役立つ機械学習における重要な概念です。この記事では、2 つの一般的な正則化手法、L1 正則化項と L2 正則化項について詳しく説明します。次に、PyTorch プラットフォームに基づいて、上記の 2 つのテクノロジを独自のネットワーク モデルに追加し、正則化を独自に使用する方法を説明します。

1 背景の紹介

機械学習における私たちの目標は、損失関数を最小化するモデルを見つけることです。ただし、損失関数の最小化のみに焦点を当てると、トレーニング データでは良好なパフォーマンスを発揮する過度に複雑なモデルが完成する可能性がありますが、新しいデータではパフォーマンスが低下する可能性があります。これはオーバーフィッティングと呼ばれます。

過学習を防ぐために、損失関数に正則化項を追加できます。これにより、モデルの複雑さが減ります。L1 正則化項と L2 正則化項は、2 つの一般的な正則化項です。

2 式の導出

正則化公式の導出に関しては、インターネット上に多くの優れた専門家が鮮やかな紹介と解説を行っていますので、車輪の再発明を避けるために、次の内容を読む前にこのブログを参照してください。正則化 (正則化)

L1 と L2 のテクノロジーを一般的に理解したら、簡単な分類と確認を行ってみましょう。

L1 の場合、元の損失関数に追加します。

L 1 = λ ∑ ∣ wi ∣ L1 = \lambda\sum\left|w_i\right|L1 _=w私は

同様に、L2 は次のように結合します。

L 2 = λ ∑ wi 2 L2 = \lambda\sum w_i^2L2_ _=w2
其中, w w w はネットワーク モデルのパラメーターを表します。

3 プログラムの実現

3.1 正則化の実装

いわゆる正規項の追加とは、損失関数に別の項を追加することです。したがって、L1 と L2 によって生成される追加の損失値を計算する追加関数を定義できます。

# 定义L1正则化函数
def l1_regularizer(weight, lambda_l1):
    return lambda_l1 * torch.norm(weight, 1)

# 定义L2正则化函数
def l2_regularizer(weight, lambda_l2):
    return lambda_l2 * torch.norm(weight, 2)

L1 と L2 の計算方法は、上記のプログラムで定義されています。つまり、すべてのネットワーク パラメーターの重みに対して絶対値と二乗演算が実行されます。実際の使用では、関数が返した値を元の損失結果に加算するだけで、通常の動作が実現されます。

3.2 ネットワーク例

独自のネットワーク トレーニング モデルで正則化テクノロジーを使用する方法をより適切に示すために、まず、通常のアイテムを追加しないネットワーク トレーニング プログラムを提供します (便宜上、以下の通常のアイテムを追加するプログラムと比較します。このフレームワークに従って比較することもできます)自分でプログラムを作成し、変更する必要がある場所をすぐに見つけます):

import torch
import torch.nn as nn

#定义网络结构
class CNN(nn.Module):
    pass
    
# 实例化网络模型
model = CNN()  
# 定义损失函数
criterion = nn.MSELoss()
# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 迭代训练
for epoch in range(1000):
    #训练模型
    model.train()
    for i, data in enumerate(train_loader, 0):
        #1 解析数据并加载到GPU
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)
        #2 梯度清0
        optimizer.zero_grad()
        #3 前向传播
        outputs = model(inputs)
        #4 计算损失
        loss = criterion(outputs, labels)
        #5 反向传播和优化
        loss.backward()
        optimizer.step()

3.3 ネットワークに正則化アイテムを追加する

次のプログラムは、損失関数レベルからの正規項の追加を実現します。

import torch
import torch.nn as nn

#定义网络结构
class CNN(nn.Module):
    pass
    
# 实例化网络模型
model = CNN()  
# 定义损失函数
criterion = nn.MSELoss()
# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 迭代训练
for epoch in range(1000):
    #训练模型
    model.train()
    for i, data in enumerate(train_loader, 0):
        #1 解析数据并加载到GPU
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)
        #2 梯度清0
        optimizer.zero_grad()
        #3 前向传播
        outputs = model(inputs)
        #4 计算损失
        #4.1 定义L1和L2正则化参数
        lambda_l1 = 0.01
        lambda_l2 = 0.01
        
        #4.2 计算L1和L2正则化
        l1_regularization = l1_regularizer(model.weight, lambda_l1)
        l2_regularization = l2_regularizer(model.weight, lambda_l2)
        
        #4.3 向loss中加入L1和L2 
        loss = criterion(outputs, labels)
        loss += l1_regularization + l2_regularization
        
        #5 反向传播和优化
        loss.backward()
        optimizer.step()

プログラム内のl1_regularizer()sum関数は、セクション 3.1 で手動で実装した L1 および L2 計算関数l2_regularizer()です

注: この例では、L1 と L2 は損失関数とは独立して実装されています。しかし、実際の運用においては、L1とL2の計算処理を損失関数の中に入れる、つまり損失関数を書き換えるのが最も安全です。具体的な操作は、損失時に上記 2 つの計算関数を呼び出すことです。

3.4 PyTorch の通常の方法: 重みの減衰

この章の最初の 3 つのセクションでは、手動で規則的な計算を実装し、ニューラル ネットワークに埋め込む方法を紹介しましたが、基本的なネットワーク処理技術の 1 つとして、PyTorch には正則化テクノロジが付属しています。オプティマイザに統合されています。
上記のプログラムで使用されているオプティマイザーをtorch.optim.SGD例として、それを使用してネットワークを直接正規化する方法を紹介します。

 optimizer = torch.optim.SGD(model.parameters(), lr=lr, weight_decay=1e-4)

上記は SGD の一般的な定義であり、パラメータの意味は次のとおりです。

  1. model.parameters(): モデルのすべての学習可能なパラメータ
  2. lr:学習率
  3. Weight_decay: 重み減衰係数

このうち重み減衰係数weight_decayは定番の手法です具体的には、重み減衰は L 2 ノルム正則化 (正則化) と同等です具体的な導出と分析は、ブログでご覧いただけます:重み減衰の WEIGHT_DECAY
ニューラル ネットワークにおける Weight_decay 正則化

4 正規用語の使用上の注意

L1 および L2 定期期間を使用する場合は、次の点に注意する必要があります。

  1. 正則化パラメータλ λλの選択は非常に重要です。λ λの場合λが大きすぎる場合、モデルが単純すぎる可能性があり、アンダーフィッティングが発生する可能性があります。λ λの場合λが小さすぎる場合、正則化の効果が明確ではない可能性があります。

  2. L1 と L2 の両方の正則化項を同時に使用できます。これはElastic Netと呼ばれます。

  3. L1 正則化項は、一部のモデル パラメーターがゼロになるため、モデルが不安定になる可能性があります。データがわずかに変化すると、モデルのパラメータが大きく変化する可能性があります。

5 まとめ

全体として、正則化項の使用は、モデルの過学習を防ぐ効果的な手法です。これは、モデルの適合能力を確保しながら過適合を回避するのに役立ち、それによってモデルの汎化能力が向上します。同時に、正則化項目の使用は、特徴選択の実行、モデルの複雑さの軽減、モデルの解釈可能性の向上にも役立ちます。
ただし、正規化用語の使用にはいくつかの制限があります。たとえば、場合によっては、正則化項がモデルのパフォーマンスに一定の影響を与える可能性があります。また、正則化項の係数は適度に調整する必要があり、大きすぎたり小さすぎたりするとモデルの性能が低下する可能性があります。同時に、良好なネットワーク トレーニング結果はさまざまな要因の組み合わせによって決まり、通常の用語を使用する一方で、他の手法 (ドロップアウトなど) を無視することはできません。

おすすめ

転載: blog.csdn.net/qq_44949041/article/details/131538200