공통 틀: 대칭이 고른 축에서 큰 것부터
소리, 그림, 공 위의 모양에서 신호를 물결로 다시 적고 계수를 정해진 순서로 하나씩 더하는 계산을 세 번 했다. 바탕의 차원은 1, 2, 공 표면으로 달랐는데도 계산의 모양이 거의 같았던 것은 무엇이 같았기 때문일까? 그리고 계수 1%만 남겨도 그림이 남는 신호와 남지 않는 신호는 무엇이 다를까?
숫자 4096개, 계수 41개
네 신호는 모두 숫자 4096개로 적혀 있다. 평균을 빼고 계수 41개(1%)만 남겼을 때 담은 세기를 한 표에 모으면 다음과 같다. 마지막 열은 물결로 바꾸지 않고, 원래 칸 가운데 평균에서 가장 많이 벗어난 41칸만 남겼을 때다. 구면 모양은 반지름을 잰 점들이 공 위에 고르게 놓이지 않아(극 가까이에 촘촘하다) 칸 축을 재지 않았다.
| 신호 | 물결 축 | 물결 축, 큰 것부터 | 물결 축, 낮은 것부터 | 칸 축, 큰 것부터 |
|---|---|---|---|---|
| 잦아드는 화음 | 코사인 물결 | 76.2% | 0.0% | 14.9% |
| 선생님 그림 | 바둑판 물결 | 83.3% | 75.2% | 3.7% |
| 정육면체 | 구면 조화 | 99.7% | 84.6% | (재지 않음) |
| 소행성 | 구면 조화 | 95.4% | 93.5% | (재지 않음) |
물결 축에서 큰 것부터 남기면 네 신호 모두 41개로 세기의 4분의 3 넘게 담지만, 칸 축에서는 화음이 14.9%, 그림이 3.7%다. 숫자는 같은 4096개인데 축에 따라 몇 개에 몰리기도 하고 고루 퍼지기도 한다. 이렇게 신호를 어떤 축으로 적었을 때 세기가 소수의 계수에 몰리는 성질을 그 축에서의 희소성 (계수가 몇 개에 몰리는 성질 / sparsity)이라 한다.
세 번의 일을 한 줄로 적으면 「대칭 → 고유 함수 → 계수 → 큰 것부터 더하기」다.
- 대칭. 바탕마다 내용을 바꾸지 않고 옮기는 변환이 있다. 소리는 시간을 미는 것, 그림은 가로·세로로 미는 것, 공 표면은 돌리는 것이다.
- 고유 함수. 그 변환을 해도 모양이 그대로이고 배율이나 같은 묶음 안의 섞임만 생기는 물결을 고른다. 미는 대칭에서는 사인·코사인(평면에서는 두 방향 물결의 곱인 바둑판 물결), 돌리는 대칭에서는 차수마다 묶인 구면 조화다.
- 계수. 고른 물결은 정규 직교라서, 계수는 신호를 그 물결에 사영해 구하고 계수의 제곱합이 신호의 세기와 같다.
- 큰 것부터 더하기. 버린 계수의 제곱합이 복원 오차의 제곱합이므로, 큰 것부터 더하면 개수마다 가장 가깝다.
밀고 나서 해도 하고 나서 밀어도 결과가 같은 연산이 왜 사인·코사인을 고유 함수로 갖는지는 평행이동 대칭에서, 돌리기가 왜 같은 차수 안에서만 섞는지는 구면 조화에서 보았다. 이 장에서 새로 본 것은 넷째 단계다. 물결 축이 정해지면, 바탕이 줄이든 평면이든 공 표면이든 「계수를 늘어놓고 큰 것부터 더한다」는 넷째 단계는 똑같다. 위젯 1~3이 같은 재생 막대 하나로 세 바탕을 다룰 수 있는 것도 그래서다.
그러면 계수가 큰 것은 어디에 있을까? 큰 계수의 자리는 바탕이 아니라 신호가 정해서, 세 신호의 스펙트럼을 나란히 놓으면 차이가 보인다.

