Can LLMs learn from a single example?

단 하나의 예제로도 언어모델은 배울 수 있나요?

https://www.fast.ai/posts/2023-09-04-learning-jumps/


We’ve noticed an unusual training pattern in fine-tuning LLMs. 

저희는 LLM을 미세 조정하는 과정에서 특이한 학습 패턴을 발견했습니다. 

At first we thought it’s a bug, but now we think it shows LLMs can learn effectively from a single example.

처음에는 버그라고 생각했지만, 지금은 LLM이 단일 예제로도 효과적으로 학습할 수 있음을 보여주는 것이라고 생각합니다.


저자 AUTHOR

제레미 하워드 Jeremy Howard & 조나단 휘태커 Jonathan Whitaker

2023년 9월 4일 게시



요약: 최근 객관식 과학 시험 문제에 대한 대규모 언어 모델(LLM)을 미세 조정하는 과정에서 매우 특이한 학습 손실 곡선을 관찰했습니다. 모델이 데이터 세트의 예시를 한 번만 보고도 빠르게 암기할 수 있는 것으로 나타났거든요. 이 놀라운 성과는 신경망 샘플 효율성에 대한 기존의 통념을 뒤집는 것입니다. 이에 흥미를 느낀 저희는 이 현상을 검증하고 더 잘 이해하기 위해 일련의 실험을 진행했습니다. 아직 초기 단계이지만, 이 실험은 '모델이 입력을 신속하게 기억할 수 있다'는 가설을 뒷받침합니다. 이는 우리가 LLM을 훈련하고 사용하는 방법을 다시 생각해야 한다는 것을 의미할 수 있습니다.




신경망이 학습하는 방법

How neural networks learn


입력과 출력의 예를 보여줌으로써 신경망 분류기를 훈련시키면, 신경망은 입력에 따라 출력을 예측하는 방법을 학습하게 됩니다. 예를 들어, 개와 고양이의 사진과 각 품종의 예시를 보여주면 신경망은 이미지에서 품종을 추측하는 방법을 학습합니다. 좀 더 정확하게 말하면, 가능한 품종 목록에 대해 각 품종의 확률에 대한 추측을 출력합니다. 확실하지 않은 경우 각 품종에 대해 거의 동일한 확률을 추측하고, 확신이 높으면 예측된 품종에 대해 거의 1.0의 확률을 추측합니다.


훈련 세트의 모든 이미지를 올바른 레이블과 함께 신경망에 제시하는 것이 훈련 과정입니다. 모든 입력 데이터를 한차례 거치는 과정을 '에포크'라고 합니다. 모델이 효과적으로 학습하기 위해서는 많은 훈련 데이터가 필요합니다.


학습하는 동안 신경망은 손실(거칠게 표현하자면 모델이 얼마나 자주 틀렸는지를 측정하는 척도)을 줄이려고 시도하며, 모델이 정답이라고 확신했는데 잘못된 예측이었을 경우 가장 큰 불이익을 주는 식입니다. 그 반대의 경우도 마찬가지고요. 훈련 세트(training set)에 대한 각 배치 후에 손실을 계산하고, 때때로 (주로 각 에포크가 끝날 때마다) 모델이 학습하지 못한 입력에 대한 손실도 계산하는데, 이를 '검증 세트(validation set)'라고 합니다. 다음은 11개의 에포크에 대해 학습했을 때의 실제 모습입니다:


<반려동물 품종에 대한 훈련 손실 차트>



보다시피, 훈련 손실은 비교적 빠르게, 점진적으로(그리고 울퉁불퉁하게) 개선되다가 시간이 지남에 따라 느려지고, 검증 손실은 더 느리게 개선되며, 더 오래 훈련하면 결국 완전히 평평해지다가 결국 더 나빠집니다.


모델이 특정 이미지의 모양을 학습하기까지 많은 시간이 걸리기 때문에 차트에서 에포크가 시작되고 중지되는 시점을 확인할 수 없습니다. 이것은 신경망이 개발된 수십 년 동안 신경망의 근본적인 제약 조건이었습니다. 신경망은 무언가를 학습하는 데 엄청나게 오랜 시간이 걸립니다! 신경망이 왜 이렇게 "샘플 비효율적"인지에 대해서는 (특히 아이들의 학습 방식과 비교하여) 활발히 연구되고 있는 분야이기도 합니다.




