티스토리 뷰

반응형

https://www.youtube.com/watch?v=3G5hWM6jqPk&list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI&index=4

 

GANs에 대해 너무 설명을 잘한 영상이라 가져왔다.

 

확실히 MIT 분들이 똑똑한 것 같다. 그래서 이 글은 GANs를 만드는 방법에 대한 요약이다.

 

머신러닝의 공식화

 

원래 머신 러닝은 지도학습과 비지도학습으로 나뉜다.

x 데이터, y는 라벨

 

그런데 비지도학습이라는 다른 것도 있다. 데이터 자체는 x로 주어지나, 라벨은 없다.

 

생성형 모델

여기서 목표가 중요하다.

생성형 모델의 목표는, Take as input training samples from some distribution and learn a model that represent that distribution.

즉, 훈련 샘플 데이터의 분포를 넣고, 그 분포를 나타낼 수 있는 모델을 학습하는 것이다.

 

생성형 모델이 보고 있는 데이터의 분포는 2가지로 나뉜다.

밀도 추정(Density Estimation)과 샘플 생성(sample gerneration)

 

밀도추정은 몇 가지 데이터를 주고, 데이터가 어디에서 왔는지를 추측할 수 있는 확률 밀도 함수를 학습하는 모델을 훈련하는 방식

 

샘플 생성은 밀도추정과 유사하지만 새로운 인스턴스를 생성하는 데 초점이 있다.

이 확률 분포 모델을 다시 학습하고, 해당 모델을 사용하여 샘플링하고 우리가 보았던 데이터와 비슷한 새 인스턴스를 생성하는 것.

 

목표는 명확하다. 이 생성된 샘플들을 진짜 데이터 분포와 비슷하도록 해당 확률 분포를 가지는 모델을 학습시키는 것.

 

이 정의를 이용하면, 실제 세계에서 생성형 모델을 적용할 수 있는 예제를 설명할 수 있다.

 

예제 : 얼굴 데이터 셋

얼굴 데이터 셋에서는 어떤 라벨을 기준으로(속눈썹, 눈의 모양, 입의 모양 등등) 구분해야 할지 모른다.

편향될 수 있는 경우가 많다.

 

그러나 라벨링 없이도 자동으로 이 분포를 식별할 수 있는 방법이 있다.

 

하지만 편향성이 많기에, 이 작업을 수행할 수 있는 생성 모델을 개발하고, bias(편향성)을 발견하고 진단하는 것이 소프트웨어 랩 경쟁의 일부가 될 것이다.

 

 

왜 생성형 모델인가?

이상치를 감지할 수 있다.

자율 주행 자동차가 만약 edge cases를 만난다면? 사슴이 나온다면?

 

생성 모델을 사용하면 밀도 추정이라는 아이디어를 사용하여 변칙적인 이벤트를 실제로 만들어 데이터로 만들 수 있다.

 

잠재 변수 모델(Latent variale models)

플라톤의 이데아에 빗대어 설명

잠재 변수는 직접 관찰되진 않지만, 관찰 가능한 데이터의 분포를 설명하는 데 있어 중요한 기능을 한다.

예를 들어, 소비자의 구매 이벤트는 발생하나, 소비자가 어떤 구매를 선호하는지는 숨겨져 있다.

 

이런 잠재 변수들로만 구성된 모델을 잠재 변수 모델이라고 한다.

잠재 변수 모델은 관찰된 데이터의 분포를 효과적으로 설명하고, 복잡한 패턴을 사용하는 데 널리 사용된다.

 

Autoencoders

우리가 이걸 인코더라 부르는 이유는 x 데이터를 z에 매핑하기 때문이다.

우리는 왜 저차원으로 만들어야 할까? -> 당연히 그게 효율적이기 때문이다.

 

저차원 잠재 공간을 만드는 건 작은 벡터로 압축할 수있다는 것이다.

따라서 이 잠재 변수를 학습하기 위해서는 네트워크를 실제로 어떻게 훈련시켜야 할까?

 

훈련 데이터가 없기 때문에 잠재 변수를 관찰할 수 없다.

결론적으로, 이 차원 축소된 잠재 변수를 디코딩하는 방법을 구축하는 것으로 신경망 레이어를 만든다.

이 과정에서 CNN과 같은 일련의 신경망 레이어를 사용할 수 있다.

 

이 생성된 이미지의 출력을 x hat(x^)이라고 하면, x hat은 입력 데이터의 불완전한 재구성이다.

그렇기에 우리가 해야할 일은, 이 출력된 데이터가 실제 데이터와 얼마나 차이나는지에 대한 오차를 구하는 것이다.

 

L(x,x^) = ||x(실제) - x^||^2

 

입력과 재구성된 요소의 거리 사이를 최소화한다.

예시 : 입력된 데이터와 재구성된 출력 사이의 픽셀별 차이 비교

 

여기서 중요한 건, 손실의 정의에서 레이블이 필요하지 않다는 것이다.

오직 손실의 비교는 입출력만 한다.

 

이 부분에서 비지도 학습의 아이디어로 들아가게 된다.

 

