VAE: 잠재 변수를 분포로 뽑아 그리기

속성 벡터: 다 배운 잠재 공간에서 방향 찾기

조건부 VAE 는 조건을 처음부터 모델에 넣었다. 학습 그림마다 라벨이 붙어 있어야 했고, 어떤 조건을 받을지도 학습 전에 정해야 했다. 학습이 끝난 뒤에 「안경도 바꿔 보고 싶다」는 생각이 들면 모델을 처음부터 다시 학습해야 한다.

다른 방법은 없을까? 조건 없는 VAE 도 학습하면서 그림들을 잠재 공간 곳곳에 늘어놓았으니, 손글씨 지도에서 같은 숫자의 잠재 변수끼리 모여 있던 것처럼 얼굴을 학습한 VAE 라면 안경 쓴 얼굴들의 잠재 변수도 잠재 공간의 어느 한 곳에 모여 있지 않을까? 그렇다면 안경 쓴 얼굴들이 모인 곳으로 가는 방향을 찾아 아무 얼굴의 잠재 변수에 더해 주기만 하면 안경이 씌워질지도 모른다. 이번에는 조건을 모델에 넣지 않고, 다 배운 잠재 공간 안에서 방향을 찾아본다. 잠재 변수 2칸짜리 손글씨 지도는 이런 실험을 하기에 너무 좁으니, 실제 얼굴 사진으로 해 본다.

역사: 「왕 − 남자 + 여자」에서 얼굴로

잠재 공간에서 덧셈·뺄셈을 하는 생각은 낱말에서 먼저 나왔다. 2013년 미콜로프(Tomas Mikolov)와 동료들이 학습한 단어 벡터에서는 「왕」의 벡터 − 「남자」의 벡터 + 「여자」의 벡터에 가장 가까운 단어가 「여왕」이었다.

2015년 래드퍼드(Alec Radford), 메츠(Luke Metz), 친탈라(Soumith Chintala)는 노이즈를 받아 얼굴 그림을 그리는 생성 모델(적대적 생성 신경망, 이 책에서는 다루지 않는다)의 입력 공간에서도 벡터 덧셈·뺄셈이 되는지 시험했다. 「안경 쓴 남자 − 안경 안 쓴 남자 + 안경 안 쓴 여자」를 넣자 안경 쓴 여자가 나왔고, 「웃는 여자 − 무표정한 여자 + 무표정한 남자」는 웃는 남자가 되었다. 이들이 적은 시행착오가 있다. 그림 한 장씩으로 계산하면 결과가 들쭉날쭉해서, 개념마다 그림 세 장의 입력 벡터를 평균 낸 뒤에 계산해야 결과가 안정되었다. 같은 덧셈·뺄셈을 픽셀에서 하면 얼굴이 겹쳐 보이는 흐린 그림만 나왔다.

「안경 쓴 남자 − 안경 안 쓴 남자 + 안경 안 쓴 여자」를 300번 계산한 결과를 두 축(안경 쪽, 남자 쪽) 평면에 찍은 장난감 그림. 개념마다 그림 한 장의 입력 벡터로 계산하면(왼쪽) 결과가 축마다 표준편차 0.60으로 흩어져 68%만 「안경 쓴 여자」 자리에 가장 가깝고, 세 장을 평균 내면(오른쪽) 0.35로 모여 87%가 맞게 떨어진다. 개념 자리와, 그림마다 입력 벡터가 개념 자리에서 벗어나는 표준편차(0.35)는 보기로 정한 값이다. 래드퍼드·메츠·친탈라(2015)가 적은 「한 장씩은 불안정, 세 장 평균은 안정」을 직접 그림. 스크립트 sources/vae/attr_h_history.py
「안경 쓴 남자 − 안경 안 쓴 남자 + 안경 안 쓴 여자」를 300번 계산한 결과를 두 축(안경 쪽, 남자 쪽) 평면에 찍은 장난감 그림. 개념마다 그림 한 장의 입력 벡터로 계산하면(왼쪽) 결과가 축마다 표준편차 0.60으로 흩어져 68%만 「안경 쓴 여자」 자리에 가장 가깝고, 세 장을 평균 내면(오른쪽) 0.35로 모여 87%가 맞게 떨어진다. 개념 자리와, 그림마다 입력 벡터가 개념 자리에서 벗어나는 표준편차(0.35)는 보기로 정한 값이다. 래드퍼드·메츠·친탈라(2015)가 적은 「한 장씩은 불안정, 세 장 평균은 안정」을 직접 그림. 스크립트 sources/vae/attr_h_history.py