매우 이상한 손실 곡선

A very odd loss curve


최근 저희는 "참가자들이 대규모 언어 모델에 의해 작성된 어려운 과학 기반 질문에 답하도록 도전하는" Kaggle LLM 과학 시험 대회를 진행하고 있습니다. 예를 들어, 첫 번째 문제는 다음과 같습니다:


샘플 Kaggle 문제


다음 중 은하단에서 관측된 "누락된 바리오닉 질량" 불일치에 대한 수정 뉴턴 역학(MOND)의 영향을 정확하게 설명하는 것은?


A. MOND는 "퍼지 암흑 물질"이라는 새로운 형태의 물질이 존재한다고 가정하여 은하단에서 관측된 바이론 질량 누락을 감소시키는 이론입니다.

B. MOND는 은하단에서 관측된 누락된 바이리오닉 질량과 측정된 속도 분산 사이의 불일치를 약 10배에서 약 20배로 증가시키는 이론입니다.

C. MOND는 암흑 물질로 여겨지던 은하단에서 사라진 중성자 질량이 중성미자와 축의 형태로 존재한다는 것을 증명함으로써 은하단에서 사라진 바이리오닉 질량을 설명하는 이론입니다.

D. MOND는 은하단에서 관측된 누락된 바이리오닉 질량과 측정된 속도 분산 사이의 불일치를 약 10배에서 약 2배로 줄이는 이론입니다.

E. MOND는 암흑 물질의 존재를 필요로 하지 않는 중력에 대한 새로운 수학적 공식을 적용하여 은하단에서 관측된 바리오닉 질량 누락을 제거하는 이론입니다.



집에서 문제풀이하는 분들을 위해 말씀드리자면 정답은 (당연히) D입니다.


다행히도 이러한 질문에 답하기 위해 수정 뉴턴 역학에 대한 지식에 의존할 필요는 없습니다. 대신 이러한 질문에 답할 수 있도록 모델을 훈련시켜야 합니다. Kaggle에 모델을 제출하면 우리가 볼 수 없는 수천 개의 "미공개(held out)" 질문에 대해 테스트를 거치게 됩니다.


친구인 Radek Osmulski가 만든 "big dataset of questions" 데이터 세트에 대해 3 에포크에 걸쳐 모델을 훈련한 결과 다음과 같은 예상치 못한 훈련 손실 곡선을 발견했습니다:


<Kaggle comp에 대한 3번의 에포크 트레이닝의 손실 차트>



여기서 문제는 각 에포크의 끝을 명확하게 볼 수 있다는 것입니다. 손실이 급격하게 하락하는 게 보이니까요. 이전에도 비슷한 손실 곡선을 본 적이 있으며, 항상 버그로 인한 것이었습니다. 예를 들어, 검증 세트로 모델을 평가할 때 실수로 검증 세트까지 계속 학습하도록 하는 바람에 모델이 갑자기 훨씬 더 개선된 것처럼 보이는 경우가 있습니다. 그래서 우리는 훈련 프로세스에서 버그를 찾기 시작했습니다. 우리는 Hugging Face의 트레이너(Trainer)를 사용하고 있었기 때문에 거기에 버그가 있을 것이라고 추측했습니다.


코드를 살펴보는 동안 Alignment Lab AI Discord의 동료 오픈소스 개발자들에게도 비슷한 이상한 훈련 곡선을 본 적이 있는지 물었고, 거의 모든 사람들이 "그렇다"고 답했습니다. 하지만 응답한 모든 사람이 HF Trainer를 사용하고 있었기 때문에 해당 라이브러리에 버그가 있다는 이론을 뒷받침하는 것 같았습니다.


그러던 중 Discord의 @anton이 자신만의 간단한 커스텀 트레이닝 루프에서 이러한 곡선을 발견했다고 알려왔습니다:


