희소성을 위한 정규화: L1 정규화

희소 벡터는 종종 많은 차원을 포함합니다. 특성 교차를 생성하면 더 많은 차원이 발생합니다. 이러한 고차원 특성 벡터가 주어지면 모델 크기가 커질 수 있으며 엄청난 양의 RAM이 필요할 수 있습니다.

가능한 경우 고차원 희소 벡터에서는 가중치가 정확히 0로 떨어지도록 유도하는 것이 좋습니다. 가중치가 정확히 0이면 모델에서 해당 특성을 삭제합니다. 특성을 제로 아웃하면 RAM이 절약되고 모델의 노이즈가 줄어들 수 있습니다.

예를 들어 캘리포니아뿐만 아니라 전 세계를 포괄하는 주택 데이터 세트를 생각해 보세요. 전 세계 위도를 분 단위 (1도당 60분)로 버케팅하면 약 10,000개의 차원이 희소 인코딩으로, 분 단위의 전 세계 경도는 약 20,000개의 차원이 됩니다. 이 두 특성의 특성 교차를 통해 약 200,000,000개의 차원이 생성됩니다. 이러한 200,000,000개의 차원 중 상당수가 제한된 거주 지역 (예: 바다 한가운데)을 나타내므로 해당 데이터를 효과적으로 일반화하는 데 사용하기가 어렵습니다. 이러한 불필요한 차원을 저장하는 데 RAM 비용을 지불하는 것은 어리석은 일입니다. 따라서 무의미한 차원의 가중치가 정확히 0이 되도록 하는 것이 좋습니다. 그러면 추론 시 이러한 모델 계수의 스토리지 비용을 지불하지 않아도 됩니다.

적절하게 선택한 정규화 항을 추가하여 이 아이디어를 학습 시 실행된 최적화 문제에 적용할 수 있습니다.

L2 정규화를 통해 이 작업을 달성할 수 있을까요? 아니요. L2 정규화는 가중치가 작아지도록 유도하지만 정확히 0.0이 되도록 강제하지는 않습니다.

모델에서 0이 아닌 계수 값의 개수에 페널티를 적용하는 정규화 항을 만들어 볼 수도 있습니다. 이 수를 늘리는 것은 모델의 데이터 적합성에 충분한 이득이 있는 경우에만 정당화됩니다. 안타깝게도 이러한 개수 기반 접근 방식은 직관적으로는 매력적이지만 볼록 최적화 문제를 볼록하지 않은 최적화 문제로 바꿀 수 있습니다. 따라서 L0 정규화로 알려진 이 아이디어는 실제로 효과적으로 사용할 수 없습니다.

하지만 L1 정규화라는 정규화 항이 있습니다. 이 정규화는 L0에 대한 근사치 역할을 하지만 볼록하기 때문에 계산하기에 효율적이라는 이점이 있습니다. 따라서 L1 정규화를 사용하여 모델에서 유용하지 않은 많은 계수를 정확히 0이 되도록 유도하여 추론 시 RAM을 절약할 수 있습니다.

L1 정규화와 L2 정규화 비교

L2와 L1은 서로 다른 방식으로 가중치에 페널티를 적용합니다.

  • L2가중치2에 페널티를 적용합니다.
  • L1은 |가중치|에 페널티를 적용합니다.

따라서 L2와 L1은 서로 다른 미분을 가집니다.

  • L2의 미분계수는 2 * 가중치입니다.
  • L1의 미분계수는 k (가중치와 무관한 값을 갖는 상수)입니다.

L2의 미분계수는 매번 가중치의 x% 를 제거하는 힘으로 생각하면 됩니다. 제노가 말했듯이, 어떤 숫자의 x%를 수십억 번 제거하더라도 그 숫자는 0이 되지 않습니다. (Zeno는 정확히 0을 생성할 수 있는 부동 소수점 정밀도 제한에 익숙하지 않았습니다.) 어쨌든, L2는 일반적으로 가중치를 0으로 유도하지 않습니다.

L1의 미분계수는 매번 가중치에서 일정 상수를 빼는 것으로 생각하면 됩니다. 하지만 절댓값으로 인해 L1은 0에서 불연속성을 가지며, 이로 인해 0을 가로지르는 빼기 결과가 0이 됩니다. 예를 들어 빼기 연산으로 인해 가중치가 +0.1에서 -0.2로 강제되는 경우 L1은 가중치를 정확히 0으로 설정합니다. 유레카, L1은 가중치를 0으로 만들었습니다.

모든 가중치의 절댓값에 페널티를 적용하는 L1 정규화는 다양한 모델에서 매우 효율적으로 활용할 수 있습니다.

이 설명은 1차원 모델에만 적용됩니다.

아래의 재생 버튼()을 클릭하여 L1 정규화와 L2 정규화가 가중치 네트워크에 미치는 영향을 비교해 보세요.