민프
[논문리뷰] GAN(Generative Adversarial Networks) (feat. 퍼셉트론, 다중퍼셉트론, MCMC, DBN, NCE 등..) 본문
[논문리뷰] GAN(Generative Adversarial Networks) (feat. 퍼셉트론, 다중퍼셉트론, MCMC, DBN, NCE 등..)
민프야 2024. 6. 11. 18:10
1. 소개
Generative : 생산하는
Adversarial : 두 당사자가 적대 관계에 있는
Networks : 연결망, 방송망
GAN의 뜻은 위 와 같습니다.
말 그대로 두 모델이 대립 or 경쟁하는 과정을 통해 추정하는 프레임워크를 설명해주고 있습니다.
하나는 데이터 분포를 포착하는 생성 모델 G(Generator),
다른 하나는 샘플이 훈련 데이터에서 온 것인지 생성 모델에서 온 것인지 확률을 추정하는 판별 모델 D(Discriminator) 입니다.
G의 훈련 절차는 D가 실수를 범할 확률을 최대화 하는 것 이라고 합니다
G는 D를 속이기 위해 최선을 다하고, D는 G가 만든 가짜 데이터를 식별하려고 합니다.
2. 관련 연구
여기에서는 GAN이 다른 기존 방법들(MCMC, DBN, NCE 등..)에 비해 갖는 장점과 이유가 나오는데요
MCMC(Markov Chain Monte Carlo)
- 샘플링 속도 문제
MCMC는 샘플을 생성하기 위해 마르코프 체인을 사용하며, 이는 수렴하는 데 시간이 오래 걸릴 수 있다고 합니다. 이로 인해서 충분한 품질의 샘플을 얻기 위해 많은 반복이 필요하다고 합니다.
이에 반해 GAN은 마르코프 체인을 사용하지 않고 단일 전방 전달(forward pass)로 직접 샘플을 생성할 수 있어서 훨씬 빠르게 생성할 수 있고, 수렴 속도도 빠르다고 합니다.
- 혼합 문제 (Mixing Issue)
MCMC 방법은 고차원 공간에서 혼합 속도가 느리며, 이 부분은 샘플의 다양성을 보장하는데 어려움을 주게 되는데
이에 반해 GAN은 이러한 혼합 문제 없이 고차원 공간에서 직접 샘플을 생성할 수 있다고 합니다
DBN(Deep Belief Network)
- 복잡한 학습 과정
DBN은 학습 과정에서 층별 사전 학습(pretraning)와 같은 복잡한 절차가 필요하여서 학습하는데 복잡하고 시간이 많이 걸리는 원인이 됩니다
이에 반해 GAN은 단일 네트워크에서 생성기와 판별기를 동시에 학습하기 때문에, 이러한 복잡한 사전 학습 과정이 필요하기 않습니다
- 마르코프 체인 사용
DBN도 샘플링을 위해 마르코프 체인을 사용하기 때문에 MCMC와 유사한 문제를 겪고 있는데
이에 반해 GAN은 마르코프 체인을 사용하지 않기 때문에 이와 관련된 문제에서 자유롭습니다
NCE(Noise-Contrastive Estimation)
- 고정된 노이즈 분포
NCE는 고정된 노이즈 분포를 사용하기 때문에 모델이 일정 수준 이상 학습되면 학습 속도가 급격히 느려질 수 있습니다. 이는 모델이 작은 부분집합의 변수에 대해 대략적으로 올바른 분포를 학습한 후 발생하는 문제입니다.
이에 반해 GAN는 노이즈를 생성기 입력으로 사용하여 지속적으로 변하는 샘플을 생성하므로, 학습이 느려지는 문제가 없습니다
- 학습 밀도의 명시적 표현 필요
NCE는 확률 밀도를 명시적으로 나타내야 하므로, 모델이 복잡해지면 이를 명시적으로 나타내는 것이 어려울 수 있습니다
이에 반해 GAN는 확률 밀도를 명시적으로 나타낼 필요가 없고, 단지 샘플을 생성하는 방법을 학습하면 되기 때문에 더 유연하게 적용할 수 있습니다
이러한 이유들로 인해 GAN은 기존의 생성 모델들에 비해 많은 장점을 가지며, 특히 고차원 데이터의 생성 및 학습에 더 적합하다고 평가를 받고 있습니다
자 그럼 이제 적대적 네트워크에 대해서 알아보겠습니다
3. Adversarial nets
논문 내용 서문에서 아래와 같은 문장이 있습니다
The adversarial modeling framework is most straightforward to apply when the models are both multilayer perceptrons.
위 문장은 해당 프레임워크는 모델이 모두 다층 퍼셉트론일 때 적용하기가 가장 간단하다고 하는 내용인데
GAN는 생성기(G), 판별기(D)가 서로 경쟁하며 학습하는 구조이고, 생성기는 판별기를 속이려고 하고, 판별기는 생성기를 이기려고 함으로써 두 모델 모두 성능이 향상이 되게 되는데 여기에서 생성기와 판별기가 다중 퍼셉트론(MLP)으로 구성될 떄 GAN의 기본 개념과 학습 과정을 이해하기 쉽다는 것을 의미합니다.
MLP를 사용하면 생성기와 판별기를 쉽게 구현하고, 역전파 알고리즘을 통해 효과적으로 학습할 수 있기 때문에 위 문장에서 MLP를 사용할 때 GAN을 가장 쉽게 적용할 수 있다고 언급 한 것 입니다
여기에서 나오는 퍼셉트론과 다층 퍼셉트론에 대해서 짧게 말씀드려보자면
(자세한건 나중에 블로그에 논문 분석 올려놓겠습니다)
- 퍼셉트론(Perceptron)
1957년 프랭크 로젠블렛(Frank Rosenblatt)이 개발한 모델로, 단일 뉴런으로 이루어져 있고, 인공지능과 기계학습에서 가장 기본적인 형태의 인공 신경망입니다. 퍼셉트론은 사람의 뇌 신경세포(neuron)의 동작과정을 흉내내어 만든 수학적 모델 입니다.
퍼셉트론은 입력값에 가중치를 곱한 후 합산하고, 그 결과를 활성화 함수(activation function)에 전달하여 출력을 생성합니다.
위 사진은 사람의 뇌 신경세포와 퍼셉트론의 동작과정을 나타낸 부분인데
퍼셉트론의 구성을 보면
- 입력 노드(input node) : 각 입력 변수에 해당합니다.
- 가중치(weight) : 각 입력 변수에 곱해지는 값으로, 학습을 통해 조정됩니다.
- 합산 함수(summation funcion) : 가중치가 곱해진 입력값을 모두 더합니다.
- 활성화 함수 (activation function) : 합산된 값을 출력으로 변환합니다. 주로 계단 함수 (step function)나 시그모이드 함수(sigmoid function)을 사용합니다
여기에서 활성화 함수(Actiation Function)가 언급되었는데 이 활성화 함수는 인공지능에서 기본이 되는 것 중 하나인데요 무엇인지 간단하게 알아보자면
- 활성화 함수(Activation Function)
활성화 함수는 인공지능 신경망에서 아주 중요한 역할을 하는데, 쉽게 설명하면 "결정 스위치" 와 같다고 생각하시면 쉬울 것 같네요
우리가 어떤 결정을 내릴 때, "예" 또는 "아니오"를 결정하는 것처럼, 활성화 함수도 신경망의 뉴런이 어떤 결과를 낼지 결정하게 됍니다
예를 들어서)
문을 여는 비밀번호 자물쇠를 생각해보면
- 입력 : 비밀번호 (예: 1234)
- 결과 : 자물쇠가 풀리거나 잠김
비밀번호가 맞다면 자물쇠가 풀리고, 틀리면 열리지 않거나 다시 잠기게 되죠. 이처럼 활성화 함수도 마찬가지로 어떤 숫자가 입력되었을 때 이 숫자가 특정 조건을 만족하는 지 판단하게 됍니다
여기에서 활성화 함수 종류를 보면
- 계단함수 (Step Function) : 스위치와 같이 입력이 특정 값을 넘으면 "켜짐(1)" 그렇지 않으면 "꺼짐(0)"으로 출력합니다.
- 시그모이드 함수 (Sigmoid Function) : 입력이 작을 때는 "꺼짐(0)"에 가깝고, 입력이 클 때는 "켜짐(1)"에 가까운 값을 출력하고, 중간값은 0에서 1사이의 값 입니다.
- 렐루 함수(ReLU Function) : 자동문을 생각해보면 사람이 앞에 서면 열리고, 사람이 없으면 닫혀있는 것 처럼 입력이 0보다 크면 그대로 출력하고, 0보다 작으면 0을 출력해주는 함수입니다
이렇게 활성화 함수는 신경망의 "결정 스위치" 역할을 하여서, 입력에 따라 적절한 출력을 결정하는 것을 담당하여서 신경망이 더 똑똑하고 유용하게 작동할 수 있도록 해줍니다
- 다층 퍼셉트론 (Multi layer perceptron)
다층 퍼셉트론(Multilayer Perceptron, MLP) 다층 퍼셉트론은 퍼셉트론을 여러 층(2개 이상)으로 쌓아 올린 신경망 구조입니다.
입력층(input layer), 은닉층(hidden layer), 출력층(output layer)으로 구성되어 있으며, 각 층은 여러 개의 뉴런으로 이루어져 있습니다.
구성 요소는 아래와 같습니다
- 입력층(input layer): 입력 데이터를 받는 층입니다.
- 은닉층(hidden layer): 입력층과 출력층 사이에 위치하며, 여러 층으로 구성될 수 있고, 은닉층의 뉴런들은 입력 데이터를 비선형적으로 변환합니다. 여기에서 은닉층이 1개만 있는 다층 퍼셉트론의 경우 "얕은 신경망(Shallow neural network)", 은닉층이 2개 이상인 경우를 깊은 신경망 (deep neural network)라고 하고, 이 깊은 신경망을 학습시키는 것을 딥러닝(deep learning)이라고 합니다.
- 출력층(output layer): 최종 출력을 생성하는 층입니다.
학습 방법
- 역전파 알고리즘(backpropagation): MLP는 오류 역전파 알고리즘을 사용하여 학습합니다. 이 알고리즘은 출력층에서 계산된 오류를 역방향으로 전달하여 각 층의 가중치를 조정합니다.
여기에서 역전파 알고리즘이란 쉽게 말해 인공지능 신경망이 "어떻게 더 똑똑해질까?"를 결정하는 방법인데요. 이건 마치 선생님이 시험을 보고 나서, 학생들이 틀린 문제를 이해하고 다시 공부하도록 돕는 것과 같습니다
조금 어렵게 이야기해보자면 다층 신경망에서 가중치를 학습하기 위한 핵심 알고리즘 입니다
조금 더 자세하게 아래 사진을 기준으로 역전파 알고리즘을 통한 신경망 학습의 동작순서를 설명해드리자면
1. 순전파(Forward Pass) : 먼저 입력층에서 출력층까지 순전파를 수행하여 출력을 계산하게 합니다
- input layer: x1, x2
- hidden layer : 은닉층의 각 뉴런에서 선형 변환(특징 추출,비선형성 도입(ReLU, Sigmoid, Tanh등..))을 수행하고 활성화 함수를 적용합니다
- output layer : 은닉층의 출력을 받아 출력층의 뉴런에서 계산합니다
2. 오류 계산 (Error Calcualtion) :
- output layer: 출력층의 출력 a1(2), a2(2)를 시레 목표값 y1, y2와 비교하여 오차를 계산하고, 각 출력에 대해 손실함수 L을 사용하여 총 손실을 구합니다
3. 역전파 (Backpropagation) : 출력층에서 입력층으로 오차를 역전파하여 각 가중치와 바이어스의 기울기를 계산합니다
- 출력층(output layer) : 출력층의 각 뉴런의 오차를 계산합니다
- 은닉층 (hidden layer) : 은닉층의 각 뉴런의 오차를 계산
4. 가중치 업데이트 (Weight Update) : 계산 된 기울기를 사용하여 경사 하강법을 통해 가중치와 바이어스를 업데이트 합니다
이 과정을 여러 번 반복하면서 신경망은 점점 더 정확한 예측을 할 수 있도록 학습 됩니다
설명은 여기까지 하고, GAN의 기본 아이디어는 생성 모델(G)과 판별 모델(D)로 구별되고, 이 둘은 상호 경쟁하는 방식으로 훈련되는데요
생성 모델 G는 랜덤 노이즈를 입력으로 받아 데이터를 생성하고, D는 해당 데이터가 진짜인지 가짜인지 판별합니다
G와 D는 아래와 같은 미니맥스 게임을 수행하는데요
미니 맥스 게임은 GAN의 핵심 아이디어인데요 이 게임을 통해서 생성기 (G)와 판별기 (D)가 서로 경쟁하면서 성능을 향상 시킵니다. 이 게임의 목적은 생성기(G)가 더 현실적인 데이터를 생성하도록 유도하고, 판별기(D)는 이를 더 잘 구분하도록 학습하는 것 입니다
위 공식에서 보면 D(x)는 데이터 x가 실제 데이터일 확률이고,
G(z)는 생성기가 랜덤 노이즈 z를 입력으로 받아 생성한 데이터 입니다.
Pdata(x)는 실제 데이터 분포이고,
Pz(z)는 생성기의 입력 노이즈 분포입니다
여기에서 판별기의 목적은
실제 데이터와 생성된 데이터를 최대한 잘 구별하려고 하는 것 이고,
생성기의 목적은
판별기를 속여서 생성된 데이터를 실제 데이터로 인식하게 만들려고 하는 것 입니다
결론적으로 미니맥스 게임을 통한 GAN 학습은 생성기와 판별기가 서로 경쟁하며 성능을 향상시키는 과정을 통해 고품질의 데이터를 생성할 수 있게 하고, 이를 통해 신경망 모델이 더 정교하고 다양한 데이터를 생성할 수 있게 되어, 많은 실제 응용 분야에서 큰 장점을 제공합니다.
4. 실험 (Experiments)
논문에서는 아래 사진과 같이 다양한 데이터셋(MINIST, Toronto Face Database, CIFAR-10)에서 GAN을 훈련시켰습니다
이렇듯 보시면 생성된 샘플들은 기존의 생성 모델들과 경쟁할 만한 품질을 보인 것을 확인하실 수 있습니다
이 와 같이 이번 논문을 읽어보면 GAN을 통해 생성 모델의 새로운 가능성을 열었다는 것과, 경쟁적 학습 방식은 다양한 응용 분야에서 효과적으로 활용될 수 있다는 것을 알게 되었습니다
참고 링크
https://arxiv.org/abs/1406.2661
https://compmath.korea.ac.kr/deeplearning/Perceptron.html
https://yhyun225.tistory.com/21
'[AI | ML]' 카테고리의 다른 글
[AI | ML] [분류기] Decision Tree (결정 트리)에 대해서 알아보자 (14) | 2024.10.23 |
---|---|
[AI | ML] [분류기] SVM (Support Vector Machine)에 대해서 알아보자 (4) | 2024.10.02 |
[AI | ML][분류기] K-Nearnest Neighbor 알고리즘 (KNN, k-최근접 이웃)에 대해서 알아보자 (2) | 2024.01.24 |
[AI | ML][HPE] BlazePose에 대해서 알아보자 (BlazePose: On-device Real-time Body Pose tracking 논문 리뷰) (0) | 2023.10.16 |
[AI | ML][HPE] MoveNet에 대해서 알아보자 (with Tensorflow Lite) (2) | 2023.10.16 |