<Anton의 커스텀 루프 트레이닝 손실 차트>


... 그리고 그는 매우 놀라운 유효성 검사 손실 곡선도 함께 보여주었습니다:


<Anton의 맞춤형 루프 검증 손실 차트>



그 후 점점 더 많은 Discord 친구들로부터 허깅페이스의 트레이너를 사용하지 않을 때에도 비슷한 이상한 동작이 발생한다는 이야기를 듣기 시작했습니다. 저희는 이것이 우리가 사용하던 LoRA 접근 방식만의 이상한 현상인지 궁금했지만, 풀 파인튜닝을 할 때도 같은 패턴이 나타난다는 이야기를 들었습니다. 사실, LLM 파인튜닝 커뮤니티에서는 이런 종류의 작업을 할 때 이런 일이 발생한다는 것은 기본 상식이었습니다....



더 깊이 파고들기

Digging deeper


오픈 소스 동료들로부터 계속 들었던 가설은 이러한 훈련 곡선이 사실은 과적합(overfitting)의 결과라는 것이었습니다. 처음에는 불가능해 보였습니다. 모델이 한두 개의 예시만으로 입력을 인식하는 방법을 학습하고 있다는 것을 의미하기 때문입니다. 첫 번째 곡선을 다시 살펴보면 첫 번째 에포크 이후 손실이 0.8에서 0.5로, 두 번째 에포크 이후 손실이 0.5에서 0.2 이하로 급감하는 것을 볼 수 있습니다. 게다가 두 번째와 세 번째 에포크가 진행되는 '동안(during)'에는 새로운 학습이 전혀 이루어지지 않았습니다. 


따라서 (이 이론에 따르면) 첫 번째 에포크가 시작될 때의 초기 학습을 제외하고는 거의 모든 명백한(apparent, 뚜렷하게 외부에서 관측 가능한?) 학습은 행당 3개의 예제만 있는 훈련 세트의 암기에서 발생한 것이었습니다! 더구나, 각 질문마다 모델은 매우 적은 양의 정보만을 받습니다. 이 정보는 모델의 답안이 실제 정답과 비교해 어떤지에 대한 것입니다.


So, other than its initial learning during the beginning of the first epoch, nearly all the apparent learning was (according to this theory) memorization of the training set occurring with only 3 examples per row! Furthermore, for each question, it only gets a tiny amount of signal: how its guess as to the answer compared to the true label.



우리는 실험을 해 보았습니다. 다음 학습률 스케줄(Learning rate schedule)을 사용하여 2에포크에 걸쳐 Kaggle 모델을 훈련시켰죠:


<Learning rate schedule>


요즘에는 이런 종류의 스케줄이 흔하지 않지만, 2015년 논문 '신경망 학습을 위한 주기적 학습률'에서 Leslie Smith가 만든 후 많은 성공을 거두었던 접근 방식입니다.


그 결과로 다음과 같은 황당하고 놀라운 훈련 및 검증 손실 곡선을 얻었습니다:


<2에포크 Cyclical Learning Rates 실험 결과>



이 그림을 완벽하게 설명할 수 있는 (현재까지의) 유일한 결론은 다음 가설이 맞다는 것입니다. "모델이 예시를 한 번만 보고도 빠르게 인식하는 방법을 학습하고 있다"는 가설이죠. 


손실 곡선의 각 부분을 차례로 살펴봅시다.


첫 번째 에포크를 보면 매우 일반적인 손실 곡선처럼 보입니다. 학습률은 에포크의 첫 10% 동안 워밍업한 다음 코사인(cosine) 스케줄에 따라 점차 감소합니다. 학습률(LR)이 적정 온도(temperature)에 도달하면 훈련 및 검증 손실이 급격히 감소한 다음, LR이 감소하고 '빠른 승리(quick wins)'가 포착되면서 둘 다 느려집니다.