그해 말 라르센(Anders Boesen Lindbo Larsen)과 동료들은 계산에 쓸 벡터를 라벨로 뽑았다. 얼굴 사진에 붙은 「안경」 같은 라벨로 그림을 둘로 나누고, 인코더가 내놓은 잠재 변수의 평균끼리 뺀 것이다. 그들도 이 방법이 「짙은 화장」과 「립스틱」처럼 함께 붙는 라벨에는 문제가 있다고 적었고, 남자 쪽으로 가는 벡터에 콧수염이 따라 나온다는 것을 그림으로 보였다. 이듬해 화이트(Tom White)는 사진 속 사람의 미소를 더하고 빼 주는 온라인 서비스를 열었다가 같은 문제를 겪었다. 데이터에서 여자가 남자보다 더 자주 웃고 있었기 때문에, 미소를 빼면 얼굴이 남자처럼 바뀌었다.

김민준 M01
김민준

안경 쓴 남자에서 안경 안 쓴 남자를 빼고 안경 안 쓴 여자를 더한다, 지금 보면 벡터 셋을 더하고 빼는 한 줄이잖아요. 그런데 왜 세 장씩 평균을 내야 겨우 됐어요?

선생님 T02
선생님

래드퍼드 팀은 「안경 쓴 남자」의 입력 벡터를 어디서 구했을까요? 그 모델은 노이즈를 받아 그림을 그리기만 했어요.

이서연 S01
이서연

음, 사진을 넣으면 입력 벡터를 돌려주는 장치가 없으니까… 노이즈를 잔뜩 넣어 그려 보고, 안경 쓴 남자처럼 보이는 그림이 나온 노이즈를 사람이 골랐겠네요.

선생님 T01
선생님

그래요. 그 세 장도 모델이 그린 그림 가운데서 고른 거예요. 실제 사진을 입력 공간으로 보내 주는 인코더가 그 모델에는 없었어요.

김민준 M04
김민준

아, 고른 그림이 세 장뿐이면 그 세 장에만 있는 머리 모양이나 배경도 벡터에 같이 들어가겠네요. 한 장으로는 들쭉날쭉할 수밖에 없었구나.

선생님 T01
선생님

라르센 팀의 모델에는 인코더가 있었어요. 그러면 무엇이 달라질까요?

이서연 S03
이서연

라벨 붙은 실제 사진을 인코더에 넣으면 되니까, 세 장이 아니라 라벨이 붙은 사진 전부로 평균을 낼 수 있어요. 잠깐, 그런데 그렇게 해도 「립스틱」과 「짙은 화장」은 같이 따라왔다고 했잖아요.

김민준 M03
김민준

사진을 많이 모으면 우연히 섞인 특징은 지워지는데, 데이터에서 늘 같이 붙어 다니는 건 안 지워지는 거네. 그럼 우리가 얼굴 사진 VAE 로 안경 벡터를 직접 뽑으면, 거기엔 무엇이 따라 들어올까요?

얼굴 사진으로 VAE 학습하기

데이터는 2015년 홍콩중문대의 류(Ziwei Liu)와 동료들이 모은 CelebA 다. 유명인 10,177명의 얼굴 사진 202,599장에, 사진마다 「안경」「남성」「수염 없음」「웃음」 같은 예/아니오 라벨 40개가 붙어 있다. 얼굴은 두 눈이 같은 자리에 오도록 맞춰 잘라 두었다. 이 데이터는 비상업 연구 목적으로만 쓸 수 있어서, 이 절의 사진과 그림도 비상업 연구 목적의 범위 안에서 싣는다. 사진을 가운데 148 × 148 칸으로 잘라 64 × 64 로 줄였고, 학습에는 162,770장, 확인에는 따로 떼어 둔 시험 사진 19,962장을 썼다.

