조건과 ELBO

자주 하는 실수와 요약

자주 하는 실수

실수 나온 문제 바로잡는 법
칸마다 동전을 던지면 흐린 그림이 또렷해진다고 봄 1 칸마다 따로 던지면 외톨이 점이 생긴다. 칸들이 함께 움직이는 분포가 필요하다
조건을 받은 ELBO 를 조건 없는 ELBO 와 그대로 견주거나, 조건을 한없이 주면 된다고 봄 2 조건을 고르는 값 log p(c) 를 더해야 공정하다. 조건을 잘게 나눌수록 그 값이 비싸지고 조건마다 데이터가 줄며 다양성도 사라진다
두 무리의 평균 차를 그대로 한 속성의 효과로 봄 3 두 무리의 다른 구성(성별 비율)이 차에 함께 들어간다. 같은 성별 안에서 견준다
속성 벡터를 더하면 그 속성만 바뀐다고 보거나, 섞인 성분을 빼면 깨끗한 속성이 남는다고 봄 4 함께 붙어 다니는 속성의 차가 섞인다(수염과 남성의 코사인 0.935). 같은 무리 안에서 견주거나 성분을 빼는 것은 그 무리 안에 두 경우가 다 있을 때만 통한다(수염 있는 여성 사진 117장)
조건부 VAE 에 조건을 주면 그 속성이 반드시 그려진다고 봄 5 잠재 변수가 같은 정보를 이미 가지면 디코더는 조건을 덜 쓴다(안경 판정 0.0 → 0.5%)

요약

VAE 가 뽑은 그림은 흐리다. 조건을 더 주면(조건부 VAE) 조건 안에 남은 흩어짐이 줄어 덜 흐려지고 ELBO 도 오르지만, 그 ELBO 는 조건을 받은 뒤의 바닥이라 조건을 고르는 값 log p(c) 를 따로 치러야 공정하게 견줄 수 있고, 칸마다 따로 던지는 디코더의 흐림은 남는다. 조건은 값을 사람이 정해 준 잠재 변수를 하나 더 둔 것과 같다. 그 조건을 사람 대신 모델이 스스로 만들게 하면, 수리공의 걸음처럼 앞 걸음의 거친 그림이 다음 걸음의 조건이 되고, 바닥은 걸음마다의 항을 더한 꼴이 된다. 디퓨전 모델은 인코더를 잡음 섞기로 고정한 VAE 로 읽을 수 있다. 조건을 모델에 넣지 않고, 다 배운 잠재 공간에서 라벨 있는 그림과 없는 그림의 잠재 변수 평균의 차(속성 벡터)를 더해 속성을 바꿀 수도 있다. 라벨은 학습이 끝난 뒤에 적게 있으면 되지만, 데이터에서 함께 붙어 다니는 속성까지 끌려온다.

flowchart LR
  A["VAE 의 그림은 흐리다"] --> B["조건부 VAE<br/>라벨·생김새를 조건으로"]
  B --> C["조건 안의 흩어짐이 줄어<br/>조금 선명해진다"]
  B --> D["조건을 받은 ELBO<br/>log p(c) 를 따로 치른다"]
  D --> E["조건 = 사람이 값을 정한 잠재 변수"]
  E --> F["모델이 만든 조건<br/>수리공의 걸음, 걸음마다의 항을 더한 ELBO"]
  A --> G["속성 벡터<br/>다 배운 잠재 공간에서 방향 찾기"]
  G --> H["함께 붙어 다니는 속성까지 끌려온다"]

막힌 곳

조건을 더 세밀하게 주면 그림이 조금 선명해졌지만, 그 조건은 사람이 그림에서 재서 정해 주었고 값을 따로 치러야 했다. 모델이 스스로 만든 조건, 곧 수리공의 걸음은 큰 꼴부터 정하고 세부를 나중에 채웠다.

그런데 「흐리다」「큰 꼴」「세부」는 아직 눈대중으로 쓴 말이다. 얼굴 사진을 되살린 그림에는 누구인지 알아볼 만한 꼴은 남았지만, 안경테 같은 가는 무늬는 원래 사진의 14.5%만 남았다. 이 14.5%도 칸마다 이웃 칸과의 밝기 차로 어림한 값이었다. 흐림이란 정확히 그림의 어떤 무늬를 잃은 것일까? 굵은 꼴과 가는 무늬를 한 그림에서 떼어 내 각각 얼마나 들어 있는지 잴 수 있을까? 둥근 정도를 재려고 손으로 골랐던 곧은 획 필터도, 얼굴 사진을 학습할 때 속을 열지 않고 빌려 쓴 그림용 부품도 이웃한 칸들을 묶어 읽었다. 그것들은 그림의 어떤 무늬를 보고 있었을까?