두 번째 에포크가 흥미로워지는 부분입니다. 에포크가 시작될 때 데이터셋을 다시 섞지 않기 때문에, 두 번째 에포크의 첫 번째 배치는 학습률이 아직 워밍업 중일 때입니다. 그것이 (가장 처음에 보여준 손실 곡선에서 2번 에포크에서 3번 에포크로 이행시에 보였던) 즉각적인 단계적 변화가 여기서는 보이지 않는 이유입니다. 이러한 배치들은 LR이 낮아서 학습을 많이 하지 못했을 때만 볼 수 있는 것이죠.


The second epoch is where it gets interested. We’re not re-shuffling the dataset at the start of the epoch, so those first batches of the second epoch are when the learning rate was still warming up. That’s why we don’t see an immediate step-change like we did from epoch 2 to 3 in the very first loss curve we showed – these batches were only seen when the LR was low, so it couldn’t learn much.


이 에포크의 첫 10%가 끝날 무렵에는 훈련 손실(training loss)이 급감하는데, 이는 첫 번째 에포크에서 이러한 배치를 볼 때 LR이 높았으며 모델이 이러한 배치가 어떻게 생겼는지 학습했기 때문입니다. 모델은 여기서 자신이 확신을 갖고 정답을 추측할 수 있음을 빠르게 학습한 겁니다.


Towards the end of that first 10% of the epoch, the training loss plummets, because the LR was high when these batches were seen during the first epoch, and the model has learned what they look like. The model quickly learns that it can very confidentally guess the correct answer.


하지만 이 시기에는 검증 손실(validation loss)이 악화됩니다. 모델이 확신을 갖게 되었다고 해서 실제로 예측을 더 잘하는 것은 아니기 때문입니다. 단순히 데이터셋을 암기했을 뿐이지 일반화 능력(generalizing)은 향상되지 않습니다. 손실 함수(loss function)는 정답이라고 확신했는데 그 예측이 틀렸을 경우에 더 큰 불이익을 주기 때문에, 과신에 찬(Over-confident) 예측은 검증 손실 악화의 원인이 됩니다.


곡선의 끝 부분은 특별히 더 흥미로운 지점입니다. 훈련 손실이 점점 더 악화되기 시작하는데, 이는 절대 일어나서는 안 되는 일입니다! 사실 우리 둘 다 합리적인 LR을 사용했을 때 이런 현상을 본 기억이 없습니다.


그러나 실제로 이것은 암기 가설에 따르면 완벽하게 이해가 됩니다. LR이 다시 떨어진 시점에 접한 배치이기 때문에 모델이 효과적으로 암기하지 못했기 때문입니다. 그러나 모델은 여전히 과신하고 있는 상태입니다. 직전에 거의 완벽하게 정답을 맞힌 배치가 많았고, 지금 접하고 있는 배치는 아직 학습 기회가 없었던 것이라는 사실에 적응하지 못했기 때문이죠.


모델의 자신감(confidence)은 점차적으로 보다 합리적인 수준으로 재보정(recalibrates)되지만, LR이 점점 낮아지고 있기 때문에 시간이 걸립니다. 재보정하는 동안 검증 손실이 다시 감소합니다.



다음 실험에서는 CLR(Cyclical Learning Rates) 대신 3에포크에 걸쳐 1사이클 훈련을 시도했습니다. 즉, 훈련 시작 시 배치의 10%에 대해 단일 LR 워밍업을 수행한 다음 코사인 일정에 따라 나머지 배치에 대해 LR을 감쇠시켰습니다. 이전에는 각 에포크마다 별도의 워밍업과 감쇠 주기를 수행했습니다. 또한 우리는 LoRA 랭크를 높였기 때문에 학습 속도가 느려졌습니다. 그 결과, 손실 곡선은 다음과 같습니다:


<3에포크에 걸친 1사이클 훈련>



이 곡선은 한 가지를 제외하고는 이전 논의에서 예상했던 것과 대체로 일치합니다. 에포크 2에서 검증 손실이 급증하지 않고 에포크 3에 이르러서야 급증하는 것을 볼 수 있다는 점이죠. 그러나 이전에는 2번째 에포크까지 학습 손실이 0.2 정도였는데, 이는 매우 자신감 있는 예측을 할 때만 가능합니다. 1사이클 예시에서는 세 번째 에포크가 될 때까지는 그렇게 자신 있게 예측하지 못하며, 그 전까지는 검증 손실이 급증하는 것을 볼 수 없습니다.