모델은 손글씨에서 쓴 VAE 와 같은 구조다. 인코더가 사진 한 장을 받아 인코더 분포 N(μφ, σφ²)의 평균 μφ와 표준편차를 내놓고, 디코더가 64칸짜리 잠재 변수 z에서 사진을 되살린다. 손글씨 VAE 와 다른 점은 둘이다. 하나는 디코더가 칸마다 잉크 동전 대신 밝기의 평균을 내놓는 정규분포 디코더라 재구성 항이 제곱 오차가 된다는 것이다(표준편차 0.1). 다른 하나는 64 × 64 × 3 = 12,288칸을 MLP 처럼 한 줄로 늘어놓지 않고, 이웃한 칸들을 묶어 읽는 합성곱 층을 쌓았다는 것이다. 합성곱 층의 속은 아직 열지 않고 빌려 쓴다. 파라미터는 217만 개이고, 학습 사진을 30번 돌리는 데 GPU 하나로 5분쯤 걸렸다.

위: CelebA 시험 사진 8장(가운데를 잘라 64 × 64 로 줄인 것). 아래: 잠재 변수 64칸짜리 VAE 가 사진을 인코더에 넣었다가 인코더 분포의 평균 μ 를 디코더로 되살린 그림. 첫째·둘째 사진의 안경테처럼 가늘고 세밀한 부분이 흐려지거나 사라진다. 사진 자료: CelebA(Liu, Luo, Wang, Tang, ICCV 2015, 홍콩중문대 MMLAB, 비상업 연구 목적으로만 이용 가능).
위: CelebA 시험 사진 8장(가운데를 잘라 64 × 64 로 줄인 것). 아래: 잠재 변수 64칸짜리 VAE 가 사진을 인코더에 넣었다가 인코더 분포의 평균 μ 를 디코더로 되살린 그림. 첫째·둘째 사진의 안경테처럼 가늘고 세밀한 부분이 흐려지거나 사라진다. 사진 자료: CelebA(Liu, Luo, Wang, Tang, ICCV 2015, 홍콩중문대 MMLAB, 비상업 연구 목적으로만 이용 가능).

되살린 얼굴은 누구인지 알아볼 만하지만 흐리다. 시험 사진 2,000장에서 가는 무늬의 세기(칸마다 이웃 네 칸과의 밝기 차를 모은 값의 분산)는 원래 사진의 14.5%만 남았다. 손글씨에서 본 흐림이 얼굴에서도 나타난다.

라벨의 차이로 방향을 뽑는다

이제 라벨을 쓴다. 학습 사진 가운데 「안경」 라벨이 붙은 10,521장과 붙지 않은 152,249장을 각각 인코더에 넣어 인코더 분포의 평균 μφ를 모으고, 안경 쓴 사진들의 평균에서 안경 안 쓴 사진들의 평균을 뺀다. 이 평균의 차가 안경 쪽으로 가는 방향이다.