그림과 소행성의 세기는 굵은 무늬(낮은 차수)일수록 크고 높은 쪽으로 거듭제곱 꼴로 고르게 준다. 차수 4~40에서 맞춘 로그–로그 기울기는 정육면체 −2.92, 소행성 −3.17이다. 모서리가 있는 정육면체가 더 느리게 준다. 매끄러울수록 계수가 빨리 준다는 것은 글자 「ㅅ」의 화살표에서 본 것(화살표 길이가 주파수를 따라 줄어드는 모습)과 같은 이야기다. 이런 신호에서는 「낮은 것부터」가 「큰 것부터」와 비슷해서, 굵은 것부터 그리는 생성 모델이 잘 맞는다. 화음은 음높이와 배음 자리에 봉우리가 서고 그 사이는 골짜기여서, 낮은 것부터 더하면 빈 칸만 더하게 된다.
신호 안의 대칭도 큰 계수의 자리를 고른다. 선생님 그림은 좌우가 거의 같아서 가로 물결 수 kx가 짝수인 계수가 세기의 92.9%를 담는다. 짝수 kx의 코사인은 가운데 선에 대해 좌우가 같은 물결이기 때문인데, 정육면체에서 차수 4, 6, 8과 번호 4의 배수만 살아남은 것도 같은 이유다. 바탕의 대칭이 축을 고르고, 신호의 대칭이 그 축 안에서 살아남는 계수를 고른다.
ML에서: 바둑판 물결 축에서 바로 그리는 디퓨전
그림의 세기가 굵은 바둑판 물결에 몰려 있다면, 칸 대신 바둑판 물결 계수를 바로 만들어도 된다. 닝(Mang Ning)과 동료들의 DCTdiff(arXiv 2024, ICML 2025)는 디퓨전 모델이 그림의 칸 대신 이산 코사인 변환 계수를 만들게 했다. 저자들은 같은 구조의 모델에서 칸으로 만드는 디퓨전보다 그림의 질과 학습 효율이 좋았고, 잠재 공간(인코더로 줄인 공간)을 거치지 않고도 512 × 512 해상도까지 키울 수 있었다고 보고했다. 같은 논문은 그림 디퓨전을 스펙트럼 자기회귀로 볼 수 있다는 이론적 설명도 붙였다. 계수가 몰리는 축에서 그리면 모델이 정해야 할 큰 숫자가 적고, 남은 작은 계수는 대충 맞혀도 그림이 크게 틀어지지 않는다.
문제 10. 월수금 수업 일정표
1년 52주(364일)의 일정표에 월·수·금은 1, 나머지 날은 0을 적었다(첫날이 월요일). (가) 364칸을 이산 푸리에 변환하면 0이 아닌 계수는 몇 개이고, 번호는 무엇인가? (나) 11째 주 수요일 하루가 휴강이 되어 그날의 칸 하나만 0으로 바꾸면 0이 아닌 계수는 몇 개가 되고, 가장 큰 계수 7개가 세기의 몇 %를 담는가? (다) 칸 축과 물결 축 가운데 어느 쪽이 이 일정표를 싸게 적는가?

칸 축으로는 1인 칸이 156개라서 숫자 156개를 적어야 해요. 물결 축으로 하면… 계산하니까 0이 아닌 계수가 7개예요. 번호 0, 52, 104, 156, 208, 260, 312요.

왜 하필 52의 배수일까요?

일정이 7일마다 되풀이되니까, 364일 동안 52번 되풀이되는 물결과 그 배수만 남는 거네요.

그런데 208, 260, 312는 52번보다 훨씬 빨리 도는 물결이잖아?

칸 364개에서는 208이 −156, 260이 −104, 312가 −52랑 같은 거야. 한 주 7칸을 적는 것과 숫자 개수가 같아.

(나)는 하루만 바꿨는데 0이 아닌 계수가 364개로 다 살아나. 그래도 큰 7개가 99.37%를 담아. 휴강 하루는 칸 축으로는 숫자 하나인데 물결 축으로는 모든 계수에 조금씩 퍼져.

(다)는 어떻게 답하면 될까요?

되풀이되는 규칙은 물결 축이 싸고, 하루짜리 예외는 칸 축이 싸요. 둘이 섞여 있으면 「물결 7개 + 칸 하나」로 적는 게 제일 싸겠네요. 축마다 싸게 적히는 정보의 종류가 따로 있어요.

시간표 앱에 「매주 월수금」 반복 일정을 하나 넣고, 휴강만 따로 지우는 거랑 똑같아요.
문제 11. 어떤 축에서도 몰리지 않는 신호
64 × 64 그림(칸 4096개) 두 장과 화이트 노이즈(칸마다 서로 상관없이 종 모양 분포에서 뽑은 값) 하나를 본다(모두 평균을 뺀다). (가) 칸 (20, 30) 하나만 밝은 「점 하나 그림」을 바둑판 물결로 적고 큰 계수 1개, 41개, 410개를 남기면 담은 세기는 각각 몇 %인가? (나) 바둑판 물결 하나(kx = 5, ky = 3)로 된 그림을 칸 축에서 큰 칸 41개, 410개만 남기면? (다) 화이트 노이즈 4096칸을 코사인 물결 축과 칸 축에서 큰 것 41개만 남기면 각각 몇 %인가? 왜 1%가 아닌가? (위젯 4에서 확인해 보자.)

