LLM은 왜 새 것을 배우면 옛 것을 잊나
어떤 모델에 새 데이터를 조금 더 먹였더니, 손도 안 댄 옛 과제 점수가 같이 내려갔다는 얘기를 처음 들었을 때 좀 의아했다. 새로 배운 게 왜 이미 알던 것을 밀어내나? 사람은 자전거를 다섯 해 쉬었다가 타도 핸들을 잡으면 몸이 먼저 기억하고, 중국어 성조를 새로 외운다고 구구단 칠 단이 흔들리지는 않는다. 그런데 모델은 번역을 조금 더 가르치면 멀쩡히 돌던 요약이 같이 어긋나고 요약을 고치려고 다시 가르치면 이번엔 번역이 어그러지니 그렇게 안 된다. 이름도 붙어 있다.
사람은 자전거를 안 잊는데
이걸 파국적 망각이라고 부른다. 새 과제를 학습시키면 이전 과제에서 내던 성능이 같이 깎여 내려가는 현상을 말한다. 1989년에 Michael McCloskey와 Neal Cohen이 작은 신경망에 덧셈을 먼저 가르치고 뺄셈을 이어 가르쳤더니 덧셈 쪽 정답률이 거의 바닥까지 떨어진 걸 보고한 1989년 논문이 이 이름의 출발점이다. 조금 깎인 게 아니라 뺄셈을 몇 번 돌리는 사이에 1 더하기 1도 틀리는 상태가 됐으니 파국적이라는 말이 과장이 아니었다. 당시엔 신경망이 몇십 개 단위의 작은 장난감이었는데, 규모가 수천억 배로 커지고 학습 데이터가 책 수십만 권 분량이 된 지금도 같은 일이 난다.
사람의 기억과 뭐가 다른지는 한 문장으로 갈린다. 사람은 새로 배운 것을 옛 기억 옆에 쌓는 쪽에 가깝고, 모델은 옛 기억을 담고 있던 그 자리를 새 학습이 고쳐 쓴다. 자전거와 중국어가 서로 간섭하지 않는 건 둘이 머릿속 다른 자리에 있어서가 아니라, 적어도 하나를 배우는 동안 다른 하나를 덮어쓰지 않는 장치가 사람 쪽에 있기 때문이다. 자는 동안 그날 겪은 일을 옛 기억과 맞춰 다시 정리하고 그중 겹치는 것만 추려 오래 남긴다는 설명이 오래 나와 있는데, 모델에는 그런 정리 과정이 기본으로 들어있지 않다. 넣어주려면 사람이 따로 설계해야 하는데 다음에 볼 방법들이 다 그 설계다.
숫자 하나를 고치면 다른 답이 바뀐다
여기서 가중치라는 말이 나온다. 가중치는 모델이 학습하면서 조금씩 조정해 온 숫자 뭉치를 말한다. 큰 모델이면 이 숫자가 수천억 개 단위로 들어있어서, 파일로 받으면 수백 기가바이트가 된다. 입력이 들어오면 이 숫자들을 거쳐 나오는 계산 결과가 답이 되니 모델이 아는 것은 전부 이 숫자 안에 들어있다고 보면 된다. 중요한 건 저장 방식이다.
지식이 파일처럼 칸칸이 들어있지 않다. “프랑스의 수도는 파리”라는 사실이 어느 한 칸에 적혀 있는 게 아니라, 수만 개 숫자가 함께 만들어내는 조합으로 들어있다. 그래서 같은 숫자가 “프랑스의 수도”에도 쓰이고 “파리의 인구”에도 쓰이고 “유럽 도시 이름 맞히기”에도 쓰인다. 하나의 숫자가 여러 답에 걸쳐 일을 하는 셈이다. 그 숫자를 하나 고치면 고치려던 답만 바뀌는 게 아니라, 그 숫자를 함께 쓰던 답들이 어디서 얼마나 흔들렸는지 모르는 채로 조금씩 따라 움직인다.
새 데이터로 추가 학습을 하면 그 숫자들을 새 답이 잘 나오는 쪽으로 민다. 미는 양이 작으면 옛 답을 내던 조합이 그래도 버티는데, 새 데이터가 많고 학습률을 높게 주면 숫자가 멀리 밀려나서 옛 조합이 흐트러지니 같은 데이터로도 학습률을 어떻게 주느냐에 따라 결과가 갈린다. 흐트러진 티는 금방 안 난다. 새로 가르친 과제에서는 점수가 올라가 있으니 학습이 잘된 것처럼 보이고, 의료 문답을 가르치는 동안 슬그머니 깎인 코드 작성이나 긴 글 요약은 따로 재보기 전까지 아무도 확인하지 않는다. 그래서 파인튜닝을 할 때는 새 과제 점수만 보지 말고 원래 잘되던 쪽 과제도 전후로 같이 재두는 게 중요하다.
크기가 커져도 사라지지 않는다는 쪽 증거도 쌓여 있다. Google DeepMind 연구진이 대형 모델에서의 망각을 측정한 2022년 논문에서 모델을 키우면 망각이 줄어드는 경향은 있지만 없어지지는 않는다고 적었다. 크기별로 같은 실험을 돌려보니 큰 쪽이 덜 잊기는 해도, 얼마나 커야 안 잊는다는 선은 나오지 않았다. 새 과제를 오래 가르칠수록 먼저 배운 과제 점수가 계속 내려가는 모양도 크기와 상관없이 비슷하게 나왔다. 키우는 것만으로 해결되지 않으니 실제로 쓰는 방법은 따로 있다.
안 잊게 하려고 쓰는 방법과 그 대가
크게 세 갈래다. 첫째는 옛 데이터를 새 데이터에 섞어서 같이 보여주는 것인데 리플레이 또는 리허설이라고 부른다. 수학 문제를 새로 가르치는 중에도 예전에 풀던 문제와 일반 문답을 일정 비율로 끼워 넣어서, 숫자가 새 과제 쪽으로만 밀리지 않게 잡아두는 방식이다. 섞는 비율을 올리면 옛 성능이 잘 버티고 내리면 새 과제가 빨리 붙으니 이 비율을 얼마로 잡느냐가 곧 선택이다. 효과는 제일 확실한데 옛 데이터를 그대로 들고 있어야 하고, 섞은 만큼 학습 시간과 계산 비용도 같이 늘어난다.
둘째는 중요한 가중치를 덜 움직이게 묶는 것이다. 대표적인 게 EWC라는 방법인데 옛 과제에 많이 쓰이던 숫자가 어느 것인지 먼저 재두고, 그 숫자들에만 학습할 때 거의 안 움직이게 제약을 걸고 나머지는 자유롭게 두는 식이다. DeepMind가 2017년 PNAS에 실은 논문에서 이 방법으로 아타리 게임 여러 개를 이어 학습시켜도 먼저 배운 게임 실력이 유지되는 걸 보였는데, 제약 없이 그냥 이어 학습시킨 쪽은 먼저 배운 게임을 거의 못 하는 상태로 돌아갔다. 대가는 새 과제를 배우는 폭이 줄어든다는 것이다. 묶어둔 숫자가 많으면 안 잊기는 하는데 새것도 잘 못 배우니 어느 숫자를 중요하다고 볼지 재는 단계에서 이미 결과가 갈린다.
셋째가 요즘 제일 많이 쓰이는 LoRA다. 본체 가중치는 아예 건드리지 않고, 본체 옆에 작은 보조 행렬 한 쌍만 새로 붙여서 그것만 학습시킨다. 원래 숫자를 안 고치니 옛 능력이 통째로 날아갈 일이 없고, 붙인 부분만 떼면 원래 모델로 돌아온다. 학습해야 할 숫자가 전체의 1% 아래로 줄어드니 비용도 적게 들고, 용도별로 어댑터를 따로 만들어 상담용과 요약용을 필요할 때 갈아 끼우는 것도 된다. 2021년에 Microsoft 연구진이 LoRA를 제안한 논문을 냈고, 지금은 파인튜닝이라고 하면 대개 이쪽을 뜻한다.
- 옛 데이터 섞어 보여주기 — 내주는 것: 옛 데이터를 계속 들고 있어야 하고 학습 시간도 늘어난다. 얻는 것: 옛 성능이 가장 잘 버티고, 섞는 비율로 조절할 수 있다.
- 중요한 가중치 묶기 — 내주는 것: 새 과제를 배우는 폭이 줄어든다. 얻는 것: 옛 데이터를 들고 있지 않아도 되고, 어느 숫자가 중요한지 기록이 남는다.
- LoRA로 작은 부분만 덧붙이기 — 내주는 것: 크게 바꿔야 하는 학습은 잘 안 먹는다. 얻는 것: 본체가 안 변하고, 비용이 싸고, 떼면 원복된다.
물론 LoRA가 공짜는 아니다. 2024년에 나온 LoRA와 전체 파인튜닝을 비교한 논문에서는 LoRA가 옛 능력을 덜 잊는 대신 새 영역을 배우는 정도도 전체 학습보다 낮았다고 적었다. 프로그래밍이나 수학처럼 원래 모델에 많이 들어있지 않은 분야를 새로 가르칠 때 차이가 특히 났고, 원래 어느 정도 하던 분야에서는 차이가 작았다. 덜 잊는 것과 덜 배우는 것이 같은 이유에서 온다는 말이다. 본체를 안 건드리니까 안 잊고, 본체를 안 건드리니까 많이 못 배운다.
쓰는 쪽에서 체감하는 지점
모델을 직접 학습시키지 않는 사람에게도 이 얘기가 닿는 자리가 있다. 모델 버전이 올라간 다음에 잘 돌던 프롬프트가 어긋나는 일이다. 새 버전이 전체 성능은 더 좋다고 나와 있는데, JSON만 받던 자리에 설명이 한 줄 붙어 나오거나 특정 분야 답변만 유독 나빠지는 식이다. 평균이 올라가도 내가 쓰던 기능 하나는 내려갈 수 있으니 버전을 올릴 때는 실제로 쓰는 입력 열댓 개를 모아 전후를 직접 재보는 게 맞다. 재보지 않으면 형식이 깨진 걸 사용자 신고로 알게 되는데, 그때는 이미 며칠치 출력이 섞여 있다.
파인튜닝을 외부에 맡긴다고 해보자. 받은 결과물에서 확인할 게 몇 가지 있는데 어느 것도 어려운 요구가 아니다. 새로 가르친 과제 점수만 왔는지, 손대지 않은 과제도 같이 재서 전후를 보여주는지 먼저 본다. 그리고 옛 데이터를 몇 퍼센트 섞었는지, LoRA인지 전체 파인튜닝인지도 받아둔다. LoRA라면 어댑터만 따로 받을 수 있는지 물어야 하는데 이게 되면 새 버전 본체가 나왔을 때 어댑터만 다시 붙여보면 되니 처음부터 다시 학습시킬 일이 줄어든다.
솔직히 나는 이 분야에서 뭐가 가장 답답한지 잘 모르겠다. 직접 대규모 파인튜닝을 돌려본 적이 없어서, 숫자가 얼마나 밀리면 어떤 과제가 먼저 깎이는지 같은 감각이 없다. 작은 모델로 한번 해볼 생각이다. 과제 두 개를 이어 가르치면서 학습률만 세 단계로 바꿔보고, 먼저 배운 과제 점수가 어느 지점에서 꺾이는지 그래프로 찍어보려 한다. 숫자가 눈에 보이면 말로 읽은 것보다 훨씬 잘 붙을 것 같다.
잊는 걸 완전히 막는 방법은 아직 없다. 다만 무엇을 잊었는지 재볼 수는 있으니 당장 할 일은 모델을 바꿀 때마다 옛 과제를 다시 돌려보는 습관을 들이는 쪽이다.