한 가지 중요한 점은 검증 손실이 악화된다고 해서 반드시 과적합(over-fitting)인 것은 아니라는 것입니다. 우리가 일반적으로 신경 쓰는 것은 정확도(accuracy)이며, 모델이 지나치게 자신감이 있어도(over-confident) 괜찮습니다. Kaggle 대회에서 순위표에 사용되는 지표는 Mean Average Precision @ 3 (MAP@3)이며, 이는 내 모델의 객관식 예측 중 상위 3개 예측의 정확도입니다. 


다음은 이전 차트에 표시된 1사이클 훈련의 배치당 검증 정확도입니다. 보다시피, 마지막 에포크 동안 검증 손실이 악화되었음에도 불구하고 정확도는 꾸준히 개선되고 있습니다:


<MAP@3 for 1cycle training>



좀 더 자세히 살펴보고 싶으시다면, Johno가 이 보고에서 몇 가지 추가 예제의 로그와 이 효과가 실제로 작동하는 것을 직접 보고 싶은 분들을 위한 노트북을 공유하고 있으니 참고하시기 바랍니다. 




암기 가설이 어떻게 사실일 수 있나요?

How could the memorization hypothesis be true?


신경망이 하나의 예제에서 입력을 인식하는 법을 배울 수 없다는 절대적인 법칙은 없습니다. 그것은 그저 연구자들과 실무자들이 일반적으로 그렇다고 널리 인식하고 있는 사실일 뿐입니다. 확률적 경사 하강법(SGD, stochastic gradient descent)을 사용하여 탐색하려는 손실 표면이 너무 울퉁불퉁하여 한 번에 멀리 이동할 수 없기 때문에 많은 예제가 필요합니다. 그러나 고전적인 논문인 '신경망의 손실 표면 시각화'(Visualizing the Loss Landscape of Neural Nets)에서 볼 수 있듯이 잔류 연결(residual connections)을 사용하는 등 손실 표면을 더 매끄럽게 만들 수 있는 몇 가지 방법이 있다는 것을 우리는 알고 있습니다(Li et al, 2018).


ResNet-56의 손실 표면(Li et al, 2018)



사전 학습된 대규모 언어 모델은 최소 손실에 가까운 영역에서 매우 매끄러운 손실 표면(loss surfaces)을 가지며, 오픈 소스 커뮤니티에서 수행되는 많은 파인튜닝 작업이 이 영역에서 이루어집니다. 이는 파인튜닝된 범용 언어 모델(fine-tuned universal language models)의 최초 개발과 관련된 기본 전제를 기반으로 합니다. 이러한 모델은 2018년에 저희 중 한 명(Jeremy)과 Sebastian Ruder가 ULMFiT 논문에서 처음 문서화했습니다. 제레미가 처음 ULMFiT 알고리즘을 구축한 이유는 언어 모델링(즉, 문장의 다음 단어 예측)을 잘 수행하려면 내부적으로 풍부한 추상화 계층 구조와 기능을 구축해야 한다고 생각했기 때문입니다. 또한 제레미는 이 계층 구조를 약간의 파인튜닝을 통해 유사한 기능을 필요로 하는 다른 작업에도 쉽게 적용할 수 있다고 믿었습니다. ULMFiT 논문은 그 믿음이 실제로 정확하다는 사실을 최초로 보여주었습니다.


(ULMFiT에서 연구한 것보다 훨씬 더 큰) 오늘날의 대규모 언어 모델에는 훨씬 더 풍부한 추상화 계층 구조(hierarchy of abstractions)가 있을 것이 틀림없습니다. 따라서, 예를 들어, 과학에 관한 객관식 질문에 답하도록 이러한 모델 중 하나를 파인튜닝한다면 모델에서 이미 사용할 수 있는 기능과 지식을 대부분 활용할 수 있습니다. 적절한 조각을 적절한 방식으로(right pieces in the right way) 표면화하기만 하면 됩니다. 따라서 가중치를 많이 조정할 필요가 없습니다.


