혼동하기 쉬운 점과 요약
토론 1. 인코더 분포를 넓히면 뽑은 그림 한 장 한 장이 흐려지나
위젯 3에서 σ를 키우면 평균 그림이 뿌예진다. 그때 뽑은 그림 한 장도 뿌예지는가?

위젯 3에서 σ를 키우면 평균 그림이 점점 뿌예졌죠. 그럼 σ가 큰 인코더 분포에서 뽑은 그림 한 장은 어떨까요?

평균이 뿌예지니까 한 장 한 장도 조금씩 뿌예지지 않을까요? 분포가 넓을수록 그림이 덜 또렷해질 것 같은데요.

문제 3의 디코더로 해 봐요. σ = 2에서 잠재 변수를 하나 뽑아 디코더에 넣으면 무엇이 나와요?

이 디코더는 z < 0이면 그림 A, 아니면 그림 B를 내놓으니까… 뽑을 때마다 A 아니면 B예요. 둘 다 0과 1로만 된 흑백 그림이고요.

그럼 회색 칸이 하나도 없는 그림만 나오네요. 그런데 문제 3에서 σ = 2면 100칸이 다 회색이었는데요.

그 회색은 무엇을 칠한 거였어요?

뽑은 그림들을 겹친 평균 그림이요. A가 40%, B가 60% 나오니까 그 칸이 0.401, 0.599로 칠해진 거예요. 한 장이 회색이 된 게 아니라, A와 B가 섞여 나오는 비율이 평균 그림에 회색으로 찍힌 거였네요.

위젯 3의 64장도 그랬어. σ를 키우니까 다른 숫자가 섞여 나오긴 해도, 한 장씩 보면 회색 칸이 20% 안팎으로 또렷했어.

맞아요. σ를 키우면 한 장이 흐려지는 게 아니라, 어느 그림이 나올지가 넓게 흩어져요. 흐려지는 것은 여러 그림을 겹친 평균이에요.
토론 2. 평균이 맞는 그래디언트 추정이면 어느 것을 써도 되나
문제 10의 두 추정은 평균이 둘 다 2다. 그렇다면 학습에는 어느 쪽을 써도 같은가?

문제 10에서 재파라미터화와 로그 미분은 둘 다 평균이 2였어요. 그럼 학습에는 어느 쪽을 써도 될까요?

평균이 맞으면 되는 거 아니에요? 한 번 뽑을 때는 좀 빗나가도, 학습을 오래 돌리면 고친 값들이 평균으로 맞춰질 테니까요.

그래디언트를 표준편차 0.1 안으로 알고 싶다고 해 봐요. 샘플을 몇 개 평균 내야 할까요?

샘플 n개를 평균 내면 분산이 n분의 1로 주니까… 표준편차가 0.1이 되려면 분산이 0.01이어야 해요. 재파라미터화는 8 ÷ n = 0.01이라 n = 800개.

로그 미분은 74 ÷ n = 0.01이면 7,400개야.

같은 정확도를 얻는 데 아홉 배 넘게 뽑아야 하네요. 디코더를 아홉 배 넘게 더 돌려야 한다는 거고요. 평균이 맞는다고 같은 게 아니었어요.

그렇다고 샘플을 한 개만 쓰면 어떻게 될까요? VAE는 보통 그림마다 샘플 하나로 학습하죠.

학습 스텝마다 그래디언트가 크게 흔들리겠네요. 분산 74면 표준편차가 8.6이니까, 평균 2인 값이 한 스텝에서는 −6이나 10쯤으로 나올 수도 있어요. 그러면 학습률을 낮춰야 하고 그만큼 느려지고요.

양궁이랑 같네. 화살 평균은 둘 다 과녁 한가운데인데, 한 선수는 화살이 10점 근처에 모이고 다른 선수는 과녁 끝까지 널뛰면 점수는 딴판이잖아. 평균만큼 화살이 퍼진 정도, 분산도 봐야 해.
토론 3. 웃는 사진과 안 웃는 사진의 평균 차는 미소만 담고 있나
웃는 사진의 잠재 변수 평균에서 안 웃는 사진의 평균을 뺀 「미소 벡터」는 미소의 효과만 담고 있는가?

웃는 사진의 잠재 변수 평균에서 안 웃는 사진의 평균을 빼면 미소 벡터가 나와요. 이 벡터는 미소만 담고 있을까요?