재구성의 품질

자동 인코딩은 압축의 한 형태이다.

따라서, 잠재 공간의 차원이 낮을수록 복구할 떄 재구성의 품질은 떨어진다.

그러나 반대로 인코딩의 차원이 높으면 인코딩의 효율성이 떨어진다.

 

그래서 나온 해결책이 VAEs

 

VAEs(Variational Autoencoders)

전통적인 자동 인코딩은 가중치가 업데이트 되면서 작동하는 신경망의 일반 레이어와 다를 바 없다.

즉, 전달할 때마다 가중치가 설졍되면 신경망을 훈련한 뒤에는 결정된다는 의미다.

 

즉, 모든 훈련 데이터셋에 대해 동일한 신경망을 적용한다.

 

대조적으로 변형 자동 인코더(VAEs)는 자동 인코딩 아이디어에 무작위성 요소를 도입한다.

확률론을 적용하여, 입력 데이터와는 유사하지만 실제로는 엄격하게 재구성되도록 강요하지는 않는다.

 

 mean vector와 standard deviation vector

 

어떻게 학습되는 지에 대한 추가적인 설명

구조가 확률적인 인코더와 디코더를 가진다.

 

그래서, 손실 함수는 (reconstruction loss) + (regularization term)이 된다.

모든 신경망 목표는 신경망 가중치를 최적화하는 것이다.

 

이 regularzaion term은 확률 분포가 있기 때문에 정규화의 일환으로 추론을 진행한다.

잠재 분포에서 사전 확률(prior probability)라고 부르는 걸 수행하도록 해야 하는 것이다.

 

그리고 사전 확률은 그 잠재 변수 공간이 어떻게 보일지에 대한 초기 가설이나 추측.

 

그리고 이건 신경망이 사전 분포를 대략적으로 따르게 할 수 있는 잠재 공간을 강제하는 데 도움이 된다.

P와 Z로 효현

 

이 P와 Z를 포함하는 D 정규화는 사실상 우리가 잠재 변수를 부호화하거나, 잠재공간의 구조를 어떻게 보아야 하는지에 대한 사전 확률 가설 사이의 거리를 포착하는 정규화 용어

 

따라서 훈련 과정에서는 각 잠재 변수가 이전과 유사한 확률 분포를 채택하도록 강제하려고 노력한다.

 

Priors on the latent distribution (잠재 분포에 대한 사전 확률)

인코딩을 할 때, 확률적으로 부드럽게 분산시켜서 그 분포에 대한 가우시안을 구한다.

보편적인 선택은 정규 가우시안 분포

p(z) = N(u=0 , 분산=1)

 

분산이 1인 이유는 신경망이 아무것도 하지 않고 그냥 치팅하는 걸 방지하기 위함이다.

 

prior가 표준 정규일 때 이를 K-L 다이버전스라고 부른다.

 

중요한 건, 공식이 아니고 이 시도를 하는 이유가 잠재 인코딩 간의 차이를 포착하려는 시도라는 개념이다.

 

왜 이런 사전 설정이 VAEs에 효과적으로 작동하는가?

 

1. 연속성 : 잠재 공간에 가까운 포인트일수록, 디코딩을 했을 때 이상적으로 비슷하다.

2. 완전성 : 샘플링의 목적 - 가까울 수록 디코딩을 했을 때 의미 있는 지표가 된다.

 

반대로 정규화하지 않으면 어떻게 되는가? 

잠재 공간에서 가깝지만 유사한 디코딩이 아닐 수 있다.

 

정규화를 통해 잠재 공간에서 연속적이고 완전한 결과를 얻을 수 있다.

또한 독립적인 잠재변수 분포 각각에 대한 분산을 정규화한다 (classification 효과도 얻을 수 있다.)

 

여기까지는 순전파

마지막 중요한 단계는 역전파를 어떻게 할 것인가?

 

Reparametrizing the Sampling layer

 역전파에는 완전히 결정적인 노드가 필요하다.

key idea = z~N(u,분산) 확률적인 건 못쓴다

샘플링 레이어로 다시 매개변수화하는 아이디어가 핵심이다.

 

재매개변화 대신 해당 레이어를 통해 직접 샘플링한다.

consider the sampled latent vector z as a sum of (샘플 잠재 벡터 z를 다음의 합으로 취한다)

  • a fixed u vector (고정된 뮤(기대값))
  • and a fixed 분산 vector : scaled by random constants(E) drawn from the prior distribution(여기선 가우시안)

z = u + 분산 다이버전스 E

 

여기서 중요한 개념은,

정규 분포에서 도출된 무작위 상수 엡실론에 대한 모든 샘플링을 수행한다는 것이다.

 

즉, 기대값 고정, 분산 고정, 표준 편차 고정이 되고, randomness와 샘플링은 엡실론 상수에 의존한다.

 

그 다음 해당 무작위 상수에 따라 평균과 표준 편차를 스케일링해서, 잠재 변수 내에서 샘플링 작업에 대해 다시 달성이 가능하다.

 

