암기와 일반화: 일반화란 무엇인가

이 장의 물음

자료를 짧게 적을 수 있으면 규칙이 있다는 생각을 비트로 재 왔다. 예측기는 산술 코딩을 거쳐 그대로 압축기가 되었고, 최소 기술 길이는 예측기 자신을 적는 비트까지 셈에 넣어야 공평하다고 했다. 그런데 학습을 해 본 사람이 정말 궁금한 것은 비트가 아니라 처음 보는 자료인데, 학습 자료를 다 맞힌 모델이 시험 자료에서도 맞을지 학습 자료만 보고 알 수 있을까?

신경망을 학습시켜 본 사람은 학습 정확도가 100%에 닿는 장면을 흔히 보는데, 그때 시험 정확도는 높을 때도 있고 낮을 때도 있다. 같은 크기의 신경망, 같은 옵티마이저, 같은 스텝 수인데 결과가 갈린다. 그림 생성 모델도 비슷해서, 학습 그림이 적으면 학습 그림을 거의 그대로 다시 그리고, 많으면 처음 보는 그림을 그린다. 무엇이 둘을 가를까?

암기: 외운 라벨은 줄어들지 않는다

시험 전날 기출문제 스무 개의 답 번호만 외운 친구와 풀이를 이해한 친구가 있다고 하자. 기출문제를 다시 내면 둘 다 100점이어서, 둘의 차이는 처음 보는 문제에서야 드러난다. 그런데 시험을 보기 전에, 두 친구의 공책만 보고 누가 외웠는지 알아낼 수는 없을까? 답 번호만 적힌 공책은 문제 수만큼 길고, 풀이를 이해한 친구의 공책에는 짧은 규칙 몇 줄이 있을 것이다. 외운 것과 규칙을 찾은 것이 공책의 길이로 갈린다면, 신경망도 「공책의 길이」로 가를 수 있을까?

역사: 아무 규칙도 없는 라벨까지 외운 신경망

2016년 말 장치위안(Chiyuan Zhang), 사미 벤지오(Samy Bengio), 모리츠 하르트(Moritz Hardt), 벤저민 레흐트(Benjamin Recht), 오리올 비냘스(Oriol Vinyals)는 그림 분류 자료 CIFAR-10의 라벨을 모두 무작위로 바꾼 뒤 평소 쓰는 합성곱 신경망을 학습시켰다. 신경망은 아무 규칙도 없는 라벨까지 학습 오차 0으로 맞혔고, 시험 정확도는 찍는 수준에 머물렀다. 그들은 라벨만이 아니라 그림 자체를 가우시안 노이즈로 바꿔도 신경망이 다 맞힌다는 것을 보였고, 파라미터가 자료 수보다 많기만 하면 층이 둘뿐인 신경망도 자료 n개에 어떤 라벨을 붙이든 모두 맞힐 수 있다는 것을 증명으로 보였다. 이 논문 「딥러닝을 이해하려면 일반화를 다시 생각해야 한다(Understanding Deep Learning Requires Rethinking Generalization)」는 2017년 국제 표현 학습 학회(ICLR)에 실렸다.

논문이 겨냥한 것은 「모델 족이 얼마나 많은 것을 맞힐 수 있는가」로 일반화를 설명하던 오랜 방식이었다. 같은 신경망이 참 라벨도 무작위 라벨도 다 맞힌다면, 신경망이 맞힐 수 있는 범위만 보아서는 왜 참 라벨에서만 처음 보는 그림이 맞는지 설명할 수 없다. 저자들은 4년 뒤 『Communications of the ACM』 2021년 3월호에 같은 실험과 그 뒤의 논의를 다시 정리해 실으면서 제목에 「아직도(still)」를 넣었다.

최적화 책이 「무엇을 고르나」를 묻는다면, 이 장은 같은 실험을 반대쪽에서 보아 고른 것이 정말로 학습 자료보다 짧은가를 비트로 잰다.

두 클러스터, 두 가지 라벨

