희소 벡터는 종종 많은 차원을 포함합니다. 특성 교차를 생성하면 더 많은 차원이 생성됩니다. 이러한 고차원 특성 벡터를 감안할 때 모델 크기는 커질 수 있고 엄청난 양의 RAM이 필요합니다.
고차원 희소 벡터에서는 가능하면 가중치가 정확히 0
으로 떨어지도록 유도하는 것이 좋습니다. 정확히 0인 가중치는 모델에서 해당 특성을 삭제합니다.
특성을 제거하면 RAM이 절약되고 모델의 노이즈가 줄어들 수 있습니다.
예를 들어 캘리포니아뿐만 아니라 전 세계를 아우르는 주택 데이터 세트를 생각해 보세요. 분 단위 (도당 60분)로 전역 위도를 버케팅하면 희소 인코딩에서 약 10,000개의 차원을, 분 단위의 글로벌 경도는 약 20,000개의 차원을 제공합니다. 이 두 특성의 특성 교차는 약 2억 개의 차원을 생성하게 됩니다. 이러한 2억 개의 차원 중 많은 부분이 제한된 거주 지역 (예: 바다 한가운데)을 나타내므로 이 데이터를 효과적으로 일반화하기는 어려울 것입니다. 이렇게 불필요한 크기를 저장하는 데 드는 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% 를 제거하는 힘으로 생각할 수 있습니다. Zeno가 알고 있듯이, 숫자 x00억의 x%를 제거하더라도 감소한 숫자는 결코 0이 되지 않습니다. (Zeno는 부동 소수점 정밀도 제한에 대해 잘 알지 못했으며, 이 경우 정확히 0이 생성될 수 있었습니다.) 어떤 경우든 L2는 일반적으로 가중치를 0으로 유도하지 않습니다.
L1의 미분계수는 매번 가중치에서 일정 상수를 빼는 힘으로 생각할 수 있습니다. 하지만 절댓값으로 인해 L1은 0에서 불연속성을 가지며, 이로 인해 0을 교차하는 빼기 결과가 0이 됩니다. 예를 들어, 빼기 값으로 가중치를 +0.1에서 -0.2로 강제했다면 L1은 가중치를 정확히 0으로 설정합니다. 유레카, L1이 가중치를 0으로 해결했습니다.
모든 가중치의 절댓값에 페널티를 적용하는 L1 정규화는 넓은 모델에서 매우 효율적입니다.
이 설명은 1차원 모델에만 적용됩니다.
아래 재생 버튼(play_arrow)을 클릭하면 L1 정규화와 L2 정규화가 가중치 네트워크에 미치는 영향을 비교할 수 있습니다.