원래는 역전파에서 문제가 있지만, E의 개념을 가우시안 공식으로 따로 빼놓고, z함수 인코딩은 고정된 방식으로 하면 결정적이기 때문에 역전파가 가능하다.

 

VAEs : Latent perturbation

VAE를 할 때 다른 건 다 고정하고, 하나의 잠재변수만 조금씩 증가하거나 감소시킬 수 있다.

이걸 이해하면 재구성을 통해 독립적인 특징을 전부 조정하면서 뽑아낼 수 있다.

 

Standard VAE loss = reconstruction term + Regularizaion term

여기서, B(베타) 상수를 Regularizaion term에 추가함으로서 성립한다.

 

B-VAE loss = reconstruction term + B*Regularizaion term

 

베타는 얼마나 영향을 줄지를 결정하는 가중치 상수다.

베타의 값을 증가시키면서 변수가 서로 상관되지 않도록 (독립적으로) 되도록 할 수 있다.

수학적으로 가능하다.

 

베타를 크게 주면, 머리가 돌아갈 때 웃음의 변수는 바뀌지 않고 머리만 돌아가게 만들 수 있다.

즉, 다른 변수의 영향력을 줄여준다.

 

다음 강의 - 잠재 변수 학습이라는 아이디어를 사용하여 편향을 발견하고, 진달할 뿐만 아니라 얼굴 신경망에서 이러한 편향 중 모델에 해로운 걸 실제로 해결하고 완화할 수 있는 방법을 실현한다.

 

GANs(Generative Adversarial Network)

위의 기본 개념이 있는 상태에서, GANs가 적용된다.

 

idea : dont' explicitly model density, and instead just sample to generate new instances.

밀도도 명시적으로 모델링하기 싫다.

그러니 밀도 없이도 새로운 인스턴트를 생성하는 샘플링이 필요하다.

 

problem : want to sample from complex distribution - can't do this directly!

복잡한 분포에서 샘플 추출도 직접적으로는 불가능하다!

고차원적이기 때문

 

Solution : sample from something simple(noise), learn a transformation to the data distribution

아주 간단한 것으로부터(노이즈)로부터 샘플을 만들어서, 데이터의 분포와 비슷하게 되도록 훈련 한다!

 

생성기와 판별기

GAN는 노이즈로부터 만든 Fake를 만드는 생성기와, real 데이터와 fake 데이터를 받는 판별기가 있다.

 

짝퉁 생성과도 같다. 진짜 진퉁들 사이에 짝퉁 생성이 먹히게 하기 위해서는, fake를 최대한 정교하게 만들어야 하고, 그렇게 만들어진 fake가 통과하면 판정기에서는 그 fake를 진짜라 판단한 것이므로 출력으로 내보낸다.

 

이 과정이 한 번만 일어나는 게 아니라, 판별기 또한 판별을 강화한다.

그러면서 가짜는 더욱 정교해진다.

 

판별자의 목표는 진짜인지 가짜인지 알아내는 것이므로, 훈련이 진행될 수록 fake는 줄어든다.

그리고 생성기는 진짜 데이터가 어디에 있는지 보고, 진짜 데이터에 가깝도록 값을 옮겨간다.

 

이 과정은 확률을 조정하는 걸로 조정할 수 있다.

 

생성자와 판별자의 손실이 서로 상충(adversarial)되어야 한다.

 

판별자의 함수

arg maxD Ez,x [log D(G(z)) + log (1-D(x)) ]

 

log D(G(z)) = Fake 판별 추정치

log (1-D(x)) = Real 판별 추정치

 

위의 확률을 최대화하고 싶다.

 

생성자의 함수

arg minG Ez,x [log D(G(z)) + log (1-D(x)) ]

 

위의 확률을 최소화하고 싶다.

 

위 두개의 함수를 합친다.

 

arg minG  maxD Ez,x [log D(G(z)) + log (1-D(x)) ]

 

생성자는 노이즈로부터 생성된 랜덤 노이즈를 학습된 데이터 분포와 비슷하게 만드는 것이다.

 

GANs의 적용과 확장

학습 과정에서 점진적으로 레이어를 추가한 다음 생성된 예제를 개선한다.

 

네트워크 자체에 특정 레이블이나 세대를 넣고 싶은 경우엔?

Conditioning factor를 넣는다.

 

input을 다른 라벨링과 합쳐서, 새로운 개념을 생성하게 만든다.

스트리트 뷰와 공중뷰 간의 변환에도 사용할 수 있다.

 

CycleGan

한 도메인의 여러 이미지를 입력으로 사용하고, Target 도메인에서 소스 도메인에 해당하는 예제를 생성하도록 바꾼다.

말 도메인의 이미지를 얼룩말 도메인으로 바꾼다.

 

그리고 이 모든 예제는 일반적으로 분포 변형에 대한 아이디어다.

GANs는 가우시안의 노이즈에서 target data의 분포를 맞추지만

CycleGan은 배포 데이터의 X를 target data의 분포에 맞추는 것이다.

 

이는 이미지 뿐만 아니라 음성 및 오디오에도 적용이 가능하다.

ex) 오바마 대통령의 목소리 따라하기

반응형