(가)는 점 하나니까 아무 축에서나 싸겠죠. 계산하면… 큰 계수 1개가 0.10%, 41개가 3.93%, 410개가 33.8%예요. 하나도 안 싸요.

점 하나를 바둑판 물결로 만들려면 어떤 물결이 필요할까요?

한 칸에서만 밝고 나머지는 다 0이어야 하니까, 굵은 것부터 가는 것까지 모든 물결이 밝은 칸 하나에서만 겹쳐 쌓이고 다른 데서는 지워져야 해요. 그래서 계수 4096개가 거의 같은 크기로 다 필요하네요.

(나)는 반대야. 물결 축에서는 계수 1개로 100%인데, 칸 축에서는 41칸이 3.94%, 410칸이 34.2%야. 점 하나 그림을 물결 축에서 적었을 때랑 숫자가 거의 같아. 한 축에서 몰린 신호가 다른 축에서는 고루 퍼져.

(다)는요?

화이트 노이즈는 두 축에서 다 8.62%예요. 그런데 1%를 남겼는데 왜 8.6%지? 아, 남긴 게 아무 41개가 아니라 가장 큰 41개라서요. 종 모양 분포에서 크기 순으로 위 1%만 골라 제곱하면 평균보다 훨씬 크니까요. 다른 정규 직교 축을 무작위로 만들어 봐도(길이 256, 큰 것 3개) 평균 9.28%라서 비슷해요. 어느 축으로 바꿔도 노이즈는 노이즈라 몰리지 않아요.

그래요. 모든 신호의 세기를 적은 계수에 몰아 담는 축은 없어요. 축이 정해지면 그 축에서 싸게 적히는 신호가 정해지고, 우리가 고른 물결 축이 잘 맞는 것은 소리, 그림, 모양 같은 신호가 그 축에서 몰리기 때문이에요.

선형대수 시간에 기저를 바꿔도 벡터는 그대로라고 배웠는데, 좌표가 몇 개에 몰리는지는 기저마다 다르구나.
문제 12. 부피 16³ 칸의 덩어리
3차원 모양을 칸마다의 값으로 적는 생성 모델이 있다고 하자. 16 × 16 × 16 = 4096칸 부피에 매끈한 덩어리(가운데가 가장 높고 멀어질수록 종 모양으로 낮아지는 혹 셋을 더한 값)를 담고, 같은 덩어리를 값이 0.3 보다 크면 1, 아니면 0으로 깎은 것도 만든다. 3차원 코사인 물결(가로·세로·깊이 물결의 곱)로 적는다. (가) 두 부피에서 계수를 큰 것부터 41개, 낮은 주파수부터 41개 남기면 담은 세기는? 칸 축에서 큰 칸 41개면? (나) 깎은 덩어리는 왜 더 비싼가? (다) 생성 모델이 부피를 0과 1로 만드는 것과 매끈한 값으로 만드는 것 가운데 어느 쪽이 굵은 것부터 그리기에 맞는가?

(가)는 매끈한 덩어리가 큰 것부터 90.2%, 낮은 주파수부터 68.7%, 칸 축 36.3%예요. 깎은 덩어리는 66.8%, 38.6%, 21.0%고요. 깎은 쪽은 1인 칸이 186개뿐이라 칸 축에서 싸야 할 것 같은데 오히려 다 낮네요.

깎은 덩어리의 가장자리에서 값은 어떻게 바뀌나요?

0에서 1로 한 칸 만에 뚝 끊겨요. 끊긴 데가 있으면 계수가 느리게 준다고 했죠. 그래서 41개로는 가장자리를 못 담아요.

칸 축에서 낮은 것도 이해돼. 1인 칸 186개가 다 같은 값이라 평균을 빼면 186칸에 세기가 고르게 퍼지니까, 그중 41칸만 고르면 22%쯤밖에 안 돼. 숫자가 21.0%로 비슷하고.

(다)는요? 바탕이 3차원이 되어도 앞의 세 바탕과 무엇이 같나요?

3차원 바둑판 물결도 서로 수직일까요? 가로·세로·깊이 물결의 곱이니까… 한 방향씩 수직이면 곱도 수직이에요. 그럼 큰 것부터 더하기가 그대로 통해요.

그럼 매끈한 덩어리와 깎은 덩어리 가운데 큰 것부터 그리기에 맞는 쪽은요?

매끈하게 적은 덩어리요. 계수가 빨리 줄어서 굵은 것부터 그리기에 맞아요.

0과 1로 만들면 마지막에 가장자리를 날카롭게 깎는 일을 따로 해야겠네.

3D 프린터 출력물도 매끈한 설계 파일에서 마지막에 층으로 깎아 내잖아요. 처음부터 층으로 그리려면 계단 모서리를 다 따로 적어야 하고요.