모델 경량화 2 : 주 기법들(Pruning, KD, Quantization)
이제 본격적으로 모델 경량화 기법들을 알아보자.
1. Pruning (가지치기)
학습된 모델에서 중요하지 않다고 판단된 뉴런이나 연결(시냅스라고도 한다.)을 제거해서 모델의 크기와 계산 비용을 줄이는 방법이다.
- Structured Pruning : 뉴런, 채널, 혹은 레이저 전체를 제거하는 방식
- Unstructured Pruning : 개별적인 연결 하나를 끊는 방식
2. Knowledge Distillation (지식 증류)
고성능을 보이는 교사 모델이 있고, 상대적으로 성능이 떨어지는 학생 모델이 있다.
교사 모델이 출력하는 예시 답안을 학생 모델이 물려받아서, 학습함으로써 성적을 향상시키는 기법이라고 보면 된다.
이는 성능 저하를 최소화하면서 모델을 압축할 수 있는 또 다른 방법이다.
(1) 두 모델의 차이
- 교사 모델 : 좀 더 크고 우리가 원하는 태스크에서 고성능을 보인다.
- 학생 모델 : 상대적으로 작고 가벼운 모델이며, 교사 모델에 비해 성능이 떨어진다.
설명이 불가능하고 내부가 어떻게 동작하는지를 알 수 없는 경우를 블랙 박스 모델이라고 하며,
우리가 쓰는 교사 모델이 블랙 박스인지 화이트 박스인지에 따라서 세부적인 지식 증류 기법을 분류할 수 있다.
(2) 세부 기법
White - box KD
메타에서 공개하고 있는 LLaMA와 같은 오픈소스 언어 모델의 경우
이 경우 얻을 수 있는 정보가 블랙 박스 모델보다 많아서 적용할 수 있는 기법들이 훨씬 많다.
Black - box KD (우리가 뉴럴 네트워크라고 하는 것들)
챗 GPT와 같이 비공개 모델을 교사 모델로 사용하는 경우
(3) 활용
우리가 어떤 입력값을 주었을 때, 이것에 대한 로짓 값, 혹은 로짓값을 소프트맥스라는 함수에 넣게 되면 확률분포로도 뽑을 수 있다. 이 값을 활용할 수도 있다. 혹은 이 과정들을 통해서 나온 실질적인 최종값을 쓸 수도 있다.
우리가 지식을 증류한다고 했었는데, 이 지식으로 어떤 것들을 쓸 것이냐에 따라 세부적으로 구분할 수 있다.
Feature - based KD
모델 안에 있는 내부적인 Feature, 혹은 임베딩, 레프리젠테이션이라고 부르는 것들을 우리가 지식으로 증류를 받아서 학생들에게 가르치는 경우.
Logit - based KD
Logit값, 혹은 확률분포 값을 배우는 경우
Limitation Learning
실질적인 출력값을 배우는 경우
이는 보통 언어 모델에서 지칭한다.
지식들이 갖고 있는 특징들은 서로 다르다.
ex
자연어로 된 출력값들을 지식으로 사용한다면?
인간이 해석할 수 있는 가능성이 높다는 장점이 있다.
반면, Feature나 Logit 의 경우 그렇지 않을 것이다.
3. Quantization (양자화)
우리가 아는 숫자 혹은 정보를 컴퓨터에 저장할 때는 0과 1이라는 두 숫자만 활용한다.
이 모델의 가중치들이 바이너리 형태로 저장되어 있을텐데, 이들을 보통 자료형이라고 지칭하고, 이 자료형을 간소화하는 과정을 양자화라고 한다.
정리하자면, 낮은 비트 정밀도로 변환하여 효율을 높이는 것이다. (ex 32비트 부동 소수점을 8비트 정수로 변환)
구체적인 예시
float num = 1234.5678 -> int num =1234
위와 같이 32비트로 저장된 값을 8비트로 저장하게 되면서 정밀도는 낮아지지만 75%에 해당하는 저장공간을 확보를 할 수 있게 되는거다.