모델 가지치기는 대형 모델에 뺄셈을 하는 방법입니다. 가중치 중에서 0에 가깝고 결과에 거의 영향을 주지 않는 연결을 찾아 삭제하거나 0으로 만들어, 모델을 더 작고 빠르게 하면서 능력 저하는 조금으로 억제하는 것입니다. 양자화, 증류와 함께 모델 압축으로 묶이지만 손대는 위치가 완전히 다르므로, 여기서는 가지치기 자체부터 정리합니다.
잘라내는 것은 무엇인가
신경망의 부피를 차지하는 것은 뉴런 사이 연결의 강도를 나타내는 가중치입니다. 학습이 끝난 뒤 가중치 분포는 고르지 않습니다. 소수의 연결이 판단의 대부분을 담당하고, 긴 꼬리는 0에 가까워 거의 배경 소음 수준입니다. 가지치기는 연결을 중요도 순으로 줄 세워 그 꼬리를 제거합니다.
방식은 두 가지입니다. 비구조적 가지치기는 가중치를 하나씩 0으로 만들어 파일 안에 0을 잔뜩 남깁니다. 이론상 공간은 절약되지만 일반 하드웨어는 0을 계산한다고 빨라지지 않아, 전용 희소 연산 지원이 없으면 속도는 그대로입니다. 구조적 가지치기는 채널, 어텐션 헤드, 심지어 층 단위로 통째로 삭제해 모양이 규칙적인 모델이 남으므로, 일반 GPU와 휴대폰 칩에서 바로 빨라집니다. 실무에서 후자가 훨씬 많이 쓰이는 이유가 여기에 있습니다.
연결을 꽤 잘라내도 동작하는 이유
핵심은 과잉 매개변수화입니다. 학습이 잘 되도록 모델에는 보통 과제 수행에 실제로 필요한 것보다 훨씬 많은 매개변수가 주어집니다. 많은 연결은 처음부터 잉여라 서로 상쇄되거나 극소수의 샘플에서만 활성화됩니다. 이를 제거하는 것은 내력벽이 아니라 비계를 걷어내는 일에 가깝습니다.
다만 한 번에 잘라내고 끝나는 일은 아닙니다. 무작정 삭제하면 성능이 눈에 띄게 떨어지므로, 표준 절차는 조금 자르고 데이터로 미세 조정해 회복하고 다시 자르는 반복입니다. 복권 가설이 말하는 것도 비슷한 현상으로, 큰 네트워크 안에는 단독으로 학습해도 근접한 성능을 내는 훨씬 작은 부분 네트워크가 숨어 있다는 것입니다. 자를 수 있는 한도는 잉여가 얼마나 있느냐에 달려 있어, 이미 빡빡하게 학습된 모델은 여유가 거의 없습니다.
양자화, 증류와의 차이
| 방법 | 바꾸는 것 | 모델 구조 | 대표적인 이득 |
|---|---|---|---|
| 가지치기 | 연결이나 채널 통째로 삭제 | 더 작고 희소해짐 | 매개변수 감소, 구조적 방식은 바로 속도 향상 |
| 양자화 | 각 수치의 정밀도를 16비트에서 8비트, 4비트로 | 그대로 | 메모리 사용량이 크게 감소 |
| 증류 | 작은 모델이 큰 모델의 출력을 흉내 내며 학습 | 새 모델 | 독립적인 작은 모델 확보 |
세 가지는 겹쳐 쓰는 경우가 많습니다. 먼저 가지치기로 줄이고, 양자화로 정밀도를 낮춘 뒤, 증류나 미세 조정으로 품질을 되찾습니다. 오픈 모델이 가지치기 버전을 내세운다면 구조를 잘랐는지, 그냥 0으로만 만들었는지 확인하세요. 전자는 실제로 빨라지고, 후자는 대개 파일만 작아 보일 뿐입니다.
흔한 오해 세 가지
첫째, 가지치기는 데이터를 지우는 일이 아닙니다. 모델 내부 매개변수를 다루며 학습 데이터와는 무관합니다. 둘째, 많이 자를수록 좋은 것이 아닙니다. 잉여의 경계를 넘으면 품질이 절벽처럼 떨어지고, 먼저 사라지는 것은 흔한 시험으로는 잡히지 않는 틈새 지식과 롱테일 능력입니다. 셋째, 가지치기로 아낀 메모리로 더 큰 모델을 학습할 수 있는 것은 아닙니다. 주로 추론 배포를 위한 것이고, 학습 메모리의 주범은 옵티마이저 상태와 활성화 값이라 가지치기가 도울 수 없습니다.
가지치기를 할지 고민된다면 두 가지를 먼저 물어보세요. 배포 기기의 연산과 메모리가 정말 부족한가, 회복 미세 조정에 쓸 데이터가 있는가. 둘 다 그렇다면 진행하고, 파일 크기를 보기 좋게 만들고 싶을 뿐이라면 품질 하락 위험을 감수할 가치가 없습니다.