실험을 손에 잡히게 줄여 보자. 평면 위에 클러스터(한 중심 근처에 흩어진 점들의 모임) 둘을 둔다. 한 클러스터는 (−1.5, 0), 다른 클러스터는 (1.5, 0) 근처에 표준편차 0.6으로 흩어져 있고, 왼쪽 클러스터의 점은 라벨 0, 오른쪽 클러스터의 점은 라벨 1이다. 평면을 고른 것은 신경망이 그은 경계를 눈으로 볼 수 있기 때문이다. 학습 점 100개(클러스터마다 50개)와 시험 점 2,000개를 따로 뽑고, 학습 점의 라벨은 두 벌 만든다. 한 벌은 클러스터를 따른 참 라벨이고, 다른 한 벌은 점마다 동전을 던져 붙인 무작위 라벨이다. 무작위 라벨 100개 가운데 57개는 우연히 참 라벨과 같았다.

두 벌에 같은 작은 MLP(층마다 모든 칸이 다음 층의 모든 칸과 이어진 신경망. 입력 2칸 → 128 → 128 → 출력 2칸, 파라미터 17,154개)를 같은 방법으로 학습시킨다. Adam(학습률 0.01)으로 학습 점 100개 전부를 한 묶음으로 2,000스텝이다(계산은 sources/memorization/s1_labels.py).

라벨 10스텝 뒤 학습 정확도 300스텝 뒤 학습 정확도 2,000스텝 뒤 학습 정확도 시험 정확도 파라미터 수
참 라벨 100% 100% 100% 99.3% 17,154
무작위 라벨 61.0% 99.0% 100% 54.8% 17,154
같은 MLP가 같은 학습 점 100개에 그은 경계. 왼쪽은 참 라벨, 오른쪽은 동전으로 붙인 무작위 라벨. 둘 다 학습 점을 하나도 틀리지 않지만, 무작위 라벨의 경계는 점 하나하나를 감싸느라 구불구불하고 시험 점에서는 찍기와 비슷하다
같은 MLP가 같은 학습 점 100개에 그은 경계. 왼쪽은 참 라벨, 오른쪽은 동전으로 붙인 무작위 라벨. 둘 다 학습 점을 하나도 틀리지 않지만, 무작위 라벨의 경계는 점 하나하나를 감싸느라 구불구불하고 시험 점에서는 찍기와 비슷하다

두 모델은 학습 자료에서 똑같이 완벽하고 파라미터 수도 같다. 시험 정확도는 시험 점의 참 라벨과 견준 값이라, 무작위 라벨을 외운 모델은 찍기 수준에 가깝다(학습 라벨 57개가 우연히 참 라벨과 같았던 만큼 50%보다 조금 높다). 학습이 걸린 시간은 다르지만, 스텝 수를 넉넉히 주면 학습 속도의 차이도 사라지므로, 시험 자료를 보지 않고 두 모델을 가를 잣대가 따로 필요하다.

순차 코드로 라벨의 비트를 재기

최소 기술 길이에서 쓴 순차 코드를 다시 꺼낸다. 앞의 자료로 배운 모델로 다음 자료를 적는 비트를 차례로 더해 가는 이 방법은, 받는 사람도 같은 학습법으로 같은 모델을 다시 만들 수 있으므로 모델을 적는 비트를 따로 셀 필요가 없다는 장점이 있다.

여기서 적을 것은 라벨이고, 점의 위치는 보내는 사람과 받는 사람이 모두 안다고 둔다. 학습 점 100개를 정해진 순서로 늘어놓고 1~4번째, 5~8번째, 9~16번째, 17~32번째, 33~64번째, 65~100번째의 여섯 묶음으로 자른다. 첫 묶음의 라벨은 아무것도 배우지 않았으니 1비트씩 적는다. 그다음 묶음부터는 앞 묶음까지의 점으로 MLP를 처음부터 새로 학습시켜(같은 2,000스텝), 그 MLP가 다음 묶음의 라벨에 준 확률 q로 −log₂ q비트씩 적는다. 자신 있게 틀린 라벨 하나에 끝없는 비트가 들지 않게, MLP의 확률에 고른 확률을 1% 섞는다. 그러면 라벨 하나에 드는 비트는 많아야 −log₂ 0.005 = 7.64비트다.

