2-2-2. AI는 창의력을 발휘할 수 있을까? - GAN
●GAN - Generative Adversarial Networks
Adversarial Networks
GAN은 두 개의 신경망으로 구성. 이 두개의 신경망이 서로 게임을 하면서 상대방으로 이기기위해 노력.
AI끼리 서로 싸우는 과정에서 양쪽 모두의 실력이 향상, 결과적으로 엄청난게 성능이 좋은 인공지능 탄생.
두 개의 신경망이 서로 적대적(adversarial)으로 경쟁하므로 이 기술 이름에 adversarial network라는 이름이 붙음.
Generative Networks
GAN은 새로운 데이터를 생성하는 생성적(generative) 인공지능.
GAN이 생성하는 이미지는 마치 사람이 제작한 데이터처럼 리얼함.
GAN 성능이 발달하면서 이제는 육안으로는 구분하기가 불가능에 가까워졌음.
Generator, Discriminator
GAN은 서로 적대하는 두 개의 신경망으로 구성.
이 두 개의 신경망을 각각 제너레이터(generator)와 디스크리미네이터(discriminator)라고 부름.
제너레이터는 이름 그대로 데이터를 생성하는 신경망.
디스크리미네이터는 구분하는 신경망. - 식별하다. 구분하다.
생성을 잘하는 인공지능과 구분을 잘하는 인공지능이 서로 싸우며 성장하는 것이 GAN의 기본 철학.
Generator의 구조와 역할
Generator의 핵심 기능은 데이터를 위조하는 것.
이 과정을 수학적으로 설명하면 'latent space(잠재 공간)의 변수를 데이터의 분포로 사상시키는 함수'
-> 노이즈를 입력받아 데이터를 출력하는 함수.
제너레이터의 입력층은 노이즈를 입력받고, 출력층에서는 데이터를 출력.
출력층의 형태는 위조하고자 하는 데이터의 형태와 동일하게 세팅.
초기에는 출력층에서 별 의미 없는 값들이 출력. 하지만 학습이 진행되면서 점점 더 좋은 위조 데이터가 출력도록 가중치가 수정.
Discriminator의 구조와 역할
디스크리미네이터의 구조는 평범한 CNN 분류 모델.
제너레이터가 생성한 위조 데이터와 실제 데이터를 입력받아 분류함.
학습이 진행될수록 위조 데이터와 실제 데이터를 잘 구분하도록 학습.
하지만 제너레이터의 성능이 어느 정도 높아져 위조 데이터와 셀제 데이터 사이에 큰 차이가 없는 수준이 된다면 디스크리미네이터는 더 이상 가짜와 진짜 데이터를 구분하지 못함.
GAN의 학습 과정
제너레이터 - 위조화폐 제조범 / 디스크리미네이터 - 경찰
제조범은 가짜 화폐를 만들어내지만 처음에는 많이 엉성/ 경찰 또한 구분하는 실력이 떨어짐.
서로 경쟁하면서 성장함. 초기에는 아무래도 경찰의 성능이 좋음.
이러다가 가짜 화폐가 진짜와 구분할 수 없을 정도로 성장. 경찰이 더 이상 구분하지 못하면 학습 종료.
이 과정이 GAN의 학습 과정.
이렇게 학습이 끝나면 디스크리미네이터는 버리고 제너레이터만 활용.
제너레이터에 latent space의 변수를 입력하면 진짜 같은 위조 데이터 생성.
●어떤 인공지능 생성?
Gan을 만들어 보자
이번에 활용할 알고리즘은 GAN의 일종인 DCGAN.
Deconvolutional Neural Network를 활용하여 노이즈를 이미지로 변환하는 것이 특징.
이미지 데이터를 간편하게 위조해 볼 수 있는 모델.
이미지는 0 ~ 1 까지가 아닌 -1 ~ 1 사이로 노멀라이즈.
MNIST, Fashion MNIST - 28 X 28 흑백 이미지 데이터, CIFAR10 - 32 X 32 컬러 이미지 데이터.
디스크리미네이터의 구조
2층 CNN, Flatten, FNN
층수 | 종류 | 크기 | 활성화 함수 |
1층 | CNN | 64, (5, 5), strides = (2, 2) | LeakyReLu |
- | Dropout | rate = 0.3 | - |
2층 | CNN | 128, (5, 5), strides = (2, 2) | LeakyReLu |
- | Dropout | rate = 0.3 | - |
3층 | Flatten | - | - |
4층 | FNN | 1 | - |
세 데이터 모두 2층 CNN, Flatten, FNN으로 구성된 디스크리미네이터를 활용.
CNN에는 드롭아웃 적용.
음수값 표현을 위해 활성화 함수로 리키렐루를 사용.
Stried는 CNN의 필터를 적용할 때 한번에 몇 칸씩 건너뛸지를 지정하는 값.
앞서 살펴본 CNN은 필터를 한 번에 한 칸씩 움직이면서 적용.
stried를 (2, 2)로 설정하면 필터를 한 번에 두 칸씩 움직이면서 적용.
결과적으로 이미지의 상당부분을 생략하고 건너뛰기 때문에 출력하는 이미지의 크기가 작아지는 효과.
stride를 조절하면 풀링 레이어를 생략할 수 있음.
제너레이터의 구조 - MNIST, Fashion MNIST
총 6층 구조 FNN으로 시작하여 DCNN으로 이어지는 구조.
층수 | 종류 | 크기 | 활성화 함수 |
1층 | FNN | 100 | - |
2층 | FNN | 12,544 | - |
- | BatchNorm | - | LeakyReLu |
3층 | Reshape | (7, 7, 256) | - |
4층 | DCNN | 128, (5, 5) | - |
- | BatchNorm | - | LeakyReLu |
5층 | DCNN | 64, (5, 5), strides = (2, 2) | - |
- | BatchNorm | - | LeakyReLu |
6층 | DCNN | 1, (5, 5), strides = (2, 2) | tanh |
입력층은 크기 100짜리 노이즈를 입력받기 위하여 크기를 100으로 설정.
3층의 Reshape 레이어는 Flatten()의 반대 연산. 일렬로 펼쳐진 퍼셉트론을 (7, 7, 256) 형태로 모양을 변형.
이 과정에서 일렬로 이어진 FNN 데이터가 DCNN을 적용하기 위한 이미지 형태로 변형.
DCNN은 앞서 살펴본 CNN의 반대 연산. CNN에서 strides를 적용하면 이미지 크기가 줄어들 듯, DCNN에서 strides를 적용하면 이미지 크기가 커짐.
활성화 함수로는 앞서 살펴본 리키 렐루를 활용. 출력층에서는 출력값을 -1 부터 1 사이로 고정하기 위하여 tanh를 활성화 함수로 사용.
제너레이터의 구조 - CIFAR10
층수 | 종류 | 크기 | 활성화 함수 |
1층 | FNN | 100 | - |
2층 | FNN | 1,024 | - |
- | BatchNorm | - | LeakyReLu |
3층 | Reshape | (2, 2, 256) | - |
4층 | DCNN | 256, (5, 5), strides = (2, 2) | - |
- | BatchNorm | - | LeakyReLu |
5층 | DCNN | 128, (5, 5), strides = (2, 2) | - |
- | BatchNorm | - | LeakyReLu |
6층 | DCNN | 64, (5, 5), strides = (2, 2) | - |
- | BatchNorm | - | LeakyReLu |
7층 | DCNN | 3, (5, 5), strides = (2, 2) | tanh |
CIFAR10은 앞서 본 이미지의 크기와 달리 32 X 32 로 더 크고, 컬러 이미지인 (32, 32, 3).
따라서 제너레이터의 모습도 다름. 제너레이터의 층수를 하나 더 늘려서 stride 연산을 적용하는 방식으로 이미지의 사이즈를 늘렸고, 출력층의 필터 개수를 3개로 설정하여 각각이 색상 표현을 위한 R, G, B 데이터를 표현할 수 있도록 만듦.
출력 결과물의 차원은 (32, 32, 3)으로 CIFAR10와 동일.
●딥러닝 코딩
- 라이브러리 불러오기
에포크는 각각 100, 200으로 설정
- GAN 모델 불러오기
저자가 생성한 모델 불러오기
●인공지능 학습
직접 전체 학습 과정을 볼 수 있음.
- MNIST
AI가 창의적으로 그린 손글씨. 30에포크에는 숫자처럼 보이는 형상이 나타남. 70에포크가 되니 대부분의 데이터가 확실히 숫자처럼 보임.
- Fashion MNIST
AI가 생성한 패션 의류 데이터. 30에포크에는 의상의 실루엣이 보임. 70에포크가 되니 대부분 의류의 형상과 무늬까지 또렷. 바지나 상의 등 종류를 알아 볼 수 있음. 로고까지 비슷하게 그림.
- CIFAR10
AI가 생성한 CIFAR10 데이터. 에포크가 지날수록 뭔가를 그리려고 시도.
CIFAR10는 비행기, 자동차, 새, 고양이, 사슴, 개, 개구리, 말, 선박, 트럭 총 10개 카테고리가 포함.
아직 더 개선해야 해당 데이터를 생성할 수 있을 거 같음.
너무 오래 걸려서 포기....
※
- GAN, 무서운 도구
GAN의 변종은 계속해서 개발 중.
딥페이크도 GAN의 응용.
이를 악용하는 사례가 많음. 그렇기 때문에 제대로 구분할 수 있는 AI기술 필요.
- 프로젝트 응용
GAN에서도 에포크를 무작정 늘리면 오버피팅이 발생하지 않을까?
'@@@ 인공지능 > 수학·통계를 몰라도 이해할 수 있는 쉬운 딥러닝' 카테고리의 다른 글
2 - 2. 이미지 학습 기법 활용하기(4) (0) | 2021.07.27 |
---|---|
2 - 2. 이미지 학습 기법 활용하기(3) (0) | 2021.07.26 |
2 - 2. 이미지 학습 기법 활용하기(1) (0) | 2021.07.17 |
2 - 1. 이미지 분류(Classification) 기법 활용하기(6) (0) | 2021.07.17 |
2 - 1. 이미지 분류(Classification) 기법 활용하기(5) (0) | 2021.07.17 |