수염처럼 한쪽 성별에 몰린 속성이 아니면 괜찮지 않을까요? 웃는 사진은 남녀 모두에 많잖아요.

그럼 미소는 깨끗하겠다. 웃는 사진에서 안 웃는 사진을 뺐으니 남는 건 미소뿐이고, 슬라이더 하나로 미소만 올렸다 내렸다 할 수 있겠네요.

미소 벡터와 남성 벡터의 코사인이 −0.17이에요. 무관한 두 방향이면 크기가 0.10 둘레였죠.

0.10보다 크네요. 그럼 미소 벡터를 더하면 얼굴이 조금 여자 쪽으로 가는 거예요? 웃는 것만 바꿨는데.

음수니까 그렇겠네요. 웃는 사진 묶음에 여자가 조금 더 많은 걸까요? 그러면 문제 17의 안경과 키처럼, 두 묶음의 성별 비율 차가 평균의 차에 같이 들어간 거고요.

화이트의 미소 서비스가 겪은 일이 그거예요. 데이터에서 여자가 남자보다 더 자주 웃고 있어서, 미소를 빼면 얼굴이 남자처럼 바뀌었죠. 문제 17에서는 그런 섞임을 어떻게 걷어 냈어요?

같은 성별끼리 비교했어요. 그럼 남자끼리 미소 벡터, 여자끼리 미소 벡터를 따로 만들어서 둘을 평균하면 되겠네요.

그렇게 만든 벡터는 남성 벡터와의 코사인이 −0.03이에요.

무관한 방향의 0.10보다도 작아졌어요. 이제야 미소만 남은 거네요. 두 묶음의 평균을 뺄 때는, 두 묶음의 다른 구성이 같이 빠져나오지 않는지부터 봐야 하는구나.

수염은 이렇게 못 했지. 여자 안에 수염 있는 사진이 117장뿐이라 여자끼리 비교할 거리가 없었으니까. 미소는 남녀 모두에 웃는 사진이 있어서 같은 성별 안에서 비교하는 방법이 통한 거야.
토론 4. 순수한 노이즈를 한 번에 고치면 새 그림이 나오나
σ = 4 로 거의 다 지워진 그림도 고칠 줄 아는 디노이저가 있다. 순수한 노이즈를 넣고 한 번 고치면 새 숫자가 나오는가?

σ = 4 로 거의 다 지워진 그림도 고칠 줄 아는 디노이저가 있어요. 순수한 노이즈를 넣고 한 번 고치면 무엇이 나올까요?

디노이저는 망가진 그림을 숫자답게 고치니까, 노이즈를 고쳐도 숫자 같은 그림이 나오지 않을까요? 노이즈마다 다르니까 새 숫자가 하나씩요.

조건부 디노이징에서 σ 만 아는 디노이저로 σ = 4 그림을 고친 실험을 떠올려 봐요. 고친 결과는 어디에 가까웠어요?

원래 그림과는 46.89, 전체 평균 그림과는 7.70이요. 원래 그림보다 평균 그림에 여섯 배 넘게 가까워요.

σ = 4면 원래 그림이 거의 안 남으니까… 그 노이즈를 낳았을 수 있는 그림이 학습 그림 거의 전부네요. 그럼 제곱 오차로 배운 디노이저는 그 전부의 평균을 내놓고요. 노이즈를 바꿔 넣어도 후보가 거의 그대로니까 매번 비슷한 평균 그림이 나오겠어요.

그럼 문제 20의 몽타주는 어떻게 실제 얼굴 하나에 닿았죠?

얼굴형부터 하나 정해서 후보를 반으로 줄이고, 남은 후보에서 다음 특징을 정했어요. 한 번에 다 정하지 않고요.

디노이저도 그렇게 쓰면 되겠네요. σ = 4에서 고친 쪽으로 조금만 옮기면 큰 형태가 살짝 정해지고, 그다음 σ 를 줄여 고치면 후보가 줄어든 상태에서 평균을 내니까 덜 흐려지고요. 그렇게 거듭하면 마지막엔 후보가 하나쯤 남겠어요.

그래서 수리공이 큰 σ 에서 작은 σ 로 내려가며 조금씩 고쳤던 거구나.