이러한 점을 고려할 때, (작은 무작위 분류 헤드를 가진) 사전 학습된 언어 모델이 (좋은 가중치 구성의 방향을 부드럽고 명확하게 가리키는 손실 표면에 있는 = 즉 학습에 매우 유리한?) 가중치 공간에 위치할 수 있다고 가정해도 크게 문제는 없을 겁니다. 그리고 (우리가 했듯이) 아담 옵티마이저를 사용한다면, 일관되고 부드러운 그라데이션은 효과적인 동적 학습률(effective dynamic learning rate)을 점점 더 높이게 되며, 결과적으로 단계(steps)가 매우 커질 수 있는 것이죠.




그래서요?

What now?


아주 빠르게 학습하는 모델을 갖는다는 것은 멋지게 들리지만, 실제로는 모델을 훈련하는 방법에 대한 많은 기본 아이디어가 뒤집힐 수 있다는 것을 의미합니다! 모델이 매우 느리게 학습하면 다양한 데이터를 사용하여 여러 에포크에 걸쳐 오랜 시간 동안 학습할 수 있으며, 우리가 제공한 데이터에서 일반화 가능한 정보를 점차적으로 추출할 수 있을 것으로 기대할 수 있습니다.


그러나 모델이 이렇게 빠르게 학습하면 치명적인 망각(catastrophic forgetting) 문제의 중요성이 갑자기 크게 부각됩니다. 예를 들어 모델이 매우 일반적인 관계의 예시 10개를 본 다음 덜 일반적인 반대 예시 1개를 봤다고 가정할 때, 원래의 예시 10개의 기억에 대한 가중치를 약간 낮추는 게 아니라, 단 1개만 본 반대 예시를 더 잘 기억할 수도 있습니다.


데이터 증강이 과적합을 피하는 데 덜 유용하다는 의미가 될 수도 있습니다. LLM은 주어진 정보의 표상(representations)을 끌어내는 데 매우 효과적이기 때문에 이제 어구 변경(paraphrasing)과 역번역(back-translation)을 통해 내용을 혼합해도 큰 차이가 없을 수 있습니다. 어느 쪽이든 모델은 사실상 동일한 정보를 얻게 될 테니까요.


아마도 드롭아웃(이미 LoRA와 같은 미세 조정 기법에서도 약간 사용되고 있는) 또는 확률적 깊이(= stochastic depth, 아직 NLP에서 크게 사용되지 않는 것 같음)와 같은 기법의 사용을 크게 늘림으로써 이러한 문제를 완화할 수 있을지도 모릅니다.


또는 훈련 전반에 걸쳐 다양한 데이터 세트의 혼합을 사용하여 모델에게 아예 망각의 기회조차 주지 않도록 유의해야 할 수도 있습니다. 예를 들어, 코드 라마(Llama Code)는 치명적인 망각에 시달렸지만(코드는 더 잘하지만 다른 모든 것은 훨씬 더 나빠짐), 코드 라마를 파인튜닝 할 때는 코드가 아닌 데이터는 10%만 사용되었습니다. 아마도 (코드 데이터와 비-코드 데이터를) 50 대 50에 가까운 비율로 혼합하면 기존 기능을 잃지 않고도 코딩을 잘할 수 있을 지도 모릅니다.


다른 가설을 생각해내고 테스트해 볼 수 있었다면, 혹은 이 암기 가설이 틀렸다는 경험적 증거를 발견한다면 꼭 알려주세요! 또한, 이 분야의 다른 연구(이전 연구를 참조하지 못했다면 사과드립니다)와 이러한 관찰을 바탕으로 모델을 훈련하고 사용하는 방법을 어떻게 조정해야 하는지에 대한 아이디어도 듣고 싶습니다. 이 트위터 스레드에 대한 답글을 계속 주시할 예정이니, 의견이나 질문이 있으시면 해당 스레드에 답글을 달아 주세요.



아 길다 ㅜㅜ