테크매니아
Distiller 모델 압축 기법 (2) : Regularization 본문
Indel Distiller의 모델 압축 기법 두 번째 Regularization 입니다.
GitHub Docs(https://intellabs.github.io/distiller/regularization.html)에 있는 원문을 번역하고 해석을 추가한 문서입니다.
Regularization
Deep Learning(Ian Goodfellow et al)에서 Regularization을 다음과 같이 정의했습니다.
일반화 오류를 줄이기 위한 학습 알고리즘에 대한 수정 사항이지만 훈련 오류는 아님
PyTorch의 옵티마이저는 L2 매개 변수 Regularization을 사용하여 모델의 용량을 제한합니다 (즉, 분산 감소).
일반적으로 다음과 같이 작성할 수 있습니다.
그리고 구체적으로
여기서 W는 네트워크의 모든 가중치 요소 모음(즉, model.parameters()), loss (W; x; y)는 총 학습 손실, lossD(W)는 데이터 손실(예 : 오류)입니다. 손실 함수라고 하는 목적 함수 또는 Distiller 샘플 이미지 분류기 압축 애플리케이션의 기준).
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9, weight_decay=0.0001)
criterion = nn.CrossEntropyLoss()
...
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()
λR은 regularization strength(정규화 강도)라고 하는 스칼라이며 데이터 오류와 Regularization 오류의 균형을 맞춥니다. PyTorch에서 이것은 weight_decay
인수입니다.
||W||22는 W의 L2 노름의 제곱이므로 가중치 텐서의 크기 또는 크기입니다.
L은 네트워크의 계층 수입니다. 표기법을 단순화하기 위해 사용 된 1-기반 번호 매기기에 대한 표기법(?)
L2-norm과 L2-norm제곱의 질적 차이는 딥러닝에 설명되어 있습니다
총 학습 손실 = 데이터 손실(오류) + 정규화 강도 * W L2 norm의 제곱
Sparsity and Regularization
Regularization일부 DNN Sparsity(희소성) 유도 방법간에 흥미로운 상호 작용이 있기 때문에 Regularization을 언급합니다.
DSD(Dense-Sparse-Dense)에서 Song Han et al. 모델의 정확도를 높이기 위해 pruning을 Regularization으로 사용하십시오.
Sparsity는 강력한 Regularization형식입니다.
우리의 직관은 일단 희소성 제약 조건을 고려할 때 네트워크가 로컬 최소값에 도달하면, 제약 조건을 완화하는 것이 네트워크가 안장점을 벗어나 더 높은 정확도의 로컬 최소값에 도달할 수 있는 더 많은 자유를 준다는 것이다.
Regularization을 사용하여 sparsity를 유도 할 수도 있습니다. 요소 별 sparsity를 유도하기 위해 L1-norm, ||W||1을 사용할 수 있습니다.
l2-norm Regularization은 큰 매개 변수를 축소하여 과적합을 줄이고 모델의 정확도를 향상 시키지만, 이러한 매개 변수를 절대 0으로 강제하지는 않습니다. L1-norm Regularization은 매개 변수 요소 중 일부를 0으로 설정하므로 모델을 더 단순하게 만들면서 모델의 용량을 제한합니다. 이를 feature selection(특징 선택)이라고 하며 pruning에 대한 또 다른 해석을 제공합니다.
Distiller의 Jupyter 노트북 중 하나는 L1-norm Regularization이 sparsity를 유도하는 방법과 L2-norm Regularization과 상호작용 하는 방법을 설명합니다.
weight_decay를 0으로 구성하고 L1-norm Regularization을 사용하면 다음과 같은 이점이 있습니다.
정규화 두 가지를 모두 사용할 경우 다음과 같습니다.
distiller.L1Regularizer
클래스는 L1-norm Regularization을 구현하고 Regularization을 예약 할 수도 있습니다.
<pre class="wp-block-syntaxhighlighter-code">l1_regularizer = distiller.s(model.parameters())
...
loss = criterion(output, target) + lambda * l1_regularizer()
Group Regularization
Group Regularization에서는 개별 요소 대신 매개 변수 요소의 전체 그룹에 페널티를 줍니다. 따라서, 전체 그룹은 sparsified(희소화) 되거나(즉, 모든 그룹 요소의 값이 0) 그렇지 않다. 그룹 구조는 미리 정의되어야 합니다.
데이터 손실과 요소별 regularization(있는 경우)에 그룹별 regularization 패널티를 추가할 수 있습니다. 우리는 계층에서 모든 매개 변수 그룹을 Wl(G)로 나타내고 모든 계층에 대해 모든 그룹의 패널티를 추가합니다. 다소 지저분하지만 지나치게 복잡하지는 않습니다.