v속성=1N+∑속성 있음μϕ(x)  −  1N−∑속성 없음μϕ(x),z′=μϕ(x)+α v속성\textcolor{#1e694b}{v}_{\text{속성}} = \frac{1}{\textcolor{#3c4bff}{N_{+}}}\sum_{\text{속성 있음}} \textcolor{#87965a}{\mu_\phi}(\textcolor{#1b9e77}{x}) \;-\; \frac{1}{\textcolor{#3c4bff}{N_{-}}}\sum_{\text{속성 없음}} \textcolor{#87965a}{\mu_\phi}(\textcolor{#1b9e77}{x}), \qquad \textcolor{#8c564b}{z'} = \textcolor{#87965a}{\mu_\phi}(\textcolor{#1b9e77}{x}) + \textcolor{#008787}{\alpha}\,\textcolor{#1e694b}{v}_{\text{속성}}
v속성속성 벡터: 속성이 있는 사진들과 없는 사진들의 잠재 변수 평균의 차μϕ(x)사진 x를 넣었을 때 인코더 분포의 평균 (64칸)N+, N−속성이 있는 학습 사진과 없는 학습 사진의 수α세기: 속성 벡터를 몇 배 더하나 (음수면 뺀다)z′디코더에 넣을 바꾼 잠재 변수\begin{array}{ll} \textcolor{#1e694b}{v}_{\text{속성}} & \text{속성 벡터: 속성이 있는 사진들과 없는 사진들의 잠재 변수 평균의 차} \\ \textcolor{#87965a}{\mu_\phi}(\textcolor{#1b9e77}{x}) & \text{사진 x를 넣었을 때 인코더 분포의 평균 (64칸)} \\ \textcolor{#3c4bff}{N_{+}},\ \textcolor{#3c4bff}{N_{-}} & \text{속성이 있는 학습 사진과 없는 학습 사진의 수} \\ \textcolor{#008787}{\alpha} & \text{세기: 속성 벡터를 몇 배 더하나 (음수면 뺀다)} \\ \textcolor{#8c564b}{z'} & \text{디코더에 넣을 바꾼 잠재 변수} \end{array}

이렇게 뽑은 벡터를 속성 벡터 (attribute vector)라 한다. 학습이 이미 끝난 뒤라서 라벨은 평균 두 개를 낼 때 한 번 쓰일 뿐이고, 모델의 파라미터는 하나도 바뀌지 않는다. 이렇게 뽑은 안경 벡터의 길이는 2.03이다. 학습 사진의 μφ는 칸마다 표준편차가 약 1이니, 안경을 쓰고 안 쓰고의 차이는 잠재 공간에서 칸 두 개를 표준편차만큼 옮긴 정도의 거리다. 같은 방법으로 성별(「남성」 라벨), 수염(「수염 없음」 라벨의 반대), 미소(「웃음」 라벨) 벡터를 만들었다.

시험 사진 세 장(왼쪽부터 다섯 칸씩)의 잠재 변수에 속성 벡터를 세기 α = −1, 0, 1, 2, 3 으로 더해 되살린 그림. 테두리 친 칸이 α = 0, 곧 되살린 그림이다. 줄마다 안경, 성별(남성 쪽), 수염, 미소 벡터. 사진 자료: CelebA(비상업 연구 목적으로만 이용 가능).
시험 사진 세 장(왼쪽부터 다섯 칸씩)의 잠재 변수에 속성 벡터를 세기 α = −1, 0, 1, 2, 3 으로 더해 되살린 그림. 테두리 친 칸이 α = 0, 곧 되살린 그림이다. 줄마다 안경, 성별(남성 쪽), 수염, 미소 벡터. 사진 자료: CelebA(비상업 연구 목적으로만 이용 가능).

미소 벡터는 깔끔하게 들어서, 세기를 올리면 입꼬리가 올라가고 이가 보이고 빼면 무표정해진다. 안경 벡터는 α = 1 에서 얇은 테가 비치다가 α = 2 부터 짙은 선글라스가 된다. CelebA 의 「안경」 라벨에는 선글라스도 들어 있고, 무작위로 본 안경 쓴 여성 사진 열 장 가운데 일곱 장이 선글라스였다. 픽셀로는 눈가를 전부 검게 덮는 선글라스가 얇은 테보다 훨씬 큰 차이라, 평균의 차도 선글라스 쪽으로 끌려간다. 그리고 잘 보면 이름에 없는 것까지 바뀌는 벡터가 있는데, 무엇이 왜 함께 바뀌는지는 아래 문제에서 숫자로 따진다.

두 벡터가 얼마나 같은 쪽을 가리키는지는 길이를 뺀 각도, 곧 코사인 cos = (v1 · v2) / (‖v1‖ ‖v2‖)로 잰다. 1이면 같은 쪽, 0이면 직각, −1이면 반대쪽이다. 서로 아무 상관 없는 64칸 방향 둘을 무작위로 뽑으면 코사인의 크기는 평균 0.10, 크게 나와도(위 5%) 0.24 안쪽이다.

직접 움직여 보기얼굴의 속성 벡터크게 열기

ML에서: 학습이 끝난 모델을 고쳐 쓰기

속성 벡터는 모델을 다시 학습하지 않고 이미 있는 생성 모델의 출력을 손보는 방법이다. 화이트의 미소 서비스처럼, 학습한 사람과 쓰는 사람이 달라도 라벨 붙은 사진 몇 묶음만 있으면 새 속성 벡터를 만들어 속성을 바꿀 수 있다. 다만 속성 벡터가 정말 「그 속성 하나」만 움직이는지는 따로 확인해야 한다. 사람 눈 대신 그것을 재려고, 이 절에서는 실제 사진으로 따로 학습한 판정용 분류기(시험 사진에서 안경 99.5%, 남성 97.6%, 수염 95.6%, 웃음 92.6%를 맞힘)로 바꾼 그림을 판정했다.

문제 17. 안경 쓴 사람은 키가 크다?

어느 회사 직원 1,000명의 키를 조사했다. 남성 평균은 174cm, 여성 평균은 161cm이고, 남녀 모두 안경을 쓴 사람과 안 쓴 사람의 키 분포는 같다. 그런데 안경 쓴 직원은 80%가 남성이고, 안경 안 쓴 직원은 40%가 남성이다. (가) 「안경 쓴 직원의 평균 키 − 안경 안 쓴 직원의 평균 키」는 얼마인가? (나) 이 차를 「안경의 효과」라 할 수 있는가? (다) 안경 자체와 상관있는 차이만 보려면 어떻게 비교해야 하는가?

안경 쓴 직원(남성 80%, 여성 20%)과 안경 안 쓴 직원(남성 40%, 여성 60%)의 남녀 구성과 성별 평균 키 174cm, 161cm
안경 쓴 직원(남성 80%, 여성 20%)과 안경 안 쓴 직원(남성 40%, 여성 60%)의 남녀 구성과 성별 평균 키 174cm, 161cm
이서연 S01
이서연

계산부터 할게요. 안경 쓴 쪽이 0.8 × 174 + 0.2 × 161 = 171.4, 안 쓴 쪽이 0.4 × 174 + 0.6 × 161 = 166.2. 안경 쓴 직원이 5.2cm 커요.

김민준 M06
김민준

그런데 남자끼리 보면 안경을 쓰든 안 쓰든 174고, 여자끼리도 161이잖아. 안경이 키를 바꾼 데는 한 군데도 없는데.

선생님 T02
선생님

그럼 5.2cm 는 어디서 왔을까요?

이서연 S07
이서연

남녀 비율이요. 안경 쓴 직원 쪽에 남자 비율이 0.8 − 0.4 = 0.4 만큼 더 높고, 남녀 키 차가 13cm니까 0.4 × 13 = 5.2. 평균의 차가 전부 성별의 차예요.

김민준 M01
김민준

그럼 (나)는 「아니요」고, (다)는 같은 성별 안에서 안경 쓴 사람과 안 쓴 사람을 비교하면 되겠다. 남자끼리 차, 여자끼리 차를 각각 내면 둘 다 0이야.

문제 18. 수염 벡터 속의 남성

학습 사진에서 수염 있는 사진 26,991장 가운데 남성은 99.6%이고, 수염 있는 여성 사진은 117장뿐이다. 속성 벡터의 길이와 코사인은 아래와 같다(무관한 64칸 방향 둘의 코사인 크기는 평균 0.10).

길이 남성 벡터와의 코사인
수염 벡터(전체 사진으로) 1.78 0.935
수염 벡터(남성 사진끼리만) 0.97 0.44
안경 벡터(전체 사진으로) 2.03 0.41

(가) 코사인 0.935 는 무엇을 말하는가? (나) 수염 벡터에서 남성 벡터 방향의 성분을 빼면(사영을 빼면) 남는 길이는 얼마인가? (다) 아래 그림은 수염 없는 여성 사진에 두 가지 수염 벡터를 더한 결과다. 무엇이 예상과 다르고, 왜 그렇게 되었는가?

왼쪽: 속성 벡터끼리의 코사인. 가운데: 여성 시험 사진 둘에 전체 사진으로 만든 수염 벡터와 남성 사진끼리 만든 수염 벡터를 α = 0, 1, 2 로 더한 그림. 오른쪽: 수염 없는 여성 시험 사진 12,237장에 두 벡터를 더했을 때 판정용 분류기가 「수염 있음」「남성」으로 판정한 비율. 사진 자료: CelebA(비상업 연구 목적으로만 이용 가능).
왼쪽: 속성 벡터끼리의 코사인. 가운데: 여성 시험 사진 둘에 전체 사진으로 만든 수염 벡터와 남성 사진끼리 만든 수염 벡터를 α = 0, 1, 2 로 더한 그림. 오른쪽: 수염 없는 여성 시험 사진 12,237장에 두 벡터를 더했을 때 판정용 분류기가 「수염 있음」「남성」으로 판정한 비율. 사진 자료: CelebA(비상업 연구 목적으로만 이용 가능).

위젯 7 의 「문제 18 불러오기」를 누르면 여성 얼굴에 수염 벡터를 두 배로 더한 그림과 판정 비율을 볼 수 있다.

이서연 S01
이서연

(가)부터 볼게요. 무관한 두 방향이면 코사인 크기가 0.1 둘레인데, 0.935면 수염 벡터가 남성 벡터와 거의 겹쳐요.

김민준 M01
김민준

그래프에서도 α = 1 에서 남성 판정이 72.6%인데 수염 판정은 9.3%야. 수염을 더했는데 수염보다 남자가 먼저 와.

선생님 T01
선생님

왜 그렇게 됐을까요? 방금 문제 17(안경과 키)이랑 나란히 놓고 보면요.

김민준 M08
김민준

아, 똑같아요! 수염 있는 사진은 99.6%가 남자고 수염 없는 사진은 대부분 여자니까, 평균의 차에 성별의 차가 거의 다 들어가요. 안경 키 문제의 5.2cm 가 여기선 남성 쪽 성분이에요.

이서연 S01
이서연

(나)는 내가 할게. 남성 방향 단위벡터 쪽 성분은 1.78 × 0.935 이고, 남는 직각 성분의 길이는 1.78 × √(1 − 0.935²) ≈ 0.63이야. 수염 벡터 길이의 3분의 1 정도만 남성 방향과 직각이네.

선생님 T02
선생님

그럼 그 남은 부분, 혹은 남성 사진끼리만 비교한 수염 벡터를 여성 얼굴에 더하면 수염만 나겠네요?

이서연 S02
이서연

직각 성분은 남성 방향과 내적이 0이니까 성별과는 상관없는 부분이잖아요. 그걸 더하면 수염만 붙을 것 같아요.

김민준 M03
김민준

그림을 보면 남성끼리 만든 벡터는 α = 2 에서도 얼굴이 거의 안 바뀌어. 수염 판정 8.4%, 남성 판정 38.8%. 사영을 뺀 벡터는 스크립트로 해 보니까 α = 2 에서 수염 0.4%, 남성 7.3%야. 거의 아무것도 안 바뀌었어.

이서연 S04
이서연

성별은 빠졌는데 수염도 같이 사라졌네. 직각이라고 수염만 남는 게 아니었구나.

선생님 T14
선생님

수염 있는 여성 사진은 몇 장이었죠?

이서연 S08
이서연

117장이요. 모델은 여자 얼굴 자리 둘레에서 수염을 거의 본 적이 없어요. 남자들 사이에서 찾은 「수염 방향」이 여자 얼굴 자리에서도 수염 방향이라는 보장은 어디에도 없고요. 평균의 차는 데이터가 실제로 있는 곳에서만 뜻이 있네요.

선생님 T13
선생님

그래요. 키 문제에서는 같은 성별 안에서 비교하면 깔끔하게 0이 나왔어요. 남자 안에도 안경 쓴 사람과 안 쓴 사람이 충분히 있고, 여자 안에도 있었으니까요. 수염은 여자 안에 거의 없어요. 같은 성별 안에서 비교하는 방법은 그 성별 안에 속성이 있는 사진과 없는 사진이 다 있어야 써먹을 수 있어요. 위젯 7 에서 문제 18 설정을 불러와, 수염 벡터의 세기를 올릴 때 수염 판정과 남성 판정 막대가 어떤 차례로 오르는지 확인해 보세요.

위젯 7 · 문제 18 설정
위젯에서 열기: 위젯 7 · 문제 18 설정

문제 19. 조건부 VAE 와 속성 벡터

같은 몸통·잠재 변수 64칸으로, 안경·남성·수염·웃음 네 라벨을 인코더 끝과 디코더 입력에 이어 붙인 조건부 VAE 도 학습했다(조건이 없는 쪽과 같은 손실, 같은 학습 횟수). 안경 없는 여성 시험 사진 11,930장에 안경을 씌웠을 때 판정용 분류기의 판정 비율(%)은 아래와 같다.

안경 판정 남성 판정
속성 벡터: 바꾸기 전 → 안경 벡터 × 2 0.0 → 73.9 3.7 → 84.1
조건부 VAE: 제 라벨로 인코딩한 뒤 디코더에 준 안경 조건만 0 → 1 0.0 → 0.5 0.8 → 4.2
조건부 VAE: 사전분포에서 뽑은 잠재 변수 4,000개, 안경 조건만 0 → 1 0.0 → 5.2

안경 라벨이 붙은 학습 사진을 양쪽에서 n장씩만 골라 안경 벡터를 만들면, 전체로 만든 벡터와의 코사인은 n = 20 에서 0.62, 100 에서 0.87, 500 에서 0.97 이다(20번 평균). (가) 조건부 VAE 와 속성 벡터는 각각 라벨이 언제, 얼마나 필요한가? (나) 조건부 VAE 는 안경 조건을 받았는데도 왜 안경을 거의 씌우지 못했을까? (다) 조건부 VAE 와 속성 벡터 가운데 어느 쪽이 속성끼리 덜 얽히는가?

왼쪽: 안경 없는 여성 시험 사진에 세 방법으로 안경을 씌운 뒤의 안경 판정 비율(문제 상자의 표). 오른쪽: 양쪽에서 n장씩 골라 만든 안경 벡터와 전체 사진으로 만든 안경 벡터의 코사인(n = 20, 100, 500)
왼쪽: 안경 없는 여성 시험 사진에 세 방법으로 안경을 씌운 뒤의 안경 판정 비율(문제 상자의 표). 오른쪽: 양쪽에서 n장씩 골라 만든 안경 벡터와 전체 사진으로 만든 안경 벡터의 코사인(n = 20, 100, 500)

위젯 7 의 「문제 19 불러오기」를 누르면 여성 얼굴에 안경 벡터를 두 배로 더한 그림을 볼 수 있다.

김민준 M15
김민준

이거 진짜 재밌어요. 미소 두 칸, 안경 한 칸, 수염은 빼고… 슬라이더 네 개로 얼굴을 마음대로 조립하잖아요. 속성 라벨이 40개니까 속성 벡터를 40개 만들 수 있고요. 원하는 얼굴을 주문해서 받는 거예요!

이서연 S18
이서연

…실물이 바로 옆에 있는데, 상상한 얼굴을 만들어 내는 게 그렇게 좋아?

김민준 M01
김민준

응? 진짜 사진은 슬라이더가 없잖아. 바꿀 수가 없는데.

이서연 S01
이서연

…그렇지. 바꿀 수가 없지.

선생님 T14
선생님

속성 벡터를 마음대로 만들 수 있는지부터 따져 봐요. (가)부터요. 조건부 VAE 에는 라벨이 언제 필요했어요?

김민준 M01
김민준

학습할 때 사진마다 전부요. 16만 장 모두에 네 라벨이 붙어 있어야 했고, 다섯째 속성을 바꾸고 싶으면 처음부터 다시 학습해야 해요.

선생님 T01
선생님

속성 벡터는요? 문제 끝의 코사인을 봐요.

김민준 M03
김민준

속성 벡터는 학습이 끝난 뒤에 라벨이 필요하고… 양쪽 500장쯤이면 전체로 만든 것과 코사인 0.97이에요. 20장씩이면 0.62라 좀 불안하고요.

이서연 S01
이서연

래드퍼드 팀이 사진 한 장씩으로는 들쭉날쭉하고 세 장 평균을 내야 안정됐다는 게 이거구나. 평균 낼 사진이 적으면 그 사진들만의 우연한 특징이 같이 들어가.

선생님 T02
선생님

이제 (나)예요. 조건부 VAE 의 표가 이상하지 않아요? 안경 조건을 1로 줬는데 안경이 0.5%밖에 안 씌워졌어요.

김민준 M06
김민준

학습이 덜 됐나 했는데, 마지막 손실이 4,471로 조건 없는 VAE(4,499)와 거의 같아요. 디코더가 조건을 안 보는 것 같아요.

이서연 S02
이서연

인코더는 사진 전체를 보잖아. 안경을 썼는지는 사진에 다 있으니까 잠재 변수 64칸에 이미 들어가. 디코더 입장에서는 잠재 변수만 봐도 안경을 그릴 수 있으니까 조건 칸을 굳이 볼 필요가 없었던 거 아닐까.

선생님 T01
선생님

짐작을 숫자로 확인해 볼까요? 조건부 VAE 의 잠재 변수로도 안경 벡터를 만들어 보면요.

김민준 M01
김민준

해 봤어요. 길이가 1.55예요. 조건 없는 VAE 의 2.03보다 짧긴 한데, 그래도 꽤 길어요.

이서연 S07
이서연

그럼 잠재 변수에 안경이 여전히 크게 들어 있다는 거네.

선생님 T01
선생님

그럼 조건은 「안경 있음」인데 잠재 변수는 「안경 없음」을 가리키면, 디코더는 어느 쪽을 따를까요?

김민준 M08
김민준

잠재 변수요. 그래서 안 씌워졌구나. 사전분포에서 뽑은 잠재 변수에서도 5.2%뿐이고요.

선생님 T13
선생님

그래요. 흐림 절에서 조건은 사람이 값을 정해 준 잠재 변수를 하나 더 둔 것과 같다고 했죠. 같은 정보가 두 군데 들어갈 수 있으면 모델은 어느 쪽을 쓸지 스스로 골라요. 조건부 VAE 의 조건이 잘 들으려면 잠재 변수가 조건과 같은 정보를 갖지 못하게 하는 장치가 따로 필요해요. 이 실험은 그런 장치 없이 그대로 했고요. (다)는요?

이서연 S06
이서연

속성 벡터는 얽혀. 안경 벡터를 두 배 더하니까 남성 판정이 3.7%에서 84.1%가 됐어. 안경 쓴 사진의 79.5%가 남자니까, 문제 18(수염 벡터 속의 남성)과 같은 얽힘이 안경에서도 일어난 거야. 그러면 안경 쓴 여자 얼굴은…

김민준 M01
김민준

위젯에서 「안경 쓴 여성」을 고르면 되살린 그림부터 분류기가 남성 96%로 봐요. 이 분류기, 안경 쓴 여자를 잘 못 보네요.

이서연 S16
이서연

…분류기가 그런 거야, 분류기가.

선생님 T01
선생님

조건부 VAE 는 라벨 넷을 따로따로 받으니까, 적어도 「안경 = 1, 남성 = 0」을 함께 주문할 수는 있어요. 그런데 데이터에 그 조합이 적으면 모델이 그 조합을 잘 배웠다는 보장은 없어요. 여성 + 수염 조합은 117장뿐이었죠. 조건부 VAE 는 얽힘을 주문서에서 풀 수 있지만 데이터에 없는 조합까지 그려 주지는 않고, 속성 벡터는 라벨이 적어도 되지만 데이터가 함께 붙여 놓은 속성을 같이 끌고 와요. 두 방법 모두 결국 데이터에 있는 것만큼만 알아요.

선생님 T01
선생님

위젯 7 에서 문제 19 설정을 불러와, 안경 벡터를 두 배 더한 여성 얼굴에서 안경 판정과 남성 판정이 얼마나 함께 오르는지 직접 보세요.

위젯 7 · 문제 19 설정
위젯에서 열기: 위젯 7 · 문제 19 설정