직소 퍼즐을 맞출 때 조각을 한꺼번에 붙이지 않고 테두리부터 맞추는 거랑 비슷해. 큰 틀을 정해 두면 남은 조각이 들어갈 자리가 좁아지잖아.
혼동하기 쉬운 점
| 혼동하기 쉬운 생각 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 분류기의 확신 비율만 보고 생성이 잘된다고 봄 | 1 | 무슨 숫자가 나오는지의 비율도 본다. 상자에서 뽑은 잠재 변수는 확신은 높아도 0과 1로 쏠렸다 |
| 잠재 변수를 N(0, I) 안으로 모으면 그 둘레도 디코더가 배웠다고 봄 | 2 | 디코더는 학습 그림의 잠재 변수, 딱 그 점들만 본다. 0.1만 옮겨도 그림이 평균 두 배쯤 빨리 바뀌었다 |
| 인코더 분포를 넓히면 뽑은 그림 한 장 한 장이 흐려진다고 봄 | 토론 1 | 한 장은 여전히 또렷하다(회색 칸 20% 안팎). 흐려지는 것은 여러 그림을 겹친 평균이다 |
| 인코더 분포의 표준편차를 모든 그림에 같게 정하면 된다고 봄 | 4 | 이웃 숫자가 가까운 그림은 좁게, 여유 있는 그림은 넓게 잡아야 한다. 그래서 인코더가 그림마다 σ 를 내놓는다 |
| KL 발산은 두 분포의 자리를 바꿔도 같다고 봄 | 5 | 어느 분포로 평균 내느냐에 따라 값이 다르다 (0.0589 대 0.0566) |
| 사전분포는 데이터에서 구한 분포, 인코더 분포는 곧 사후분포라고 봄 | 6 | VAE 의 사전분포는 정해 둔 약속이고, 인코더 분포는 사후분포의 근사다 |
| 재구성만 보면 인코더 분포를 점으로 줄이는 것이 가장 좋다고 봄 | 7 | 점으로 줄면 이웃을 배우지 못하고 지도도 흩어진다. KL 이 인코더 분포를 점이 되지 않게 붙잡고 N(0, I) 안으로 모은다 |
| KL 항이 작을수록 좋은 VAE라고 봄 | 8 | KL이 0이면 잠재 변수가 그림에 대해 아무것도 알려 주지 않아 디코더가 평균 그림을 그린다 |
| 무작위로 뽑는 단계가 있으면 역전파가 지나가지 못한다고 봄 | 9 | 노이즈를 먼저 뽑아 고정하고 z = μ + σε 로 쓰면 μ, σ 로 미분된다 |
| 평균이 맞는 그래디언트 추정이면 어느 것이나 같다고 봄 | 토론 2 | 추정값의 분산이 다르다. 재파라미터화의 분산 8 대 로그 미분의 분산 74 |
| 재파라미터화는 어떤 잠재 변수에나 통한다고 봄 | 11 | 잠재 변수가 파라미터에 대해 매끄럽게 움직여야 한다. 동전처럼 0과 1만 갖는 잠재 변수는 그래디언트가 0이다 |
| ELBO가 올랐으니 모델이 좋아졌다고 봄 | 12 | ELBO는 로그우도가 오르거나 사후분포와의 KL 발산이 줄어도 오른다. 숫자 하나로는 둘을 가르지 못한다 |
| 사후분포를 q 로 쓰면 된다고 봄 | 13 | 사후분포를 구하려면 로그우도를 먼저 알아야 한다 |
| 샘플을 많이 쓰면 하한이 곧 로그우도가 된다고 봄 | 14 | 샘플을 인코더 분포에서 뽑으므로, 인코더 분포가 사후분포를 비껴 짚으면 한계가 남는다 |
| 칸마다 동전을 던지면 흐린 그림이 또렷해진다고 봄 | 15 | 칸마다 따로 던지면 외톨이 점이 생긴다. 칸들이 함께 움직이는 분포가 필요하다 |
| 조건을 받은 ELBO 를 조건 없는 ELBO 와 그대로 비교하거나, 조건을 한없이 주면 된다고 봄 | 16 | 조건을 고르는 로그 확률 log p(c) 를 더해야 공정하다. 조건을 잘게 나눌수록 log p(c) 가 비싸지고 조건마다 데이터가 줄며 다양성도 사라진다 |
| 속성이 있는 사진과 없는 사진의 평균 차를 그대로 한 속성의 효과로 봄 | 17, 토론 3 | 두 묶음의 다른 구성(성별 비율)이 차에 함께 들어간다. 같은 성별 안에서 비교한다 |
| 속성 벡터를 더하면 그 속성만 바뀐다고 보거나, 섞인 성분을 빼면 깨끗한 속성이 남는다고 봄 | 18 | 함께 붙어 다니는 속성의 차가 섞인다(수염과 남성의 코사인 0.935). 같은 성별 안에서 비교하거나 성분을 빼는 것은 그 성별 안에 속성이 있는 사진과 없는 사진이 다 있을 때만 통한다(수염 있는 여성 사진 117장) |
| 조건부 VAE 에 조건을 주면 그 속성이 반드시 그려진다고 봄 | 19 | 잠재 변수가 같은 정보를 이미 가지면 디코더는 조건을 덜 쓴다(안경 판정 0.0 → 0.5%) |
| 순수한 노이즈를 한 번에 고치면 새 그림이 나온다고 봄 | 20, 토론 4 | 한 번에 고치면 평균이 나온다. 큰 형태부터 조금씩 정해야 실제로 있을 법한 하나가 된다 |
| 출발점은 아무 데나 둬도 반복 디노이징이 데이터로 데려간다고 봄 | 21 | 디노이저는 스텝마다 지금 점이 그 단계의 σ 만큼 망가졌다고 믿고 고친다. 출발점은 그 크기의 노이즈여야 한다 |
| 학습 그림에서 오차가 0인 디노이저가 만들기에도 가장 좋다고 봄 | 22 | 학습 그림을 외운 디노이저는 학습 그림을 그대로 꺼낸다. 처음 보는 그림을 고칠 줄 아는 디노이저가 새 그림을 만든다 |
요약
오토인코더의 잠재 변수로 새 그림을 뽑기에는 한계가 둘 있었다. ① 학습한 잠재 변수들 사이(데이터의 중간 영역)에서 무엇을 그릴지 학습이 정하지 않았고, ② 잠재 변수가 어디에 놓일지 정하지 않아 무작위로 뽑을 곳을 몰랐다. 잠재 변수를 N(0, I) 안으로 모으는 페널티는 ②만 풀었다. 디코더는 학습 그림의 잠재 변수, 딱 그 점들만 배워서 조금만 옮겨도 그림이 빨리 무너졌다. ①은 점을 점 둘레의 작은 정규분포 N(μ, σ²)(인코더 분포 qφ(z ∣ x))으로 넓혀 푼다. σ = 0 인 정규분포가 점(디랙 델타)이고, 인코더가 내놓는 μ 와 σ 한 쌍이 그 그림의 잠재 표현이다. 학습 때 인코더 분포에서 뽑아 넣으면 디코더가 인코더 분포 전체를 그 그림으로 배워 조각면들이 지도를 덮는다. VAE는 인코더 분포들을 사전분포 N(0, I) 쪽으로 KL 발산만큼 당겨, 인코더 분포가 점으로 줄거나 흩어지지 않고 한데 모이게 해 ①과 ②를 함께 붙든다. 그러면 N(0, I)에서 아무 점이나 뽑아도 숫자가 나온다. 학습 안의 뽑기는 z = μ + σε 로 바꿔 써서(재파라미터화) 무작위를 ε 하나에 몰면 역전파가 지나간다. VAE의 손실은 로그우도 log pθ(x)의 하한인 ELBO = 재구성 항 − KL(q ‖ p(z))에 마이너스를 붙인 것이고, 로그우도와 ELBO의 차이는 인코더 분포와 참 사후분포 사이의 KL 발산이다(변분 추론). VAE 가 뽑은 그림은 흐리다. 조건을 더 주면(조건부 VAE) 조건 안에 남은 분산이 줄어 덜 흐려지고 ELBO 도 오르지만, 조건부 VAE 의 ELBO 는 조건을 받은 뒤의 log p(x ∣ c) 의 하한이라 조건을 고르는 로그 확률 log p(c) 를 따로 치러야 공정하게 비교할 수 있고, 칸마다 따로 던지는 디코더의 흐림은 남는다. 조건을 모델에 넣지 않고, 다 배운 잠재 공간에서 라벨 있는 그림과 없는 그림의 잠재 변수 평균의 차(속성 벡터)를 더해 속성을 바꿀 수도 있다. 라벨은 학습이 끝난 뒤에 적게 있으면 되지만, 데이터에서 함께 붙어 다니는 속성까지 끌려온다. 망가진 정도를 조건으로 받는 디노이저에 순수한 노이즈를 주고 한 번에 고치면 평균이 나오지만, σ 를 큰 값에서 작은 값으로 줄이며 고친 그림 쪽으로 조금씩 옮기기를 되풀이하면(반복 디노이징) 큰 형태부터 정해지며 새 그림이 만들어진다. 조건은 값을 사람이 정해 준 잠재 변수를 하나 더 둔 것과 같다. 조건을 사람 대신 모델이 스스로 만들게 하면, 반복 디노이징처럼 앞 스텝의 거친 그림이 다음 스텝의 조건이 되고, ELBO 는 스텝마다의 항을 더한 형태가 된다. 디퓨전 모델은 인코더를 노이즈 섞기로 고정한 VAE 로 읽을 수 있다.
flowchart LR L1["한계 ①<br/>학습한 점들 사이가 비어 있다"] --> D3["점을 인코더 분포로<br/>μ 와 σ 한 쌍"] L2["한계 ②<br/>뽑을 곳이 정해지지 않았다"] --> D2["점만 모으기<br/>②만 풀린다"] D2 --> E["VAE<br/>인코더 분포를 N(0, I) 안으로 모은다<br/>①②를 함께"] D3 --> E E --> F["재파라미터화<br/>z = μ + σε"] E --> G["ELBO<br/>로그우도의 하한"] E --> H["흐림<br/>조건을 줘도 남고, 조건은 log p(c) 를 치른다"] E --> I["속성 벡터<br/>함께 붙어 다니는 속성까지 끌려온다"] H --> J["반복 디노이징<br/>앞 스텝이 다음 스텝의 조건"]
정리 연습문제
물음. 오토인코더에 페널티를 붙여 잠재 변수를 N(0, I) 안으로 모았다. 이제 N(0, I)에서 아무 점이나 뽑아 디코더에 넣으면 숫자가 나오는가?
- [ ] 나온다. 잠재 변수를 모았으니 그 둘레도 디코더가 배웠다 〔틀림: 디코더는 학습 그림의 잠재 변수, 딱 그 점들만 본다. 조금만 옮겨도 그림이 빨리 무너진다.〕
- [x] 장담할 수 없다. 뽑을 곳은 정해졌지만 학습한 점들 사이는 여전히 비어 있다 〔맞음: 페널티는 뽑을 곳이 정해지지 않은 한계만 풀었다. 점들 사이에서 무엇을 그릴지는 아직 학습이 정하지 않았다.〕
- [ ] 나온다. 분류기가 높은 확신으로 숫자라고 판정하면 생성이 잘된 것이다 〔틀림: 무슨 숫자가 나오는지의 비율도 봐야 한다. 확신은 높아도 몇몇 숫자로 쏠릴 수 있다.〕
물음. VAE 손실의 KL 항이 하는 일로 맞는 것은?
- [x] 인코더 분포가 점으로 줄지 않게 붙잡고, 사전분포 N(0, I) 안으로 모은다 〔맞음: 점들 사이가 비는 한계와 뽑을 곳을 모르는 한계를 함께 붙든다.〕
- [ ] 작을수록 좋다. 0이 되면 가장 좋은 VAE다 〔틀림: KL 항이 0이면 잠재 변수가 그림에 대해 아무것도 알려 주지 않아, 디코더가 평균 그림을 그린다.〕
- [ ] 재구성을 돕도록 인코더 분포를 점으로 줄인다 〔틀림: 점으로 줄면 이웃을 배우지 못하고 지도도 흩어진다. KL 항은 점이 되지 않게 당긴다.〕
물음. VAE는 학습 안에서 인코더 분포로부터 잠재 변수를 뽑는다. 역전파는 이 뽑기를 지나갈 수 있는가?
- [ ] 지나가지 못한다. 무작위로 뽑는 단계는 미분할 수 없다 〔틀림: 노이즈를 먼저 뽑아 고정해 두고 평균에 표준편차와 노이즈의 곱을 더해 쓰면, 평균과 표준편차로 미분된다.〕
- [x] z = μ + σε 로 바꿔 쓰면 지나간다 〔맞음: 재파라미터화는 무작위를 노이즈 하나에 몰아 둔다. 노이즈는 상수처럼 두고 그래디언트는 평균과 표준편차로 흐른다.〕
- [ ] 바꿔 쓰기만 하면 어떤 잠재 변수에서나 지나간다 〔틀림: 잠재 변수가 파라미터에 대해 매끄럽게 움직여야 한다. 동전처럼 0과 1만 갖는 잠재 변수는 그래디언트가 0이다.〕
물음. 학습 중에 ELBO가 올랐다. 이것으로 알 수 있는 것은?
- [ ] 로그우도가 올랐다 〔틀림: 로그우도가 그대로여도 인코더 분포가 참 사후분포에 다가가면 ELBO가 오른다.〕
- [ ] 재구성 항이 올랐다 〔틀림: ELBO는 재구성 항에서 KL 항을 뺀 값이라, 재구성 항이 그대로여도 KL 항이 줄면 오른다.〕
- [x] 로그우도가 올랐거나, 인코더 분포와 참 사후분포 사이의 KL 발산이 줄었다 〔맞음: 로그우도와 ELBO의 차이가 그 KL 발산이다. ELBO 숫자 하나로는 둘을 가르지 못한다.〕
물음. 얼굴 그림 VAE에 조건을 점점 잘게 나눠 주었더니 조건부 VAE의 ELBO가 올랐다. 조건 없는 VAE보다 나은 모델이라고 해도 되는가?
- [ ] 된다. ELBO가 높을수록 나은 모델이다 〔틀림: 조건부 VAE의 ELBO는 조건을 받은 뒤의 하한이다. 두 ELBO는 같은 것을 재지 않는다.〕
- [ ] 된다. 조건을 한없이 잘게 주면 흐림도 남지 않는다 〔틀림: 칸마다 따로 던지는 디코더의 흐림은 조건을 줘도 남고, 조건을 잘게 나눌수록 다양성도 사라진다.〕
- [x] 조건을 고르는 로그 확률을 더한 뒤에 비교해야 공정하다 〔맞음: 조건을 잘게 나눌수록 조건을 고르는 로그 확률이 비싸지고, 조건마다의 데이터도 줄어든다.〕
물음. 망가진 정도를 조건으로 받는 디노이저로 새 그림을 만들려 한다. 어떻게 하는가?
- [ ] 순수한 노이즈를 가장 큰 노이즈 크기로 한 번에 고친다 〔틀림: 한 번에 고치면 그 노이즈에서 나올 수 있는 그림들의 평균이 나온다.〕
- [ ] 아무 그림에서나 출발해 고치기를 되풀이한다 〔틀림: 디노이저는 스텝마다 지금 그림이 그 단계의 노이즈 크기만큼 망가졌다고 믿고 고친다. 출발점은 그 크기의 노이즈여야 한다.〕
- [x] 순수한 노이즈에서 출발해 노이즈 크기를 큰 값에서 작은 값으로 줄이며 조금씩 고치기를 되풀이한다 〔맞음: 반복 디노이징이다. 큰 형태부터 정해지며 실제로 있을 법한 그림 하나가 된다.〕
막힌 곳
이제 새 그림을 뽑는 방법이 둘 생겼다. VAE 는 N(0, I)에서 잠재 변수를 뽑아 디코더가 784칸을 한 번에 그리고, 반복 디노이징은 순수한 노이즈에서 출발해 노이즈 크기를 줄여 가며 디노이저를 되풀이해 부른다. 조건을 더 세밀하게 주면 VAE 의 그림이 조금 선명해졌지만, 스타일 조건은 사람이 그림에서 재서 정해 주었고 조건의 로그 확률 log p(c) 를 따로 치러야 했다. 모델이 스스로 만든 조건인 반복 디노이징의 스텝들은 큰 형태부터 정하고 세부를 나중에 채웠다.
그런데 「흐리다」「큰 형태」「세부」는 아직 눈대중으로 쓴 말이다. 얼굴 사진을 되살린 그림에는 누구인지 알아볼 만한 형태는 남았지만, 안경테 같은 가는 무늬는 원래 사진의 14.5%만 남았다. 이 14.5%도 칸마다 이웃 칸과의 밝기 차로 대략 잰 값이었으니, 흐림이란 정확히 그림의 어떤 무늬를 잃은 것일까? 굵은 형태와 가는 무늬를 한 그림에서 떼어 내 각각 얼마나 들어 있는지 잴 수 있을까? 둥근 정도를 재려고 손으로 골랐던 곧은 획 필터도, 얼굴 사진을 학습할 때 속을 열지 않고 빌려 쓴 합성곱 층도 이웃한 칸들을 묶어 읽었다. 곧은 획 필터와 합성곱 층은 그림의 어떤 무늬를 보고 있었을까?