딥러닝 정규화에서 L1 규제란?

Study/Deep Learning|2023. 4. 4. 10:49
728x90
반응형

L1 규제는 손실 함수에 가중치 벡터의 L1 노름을 추가함으로써 모델의 가중치를 제한하고 일반화를 향상시키는 정규화 기법입니다. L1 노름은 가중치 벡터의 각 요소의 절대값의 합으로 정의됩니다.

 

가중치 벡터를 w라 하고, L1 규제 계수를 λ라고 할 때, L1 규제 손실 함수는 다음과 같이 정의됩니다.

 

L1(w) = λ * ||w||_1

 

여기서 ||w||_1wL1 노름을 나타내며, 다음과 같이 정의됩니다.

 

||w||_1 = Σ_i |w_i|

 

λ는 하이퍼파라미터로서, L1 규제의 정도를 조절합니다. λ가 크면 규제가 강해져 가중치가 더 많이 감소하고, λ가 작으면 규제가 약해져 가중치에 덜 영향을 미칩니다.

 

L1 규제가 적용된 최종 손실 함수는 기존 손실 함수인 L(w)L1 규제 손실 함수인 L1(w)를 합한 형태로 정의됩니다.

 

Total_Loss(w) = L(w) + L1(w)

 

L1 규제는 가중치 벡터의 일부 요소를 0으로 만들어 스파스한 모델을 만듭니다. 이 특징은 특성 선택(feature selection) 효과를 가져와서 불필요한 특성의 가중치를 0으로 만들어 모델의 복잡도를 줄이고 일반화 성능을 향상시킵니다. 이러한 이유로 L1 규제는 희소한 가중치 벡터를 생성하고자 할 때 유용하게 사용됩니다.

 

L1 규제는 가중치 벡터의 L1 노름(절대값의 합)을 손실 함수에 추가하는 것으로, 모델의 가중치를 제한하여 오버피팅을 줄이는 방법입니다. L1 규제는 몇몇 가중치를 0으로 만들어 스파스한 모델을 만듭니다. 이는 모델의 일반화를 향상시키며, 특성 선택(feature selection) 효과도 가집니다.

 

아래 코드는 L1 규제를 포함하는 손실 함수를 작성하는 예입니다.

 
# 손실 함수와 함께 사용되는 L1 규제를 계산하는 함수
def l1_regularizer(model, lambda_l1):
    l1_loss = 0.0
    for param in model.parameters():
        l1_loss += torch.sum(torch.abs(param))
    return lambda_l1 * l1_loss

# 하이퍼파라미터 설정
lambda_l1 = 0.001

# 모델 생성
model = MyModel(input_dim, hidden_dim, output_dim)

# 손실 함수 (예: 크로스 엔트로피)
criterion = nn.CrossEntropyLoss()

# 옵티마이저 생성
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# 학습 루프
for epoch in range(num_epochs):
    for data, target in dataloader:
        # 예측 및 손실 계산
        output = model(data)
        loss = criterion(output, target)

        # L1 규제 추가
        loss += l1_regularizer(model, lambda_l1)

        # 역전파 및 가중치 업데이트
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

위의 예제에서, l1_regularizer 함수는 모델의 모든 가중치에 대한 절대값의 합을 계산하여 L1 손실을 반환합니다. L1 손실은 기존의 손실 함수에 더해져 최종 손실을 구성하게 됩니다. 이렇게 손실 함수에 L1 규제를 추가함으로써 모델의 가중치를 제한하고 일반화를 향상 시킬 수 있습니다.

 
728x90
반응형

댓글()