L순차=∑t=1n−log⁡2qθ<t ⁣(yt∣xt)\textcolor{#c45a00}{L}_{\text{순차}} = \sum_{\textcolor{#a67a63}{t}=1}^{\textcolor{#3c4bff}{n}} -\log_2 \textcolor{#a000c8}{q}_{\textcolor{#665522}{\theta}_{<\textcolor{#a67a63}{t}}}\!\left(\textcolor{#8c564b}{y}_{\textcolor{#a67a63}{t}} \mid \textcolor{#1b9e77}{x}_{\textcolor{#a67a63}{t}}\right)
xt, ytt번째 학습 점의 위치와 라벨θ<tt번째 점이 든 묶음보다 앞의 점들로만 학습한 파라미터qθ<t(⋅∣xt)그 모델이 위치 xt에서 낸 라벨의 확률 (첫 묶음은 반반)n학습 점 수 (100)L순차라벨 n개를 적는 데 든 비트\begin{array}{ll} \textcolor{#1b9e77}{x}_{\textcolor{#a67a63}{t}},\ \textcolor{#8c564b}{y}_{\textcolor{#a67a63}{t}} & \textcolor{#a67a63}{t}\text{번째 학습 점의 위치와 라벨} \\ \textcolor{#665522}{\theta}_{<\textcolor{#a67a63}{t}} & \textcolor{#a67a63}{t}\text{번째 점이 든 묶음보다 앞의 점들로만 학습한 파라미터} \\ \textcolor{#a000c8}{q}_{\textcolor{#665522}{\theta}_{<\textcolor{#a67a63}{t}}}(\cdot \mid \textcolor{#1b9e77}{x}_{\textcolor{#a67a63}{t}}) & \text{그 모델이 위치 } \textcolor{#1b9e77}{x}_{\textcolor{#a67a63}{t}} \text{에서 낸 라벨의 확률 (첫 묶음은 반반)} \\ \textcolor{#3c4bff}{n} & \text{학습 점 수 (100)} \\ \textcolor{#c45a00}{L}_{\text{순차}} & \text{라벨 } \textcolor{#3c4bff}{n}\text{개를 적는 데 든 비트} \end{array}

참 라벨은 첫 묶음 4비트를 쓰고 나면 거의 비트가 들지 않는다. 점 네 개만 보고 배운 MLP도 두 클러스터 사이의 경계를 대강 알아, 다음 라벨에 0.99 넘는 확률을 준다. 33~64번째 묶음에서 한 번 크게 놀란 것까지 더해 합은 10.8비트, 라벨 하나에 0.108비트다. 무작위 라벨에서는 앞 묶음이 다음 묶음에 대해 알려 주는 것이 없다. 앞의 라벨을 외운 MLP는 다음 라벨도 자신 있게 예측하는데, 그 예측은 동전과 상관이 없다. 둘째 묶음부터 라벨 하나에 1.9~3.8비트가 들어 합은 314.9비트다. 라벨 100개를 아무 모델 없이 1비트씩 그대로 적으면 100비트이니, 무작위 라벨을 외운 모델은 라벨을 줄이기는커녕 세 배로 늘렸다.

순차 코드로 잰 묶음마다의 라벨 하나에 든 비트. 참 라벨은 첫 묶음 뒤로 거의 0이고, 무작위 라벨은 라벨을 그대로 적는 1비트(점선)보다 늘 많다
순차 코드로 잰 묶음마다의 라벨 하나에 든 비트. 참 라벨은 첫 묶음 뒤로 거의 0이고, 무작위 라벨은 라벨을 그대로 적는 1비트(점선)보다 늘 많다

이렇게 학습 자료를 규칙으로 줄이지 않고 룩업 테이블처럼 하나하나 지니는 것을 암기 (룩업 테이블처럼 외우기, memorization)라 한다. 무작위 라벨을 다 맞힌 MLP의 속은 점마다 라벨을 적어 둔 표와 다르지 않다. 표는 처음 보는 점에 대해 아무것도 말해 주지 않고, 표로 다음 라벨을 맞히려 하면 순차 코드의 비트가 줄지 않는다. L순차 = 10.8비트와 314.9비트의 차이는 시험 점을 한 번도 쓰지 않고 학습 자료만으로 잰 것이다.

ML에서: 언어 모델이 외운 문장

큰 언어 모델에도 룩업 테이블처럼 지닌 부분이 있다. 칼리니(Nicholas Carlini)와 동료 열한 명은 「큰 언어 모델에서 학습 자료 뽑아내기(Extracting Training Data from Large Language Models)」(USENIX Security 2021)를 썼다. 그들은 공개 웹 글로 학습한 GPT-2에 질의만 해서 학습 자료의 문장 수백 개를 글자 그대로 뽑아냈다. 뽑힌 것에는 이름, 전화번호, 전자우편 주소 같은 개인 정보와 코드, 128비트짜리 무작위 식별자(UUID)가 있었는데, 무작위 식별자는 규칙이 없어 외우지 않고서는 내놓을 수 없는 글이다. 학습 자료에서 한 문서에만 나온 문장도 뽑혔고, 큰 모델일수록 더 많이 외웠다.

문제 1. 기출문제 답 스무 개

사지선다 기출문제 스무 개의 답 번호를 공책에 적는다. (가) 답 번호를 하나씩 그대로 적으면 몇 비트인가? (나) 출제자가 답을 1, 2, 3, 4, 1, 2, 3, 4 … 차례로 냈다면, 공책에 적을 것은 무엇이고 몇 비트쯤인가? (다) 출제자가 답을 주사위처럼 무작위로 냈다면, 답만 외운 학생은 같은 출제자의 새 문제 스무 개에서 평균 몇 개를 맞히겠는가? (나)의 출제자라면?

김민준 M01
김민준

(가)는 답 하나가 넷 중 하나니까 2비트, 스무 개면 40비트요.

선생님 T01
선생님

(나)는요? 공책에 무엇을 적으면 받는 사람이 스무 개를 다 되살릴 수 있을까요?

김민준 M01
김민준

「1, 2, 3, 4를 되풀이」라고만 적으면 돼요. 몇 비트인지는… 규칙 하나 고르는 데 몇 비트쯤이요.

이서연 S01
이서연

받는 사람과 「되풀이 규칙」 몇 가지를 미리 정해 뒀다면 그 가운데 하나를 가리키는 비트면 되지. 40비트보다 훨씬 짧아.

선생님 T01
선생님

(다)는요? 답만 외운 학생이 새 문제를 받으면요?

김민준 M04
김민준

외운 건 기출 답이니까 새 문제에는 쓸 데가 없네요. 찍는 거랑 같아서 스무 개 중 5개요.

이서연 S07
이서연

(나)의 출제자라면 규칙을 아는 학생은 21번부터도 1, 2, 3, 4로 이어서 다 맞혀. 공책이 짧게 줄어드는 경우에만 새 문제에 쓸 수 있는 거네. 무작위로 낸 답은 40비트 아래로 줄일 수도 없고, 새 문제에 쓸 수도 없어.

김민준 M11
김민준

조교님이 작년 숙제 답안을 그대로 외워 온 사람은 올해 숫자만 바뀐 숙제에서 바로 티가 난다고 했어요.

문제 2. 동전 라벨 100개는 줄일 수 없다

동전을 100번 던져 얻은 라벨 100개(0 또는 1)를 프리픽스 코드로 적는다. (가) 100비트짜리 줄은 모두 몇 가지인가? (나) 길이가 90비트 이하인 코드워드는 모두 몇 개를 넘을 수 없는가? (다) 아무리 영리한 압축기를 써도, 동전 라벨 100개가 90비트 이하로 줄어들 확률은 얼마를 넘지 못하는가?

김민준 M01
김민준

신경망이 충분히 크면 무작위 라벨도 다 외우잖아요. 외운 신경망으로 적으면 줄어들지 않을까요?

선생님 T01
선생님

줄어든다는 말을 셈으로 바꿔 볼까요? 100비트짜리 줄은 몇 가지죠?

이서연 S01
이서연

2¹⁰⁰가지요.

선생님 T01
선생님

그럼 90비트 이하의 코드워드는 모두 몇 개까지 있을 수 있죠?

이서연 S01
이서연

길이 0인 것 1개, 길이 1인 것 2개, … 길이 0부터 90까지 다 더해도 2⁹¹ − 1개예요.

김민준 M03
김민준

그게 라벨이 줄어드는 거랑 무슨 상관이야?

이서연 S01
이서연

코드워드 하나가 줄 하나만 가리킬 수 있잖아. 그러니까 90비트 이하로 줄어드는 줄은 많아야 2⁹¹ − 1가지야.

이서연 S06
이서연

동전 라벨은 2¹⁰⁰가지가 다 똑같이 나올 수 있으니까, 줄어들 확률은 많아야 2⁹¹/2¹⁰⁰ = 2⁻⁹ = 1/512, 0.2%예요. 압축기가 얼마나 영리한지와 상관이 없어요.

김민준 M05
김민준

그럼 외운 신경망은요?

선생님 T14
선생님

순차 코드로 재면 그 신경망은 라벨을 314.9비트로 적었어요. 100비트보다 길죠. 외운 것을 받는 사람에 알려 주려면 결국 신경망의 파라미터에 라벨이 들어가 있어야 하고, 방금 센 대로, 그 파라미터를 적는 비트가 라벨 100비트보다 훨씬 짧을 확률은 아주 작아요. 신경망이 다 맞힌다는 것과 짧게 적는다는 것은 다른 일이에요.

이서연 S11
이서연

정수론 시간에 비둘기집 원리로 「모든 수를 더 짧게 적는 방법은 없다」를 증명한 적이 있어요. 짧은 이름은 몇 개 없으니까 대부분의 수는 짧은 이름을 못 받아요.

문제 3. 자신 있게 외운 모델의 비트

순차 코드에서 무작위 라벨을 외운 MLP는 다음 묶음의 라벨에도 거의 1에 가까운 확률을 준다. 이 장의 실험처럼 고른 확률을 1% 섞으면, 자신이 고른 라벨에 0.995, 다른 라벨에 0.005를 준다. (가) 맞혔을 때와 틀렸을 때 라벨 하나에 드는 비트는 각각 얼마인가? (나) 동전 라벨이라 맞힐 확률이 반이면 라벨 하나에 평균 몇 비트인가? 실험에서 9~16번째 묶음의 3.84비트와 비교해 보라. (다) 늘 반반을 주는 예측기와 비교하면? 섞는 비율을 0으로 하면 어떻게 되는가?

김민준 M01
김민준

−log₂ 0.995 = 0.0072비트, −log₂ 0.005 = 7.644비트요. 반반이면 (0.0072 + 7.644)/2 = 3.826비트. 실험의 3.84랑 거의 같네요.

선생님 T01
선생님

늘 0.5를 주는 예측기는요?

김민준 M06
김민준

맞든 틀리든 1비트요. 아무것도 안 배운 예측기가 외운 신경망보다 네 배 가까이 짧아요. 이상한데요?

이서연 S01
이서연

자신 있게 틀리는 값이 너무 비싸서 그래. 맞힐 때 아끼는 건 1비트에서 0.0072비트로 1비트도 안 되는데, 틀릴 때는 7.6비트를 내야 하잖아.

선생님 T14
선생님

그럼 섞는 비율을 0으로 하면요?

이서연 S08
이서연

틀린 라벨에 준 확률이 거의 0이 되니까 −log₂가 끝없이 커져요. 그래서 섞었던 거군요. 섞는 비율을 어떻게 정해도, 동전 라벨에서는 평균 1비트 아래로 내려갈 수 없고요.

김민준 M11
김민준

모르는 문제에 확신을 갖고 답을 쓰면 감점하는 시험이 있었는데, 그럴 땐 「모르겠다」고 쓰는 게 점수가 높았어요. 반반이 그 「모르겠다」네요.