* 구현 코드만 확인하고 싶은 경우 맨 아래의 깃허브 링크를 참조.

 

1. Competetion 개요

3년전 캐글에 올라온 주제인 Real and Fake Face Detection이라는 competition이 있다. 소셜 네트워크를 사용할 때 가짜 신분을 사용하는 사람이 있고 이를 탐지하여 WWW을 더 나은 곳으로 만들자는 것이 이 competition의 목적이다.

 

Competetion의 핵심 task는 크게 아래 2가지를 탐지하는 것이다. 

 

1. 데이터셋 내에서 변조된 얼굴 이미지변조되지 않은 얼굴 이미지분류하는 것

 

2. 만약 얼굴 이미지가 변조되었다면 변조된 영역분류하는 것

 

변조된 영역은 아래와 같이 네 부분으로 나뉜다. 왼쪽 눈, 오른쪽 눈, 코, 입이다. 

 

 

2. 데이터셋 구성 및 특징

데이터셋의 경우 포토샵 전문가가 변조/합성한 얼굴 이미지와 변조/합성하지 않은 얼굴 이미지로 구성되어 있다. 이렇게 포토샵으로 만들어진 데이터셋의 경우 GAN 기반의 데이터셋과 비교가될 수 있다. 이 데이터셋을 만든 배경은 GAN으로만은 충분하지 않다는 것이다. GAN은 Fake 이미지를 생성하기 쉬울 뿐더러 포토샵 전문가가 만드는 것과 GAN이 만드는 메커니즘 자체가 다르기 때문에 GAN이 학습한 패턴은 무의미할 수 있다는 것이다.

 

데이터셋 폴더 구성은 아래와 같다. 

 

 

데이터셋은 크게 두 개로 훈련 데이터셋(real_and_fake_face_detection)과 테스트 데이터셋(real_and_fake_face)으로 구성되어 있고, 이는 다시 각각 합성 이미지(training_fake)와 원본 이미지(training_real)로 구성되어 있다. 특히 합성 이미지의 경우 난이도가 크게 3가지로 easy, mid, hard로 나뉜 것이 특징이며 아래와 같이 mid 난이도만 되어도 시각적으로 합성 여부 탐지가 어려운 것이 특징이다.

 

mid_389_1101.jpg

 

라벨링된 이미지를 확인하던 도중 아래와 같이 라벨링이 잘못되어 있어 학습에 사용하기 어려운 이미지를 확인하였고, 따라서 아래의 해당 이미지는 학습에서 제외하였다. 

 

라벨링 오류 데이터셋 (easy_116_111.jpg)

 

따라서 본 Task를 수행하기 위해 아래와 같이 총 4,080장의 데이터셋을 이용하였다.

구분 폴더명 장수 중합 총합
train training_fake 959장 2,040장 4,080장
training_real 1,081장
test training_fake 959장 2,040장
training_real 1,081장

 

캐글에서 배포하는 이 데이터셋에서 아쉬운 점은 크게 두 가지가 있는데 첫 번째는 폴더 구성이 그다지 직관적이지 않다는 것이며, 두 번째는 training set과 test set이 동일한 데이터셋으로 구성되었다는 것이다. 그러다 보니 결과적으로 높은 성능이 나오기 쉬운 구조다. 하지만 본 데이터셋을 통해 캐글에 처음 입문하는 케이스로는 해볼만 하다고 판단된다. 

 

 

 

 

3. 관련 연구

관련 연구를 찾기 위해 SOTA (State Of the Art) 연구를 모아둔 Paperswithcode라는 사이트에서 fake face detection과 관련된 자료를 찾던 도중 아래와 같은 연구를 확인할 수 있었다.

논문을 리뷰해본 결과 위 연구에서 사용하는 데이터셋이 GAN으로 만들어진 것이 아니라 본 competition과 동일하게 포토샵 기반의 데이터셋을 이용하는 것을 확인하였다. 

 

 

위 연구에서 실험을 위해 OpenImage와 Flickr에서 데이터셋을 마련하였으며 크게 변조되지 않은 이미지와 변조된 이미지로 구성하여 훈련, 검증, 테스트 셋으로 나누었다. 변조된 이미지의 변조 방법의 경우 Random FAL(일종의 변조 자동화 포토샵 스크립트)과 Pro Artist가 변조하는 방법을 사용하였다. 

 

저자는 실험을 위해 크게 두 가지 모델을 만들었다. 이는 얼굴이 합성되었는지를 여부를 식별하는 글로벌 분류 모델과 합성된 위치를 예측하는 로컬 분류 모델이다. 따라서 위 연구를 기반으로 본 competetion에서도 합성 탐지 여부 모델과 합성 부위 예측 모델을 만들었다.

 

저자들은 실험을 위해 ImageNet 데이터셋으로부터 Pretrained된 DRN(Dialted Residual Network)의 변형인 DRN-C-26 모델을 사용하였다. 이를 통해 얻은 실험 결과는 다음과 같다.

 

 

저자들은 모델에 대해 스크립트를 통해 랜덤으로 변조한 Random FAL 방식과 프로 아티스트가 변조한 Professional Artist 방식에 대해 모델의 성능을 측정하였다. 성능 측정 결과, 고해상도의 인풋이 들어가면 더 높은 성능을 보이는 것을 확인하였다. 또한 augmentation이 없이 학습된 것이 더 뛰어난 것을 보였으나 augmentation을 적용한 것이 반대로 조금 더 모델이 robust한 결과를 보인다 하였다.

 

4. 모델 구현

4.1 원본/합성 판별 모델

위 관련 연구의 실험에 기반하여 이미지의 원본/합성 판별을 위한 모델과 합성된 위치를 예측하는 모델로 크게 두 개를 구현하였다. Pretrained Model을 사용하지 않고 학습을 위해 두 모델 모두 이미지 처리에 효율적이라 판단되는 Convolution Neural Network를 사용하였다.

 

4.1.1 레이어 구성

원본/합성 판별 모델 (syn_detect_model)

모델에 입력되는 이미지의 사이즈는 원본의 경우 600x600이나 원본 그대로 모델 학습시켜본 결과 시간이 오래 걸린다는 단점이 있어 300x300으로 축소하여 모델의 Input으로 지정하였다. 이후 Convolution 2D, Max Pooling, Batch Normalization, flatten, Dense 레이어로 모델을 구성하였고 출력 부분에는 sigmoid 함수를 통해 이진 분류가 가능하도록 하였다.

 

4.1.2 모델 학습 결과

 

학습 초반에는 위와 같이 loss 값이 0.9013, accuracy 0.5162로 시작하는 것을 확인할 수 있었고, 학습 종료 시점에는 아래와 같이 loss 값이 0.0479, accuracy가 0.9931임을 확인할 수 있었다. 또한 추가적인 다른 metric을 통해서도 학습이 전반적으로 잘 이루어지는 것을 확인할 수 있었다.

 

4.2 합성 위치 예측 모델

4.2.1 레이어 구성

합성 위치 예측 모델 (loc_detect_model)

합성 위치 예측 모델 또한 원본/합성 탐지 모델과 거의 동일한 구조를 가지고 있다. 차이점은 학습 과정에서 빠른 과적합이 이루어지는 것을 확인하였다. 따라서 Dropout 레이어를 추가하였고 출력 부분에는 라벨을 15개로 지정하여 softmax 함수를 통해 출력되도록 하였다. 라벨에 대한 구체적인 내용은 실험 부분에 기술하였다.

 

4.2.2 모델 학습 결과

학습 종료 시점에 아래와 같이 loss 값이 0.0586, accuracy가 0.9875임을 확인할 수 있었고 추가적인 다른 metric을 통해서 학습이 전반적으로 잘 이루어져 있음을 확인할 수 있었다.

 

 

5. 실험

5.1 원본/합성 판별 모델

5.1.1 이미지 어그멘테이션 (Image Augmentation)

어그멘테이션을 진행하지 않고 원본/합성 탐지 모델을 학습한 결과 충분한 성능이 도출되지 않았다. 때문에 어그멘테이션 작업을 필요로 했고 아래와 같은 옵션을 사용하여 어그멘테이션을 진행하였다.

 

구분 옵션 비고
훈련 데이터셋 horizontal_flip True 수평 플립
vertical_flip False 수직 플립
shear_range 0.2 기울기 비율
zoom_range 0.2 확대 비율
rescale 1/255. 이미지 스케일링
테스트 데이터셋 rescale 1/255. 이미지 스케일링
validation_split 0.2 훈련/평가 분할 비율

 

모델의 Robustness를 위해 수평 플립을 True로 설정하였고 기울기와 확대 비율에 대해 주로 사용되는 값인 0.2를 설정하였다. 또한 훈련 데이터셋과 테스트 데이터셋에 대해 각각 이미지 스케일링을 적용하였고 테스트 데이터셋에 대해서는 0.2 비율로 평가와 테스트 데이터셋으로 나누었다. 어그멘테이션 옵션을 적용한 결과는 다음과 같다.

 

 

Training 데이터셋 2,040장 Validation 데이터셋 1,633장 Test 데이터셋 407장에 대해 어그멘테이션을 진행하였다.

 

5.1.2 모델 레이어 구성

 

6개의 Convolution 2D 레이어와 3개의 Maxpooling 2D 레이어, 그리고 3개의 Batch Normalization 레이어를 구성하고 출력부분에는 활성화 함수로 sigmoid를 사용하여 합성 여부를 탐지할 수 있도록 만들었다. Dropout의 경우 모델이 과적합되지 않아, 별도로 적용하지 않았다. 모델의 옵티마이저는 RMSProp을 사용하였고 learning rate 값으로 0.00001을 사용하였다.

 

모델 구성의 순서에서 CS231n 강의 기준으로 Conv2D → BatchNorm → MaxPool2D 순으로 쌓는 것이 적합하다 하였으나 Conv2D → MaxPool2D → BatchNorm 형태로 구성하는 것이 더 학습 성능이 좋은 것을 실험적으로 확인하였다.

 

 

5.1.3 모델 학습 결과

100회의 에폭을 통해 학습한 결과는 아래와 같다.

학습 과정

Early Stop을 적용하여 58번째 에폭에서 종료되었고, 점진적으로 loss가 줄고, accuracy가 증가하는 양상을 확인할 수 있었다. 부가적으로 precision, recall, auc에 대한 평가 metric을 추가하여 확인할 수 있도록 하였다. 학습된 모델에 대해 validation set으로 평가한 결과 아래와 같다.

 

 

결과 값으로 Loss값 5.6%, Accuracy값 98.7%, Precision 99.4%, Recall 98.0%, AUC 99.9%을 확인할 수 있다.

 

또한 별도의 인퍼런스 모듈을 생성하여 아래와 같이 확인하였다.

Inference 과정

 

최종적으로 합성 여부 탐지를 위해 Test 데이터셋의 모든 fake 이미지를 넣은 결과 위와 같이 대부분의 이미지가 올바르게 Inference되는 것을 확인할 수 있고, 일부 Real로 오분류 되는 것 또한 확인할 수 있다. Inference를 통해 최종적인 F1 Score의 경우 98.8%의 성능을 보임을 확인하였다.

 

F1 Score

 

5.1.4 손실함수 및 정확도 그래프 시각화

 

모델 학습의 초반부에 변화가 심한 양상을 보이기도 하나 점차 변화 폭이 좁아지면서 안정적으로 학습되는 것을 확인할 수 있다. Loss는 약 0.9에서 시작하여 0.05까지 줄어들며, Accuracy는 약 0.55부터 시작하여 0.99에 근접하게 학습되는 것을 확인할 수 있다.

 

5.2 합성 위치 예측 모델

5.2.1 데이터 프레임 생성

합성 여부와 달리 합성 위치에 대한 예측 모델을 만들기 위해서는 별도의 formal한 구조로 만들어 두어야 학습에 용이할 것이라 판단되어 아래와 같이 판다스(Pandas) 라이브러리를 이용하여 데이터프레임을 생성하였다.

Dataframe 생성

파일 이름의 합성 부위를 나타내는 4자리의 숫자만 추출하여 각각의 필드로 나타내었다. 특이한점은 label이라는 컬럼을 만들었는데 이는 기존 left_eye, right_eye, nose, mouth와 같이 별개의 컬럼을 라벨로 지정하여 학습을 시도한 결과, 방법론을 잘못 적용한 것인지 학습 결과가 좋지 않았다. 마지막 레이어에 sigmoid 또는 softmax로 Unit을 4로 설정하여도 학습 결과가 미미한 것을 확인하였다. 전반적으로 모델 설계 방식에 대한 방법론 조사를 시도했으나 크게 찾지 못하였다. 하지만 조사 도중 일부 예시에서 위와 같이 개개 별로 나누는 것이 아닌 하나로 통합하여 라벨로 두는 방법을 찾아 있는 것을 확인하였고, 이를 적용하였더니 학습 결과가 개선되는 것을 확인할 수 있었다.

 

5.2.2 이미지 어그멘테이션 (Image Augmentation)

합성 여부 탐지 모델과 달리 변조 부위 탐지 모델의 경우 합성된 이미지만 사용해야 했기에 충분한 학습을 위해 이미지 어그멘테이션 작업을 진행하였다. 다음은 이미지 어그멘테이션을 위해 사용한 옵션의 종류와 값을 나타내었다.

 

구분 옵션 비고
학습 데이터셋 horizontal_flip False 수평 플립
vertical_flip False 수직 플립
shear_range 0.2 기울기 비율
zoom_range 0.2 확대 비율
테스트 데이터셋 validation_split 0.2 훈련/평가 분할 비율

 

왼쪽 눈과 오른쪽 눈의 예측 위치가 바뀌어선 되지 않기에 수평 플립을 False로 주었고, 적은 데이터셋이기에 학습 데이터셋의 일부를 수직 플립하는 옵션 또한 False로 적용하였다. 나머지 옵션인 기울기, 확대, 분할 비율의 경우 일반적으로 0.2를 설정한다고 판단하여 값을 설정하였다.

 

Training Set의 경우 총 959개를 사용하였고, Validation Set과 Test Set은 0.2 비율로 각각 768개, 191개로 나누어 어그멘테이션을 진행하였다.

 

5.2.3 모델 레이어 구성 (Model Layer Structure)

 

합성 여부 탐지 모델과 동일하게 레이어를 구성하였으며 달라진 부분은 출력 부분에 합성의 경우의 수인 15가지에 대해 softmax 함수를 적용한 것이다. 15가지는 합성 부위 별로 나올 수 있는 경우의 수인 $2^4$에서 합성되지 않은 0000에 대한 경우를 제외한 것이다. 또한 Dropout 레이어를 추가하여 학습이 과적합 되지 않도록 하였다. Dropout을 0.1로 모두 적용하여 진행한 결과 적용하지 않은 것과 비슷하게 대부분의 평가 메트릭에서 99%대를 확인할 수 있었고, Dropout을 0.2로 적용한 결과 조금 더 느슨하게 학습되는 것을 확인할 수 있었다. 다음은 모델학습 결과이다.

 

5.2.4 모델 학습 결과

모델 학습 결과 (epoch: 61 종료)

 

61번째 에폭에서 Early stop이 적용되어 종료되었다. 점진적으로 loss가 줄고, accuracy가 증가하는 양상을 확인할 수 있었고, 부가적으로 precision, recall, auc에 대한 평가 metric을 추가하여 확인할 수 있도록 하였다. (그림의 가시성을 위해 val_precision, val_recall, val_auc 정보를 담지 않았다) 모델에 대해 Validation Set을 사용하여 평가한 결과 다음과 같다.

 

모델 Evaluation 결과

모델 성능 평가 결과 값으로 Loss 값 16%, Accuracy 값 96.9%, Precision 99.0%, Recall 94.0%, AUC 99.9%를 확인할 수 있다. 다음으로 학습한 합성 부위 예측 탐지 모델에 대해 합성 이미지 전체를 입력으로 넣어 추론을 진행하는 과정을 아래와 같이 진행하였다.

 

Inference 진행 과정

0 ~ 15사이의 값을 0001, 0010, 0011 ~ 1111 값으로 딕셔너리로 아래와 같이 매핑 해두었다.

 

 

실제 합성 이미지가 들어 갔을 때 실제 값과 예측 값을 출력하였으며 만약 다를 경우 Fail이라는 문자열을 출력하도록 하여 구분하도록 하였다. 올바르게 합성 부위를 탐지한 결과의 경우 부위를 합성 부위를 True/False로 표현하여 확인할 수 있도록 하였다. 전체 959장의 합성 이미지에서 Inference를 통해 F1 Score를 계산한 결과는 다음과 같다.

 

 

Inference 진행 결과, F1 Score 97.0%로 학습이 매우 잘 이루어졌음을 확인할 수 있다.

 

5.2.5 손실함수 및 정확도 그래프 시각화

 

합성 여부 탐지 모델과 달리 초반 변화폭이 큰 양상이 없으며 전반적으로 loss 값이 줄어들고 accuracy가 증가하는 추세를 확인할 수 있다. 이와 같은 추세와 F1 Score를 통해 모델 학습 잘 이루어졌음을 알 수 있다.

 

코드: https://github.com/roytravel/fake-face-detection/

 

[1] 『Detecting Photoshopped Faces by Scripting Photoshop』 - ICCV 2019

우분투에 아나콘다 환경을 설치하는 법에 대해 간단 정리하려 합니다. 윈도우에는 자주 설치하였으나 점점 머신러닝/딥러닝 환경을 우분투에 구축할 필요성을 느껴 기록용으로 작성합니다.

 

Anaconda를 설치하기 위한 과정은 크게 5가지 밖에 없어 간단합니다. (셸스크립트 다운, 실행, 설치경로설정, 환경변수 설정/적용, conda 자동 실행 off)

 

1. 설치 셸 스크립트 다운로드

wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh

wget을 통해 아나콘다를 설치할 수 있는 셸 스크립트를 가져와줍니다. 실행할 경우 아래와 같이 다운로드 되는 것을 확인할 수 있습니다.

 

만약 더 최신버전으로 받고 싶을 경우 아나콘다 홈페이지 https://www.anaconda.com/products/individual에 들어가줍니다. 이후 맨 아래로 스크롤을 내리면 우분투 설치가 보입니다. 

 

마우스 오른쪽을 눌러주고 URL을 복사해서 wget에 입력해주시면 됩니다.

 

2. 설치 셸 스크립트 실행

sh Anaconda3-2021.05-Linux-x86_64.sh

이후 아래와 같이 설치 진행 화면이 보이면 Enter를 입력하고 Space를 계속 눌러 줍니다.

 

 

3. 아나콘다 설치 경로 설정

다음은 설치 경로를 지정하는 것인데 Default로 사용자 계정 바로 아래에 설치하는 것이니 Enter를 쳐줍니다. 필요시 원하는 경로를 입력해주시면 됩니다.

 

 

4. 환경변수 등록 및 적용

이후 환경변수에 등록할 것을 묻습니다. yes로 입력해줍니다.

 

 

yes를 입력해주면 환경변수가 등록되었습니다. 이제 등록과는 별개로 적용을 해주어야 합니다.

source ~/.bashrc 명령을 통해 적용해줍니다.

 

 

5. conda 자동실행 off

conda config --set auto_activate_base false

단순히 환경변수 적용만하고 나면 앞으로 자동으로 conda의 base라는 이름의 환경이 켜집니다. 따라서 우리가 원할때만 활성화 할 수 있도록 자동 활성화를 꺼줍니다.

 

 

아나콘다 설치가 완료되었습니다.

 

 

Reference

[1] https://thinmug.tistory.com/51

자연어처리 프로젝트 진행 도중 우분투에 딥러닝 학습 환경을 만들 필요성이 생겼고 설치 과정을 정리하여 이후에 참고하고자합니다. 먼저 우분투에 딥러닝 환경 설치하는 방법에 대해서는 https://webnautes.tistory.com/1428에서 참조하였습니다. 참조한 블로그의 포스팅과 차이점은 핵심만 추려 간소화한 것입니다.

 

딥러닝 환경을 구성하기 위해서는 크게 3가지가 필요하다.

 

1. NVIDIA 드라이버

2. CUDA

3. cuDNN

 

이를 위해 아래의 명령어를 순차적으로 실행하면 된다.

 

우분투 최신 환경 유지

sudo apt-get update

sudo apt-get upgrade

 

현재 사용중인 그래픽카드에 설치할 수 있는 드라이버 목록 확인

ubuntu-drivers devices

 

* 만약 ubuntu: command not found 에러가 발생한다면 아래와 같이 관련 패키지 설치를 우선하면 된다.

sudo apt-get install -y ubuntu-drivers-common

 

 

결과로 확인된 driver 중 하나를 설치하며, 가급적 recommended라 표시된 것을 설치한다. 설치 이후 적용을 위해서 재부팅이 필요함.

 

만약 명령어의 결과값이 위 처럼 나오지 않고 출력값이 없을 경우 그래픽카드가 올바르게 연결되어 있지 않은 것이므로 연결을 잘 확인해야 함.

 

NVIDIA 드라이버 설치

sudo apt-get install nvidia-driver-470

nvidia-smi

 

Driver Version으로부터 설치한 드라이버 버전인 470을 확인할 수 있음

 

https://developer.nvidia.com/cuda-toolkit-archive에 접속해서 CUDA Toolkit 11.4.2를 클릭. 이후 아래와 같이 Linux, x64_64, Ubuntu, 20.04, deb(local)를 선택. (각자 환경에 적합한 것으로 선택)

 

선택 이후 아래의 명령을 확인할 수 있고 터미널에 아래의 명령어를 입력

 

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

(낮은 버전에서는 위 그림보다 더 간소화된 설치 command를 제공한다. 그 때 설치 에러가 발생한다면 sudo apt-get install gcc를 통해서 gcc를 설치하면 된다)

 

CUDA Toolkit 관련 설정을 환경 변수에 추가 후 적용

sudo sh -c "echo 'export PATH=$PATH:/usr/local/cuda-11.4/bin' >> /etc/profile"

sudo sh -c "echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.4/lib64' >> /etc/profile"

sudo sh -c "echo 'export CUDADIR=/usr/local/cuda-11.4' >> /etc/profile"

source /etc/profile

 

버전이 다르다면 위 명령어에서 11.4 말고 설치한 버전만 바꾸어 입력하면 된다.

 

cuDNN 다운로드

https://developer.nvidia.com/cudnn 에 접속하여 Download cuDNN 클릭 후 로그인. 이후 Download cuDNN v8.2.4 ~ for CUDA 11.4를 선택하여 다운로드

 

cuDNN 파일 압축해제 및 파일 복사

cd Downloads

tar -xvzf cudnn-11.4-linux-x64-v8.2.4.15.tgz

sudo cp cuda/include/cudnn* /usr/local/cuda/include

sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64

sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

 

 

cuDNN 파일 심볼릭 링크 설정

sudo ln -sf /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.1.0 /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_adv_train.so.8

sudo ln -sf /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.1.0  /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8

sudo ln -sf /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.1.0  /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8

sudo ln -sf /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.1.0  /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8

sudo ln -sf /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.1.0  /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_ops_train.so.8

sudo ln -sf /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.1.0 /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8

sudo ln -sf /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn.so.8.1.0  /usr/local/cuda-11.4/targets/x86_64-linux/lib/libcudnn.so.8

 

마찬가지로 버전이 다르다면 11.4를 설치한 버전으로 바꾸면 된다.

 

새로 추가된 라이브러리를 시스템에서 찾을 수 있도록 함

sudo ldconfig

 

 

루트 디렉터리로 이동

cd

 

 

링크 설정이 정확하게 되었는지 확인

ldconfig -N -v \$(sed 's/:/ /' <<< $LD_LIBRARY_PATH) 2>/dev/null | grep libcudnn

위와 같이 8.2.4가 보여야 함.

 

여기까지하면 딥러닝 환경 설치에 필요한 NVIDIA 드라이버, CUDA Toolkit, cuDNN 설치를 완료한 것임.

 

실제로 GPU가 학습에 사용될 수 있는지 여부를 확인하기 위해서는 추가적으로 텐서플로우를 설치.

 

pip3 install tensorflow

이후 위의 tf.config.list_physical_devices("GPU")를 통해 successful이 보인다면 정상적으로 학습에 사용할 수 있음. 끝.

 

 

설치 자체는 위 명령어들만 입력해주면 간단하게 설치되어서 문제 없었음. 하지만 도중에 그래픽 카드 낮은 성능인거 확인하고 다른 그래픽카드로 갈아끼우는데 애먹어서 힘들었음. 그래픽 카드 장착 해제하기 위해서 멈치 찾고 누르는게 어찌나 어렵던지... 갈아끼우고 나서 ubuntu-drivers devices 명령어 입력 했을 때 결과가 출력되지 않아서 당황도 했음. PCI 선을 꼽지 않아서 그래픽 카드에 연결이 되지 않았던 것임. 그래서 연결하려고 PCI 선 하나 꼽았다가 비프음 4번 나는거 듣고 파워 부족이라는거 보고 PCI 선 다 넣어주고 켰더니 이번엔 비프음 5번 또 발생함. 그래픽카드와 모니터가 연결안되어서 발생하는 문제였음. 그래서 올드한 VGA 케이블에서 HDMI로 바꾸니까 됐음. 연구실 사람들 도움 받아서 하긴했는데 멈치가 망가짐 아닌 망가지긴 했음. 무튼 다음에는 삽질을 좀 덜할 수 있을 것으로 보임

 

 

Reference

[1] https://webnautes.tistory.com/1428

한 줄 핵심 요약: 렌즈에서 반드시 왜곡이 생기며 영상처리를 위해선 왜곡을 보정해줄 수 있는 카메라 캘리브레이션(camera calibration) 과정을 거쳐야 한다.

 

1. 핀홀 카메라 모델


영상처리 분야에서 영상에 대한 모든 기하학적 해석은 핀홀 카메라 모델을 바탕으로 이루어진다. 핀홀이란 종이에 핀으로 뚫은 구멍처럼 매우 작은 구멍을 뜻한다. 핀홀 카메라는 바늘구멍 사진기라고도 한다. 렌즈를 사용하지 않고 작은 구멍을 통해 빛을 받아 들여 촬영하는 사진기로, 간단하게 제작이 가능해 교육용으로 쓰이기도 한다. 핀홀 카메라 모델은 물체에 반사된 빛이 우리 수정체를 거쳐 망막에 도달하는 구조를 가장 잘나타난 모델이라 할 수 있다. 하지만 매우 이상적인 모델이기 때문에 실제로는 렌즈의 특성에 따른 영상 왜곡 문제도 함께 고려해야 한다.

핀홀 카메라 예시

 

1.1 핀홀 카메라와 일반 카메라

1.1.1 핀홀 카메라

핀홀 카메라 모델의 단점은 빛이 아주 작은 구멍을 거쳐 오기 때문에 빛을 모아서 영상을 만들기에는 많은 시간이 걸린다는 점이다. 반대로 장점은 정확한 영상을 얻을 수 있다.

 

1.1.2 일반 카메라

핀홀 카메라는 빛을 모으는데 오랜 시간이 걸리기 때문에 핀홀 카메라를 사용하지 않고, 일반적인 카메라를 사용한다. 일반 카메라의 장점은 핀홀대신 렌즈를 사용하기 때문에 빛을 잘 모아서 영상을 빠르게 만들 수 있다는 장점이 있다. 하지만 단점은 렌즈를 사용하기 때문에 왜곡이 발생해 영상이 손상되다는 점이다. 따라서 일반 카메라에서 렌즈의 왜곡을 줄여주는 작업이 필요로 하게 된다.

 

1.2 핀홀 카메라 구조

간단한 구조이다. 일반 카메라와 비교해서 핀홀 평면은 카메라의 렌즈라고 생각하면 되고, X는 실제 물체라고 생각하면 된다. 영상평면은 물체가 핀홀 평면를 통해 들어온 빛이 맺혀 영상이 만들어지는 곳이라고 생각하면 된다. 물체에서 반사된 빛 중 하나의 광선 핀홀을 통과하게 된다. 핀홀을 통과한 광선은 영상평면에 투영되어 영상이 맺히게 된다. 이 때 영상평면에 맺히는 물체의 크기는 핀홀카메라의 초점거리에 의해 결정된다.

이를 수식으로 나타내면 위와 같이 $ -x = f({X \over Z})$ 가 된다.

 

 

  • f: 핀홀 카메라 초점거리
  • z: 카메라와 물체 사이 거리
  • X: 실제 물체 크기
  • x: 영상내의 물체 크기

 

1.3 핀홀 카메라 모델의 특징 및 한계점

핀홀 카메라 모델은 영상과 관련해서 3차원 기하 모델을 얻을 수 있다. 하지만 적은 양의 빛(광선)만 핀홀을 통과하기 때문에 영상을 구성하기 위해서는 충분한 빛을 받아들일 수 있는 시간이 많이 필요하다. 빠르게 영상을 생성하기 위해서는 넓은 영역으로부터 빛을 모아야 하고, 빛이 투영점에 수렴하도록 굴절시켜야 한다. 이런 작업을 수행하기 위해 일반적으로 렌즈를 사용하게 된다. 즉, 렌즈는 한 번에 많은 빛을 모아줌으로써 빠른 영상 획득을 가능하게 한다. 

 

1.4 렌즈의 특징 및 한계점

왜곡 없는 렌즈는 없다. 렌즈 왜곡은 제조 과정에서 발생한다. 수학적으로 이상적인 포물선 렌즈보다 구면 렌즈를 만드는 것이 더 쉽기 때문이며, 렌즈와 영상 센서를 완벽하게 정렬하는 것도 쉽지 않기 때문이다. 렌즈의 왜곡률이 적을 수록 비싼 렌즈(카메라)가 된다. 하지만 이러한 왜곡을 오히려 이용한 어안렌즈라는 것을 사용하기도 한다.

어안렌즈 예시

 

이러한 렌즈에는 왜곡이 생긴다는 특성 때문에 카메라로 찍은 것과 실제 세상은 다르게 보인다. 때문에 영상처리에 있어서는 이러한 왜곡을 없애줄 수 있는 카메라 캘리브레이션 과정을 필수적으로 필요로 하게 된다. 카메라 캘리브레이션 관련해서는 이후 포스팅에서 진행될 예정이다.

 

 

Reference

[1] https://carstart.tistory.com/179?category=209767

[그림 1] GAN 모델이 생성한 이미지

1. GAN 모델 개요


 

GAN이란 무엇인가? GAN은 Generative Adversarial Nets이라는 논문을 통해 나온 모델로 위와 같이 진짜와 동일해 보이는 이미지를 생성하는 모델이다. 그렇다면 우선 GAN은 언제 만들어졌고 어떠한 과정을 거쳐 성장하게 되었는가? 아래는 GAN의 History를 나타내는 그림이다.

 

[그림 2] History of GAN

 

GAN은 2014년 arXive에 처음 올라온 논문이며 이후, 인공지능 관련 학회인 NIPS에서 정식으로 게재되었다. 처음 GAN 모델이 소개된 이후 수 많은 GAN의 후속 연구들이 이어지고 있는 것을 확인할 수 있다. 위 [그림 2]에 기재된 연구의 경우 대표적인 논문들을 기재한 것이며 이외에도 포함되지 않은 연구들이 여럿 존재한다.

 

GAN은 포스팅 되는 2021.09.14 시점으로 약 35,000회의 인용이 있는 것을 확인할 수 있고. 화두가 되었었던 Tensorflow가 발표되었던 논문보다도 더욱 많은 관심을 받고 있는 것을 확인할 수 있다.

[그림 3] GAN 모델과 Tensorflow 프레임워크의 인용수

 

얀르쿤(Yann LeCun)은 GAN 모델이 지난 20년간 딥러닝 분야에서 가장 멋진 아이디어라고 말한다.

[그림 4] 얀르쿤(Facebook, 딥러닝 3대 석학 中 1, 튜링상)

 

그렇다면 이 GAN이라고 하는 모델은 왜 각광받고 있고 후속 연구들이 이어지고 있는 것인가?

 

여러 이유가 있지만 그 중 단연 핵심이라 생각되는 것은 바로 기존의 지도학습의 한계 때문이다.

 

기존의 지도학습의 경우 데이터셋이 필수적으로 수반된다. 하지만 이러한 데이터셋을 만드는 과정에 드는 시간 등의 비용의 한계가 있기 때문에 어렵다는 것이다. 하지만 GAN은 지도학습에 사용되는 라벨 없이도 학습 가능한 비지도학습에 속하며, 데이터를 직접 생성하는 큰 장점을 가진다. 따라서 GAN의 경우 비지도학습의 선두주자로 불리고도 있으며, 몇몇의 사람들은 비지도학습이 더욱 각광받는 기술이 될 것이라 전망한다.

 

[그림 5] 머신러닝 분류체계(지도학습, 비지도학습, 강화학습)

 

아래는 처음 GAN이 나왔을 당시 논문에서 제시한 GAN 모델의 결과 중 일부이다. 

[그림 6] GAN 모델 결과

왼쪽 그림은 MNIST 데이터셋을 학습하여 오른쪽 노란박스와 같이 모델이 숫자를 생성할 수 있음을 보였다. 또한 오른쪽 그림은 TFD(Torronto Faces Dataset)을 이용하여 학습한 뒤 GAN 모델이 사람의 얼굴을 생성할 수 있음을 보였다.

 

초기의 결과물은 색채가 없고 화질이 좋지 않았다. 하지만 GAN 모델의 단점을 극복하는 연구들이 intensive하게 진행됨에 따라 아래와 같이 진짜 이미지와 구분하기 힘들 정도로 발전하는 단계가 되었다.

 

[그림 7] GAN 모델 성능 발전

 

우리는 여기서 이러한 GAN 모델의 성능을 발전을 가능케 했던 대표적인 연구들을 살펴보고자 한다. 이를 위한 첫 단계로 모카님의 블로그에서 아래와 같은 GAN 연구의 분류체계를 확인할 수 있었다.

 

[그림 8] Taxnomoy of GAN

모카님은 GAN을 크게 3가지로 Unconditional GAN, Conditional GAN, Super Resolution으로 나누었다. 분류체계의 기준은 어떻게 정하였는지는 잘 모르겠다. 하지만 서칭 결과 더 체계적이라 판단되는 분류체계는 찾을 수 없었다. 따라서 이를 기반으로 주요 연구들을 살펴보았다.

 

우리가 알아보고자 하는 대표적인 연구들은 아래와 같다.

 

[그림 9] GAN의 대표적인 후속 연구

 

먼저 위 연구에 대해 한마디로 정리하면 다음과 같다.

DCGAN: 얀르쿤이 GAN을 낳았다면 Facebook은 DCGAN을 통해 모든 후속연구가 이어질 수 있도록 키운 모델

LSGAN: 기존 GAN에 적용된 Loss의 수식을 Least Square loss로 바꾸어 성능 향상을 도모한 모델

PGGAN: 기존 모델과 달리 점진적으로 학습하여 1024x1024의 고화질 이미지 생성을 가능하게 한 모델

CycleGAN: 역함수 개념과 순환일관성 손실 함수를 이용해 특정 이미지의 화풍을 다른 이미지에 적용할 수 있게 한 모델

StarGAN: 단일 생성자/판별자로 Domain Transfer가 가능하도록 만든 모델

SRGAN: GAN 모델의 인지적 해상도를 높여 고화질 이미지 생성을 가능하게 한 모델

 

2. Original GAN


2.1 Origianl GAN의 아키텍처

먼저 GAN의 아키텍처를 확인해보면 아래의 왼쪽 그림과 같이 간단한 형태를 가진다.

[그림 10] GAN 아키텍처 & z의 랜덤 dstirubtion

GAN은 크게 2가지 모델로 이루어져 있다. Generator와 Discriminator로 이루어져 있어 동시에 두 개의 모델을 훈련하는 것이 특징이다. 

 

여기서 z라고 하는 것은 랜덤 벡터 z를 의미하는 것으로 오른쪽 그림의 uniform distribution이나 normal distribution을 따른다고 한다.

 

이 랜덤 벡터 z를 Generator의 입력으로 넣어 Fake를 생성한다. 이후 Real의 경우 실제 데이터셋을 의미하는 것으로 생성된 Fake와 실제 Real 이미지를 Discriminator의 입력으로 넣게 되면 Fake 또는 Real이라고 출력하게 된다.

 

GAN은 최종 출력인 Fake와 Real의 확률이 1/2에 수렴하여 진짜와 가짜를 구분할 수 없도록 학습하게 된다.

 

GAN을 더욱 이해하기 위해서는 확률밀도함수의 개념을 알아야 한다. 아래는 어떤 모종의 확률밀도함수를 나타내는 그래프이다.

 

2.2 확률 밀도 함수(PDF, Probability Density Function)

[그림 11] 확률 밀도 함수(PDF, Probability Density Function)

 

먼저 확률밀도함수란 통계학에서 사용되는 개념으로, 용어에서부터 직관적으로 이해할 수 있듯 확률변수의 분포를 나타내는 것으로, 연속확률변수 x에 대한 f(x)를 의미하는 것이라 볼 수 있다. 

 

가령 최윤제님의 발표자료에 있던 예시를 가져온 것은 아래와 같다.

 

[그림 12] 확률 밀도 함수에 대한 예시 1

 

가령 GAN 모델에 안경을 낀 남성의 데이터를 학습시킨다고 할 경우, 안경을 낀 남성의 특징은 x1이라고 하는 벡터가 가지게 된다. 

 

[그림 13] 확률 밀도 함수에 대한 예시 2

흑발 여성의 데이터셋을 학습 시킬 경우, 흑발 여성에 대한 특징을 x2라고 하는 벡터가 가지게 되며

 

[그림 14] 확률 밀도 함수에 대한 예시 3

금발 여성의 데이터셋을 학습 시킬 경우 GAN 모델은 금발 여성에 대한 특징을 x3라고 하는 벡터에 학습시키게 된다.

 

결론적으로 이렇게 학습된 확률밀도함수가 있을 때, 아래와 같이 GAN 모델이 생성한 이미지가 가지는 확률밀도함수와 둘 사이의 차이가 줄어들면 줄어들 수록 원래의 실제 이미지와 같아지는 원리라고 할 수 있다.

 

[그림 15] 실데이터 학습을 통한 확률 변수의 분포와 모델이 생성한 이미지가 가지는 확률 변수

 

실제 Original GAN의 논문에 실린 그림은 아래와 같다. 

[그림 16] GAN의 학습 과정

검은 점선: 원 데이터의 확률분포, 녹색 점선: 생성자가 만들어 내는 확률분포, 파란 점선: 판별자의 확률분포

 

파란 점선인 판별자(Discriminator)는 학습이 진행됨에 따라 GAN이 만들어내는 녹색 점선(Generator)와 분포가 동일해지는 것을 확인할 수 있다.

 

따라서 (d)의 단계에서는 판별자가 Real/Fake를 분류하게 되어도 확률이 같기 때문에 분류를 해도 소용 없게 되며 생성자는 실제 데이터와 매우 흡사하게 이미지를 생성할 수 있게 된다.

 

2.3 수식으로 이해하는 GAN

GAN은 생성자와 판별자의 경쟁구도이며, 경쟁을 통해 균형점(nash equilibrium)을 찾는 것이 목표라 할 수 있다.

 

GAN에서 사용되는 수식은 아래와 같이 간단한 형태이다.

 

[그림 17] GAN의 수식

G(Generator)를 minimize하고 D(Discriminator)를 maximize한다고 생각하면 된다.

 

수식을 가장 빠르게 이해하는 방법 중 하나는 수식에 0을 만드는 요소라던지 극값을 넣어 간단한 형태로 환원시키는 것이다. 먼저 수식 내의 값들을 0으로 만들어 보자.

 

Case 1: D(x)를 1로 만드는 경우 (판별자가 모든 것을 분류 가능한 경우)

D(x)=1인 상황은 logD(x)를 0으로 만드려는 것과 같다. D(x)=1이라는 의미는 판별자가 모든 것을 다 올바르게 Real/Fake 분류를 할 수 있음을 의미한다. 이렇게 되면 동시에 D(G(z))=1이 된다. 그 이유는 G가 아무리 진짜와 같은 이미지를 생성하더라도 D가 100%의 확률로 전부 잡아낼 수 있기 때문이다. 결과적으로 수식의 앞 부분은 logD(x)는 0이 되어 사라지고, 뒷 부분은 log(1-1)이 되어 무한에 수렴하게 된다. (log 함수 그래프 참조)

 

[그림 18] log 함수

 

Case 2: G(z)를 1로 만드는 경우 (판별자가 모든 것을 분류하지 못하는 경우)

G(z)=1인 상황은 생성자 G가 실제와 구분하지 못할 정도로 흡사하게 만들어 판별자 D가 하나도 구분하지 못하는 상황과 같다. 이렇게 되면 수식의 앞 부분인 logD(x)는 log0이 되어 무한에 수렴하게 되고, 뒷 부분인 log(1-D(G(z))는 0이 되어 사라지게 된다. (이 상황의 경우 minmax요소가 바뀜. min→D, max→G)

 

2.4 코드로 이해하는 GAN

GAN의 수식을 코드로 표현할 경우 아래와 같아진다.

[그림 19] 코드로 표현한 GAN 모델

크게 4 영역으로 판별자 D의 layer, 생성자 G의 layer, D의 loss, G의 loss 부분으로 나뉜다. 핵심은 loss를 표현하는 영역으로 앞서 설명한 수식을 이용하여 위와 같이 작성할 수 있다.

 

2.5 실험 결과

결과적으로 앞서보았던 그림을 포함하여 크게 3종류인 (MNIST, TFD, CIFAR-10)의 데이터셋에 대해 학습하고 이를 생성자 모델을 사용하여 시각화 하는 것을 확인할 수 있다.

[그림 20] GAN 모델 결과

숫자와 얼굴의 경우 어느정도 식별 가능한 형태라 볼 수 있으며, 동물/사물에 대해서는 비교적 추상적으로나마 생성해내는 것을 확인할 수 있다. 

 

2.6 한계점

기존의 GAN의 한계점은 크게 2가지로 나뉜다. 

1. (성능 평가)

GAN 모델의 성능을 객관적 수치로 표현할 수 있는 방안이 부재했다. GAN의 경우 결과 자체가 새롭게 만들어진 데이터이기 때문에 비교 가능한 정량적 척도가 없었다는 것이다.

 

2. (성능 개선)

GAN은 기존 네트워크 학습 방법과 다른 구조여서 학습이 불안정했다. GAN은 Saddle Problem 혹은 Minmax를 풀어야 하는 태생적으로 불안정한 구조이기 때문이다.

 

실제 2016년 NIPS에서도 GAN의 안정화가 메인화두였다고 한다. 

 

하지만 이의 두 단점을 모두 개선하여 GAN의 후속 연구가 줄줄이 이어나올 수 있도록 한 연구가 Facebook에서 개발한 DCGAN(Deep Convolutional GAN)이다.

 

2. DCGAN (Deep Convolutional GAN)


2.1 DCGAN의 연구 배경

기존의 GAN으로는 성능이 잘 나오지 않았는데 그 이유는 간단하게 Fully-Connected 되어 있는 구조이기 때문이다.

[그림21] 기존 GAN의 구조

따라서 Facebook은 DCGAN이라고 하는 모델을 내놓으며 Fully-Connected 구조를 CNN으로 바꾸어 GAN의 성능 향상을 도모한 것이 핵심이라 할 수 있다.

 

2.2 DCGAN의 아키텍처

아래는 DCGAN의 Generator에 해당하는 아키텍처이다. 

[그림 22] DCGAN의 구조 (Generator)

DCGAN은 생성자 모델에 Transposed Convolutional Network를 사용하여 Up-Sampling하는데 사용하였다. 위 그림에는 나와 있지 않지만 판별자 모델에는 단순 Convolutional Network를 사용한 것이 특징이다.

 

Trasnposed Convolutional Network의 경우 기존의 컨볼루션 네트워크처럼 줄어드는 것이 아닌 확대되는 것이라 할 수 있다. 아래 왼쪽은 기존의 컨볼루션 네트워크고 오른쪽의 경우 Transposed 컨볼루션 네트워크이다.

[그림 23] Convolutional Network (좌), Transposed Convolutional Network (우)

좌측 convolutional network는 5x5의 input에 3x3의 kernel을 사용하여 3x3의 output을 출력한다. 반면

우측 Transposed Convolutional Network는 4x4의 input과 3x3의 kernel을 통해 6x6의 output을 출력한다.

DCGAN은 Generator의 구조에 우측의 Transposed Convolutional Network를 사용하였다.

 

하지만 단순히 CNN으로 변경하는데 있어서 좋은 성능을 내지 못했다. 따라서 최적의 성능을 내기 위해 5가지 방법을 적용하였다.

 

[그림 24] DCGAN 아키텍처 가이드라인

1. 미분이 불가능한 Pooling Layer를 제거하고 미분 가능한 Convolution 레이어로 대체하였다. (Unpooling시 매우 이상한 사진을 생성한다 함)

2. BatchNormalization 레이어를 추가하였다.

3. fully-connected hidden layer를 삭제하였다.

4. 생성자 모델에 ReLU 함수를 적용하고 출력의 activation function은 Tanh로 설정하였다.

5. 마지막으로 판별자 모든 레이어에 LeakyReLU를 적용하여 유연성을 더하였다.

 

위와 같은 intensive한 실험을 통해 알아낸 최적의 generator 구조가 [그림 22]라고 할 수 있다.

 

DCGAN의 전체 아키텍처는 아래와 같다. [그림 24]의 실험을 통해 알아낸 방법을 적용한 결과를 나타낸다. (출처: Here)

[그림 25] DCGAN 전체 아키텍처

 

2.3 실험 결과

DCGAN을 사용하여 모델을 학습 시켜 이미지를 생성한 결과는 다음과 같다.

[그림 26] DCGAN 모델의 이미지 생성 결과

얀르쿤의 GAN 모델보다 훨씬 더 다채롭고 가시적인 이미지를 생성하는 것을 확인할 수 있다.

 

위와 같은 이미지를 생성하기 위해 학습에 사용한 데이터셋은 LSUN(Large-scale Scene Understanding), ImageNet-1K, Face dataset이다. 

 

아래는 판별자 모델의 필터를 시각화한 결과이다. 

[그림 27] Discriminator 필터 시각화

각각의 filter들이 침대나 창문과 같이 침실의 일부를 학습하였고, 필터 시각화를 통해 기존의 모델들이 Black Box였던 문제점을 해소하였다.

 

또한 보간(Interpolation)을 수행하여 이미지의 각도를 변경이 가능함을 보였다. 

[그림 28] 보간을 통한 각도 변경

여기서 보간이란 수치해석학에서 사용되는 개념으로 두 점을 연결하는 방법이다. 보간을 사용하는 이유는 모든 점을 메모리에 올리면 비효율적이기 때문에 특징이 될 수 있는 점들만 대표적으로 메모리에 올려 계산하기 위해 사용된다. 종류에는 다항식 보간법, 스플라인 보간법, 라그랑지 보간법, 뉴턴 보간법 등의 여러 종류가 있다.

 

또한 DCGAN을 통해 벡터 산술 연산(Vector Arithmetic)이 가능함을 보였다.

 

[그림 29] 벡터 산술 연산

 

선글라스 낀 남성 - 선글라스 벗은 남성 + 선글라스 벗은 여성 = 선글라스 낀 여성이다.

 

 

2.4 주요 Contribution

DCGAN은 크게 5가지 컨트리뷰션이 있다. 

 

1. 대부분의 상황에서 언제나 안정적으로 학습하는 Convolution GAN 구조를 제안하였다는 점

 

2. word2vec과 같은 벡터 산술 연산이 가능하여 Generator를 semantic 수준에서 데이터를 생성할 수 있다는 점

 

3. 판별자가 학습한 필터들을 시각화하여 특정 필터들이 특정 물체를 학습했다는 것을 보였다는 점

 

4. 학습된 판별자 모델이 다른 비지도 학습 알고리즘과 비교해서 뒤쳐지지 않는 분류 성능을 보였다는 점

 

5. 마지막으로 모든 GAN 연구의 시작점이 될 수 있게 만들어준 연구라고 볼 수 있다.

 

3. LSGAN (Least Square GAN)


3.1 연구 배경

LSGAN의 경우 단순히 loss 값만 변경하여 성능을 끌어올린 GAN 모델이다. 연구 배경으로는 Sigmoid cross entropy loss가 Gradient Vanishing 문제를 일으킨다는 것이다. 따라서 Sigmoid cross entropy loss → Least Square loss로 변경하자는 것이 이 논문의 핵심이라 할 수 있다.

[그림 30] LSGAN의 성능 향상 핵심 방안

위 그림을 보면 분홍색 *(star)를 볼 수 있다. 분홍색 *는 Generator가 생성한 가짜 이미지라 보면 된다. 하지만 이 가짜이미지는 판별자를 속였고 때문에 더 이상 학습하지 않는(Gradient Vanishing) 것을 확인할 수 있다. 이 때 LSGAN 모델의 아이디어는 판별자를 속였더라도 더 정교하게 속이기 위해 실제 real과 동일한 수준으로 끌어올리자(추가 학습하자)는 것이다.

 

3.2 코드로 이해하는 LSGAN

기존의 GAN과의 가장 큰 차이점이라고 하면 아래와 같이 D의 loss 함수와 G의 loss 함수에 Least Square loss를 적용한 것이라 할 수 있다. (Cross Entropy loss → Least Square loss)

[그림 31] Vanilla GAN(좌) LSGAN(우)

 

3.3 실험 결과

Original GAN보다 높은 퀄리티를 보이는 이미지를 생성하는 것을 확인할 수 있다.

[그림 32] LSGAN 모델을 통한 이미지 생성 결과

이러한 이미지를 생성하기 위해 LSUN(풍경 데이터셋), CIFAR-10을 활용하였다.

 

주요 컨트리뷰션 포인트 중 첫 번째는 High Quaility라는 것이고 두 번째는 More Stable하다는 것이다.

 

GAN을 평가하는 metric은 크게 두 가지 중 하나인 Inception Score가 Facebook에서 만든 DCGAN보다 뛰어난 성능을 보이는 것을 확인할 수 있다. (나머지 하나는 프리쳇 거리(Frechet Distance))

 

[그림 33] LSGAN의 성능 평가

 

4. PGGAN (Progressive Growing GAN)


4.1 연구 배경

크게 2가지 단점을 극복하고자 PGGAN 모델이 만들어지게 되었다. 첫 번째로는 GAN을 고해상도로 만들면 판별자는 생성자가 생성한 이미지의 Real/Fake 여부를 구분하기 쉬워진다는 단점이 있고, 두 번째로는 고해상도로 만들어도 메모리 제약조건으로 batch size를 줄여야하고 줄이면 학습과정이 불안정해진다는 단점이 있었기 때문이다.

 

 

4.2 핵심 아이디어

PGGAN은 NVIDIA에서 진행한 연구이다. PGGAN의 핵심 아이디어는 4x4의 저해상도 이미지를 1024x1024 고해상도 이미지로 단계별(Progressive Growing)로 학습한다는 것이다. 

[그림 34] PGGAN의 핵심 아이디어

기존에는 처음부터 고해상도 이미지를 학습하려다 보니 학습이 올바르게 되지 않았다. 이는 초등생에게 처음부터 미적분을 묻는 것과 같다고 한다. 따라서 기본적인 사칙연산에 해당하는 4x4, 8x8, 16x16으로 점진적으로 학습하게 되면 계속해서 간단한 문제를 묻는 것과 같기 때문에 학습이 더 잘된다고 한다.

 

따라서 저해상도에서 보이는 Abstract을 우선적으로 학습 한 뒤 고해상도에서 보이는 Concrete(눈, 코, 입, 모공 등)를 학습하는 것이 특징이다.

 

이러한 PGGAN의 장점은 크게 3가지로 나뉜다.

1. 작은 이미지부터 점진적으로 학습하기 때문에 안정성 있다.

2. 처음부터 복잡한 질문을 하지 않기에 간단하다.

3. 저해상도에서 학습할 때 충분한 학습을 하게 되며 학습 시간이 짧다.

 

 

4.3 실험 결과

가장 처음 설명한 Original GAN의 결과와 비교했을 때 비약적으로 발전한 것을 느낄 수 있다.

[그림 35] PGGAN 모델에서 생성한 이미지

위와 같은 이미지를 생성하기 위해 CelebA-HQ 데이터셋을 사용하여 30,000개의 유명인사 사진을 학습했다고 한다. 

 

또한 PGGAN의 성능의 경우 Inception Score가 8.8에 달하는 것을 확인할 수 있다.

[그림 36] PGGAN의 성능 평가

 

4.4 Contribution Point

PGGAN의 핵심 컨트리뷰션 포인트는 기존의 DEGAN, EBGAN, BEGAN 등이 128x128 이미지 밖에 생성하지 못했던 것을 1024x1024의 해상도까지 끌어올린 것이 핵심이라 할 수 있다.

 

 

5. SRGAN (Super Resolution GAN)


SRGAN은 Super Resolution GAN을 의미하는 것으로 한마디로 말하여 저화질의 이미지고화질의 이미지로 바꾸는 모델이라 할 수 있다.

 

5.1 연구 배경

기존의 SR 모델에서 목적 함수를 MSE (Mean Square Error)로 학습하여 높은 PSNR (Peak Signal-to-Noise Ratio)를 가진다. 하지만 High Frequency 성분을 갖는 detail이 결여되어 있기 때문에 Texture를 표현하는 것이 어렵다는 점을 극복하기 위해 진행 된 연구이다.

[그림 37] SRGAN과 타 모델 간의 성능 비교

쉽게 말해 MSE는 이미지가 조금 흐릿한 형태를 띠게 되는데 이는 MSE loss function은 average(평균제곱오차)를 학습하기 때문이다. 전반적으로 smooth한 정보를 얻어서 high frequency content를 표현하지 못한다는 것이다. 다시 말해 평균을 loss로 잡았기 때문에 이미지의 고주파수 영역이 평균 값으로 회귀 된다는 의미이다.

 

5.2 PSNR

먼저 PSNR을 설명하면, 최대 신호대비 잡음비라고 할 수 있다. 구체적으로, 신호가 가질 수 있는 최대 전력에 대한 잡음의 전력이다. 주로 동영상이 압축될 때 화질 손실 정보를 평가할때 사용하는 지표로, 높을 수록 결과 값이 좋다 할 수 있다.

 

[그림 38] PSNR 수치 저하에 따른 이미지 화질 비교

하지만 이러한 PSNR의 단점은 원본 이미지와 왜곡 이미지 사이의 수치적 차이로 평가하기 때문에 사람 인지와 일치되지 않는 품질 점수를 산출한다는 것이다. 예를 들면 아래 그림과 같다.

 

[그림 39] 비슷한 PSNR 수치에 대한 인지적 품질의 차이

 

PSNR 값은 유사하지만 품질을 제대로 반영하지 못하는 것과 같다. 이는 PSNR을 산출하는 수식에 내재한 단점이라 볼 수 있다.

[그림 40] PSNR 산출 수식

핵심은 맨 아랫줄만 확인하면 이해할 수 있다. PSNR은 MAX에 log scale을 취한 것에 MSE에 log scale을 취한 것을 빼준다. 하지만 앞서 언급하였던 MSE를 사용하기 때문에 이미지의 고주파수 영역을 나타내지 못하고 결과적으로 PSNR 값에 따른 이미지의 품질이 사람의 인지와 달라지는 것이다.

 

이러한 단점을 극복하기 위해 대안으로 사용하는 것은 SSIM, MOS, PSNR-HVS, PSNR-HVS-M, VIF 등이 있긴하다.

[그림 41] PSNR의 대안인 SSIM (1에 가까울 수록 좋음)

 

하지만 다시 SRGAN 모델로 돌아와서, 결과적으로 이 연구에서 하고자 하는 핵심은 해상도를 평가하는 PSNR이라는 수치는 높더라도 실제 사람의 눈으로 봤을 때 해상도가 높지 않다. 따라서 실제로 눈으로 보더라도 해상도가 높게 나올 수 있도록 만들겠다는 것이 이 연구의 핵심이라 할 수 있다.

 

5.3 연구 핵심

위와 같은 단점을 해결하기 위한 핵심 방안으로, 인지적 유사성에 주목한 perceptual loss를 사용하였다는 것이다. percepual loss는 크게 2가지인 content loss와 adversarial loss로 구성된다.

[그림 42] perceptual loss

 

5.3.1 content loss

pixel space에서 유사성 대신에 perceptual 유사성을 학습하기 위한 loss이다.

[그림 43] content loss

복잡할 것 없이 간단하게 이해하면 다음과 같다. LR(Low Resolution) 이미지를 즉, 저해상도 이미지를 생성자가 만들면 판별자가 판별할 것인데 N개를 판별한 합이 작아지도록 만드는 것이라 할 수 있다. 

 

 

5.3.2 Adversarial loss

판별자를 속이기 위한 loss 함수라 할 수 있다.

[그림 44] adversarial loss

쉽게 간략히만 이해하면 HR(고해상도)의 이미지에서 LR(저해상도)의 이미지를 빼고 제곱을 취해준 값의 합이 점점 줄어들도록 학습하는 것이라 볼 수 있다.

 

5.4 아키텍처

논문에 언급된 아키텍처보다 더 직관적으로 설명되어 있는 그림을 확인할 수 있었고 아래와 같다.

[그림 45] SRGAN 아키텍처

Pretrained된 2개의 VGG net loss를 사용한다. (reconstructed image와 reference image의 feature map 사이의 유클리디안 거리를 계산하는 방법을 사용) 여기에서 사용된 VGG22는 low level feature map을 대표하는 loss이며, VGG54는 high level feature map을 대표하는 loss라고 할 수 있다.

 

 

 

5.5 실험결과

평가 방법 중 MOS (Mean Opinion Score)를 사용하였는데 이는 Perceptual Quaility를 표현하기 위함이다. 

[그림 46] SRGAN 모델 성능 지표 비교

Set5와 Set14의 경우 데이터셋을 의미한다. 저자들은 MOS라고 하는 벤치마크 스코어를 사용하여 MSE를 사용하였을 때 보다 높은 MOS 스코어를 얻음을 보인다. 하지만 MOS라고 하는 것은 일종의 주관적인 평가로, 평가자 몇 명을 모집하여 사용하는 방식이라는 점에 있어서 정량적이라기 보다 정성적인 평가에 가깝다고 볼 수 있다.

 

주요 컨트리뷰션 포인트로는 크게 2가지로, 첫번째는 새로운 perceptual loss를 제안하였다는 점이고 두 번째로는 모호하지만 새로운 벤치마크 스코어인 MOS를 제안하였다는 것이다.

 

참고로 VGG54를 저자들은 SRGAN이라고 부른다.

 

5.6 적용 결과

 

저자들은 유튜브에 자신들이 만든 SRGAN을 이용한 영화 화질을 높이는 것을 보였다.

 

https://youtu.be/sUhbIdSd6dc

 

5.7 국내 연구 사례

[그림 47] SRGAN 국내 연구 사례

또한 이러한 SRGAN을 사용하여 CCTV 영상의 화질을 개선하는 기법을 연구한 국내 연구 사례도 존재한다. 하지만 그럴듯하게 생성이 가능하다는 것이지 법적인 증거로서의 효력으로 채택되는 것은 별 개의 문제가 될 수 있겠다.

 

6. CycleGAN


6.1 연구 배경

CycleGAN 모델을 만든 저자는 한국인으로 이전의 pix2pix라는 연구의 확장이 CycleGAN이라 할 수 있다.

[그림 48] CycleGAN 모델의 결과

 

CycleGAN은 특정 화풍, 질감을 다른 사진에 적용할 수 있는가에 대한 질문에 답을 하기 위해 만들어진 모델이라 할 수 있다. 

 

6.2 핵심 아이디어

특징이 겹치지 않는 서로 다른 이미지 집합(Unpaired)을 학습하기 위해 순환 일관성 손실 함수(Cycle Consistency)를 사용하였다는 것이다.

 

[그림 49] 순환 일관성 손실 함수

일종의 역함수라고 할 수 있다. 하지만 G를 통해 변환한 것이 F를 통해 재 변환될 때 원본과 최대한 가까워 지도록 loss 값을 설정하여 학습하는 것이라 할 수 있다.

 

 

참고로 Paired는 x좌표 값이 y좌표 값에 대응되는 정보가 담기지만 Unpaired는 대응되는 정보가 존재하지 않는 것이 특징이다.

[그림 50] Pair & Unpaired dataset

paired의 경우 pix2pix 모델에서 사용했다 할 수 있고 unpaired의 경우 cycleGAN에서 사용하였다.

 

이러한 unpaired dataset에서의 translate를 위해 사용한 함수는 순환 일관성 손실함수인데 그 전체는 아래와 같다.

[그림 51] 순환 일관성 손실 함수

크게 어려울 것 없다. 역함수를 통해 나온 값이 만약 x'라면(strict하지 않기 때문에 x'가 나옴) x와의 차이가 줄어들도록 loss 값을 설정한 것이다. 마찬가지로 y'가 나온다면 y와의 차이 값이 줄어들도록 만든것이 순환 일관성 손실함수라 할 수 있다.

 

6.3 실험 결과

[그림 52] CycleGAN 모델이 생성한 이미지 (실험 결과)

CycleGAN 모델의 실험 결과로 좌측의 Input 값을 넣으면 우측의 모네, 반고흐 등의 화풍으로 바꿔주는 것을 확인할 수 있다.

 

또한 CycleGAN에서는 실제 위성사진을 지도로 바꿔주고 지도를 실제 위성사진으로 얼마나 잘 바꾸어주는 가에 대한 실험도 하였고 아래 그림과 같다.

[그림 53] CycleGAN 모델이 수행한 Photo-Map, Map-Photo 결과

어색하거나 엉뚱한 결과를 내는 다른 모델들에 비해 Ground truth와 가장 유사한 그림을 만들어내는 것을 확인할 수 있다. 

 

이러한 CycleGAN을 평가하기 위한 평가 메트릭으로는 AMT와 FCN-Score를 사용하였다.

AMT: 사람에게 어떤 것이 진짜인지 평가하는 방식으로 별도의 Metric이 없는 GAN에게 가장 강력한 점수

FCN Score: YOLO와 같은 객체 탐지 모델을 사용해 변환된 이미지에서 얼마나 사물을 잘 인식하는가?

 

[그림 54] AMT

CycleGAN이 다른 모델들에 비해 Map→Photo, Photo→Map에서 가장 우수한 성능을 보이는 것을 확인할 수 있다.

 

또한 FCN Score에서도 마찬가지로 CycleGAN이 다른 모델들과 비교하여 뛰어난 성능을 보이는 것을 알 수 있다. (pix2pix은 저자의 연구실에서 하던 이전 연구)

[그림 54] FCN-Score

 

6.4 한계점

색상이나 질감은 변경할 수 있으나 객체의 모양은 바꿀 수 없는 것이 단점이다. 이는 여러 장의 데이터를 학습하여 분위기(화풍, 질감) 변경에만 초점을 두기 때문이다.

 

[그림 55] CycleGAN의 한계점

 

6.5 Contribution Point

주요 컨트리뷰션 포인트는 기존의 pix2pix 모델에 순환일관성 손실함수를 도입하여 unpaired한 데이터셋에서도 동작하게 만들었다는 것이 핵심이라 할 수 있다.

 

 

7. StarGAN


7.1 연구 배경

기존의 연구들은 image-to-image translation을 위해서 이미지 도메인 쌍을 학습해야 했다. 이러한 결과로 모델의 scalability와 robusteness가 떨어진다는 단점이 있었다.

 

여기서 도메인이란 이미지의 표정 변화, 이미지의 성별 변화, 이미지의 피부 색 변화 등을 의미한다.

 

따라서 StarGAN은 특정 도메인에 국한하지 않고, 하나의 Generator에서 다른 도메인으로 Transfer 할 수 있도록 만들었다는 것이다.

[그림 56] StarGAN

처음에는 StarGAN이라는 이름에서 유명인사를 의미하는 줄 알았으나 성(Star)형으로 모델을 구성하여 일종의 Transfer Learning이 가능하도록 만들었다는 것이다. 저자들은 Facial attribute transfer와 Facial expression synthesis task에서 경험적으로 효과가 있는 것을 확인하였다고 한다.

 

7.2 아키텍처

[그림 57] StarGAN 아키텍처

 

핵심만 간단하게 이야기하면 (a)의 Training the discriminator에서 기존 GAN처럼 Real/Fake만 출력하는 것과 달리 어떤 Task인지에 대한 Domain 정보까지 분류하도록 만들었다는 것이다. D는 결국 이미지와 도메인의 두 개의 확률 분포를 만들어낸다 볼 수 있다.

 

7.3 실험 결과

[그림 58] StarGAN 실험 결과 1

 

[그림 59] StarGAN 실험 결과 2

전반적으로 맨 아래의 StarGAN을 이용하면, 다른 여러 모델을 사용하여 Domain Transfer한 결과들 보다 가장 자연스럽게 나온다는 것을 확인할 수 있다.

 

[그림 60] StarGAN의 성능 평가 지표

StarGAN은 AMT 평가 메트릭에서 single attribute transfer에 있어서 가장 높은 성능을 보이는 것을 확인할 수 있고 multi attribute transfer에 있어서도 가장 높은 성능을 보이는 것을 확인할 수 있다.

 

또한 저자들은 Facial attribution transfer와 Facial Expression synthesis에서 정성적/정량적 두 측면 모두 superity를 달성했다고 말한다.

 

7.4 Contribution Point

핵심 컨트리뷰션은 모든 도메인 사이에서 학습하는 새로운 GAN 모델이며, 단일 생성자와 판별자로만 가능하게 만들었다는 것이다.

 

부수적으로는 Mask Vector라는 것을 사용하여 여러 데이터셋 간의 모든 도메인 사이에서의 이미지 변환 학습을 어떻게 해야하는지 보였다는 것이다. 여기서 Mask Vector란 모델이 모르는 라벨은 무시하고 확실히 아는 라벨에만 집중하는 것이라고 한다.

 

8. 평가 지표

GAN 모델이 생성한 이미지의 품질을 평가할 수 있는 여러 메트릭이 존재하며 그 메트릭의 종류는 아래와 같다. (출처: Here)

[그림 61] GAN 모델 평가 메트릭

여러가지가 있지만 주로 크게 2개만 사용한하며 그것은 Inception Score(IS)와 Frechet Inception Distnace(FID)이다.

 

 

8.1 Inception Score (IS)

IS의 성능 평가기준 크게 2가지 이다.

  • 생성된 이미지의 퀄리티 (Fidelity)
  • 생성된 이미지의 다양성 (Diversity)

 

계산 방법은 Pretrained된 Inception 모델에 Real/Fake 데이터를 넣어 KL-Divergence를 계산한다고 한다. 

 

이를 수식으로 이해하면 아래와 같다.

 

[그림 62] KL-Divergence 수식

p(y|x)와 p(y)의 차이를 KL-Divergence로 측정하는데 두 분포가 크게 다르면 값이 커지는 지표이다. 쉽게 말해 두 확률분포의 차이를 계산하는데 사용하는 함수이다.

 

분류 모델에 이미지를 입력할 경우 높은 확률로 클래스를 예측한다면 생성 이미지(Fake)와 실제 이미지(Real)와 비슷하다 할 수 있다 이는 p(y|x)로 측정이 가능하다. 그리고 p(y|x)에서 x로 적분한 p(y)가 평등한 분포라면 생성된 이미지가 다양성을 갖고 있다 말할 수 있다. 이러한 두 가지 관점으로 생성된 이미지(Fake)를 평가하는 것이 IS이다. (출처: Here)

 

p(y|x): 주어진 input x에 대해 label y의 확률 분포

p(y): label 들의 확률 분포

 

이에 대한 이해도를 높이기 위해서는 아래의 공돌이의 수학정리노트라는 블로그에서 직접 변화를 관찰할 수 있다. (Here)

 

[그림 63] KL-Divergence

하지만 이러한 IS의 경우 생성된(Fake) 이미지만 사용하기 때문에 실제 이미지와 비교하지 못한다는 단점이 있다.

 

이를 보완하기 위해 나온 메트릭이 FID라고 할 수 있다.

 

8.2 Frechet Inception Distance (FID)

IS의 단점을 개선하기 위해 고안된 지표로, 두 분포 사이의 거리를 측정하는데 사용되는 방법이다.

 

1. 분류 모델에 따라 실제 이미지와 생성된 이미지의 특징량을 추출한다.

2. 특징량이 정규분포를 따른다 가정 후 그 분포 사이의 거리를 측정한다.

 

[그림 64] FID 수식

ur과 cr: 각각 실제 이미지에서 추출된 특징량의 평균과 공분산을 의미한다.

ug와 cg: 각각 생성 이미지에서 추출된 특징량의 평균과 공분산을 의미한다.

 

inception 네트워크의 중간 layer에서 feature를 추출하고 feature에서 평균과 공분산을 추출하고 계산한다.

 

FID 값이 낮으면 Real/Fake가 유사하다고 판단한다.

 

단점은 표본의 분포가 정규분포가 아닐 경우 제한적인 통계량(평균, 분산)만으로는 분포의 차이를 잘못 설명할 수 있다는 점이 있다.

 

9. GAN 모델 구현

[그림 65] GAN 모델 구현을 위한 코드 제공 깃허브

https://github.com/eriklindernoren/Keras-GAN에서 GAN 모델을 구현한 코드를 제공하고 있으니 GAN에 관심이 있다면 참고하길 바란다.

 

12. GAN 활용 사례

실생활에서 사용되고 있는 GAN으로는 NAVER에서 웹툰에 GAN을 적용하여 몰입형 웹툰을 선보이기도 한다.

[그림 65] 네이버 웹툰에 적용된 GAN

또한 PULSE9의 딥리얼 AI는 가상 인물 자동화 서비스를 제공한다. 20년간 활동한 국내 아이돌 이미지 데이터를 수집하여 가상의 101명의 아이돌을 만든다고 한다.

[그림 65] PULSE9의 딥리얼 AI

 

한국전자통신연구원(ETRI)에서는 SNS 트렌드를 분석해 6M장의 DB로 개인 취향의 패션상품 제작을 돕는 서비스를 개발한다고 한다.

[그림 66] ETRI 패션상품 제작 지원 서비스

패션영상 다중 정보 추출, 디자인 생성 & 스타일 변환, 착장 영상 자동 생성 등

 

또한 MyHeritage에서는 딥 노스텔지어라고 하여 정지된 사진에 생명을 불어 넣는 AI 서비스도 제공하고 있다.

앞으로의 GAN의 미래는 어떻게 되고 세상은 어떻게 변할까? 특이점이 온다의 저자인 레이 커즈와일은 기술의 발전속도는 기하급수적으로 바뀌어 2045년이 되면 기계가 인간을 뛰어넘는 세상이 온다고 하였다. 최근 Google, Facebook, OpenAI, NAVER 등의 기업에서 눈부신 연구들이 이루어지고 있고 커즈와일이 예측한 미래는 점점더 현실로 가까워져 가는 것이 느껴진다. 아직도 헤쳐나가야 할 요소들이 많겠지만 21세기 안에는 더욱이 비약적인 발전들이 이루어질 것이라는 강한 확신이 든다. 그렇다면 전례없이 빠르게 변화하는 지금의 시대에 나라는 사람은 후대를 위해 어떤 가치를 창출 할 수 있을지 많은 고민이 든다.

 

Reference

[1] https://velog.io/@viriditass/GAN%EC%9D%80-%EC%95%8C%EA%B2%A0%EB%8A%94%EB%8D%B0-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%96%B4%EB%96%A4-GAN%EC%9D%B4-%EB%8D%94-%EC%A2%8B%EC%9D%80%EA%B1%B4%EB%8D%B0-How-to-evaluate-GAN 

[2] https://ysbsb.github.io/gan/2020/06/17/GAN-newbie-guide.html

[3] https://www.youtube.com/watch?v=odpjk7_tGY0&ab_channel=naverd2

[4] https://github.com/POSTECH-CVLab/PyTorch-StudioGAN?fbclid=IwAR23QIuAkcgjK6-Q3ypmAbBcbI3sYLV917PlKn1pekQd53WbyQv-_L7VOPw 

[5] https://github.com/nightrome/really-awesome-gan

[6] https://generated.photos/face-generator/new

[7] http://www.aitimes.com/news/articleView.html?idxno=137405

[8] https://www.bloter.net/newsView/blt201806080001

[9] https://www.samsungsds.com/kr/insights/Generative-adversarial-network-AI.html

[10] https://aigong.tistory.com/51

[11] https://sanglee325.github.io/super-resolution/srgan/#

[12] https://haawron.tistory.com/22

[제목] Attention is all you need

[학회] NIPS

[년도] 2018년

[주저자] Google Researcher

 

오늘은 Attention is all you need 논문에 나오는 attention에 대한 개념과 논문의 핵심인 transformer 모델에 대해 알아보려고 합니다. Attention이란 무엇이고 trasnformer라는 모델은 왜 나오게 되었을까요? 설명에 앞서 Harper님의 블로그를 많이 참조하였음을 밝힙니다.

 

Attention 메커니즘의 도입 배경


먼저 Attention이라고 하는 개념은 쉽게 말해 조금 더 집중해서 보겠다라는 의미입니다. 집중해서 본다는 것은 당연 그만큼 중요하단 의미입니다. 그렇다면 attention은 무엇에 더 집중한다는 것일까요? attention은 주로 자연어 처리에 사용되는데, attention은 해당 시점에서 예측해야할 단어와 관련있는 입력 단어(input word)를 중점적으로 본다고 할 수 있습니다.

 

그렇다면 이 attention이라고 하는 개념이 왜 나오게 되었을까요? 바로 기존의 seq2seq 모델의 단점을 극복하고자 나오게 되었습니다. seq2seq는 RNN 계열의 모델이며 2개의 RNN을 연결하여 하나의 시계열 데이터를 다른 시계열 데이터로 변환하는 것입니다. seq2seq 모델에 대한 구체적인 내용은 2014년 12월에 발표된 Sequence to Sequence Learning with Neural Networks 논문을 참조하면 됩니다. 이러한 seq2seq 모델에는 크게 4가지 단점이 있고 아래와 같습니다.

 

1. 상당한 계산 복잡도를 가진다.

2. RNN 모델에서 병렬처리가 불가능하다.

3. long-term dependency를 가지는 단어를 참조할 때 거리가 멀어 참조가 잘되지 않는다. 

4. 구조적으로 고정 크기의 벡터에 모든 정보를 압축하다보니 발생하는 정보손실 문제를 가진다.

 

이러한 RNN 모델의 단점을 잘 설명하는 그림은 아래와 같습니다.

[Figure 1] RNN을 이용한 번역 (영어 --> 한글)

참고로 RNN의 경우 NMT(Neural Machine Translation)에서 사용되며 위 그림은 영어를 한글로 번역하는 것을 나타내었습니다. 강아지가 소시지를 먹는다 또는 좋아한다를 예측하기 위해 likes를 참조합니다. 하지만 likes라는 단어는 여러번의 hidden layer를 거치면서 그 의미가 희석되었을 확률이 높습니다. 

 

따라서 이러한 RNN의 단점을 극복하기 위해 나온 개념이 아래와 같이 attention이 추가된 RNN 입니다.

 

[Figure 2] RNN with attention model

attention은 Input word에 해당하는 hidden layer와 출력해야 할 단어와의 연관성이 있는 단어에 가중치를 주어 output word를 출력하는 것입니다. 하지만 이 또한 병렬 처리가 불가능하다는 근본적인 RNN의 단점과 attention 계산까지 더해져 계산복잡도가 높아진다는 단점이 존재합니다. 

 

 

Transformer 모델 도입 배경


Transformer 모델은 기존의 RNN 모델의 단점인 long-range dependency 문제를 극복하고자 제시 되었던 RNN with attention 모델의 단점을 극복하고자 나오게 되었습니다. 단점은 위 설명과 동일하게 병렬 처리 불가능과 attention 계산으로 인한 계산 복잡도가 높다는 것입니다. Transformer 모델의 아이디어는 attention을 통해 참조해야할 word의 위치(position) 정보를 얻음으로서 RNN with attention 모델의 두 단점을 극복하고자 하였습니다. 

 

[Figure 3] self-attention machnism

기존의 output word를 예측할 때만 attention을 사용했던 기존 모델과 달리 Transformer는 sequence 내의 단어 관계 정보를 self-attention을 사용하여 미리 계산해둡니다. 이를 통해 Transformer는 다음 단어를 효율적으로 예측하게 됩니다. 여기서 효율적이라는 의미는 RNN with attention 모델의 단점이었던 계산 복잡도를 줄였다고 볼 수 있습니다. 

 

 

Trasnformer 모델 아키텍처


self-attention 메커니즘이 들어간 transformer의 핵심 아키텍처는 아래와 같습니다. 

 

[Figure 4] Transformer model architecture

크게 Encoder와 Decoder로 나뉘어져 있습니다. Encoder와 Decoder의 경우 둘 모두 크게 3가지로 Positional Encoding, Multi-Head Attention과 Feed Forward NN이 사용되는 것을 확인할 수 있습니다. 논문에서는 Encoder와 Decoder의 N 값을 6으로 주어 Transformer 모델을 구성했다고 합니다. 이를 입체적으로 나타내면 아래와 같습니다.

[Figure 5] Transformer model architecture

전반적으로 Abstract한 과정은 먼저 Encoder와 Decoder에 sequence가 입력이 됩니다. 이후 positional encoding을 통해 Encoder/Decoder로 들어갑니다. Encoder의 출력을 보면 모든 Decoder의 Layer에 영향을 미치는 것을 확인할 수 있습니다. 이후 Decoder는 Linear layer와 Softmax layer를 거쳐서 단어의 확률 값을 나타낸다고 볼 수 있습니다.

 

Position Encoding

먼저 Positional Encoding은 단어의 위치 정보를 나타내기 위한 방법입니다. position을 나타내주는 벡터를 각각의 단어에 더해주는 방식으로 사용됩니다. 결론적으로 이러한 posotion encoding으로 각 단어의 상대적인 위치 정보를 포함하도록 합니다. 이러한 position encoding이 가지는 의미는, 기존의 임베딩과 같은 차원의 position encoding을 만들어 더해줌으로써 time signal을 가진 embedding을 인풋으로 받을 수 있게 된다는 것입니다. 

 

 

Scaled Dot-Product Attention

Transformer에서 attention을 구하기 위한 가장 작은 단위입니다. 

[Figure 6] Scaled Dot Product Attention

Scaled Dot-Product Attention은 전반적으로 두 개의 행렬 K와 행렬 Q의 multiplication을 통해 나머지 행렬 V 내의 정보를 추출하는 과정이라 할 수 있습니다. 구체적인 내용은 아래와 같습니다.

 

[Figure 7] Scaled Dot-Product Attention

행렬 K와 행렬 Q를 Dot-product하게 되면 행렬 K를 이루는 벡터와 행렬 Q를 이루는 벡터 간의 내적이라 볼 수 있습니다. 이를 통해 K와 Q의 유사한 row vector 값의 연산값이 높게 나타나게 됩니다. 이후 이러한 결과를 Softmax 함수를 통과하게 되면 Q와 유사한 K의 row들이 확률의 형태로 나타나게 됩니다. 유사하다면 높은 확률로 나타날 것이고 이 확률 값과 V를 내적하게 되면 얻고자 하는 정보를 추출할 수 있습니다.

 

여기서 Query와 Key와 Value는 아래와 같은 의미를 가집니다.

 

Query: 영향을 받는 단어 A를 나타내는 변수

Key: 영향을 주는 단어 B를 나타내는 변수

Value: 영향에 대한 가중치를 나타내는 변수

 

이를 기반으로 다시 말해, Query를 예측하고자 하는 단어를 도출하기 위해 Key와 내적하여 가장 유사하여 확률 값이 높은 Key의 row를 추출하고, 이를 다시 Value와 내적하게 되면 가장 높은 확률 값을 구할 수 있게 된다고 볼 수 있습니다.

 

 

Multi-Head Attention

위에서 Q, K, V를 여러 다른 차원으로 projection 시킨 후 각각에서 Scaled Dot-Product Attention에 적용하여 종합한 결과를 도출하는 것이 Multi-head attention이라 할 수 있습니다. 다른 말로 multi-head attention은 self-attention을 병렬적으로 사용한 것이라 볼 수 있습니다.

[Figure 8] Multi-Head Attention

V, K, Q 각각을 h번 다른 linear projection을 통해 변환시키고 병렬적으로 각각의 attnetion을 계산합니다. 이후 이를 종합하여 선형 변환을 통해 최종 값을 계산하게 됩니다.

 

Feed Forward NN

일반적인 feed Forward Neural Network와 동일하며, 문장내의 정보를 추출하는 역할을 한다고 볼 수 있습니다.

 

 

Transformer 모델 특징


위와 같은 메커니즘을 통해 transformer는 크게 학습에 있어 CNN과 RNN보다 significant하게 빠르다는 것이 장점입니다. 또한 input/output sequence의 거리에 관계 없이 동작가능하다는 것도 장점인데 이는 병렬처리를 하여 attention을 미리 계산해두었기 때문에 가능합니다.

 

 

 

복잡도 비교


아래의 표는 Self-Attention과 Recurrent, Convolution 레이어에 대한 계산 복잡도를 비교한 표입니다.

 

 

이 중 Transformer 모델에 도입한 Self-Attention 레이어가 가장 효율적임을 알 수 있습니다. 

 

실험 결과


Transforemr 모델의 성능을 보면 아래와 같습니다. 아래는 BLEU 데이터셋에 대한 벤치마크 스코어와 부동소수점(FLOPs) 연산에 대한 결과 입니다.

base model로 영어 → 독일어 번역 성능을 앞질렀고, 이후 big model로 영어 → 프랑스 번역으로 SOTA를 달성한 것을 확인할 수 있습니다. 또한 부동 소수점 연산 또한 base model을 사용하여 대략 100배 가량 계산 효율성이 좋을 것을 확인할 수 있습니다. 

 

 

Reference


https://machinereads.wordpress.com/2018/09/26/attention-is-all-you-need/

https://velog.io/@dscwinterstudy/%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D2-8%EC%9E%A5

https://machinereads.wordpress.com/2018/09/26/attention-is-all-you-need/

https://melon-buffer-f27.notion.site/Attention-is-All-You-Need-d484b19f68a54d589cfdb2d76495c73c

https://omicro03.medium.com/attention-is-all-you-need-transformer-paper-정리-83066192d9ab

http://ko.gravatar.com/harperpark

https://tech.kakaoenterprise.com/45

 

Manifold Learning이란 고차원 데이터가 있을 때 고차원 데이터를 데이터 공간에 뿌리면 샘플들을 잘 아우르는 subspace가 있을 것이라 가정에서 학습을 진행하는 방법이다. Manifold Learning은 차원축소를 위해 사용하며 이를 통해 고차원 데이터를 저차원에서도 잘 표현하는 공간인 manifold를 찾아 차원을 축소시킨다.

 

이러한 차원축소가 필요한 이유는 크게 두 가지로, 첫 번째는 차원의 저주 문제를 해결하기 위함이다. 고차원으로 갈수록 데이터들은 희박하게 분포하게 된다. 이럴 경우 비슷한 데이터들의 특성을 잘 표현할 수 없다. 따라서 차원축소로 차원의 저주 문제를 해결하고, 학습 속도와 모델 성능을 향상시키기 위해 Manifold Learning이 사용된다. 

 

차원의 저주: 차원이 증가할수록 공간 부피는 기하급수적 증가

 

두 번째는 아래 그림과 같이 고차원 공간상에서의 데이터 포인트가 의미적으로 가까워보일 수 있으나 실제로는 거리가 먼 경우가 있고, 의미적으로 완전히 다를 수 있기 때문이다. 앞서 언급한 차원의 저주로 인해서 고차원 상에서 유의미한 거리 측정하기가 매우 어렵다.

 

 

이러한 문제를 해결하고자 Manifold Learning 즉, 차원축소 방법이 필요하다. 이러한 차원축소 방법 종류는 아래와 같이 크게 선형과 비선형으로 나뉘며 선형에는 PCA, LDA가 비선형에는 t-SNE, LLE, ISOMAP, MDS, AE 등이 있다.

 

 

선형

PCA는 1993년에 만들어진 차원축소 기법으로, 데이터를 투영시켰을 때 분산을 가장 크게 만드는 어떤 벡터(Principal Axis)를 찾는 방식으로 동작한다. 이를 위해 공분산 행렬과 특이값 분해(SVD)를 사용한다.(https://roytravel.tistory.com/341)

 

LDA는 선형판별분석이라 부르며 다른 클래스에 속한 데이터를 선형 분류 가능하도록 데이터 포인트를 투영시키는 알고리즘이다. PCA는 단순히 데이터 포인트의 분산이 가장 크도록 만드는 벡터를 찾았다. 반면 LDA는 데이터 포인트를 투영시켰을 때, 클래스간 거리를 최대가 될 수 있게 데이터 포인트의 평균거리 합을 최대로 만드는 조건과 클래스 내 데이터 포인트의 분산을 최소로 만드는 조건을 갖춘 벡터를 찾는다. 

 

비선형

t-SNE는 고차원 공간에서 유사한 두 벡터가 저차원에서도 유사하도록 원 공간에서 점들 간 유사도를 보존하며 차원을 축소하는 방법이다. 

 

Kernel PCA는 기존 PCA와 같이 linear projection을 수행하는 것이 아닌 약간의 트릭을 추가하여 non-linear projection을 수행할 수 있도록 하는 방법이다.

 

LLE는 PCA로는 불가능한 비선형적 차원 축소를 가능하게 하는 방법이다. 고차원 공간에서 인접한 데이터 포인트 간의 선형적 구조를 보존하면서 저차원으로 임베딩한다. 다르게 말해 LLE는 각 데이터 포인트들이 k개의 neighbor들과 얼마나 선형적으로 연결되어있는가를 추론하는 과정이다. 크게 아래 3단계로 동작한다.

LLE 동작 과정

첫 번째로 가장 가까운 이웃을 찾고 두 번째로 가중치 행렬을 구성한 다음 부분적으로 고유치를 분해하는 방식으로 동작한다. LLE는 기본적으로 isomap 방식과 목적은 동일하지만 Locality를 어떻게 수학적으로 반영하냐에 따라 ISOMAP의 차이가 발생한다.

 

ISOMAP은 1952년에 만들어진 것으로 다차원 스케일링(MDS) 또는 주성분 분석(PCA) 두 방법론을 결합한 방법이다. 모든 점 사이의 측지 거리를 유지하는 더 낮은 차원의 임베딩을 찾는다. 측지 거리란 두 측점 사이의 타원 체면을 따라 이뤄진 거리를 말한다. 

ISOMAP

위 그림을 보면 두 점은 유클리디안 거리로는 가깝지만 실제 측지 거리는 색깔이 나타내는 의미만큼 멀리 떨어져 위치함을 알 수 있다. 즉, Isomap 알고리즘은 두 데이터간의 실제 특징을 반영하는 거리 정보를 사용하는 효과적인 차원 축소를 추구한다. 

 

MDS는 다차원척도법으로 D차원 공간 상의 데이터가 있을 때 그 데이터 간의 거리가 저차원 공간상에서도 최대한 보존되도록 하는 벡터를 찾는 방법이다.

 

Auto Encoder는 실제 공간에 표현된 데이터를 보다 잘 표현할 수 있는 잠재 공간(latent space)를 찾아 축소하는 방법이다. 데이터를 잠재 공간으로 압축하는 encoder와, 잠재공간을 이용해 원래 데이터로 복원시키는 decoder를 사용한다.

 

 

Reference

 

합성곱 신경망(Convolutional Neural Network, CNN)

합성공 신경망은 이미지 데이터를 학습하고 인식하는데 특화된 알고리즘에 해당한다. Convolution의 의미는 신호처리 분야에서 사용되는 용어로 이미지 프로세싱에서 일정한 패턴으로 변환하기 위해 수행하는 행렬연산이라는 의미를 가진다. Convolution은 특정한 수가 조합된 행렬인 필터(=커널)을 사용하는데, 이러한 필터의 값이 어떻게 구성되어 있느냐에 따라 패턴이 달라진다[1].

 

CNN은 1989년에 나온 모델로 현재의, 이미지를 인식하고 처리하는, 컴퓨터 비전 분야에서 가장 많이 사용된다. CNN 모델의 아이디어는 아래의 실험으로부터 차용하였다.

 

 

1950년대 허블과 비셀은 고양이의 시각 피질 실험에서 고양이 시야의 한 쪽에 자극을 주었더니 전체 뉴런이 아닌 특정 뉴런만이 활성화되는 것을 발견했다. 또한 물체의 형태와 방향에 따라서도 활성화되는 뉴런이 다르며 어떤 뉴런의 경우 저수준 뉴런의 출력을 조합한 복잡한 신호에만 반응한다는 것을 관찰했다. 이 실험을 통해 동물의 시각 피질 안의 뉴런들은 일정 범위 안의 자극에만 활성화되는 ‘근접 수용 영역(local receptive field)’을 가지며 이 수용 영역들이 서로 겹쳐져 전체 시야를 이룬다는 것을 발견했다.

 

이러한 아이디어에 영향을 받은 얀 르쿤 교수는 인접한 두 층의 노드들이 전부 연결 되어있는 기존의 인경신경망이 아닌 특정 국소 영역에 속하는 노드들의 연결로 이루어진 획기적인 인공신경망을 고안해냈고 이것이 바로 합성곱 신경망이다.

 

Feature extraction using convolution위의 그림을 통해 특정한 필터를 통해 이미지 데이터에 Convolution(행렬 연산)이 적용되어 변환하는 과정을 확인할 수 있다. 이미지 데이터는 픽셀들의 합으로 이루어져 있는데 한 픽셀은 RGB의 세가지 색으로 구성된다. 따라서 100x100의 아주 작은 이미지라 하여도 (100 x 100 x 3) = 30,000개라는 큰 크기의 데이터로 구성되고 이에 따라 수 많은 이미지를 일반적인 신경망에 그대로 입력시키게 되면 학습에 있어 많은 시간이 필요하게 된다.

 

위와 같이 3x3 사이즈의 필터를 통해 Convolution을 수행하면 오른쪽 그림과 같이 데이터의 크기가 축소되는 효과를 얻을 수 있고, 이러한 Convolution을 여러번 적용하여 데이터의 크기를 줄이면서 이미지의 특징(패턴)을 추출할 수 있다는 것이 합성곱 신경망의 특징에 해당한다[2].

 

완전 연결 계층의 문제점

완전 연결 계층의 경우 이미지 전체를 하나의 데이터로 생각하여 입력으로 받아들이기에, 이미지의 특성을 찾지 못하고 이미지의 위치가 조금만 달라지거나 왜곡된 경우 올바른 성능을 내지 못한다. 즉, 완전연 연결 계층을 이용하여 이미지 분류를 하면 3차원(높이, 폭, 채널)인 이미지 데이터를 입력층에 넣어주기 위해 3차원에서 1차원으로 데이터 변환하는 과정을 거치는데, 이 때 데이터의 형상이 무시된다는 점이다. 이미지 데이터의 경우 3차원(높이, 폭, 채널)의 형상을 가지며, 이 형상은 공간적 구조(Spatial Structure) 또는 공간 정보라 불리는 정보를 가진다.

 

이미지에있어 공간 정보라는 것은 말 그대로 이미지가 가지는 공간적인 정보를 의미하는데, 가까운 픽셀들은 서로 픽셀값이 비슷하여 사진에서 음영, 선, 질감 등으로 보여진다거나, RGB의 각 채널은 서로 밀접히 관련되어 있거나, 거리가 먼 픽셀간의 관련이 없는 등의 정보들을 의미하며 이러한 정보들은 완전 연결 계층에 입력을 위해 3차원에서 1차원으로 Shift되는 순간 정보가 사라지는 문제가 발생한다[3]. 그러나 합성곱 신경망은 완전 연결 신경망과 달리 3차원의 이미지를 그대로 Input Layer에 입력하고 출력 또한 3차원 데이터로 출력하여 다음 Layer로 전달하기 때문에 데이터의 원래 구조를 유지할 수 있다. 이렇게 할 경우 이미지가 왜곡된다하여도 입력 데이터의 공간정보를 잃지 않기 때문에 CNN에서는 형상을 가지는 데이터의 특성을 추출할 수 있어 제대로 학습할 수 있게 된다.

 

이미지 처리와 필터링 기법

이미지 처리에는 다음과 같이 여러 필터링 기법이 존재한다.

https://en.wikipedia.org/wiki/Kernel_(image_processing)위와 같이 기존에는 이미지 처리를 위해서 고정된 필터를 사용했고, 이미지를 처리하고 분류하는 알고리즘을 개발할 때 필터링 기법을 사용하여 분류 정확도를 향상시켰다. 하지만 이러한 필터링 기법을 사용할때 있어 필터를 사람의 직관이나 반복적인 실험을 통해 최적의 필터를 찾아야만 했다. 따라서 합성곱 신경망은 이러한 필터를 일일이 수동으로 고정된 필터를 찾는 것이 아니라 자동으로 데이터 처리에 적합한 필터를 학습하는 것을 목표로 나오게 되었다.

 

합성곱 신경망 아키텍처

일반적인 신경망의 경우 아래 그림과 같이 Affine으로 명시된 Fully-Connected 연산과 ReLU와 같은 활성화 함수의 합성으로 이루어진 계층을 여러 개 쌓은 구조이다.

 

 

ANN의 구조

CNN은 아래의 그림과 같이 합성곱 계층(Convolutioanl Layer)와 풀링 계층(Pooling Layer)라고 하는 새로운 층을 Fully-Connected 계층 이전에 추가함으로써 원본 이미지에 필터링 기법을 적용한 뒤 필터링된 이미지에 대해 분류 연산이 수행되도록 구성된다.

 

CNN의 구조

위의 CNN의 구조를 조금 더 도식화 하면 아래와 같다.

 

CNN 구조 도식화합성곱 신경망은 크게 “필터링”과 “분류”의 과정을 거쳐 결과를 출력하게 되는데 달리 말하여 CNN은 이미지의 특징을 추출하는 부분과 클래스를 분류하는 부분으로 나눌 수 있다. 특징 추출 영역의 경우 위 그림과 같이 Hidden Layer에 속하는 Convolution Layer와 Pooling Layer를 여러 겹 쌓는 형태로 구성된다.

 

Convolution Layer는 입력 데이터에 대해 필터를 적용한 후 활성화 함수를 반영하는 필수 요소에 해당하며, 다음에 위치하는 Pooling Layer는 선택적인 Layer에 해당한다. CNN의 마지막 부분에는 이미지 분류를 위한 Fully Connected Layer가 추가된다. 이미지의 특징을 추출하는 부분과 이미지를 분류하는 부분 사이에 이미지 형태의 데이터를 배열 형태로 만드는 Flatten Layer가 위치한다.

 

CNN은 이미지 특징 추출을 위해 입력된 이미지 데이터를 필터가 순회하며 합성곱을 계산하고, 그 계산 결과를 이용하여 Feature Map을 생성한다. Convolution Layer는 필터의 크기, Stride, Padding의 적용 여부, Max Pooling의 크기에 따라 출력 데이터의 Shape이 변경되며, 앞서 언급한 이러한 요소의 경우 CNN에서 사용하는 학습 파라미터 또는 하이퍼 파라미터에 해당한다.

 

채널(Channel)

이미지를 구성하는 픽셀은 실수이다. 컬러 이미지의 경우 색을 표현하기 위해 각 픽셀을 Red, Green, Blue인 3개의 실수로 표현한 3차원 데이터이다. 컬러 이미지는 3개의 채널로 구성되며, 흑백 이미지는 1개의 채널을 가지는 2차원 데이터로 구성된다. 높이가 64 픽셀, 폭이 32 픽셀인 컬러 사진의 데이터 shape은 (64, 32, 3)으로 표현되며, 높이가 64 픽셀, 폭이 32 픽셀인 흑백 사진의 데이터의 shape은 (64, 39, 1)이다.

 

3개의 채널로 만들어진 컬러 이미지

 

합성곱(Convolution)

합성곱 층은 CNN에서의 가장 중요한 구성요소로, 완전연결 계층과 달리 입력 데이터의 형상을 유지한다. 아래와 같이 3차원 이미지를 그대로 입력층에 받으며, 출력 또한 3차원 데이터로 출력하여 다음 계층으로 전달한다.

 

합성곱 층의 뉴런의 경우 아래와 같이 입력 이미지의 모든 픽셀에 연결되는 것이 아닌, 합성곱 층의 뉴런의 수용영역안에 있는 픽셀에만 연결되기 때문에, 앞의 합성곱층에서는 저수준 특성에 집중하고, 그 다음 합성곱 층에서는 고수준 특성으로 조합해 나가도록 한다[4].

 

합성곱 처리 절차

 

필터(Filter)

위의 합성곱에서 언급한 수용영역을 Convolution Layer에서는 필터 또는 커널이라 부른다. 아래의 그림과 같이 필터는 합성곱 층에서의 가중치 파라미터(W)에 해당하며, 학습단계에서 적절한 필터를 찾도록 학습된다. 이후 합성곱 층에서 입력 데이터에 필터를 적용하여 필터와 유사한 이미지의 영역을 강조하는 특성 맵(Feature Map)을 출력하여 다음 층으로 전달한다.

 

 

필터는 이미지의 특징을 찾아내기 위한 공용 파라미터인데, 필터는 일반적으로 (4, 4)나 (3, 3)과 같은 정사각 행렬로 정의된다. 위의 합성곱 처리 절차와 같이 입력 데이터를 지정된 간격으로 순회하며 채널별로 합성곱을 하고 모든 채널(컬러의 경우 3개)의 합성곱의 합을 Feature Map으로 생성한다.

 

합성곱 계산 절차

 

스트라이드(Stride)

필터는 지정된 간격으로 이동하며 전체 입력데이터와 합성곱을하여 Feature Map을 생성하는데, 위의 그림은 채널이 1개인 입력 데이터를 (3, 3) 크기의 필터로 합성곱을 하는 과정을 설명한 것이다. 이 때 지정된 간격을 Stride라고 부른다.

Stride는 출력 데이터의 크기를 조절하기 위해 사용하며, 일반적으로 Stride는 1과 같이 작은 값에 더 잘 동작하며, Stride가 1일 경우 입력 데이터의 Spatial 크기는 Pooling Layer에서만 조절할 수 있다. 위의 그림은 Stride 1과 이후 언급될 패딩(zero-padding)을 적용한 뒤 합성곱 연산을 수행후 Feature Map을 생성하는 예제이다.

 

패딩(Padding)

패딩은 Convolution Layer의 출력 데이터가 줄어드는 것을 방지하기 위해 사용하는 개념이며, 합성곱 연산을 수행하기 이전에 입력 데이터의 외각에 지정된 픽셀만큼 특정 값으로 채워 넣는 것을 의미하고, 패딩에 사용할 값은 하이퍼파라미터로 결정이 가능하지만 보통 zero-padding을 사용한다. 패딩은 또한 주로 합성곱 층의 출력이 입력 데이터의 공간적 크기와 동일하게 맞춰주기 위해 사용하기도 한다.

 

 

Pooling Layer

풀링 레이어의 경우 컨볼루션 레이어의 출력 데이터를 입력으로 받아서 출력 데이터에 해당하는 Feature Map(=Activation Map)의 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용된다. 풀링 레이어를 사용하는 방법에는 크게 Max Pooling, Average Pooling, Min Pooling이 있다. 아래의 그림은 Max Pooling과 Average Pooling의 동작 방식을 설명하며, 일반적으로 Pooling의 크기와 Stride를 같은 크기로 설정하여 모든 원소가 한 번씩 처리되도록 설정한다.

 

풀링 레이어는 컨볼루션 레이어와 비교하여 다음과 같은 특징이 존재한다.

  • 학습 대상 파라미터가 없음
  • 풀링 레이어를 통과하면 행렬의 크기 감소
  • 풀링 레이어를 통해서 채널 수 변경 없음

이때 필터링을 거친 원본 데이터를 피처맵(Feature Map)이라고 하며 필터를 어떻게 설정할지에 따라 피처맵이 달라진다.

 

Reference

[1] https://ellun.tistory.com/104
[2] cnn이란-합성곱-신경망의-구조-알아보기
[3] [딥러닝] 합성곱 신경망, CNN(Convolutional Neural Network) - 이론편
[4] 06. 합성곱 신경망 - Convolutional Neural Networks
[5] 합성곱 신경망 (Convolutional Neural Network, CNN)과 학습 알고리즘
[6] CNN, Convolutional Neural Network 요약

 

목차

  • 인공지능의 개념
  • 최초의 계산 시스템
  • 인공지능의 역사
  • 앨런튜링 - 인공지능의 개념적 토대를 놓다
  • 다트머스 컨퍼런스
  • 기호주의와 연결주의
  • 첫 번째 AI 겨울과 AI의 부활
  • 두 번째 AI 겨울과 AI의 부활

 

인공지능의 개념

 

인공지능은 인간의 학습능력, 추론능력, 지각능력, 자연언어의 이해능력 등을 포함하는, 지능을 갖춘 컴퓨터 프로그램을 의미한다[1]. 이러한 인공지능의 목표로는 연산속도가 빠른 컴퓨터에 인간의 지능을 부여함으로써 효율적인 문제 해결을 도모하기 위함이다. 이러한 인공지능에 대해 이후에 언급될 지능과 생각 등이 무엇인가에 대한 튜링 테스트나 중국어 방 사고실험과 같은 철학적 관점의 문제가 제기되기도 한다.

 

최초의 계산 시스템

 

Pascaline최초의 계산기라 불리는 시스템은 1642년에 파스칼이라는 학자가 고안한 것으로, 파스칼린이라는 이름의 계산기로 세금계산서에 나오는 덧셈과 뺄셈을 위해 만들어졌다. 이후 1672년경에 철학자인 라이츠니츠가 곱셈을 처리할 수 있는 계산기를 고안했고 1694년에 Stepped reckoner라는 이름으로 완성되었는데, 이러한 라이프니츠의 업적은 0과 1 혹은 On과 Off로 표시할 수 있는 이진법을 개발해 현대식 컴퓨터(디지털) 개발에 초석을 놓았다는점에 의미가 있다. 이후 1822년 찰스 배비지는 조금 더 현대적인 의미의 컴퓨터를 고안하였고, “차분기관”이라하여 명령들을 해석하며 계산을 실행하는 기계 즉, 프로그래밍 가능한 컴퓨터를 설계하고 제작을 시도하였다.

 

Stepped reckoner

 

인공지능의 역사

1943년 논리학자인 윌터 피츠와 신경과학자인 워렌 맥컬럭이 “A Logical Calculus of Ideas Immanent In Nervous Activity”라는 논문에서 인간의 사고 메커니즘에 해당하는 뉴런의 작용을 0과 1로 이루어지는 이진법 논리 모델로 설명하였고 1946년 범용 컴퓨터인 ‘에니악(ENIAC)’의 등장 이후부터 컴퓨터 연구와 함께 인공지능에 대한 연구가 진행되었다.

 

앨런튜링 - 인공지능의 개념적 토대를 놓다

이후 1950년 영국의 수학자인 앨런 튜링은 “Computing Machinery and Intelligence”라는 논문을 발표하였는데, 해당 논문은 생각하는 기계의 구현 가능성에 대한 것으로 “기계가 생각할 수 있는가?”라는 물음을 통해 그 유명한 튜링 테스트가 고안되었고 또한 인공지능에 대한 개념적 토대를 놓게 되었다.

 

다트머스 컨퍼런스

1940년대와 1950년대에 이르러 다양한 영역의 과학으로부터 인공적인 두뇌의 가능성이 논의되었고, 1956년에 마빈 민스키와 존 매카시 등이 개최한 다트머스 컨퍼런스를 통해 현재 AI라 불리는 용어가 정립 되었으며 AI가 학문의 분야로 들어오는 계기가 되었다. 이 컨퍼런스에서 참석자들은 튜링의 ‘생각하는 기계’를 구체화하고 논리와 형식을 갖춘 시스템으로 이행시키는 방법을 두달간 논의하였다. 다트머스 컨퍼런스 이후 AI라는 새로운 학문은 대수학 문제를 풀고, 기하학의 정리를 증명하고, 영어를 학습 등의 발전의 땅을 질주하게 되었다.

 

이렇게 인공지능에 대한 개념적 토대를 놓은 1950년대의 인공지능 연구는 크게 두 분야인 기호주의와 연결주의로 나뉘었다. 기호주의는 인간의 지능과 지식을 기호화, 메뉴얼화하고 이를 따르는 컴퓨터가 있으면 문제 해결이 가능하다는 전제를 기반으로 하며, 이와 관련한 문제로는 체스, 미로, 퍼즐 등이 있다. 이러한 기호주의의 특징은 논리로 해결할 수 있는 문제, 메뉴얼화가 가능한 분야에 강하다는 장점이 존재하며, 영상인식이나 음성인식과 같은 논리로 설명하기 어려운 문제에 약하다는 단점이 있다. 기호주의의 성과로는 수학, 퍼즐, 체스, 미로등과 같은 논리적인 문제를 해결할 수 있게 되었으며 인간과 대화할 수 있는 챗봇이 탄생하게 되었다.

 

이렇게 현실적으로 실현 가능하고 인공지능 기술의 기초가 되는 접근법인 기호주의 분야가 사람들의 관심을 받고 있었으나 1958년 프랭크 로젠블랫이 인공신경망(ANN)의 기본이 되는 알고리즘인 퍼셉트론(Perceptron)을 고안하게 되었고, 사람들의 사진을 대상으로 남자/여자를 구별해내게 되면서 뉴욕 타임즈에 실리게 되었고 이후 인공지능 연구의 트렌드가 기호주의에서 연결주의로 넘어오게 되는 계기가 되었다.

 

연결주의의 경우 뇌 신경 네트워크의 재현을 목표로 하는 접근법으로, 인공지능 학습에 있어 좋은 경험(정보)가 있으면 문제를 해결할 수 있다는 전제를 기반으로 한다. 인간 또한 어떠한 방법을 통해 생각 하는지 알지 못하기에 말로 설명할 수 없는 문제의 경우 경험으로 배우는 것이 효과적이라는 것으로 현재의 기계학습으로 연결된다. 이러한 연결주의의 특징으로는 인간이 메뉴얼로 만들 수 없는 복잡한 문제여도 인공지능이 스스로 답을 찾을 수 있다는 점이다. 이러한 연결주의의 성과를 통해 앞서 언급한 퍼셉트론이 탄생하게 되었다.

기존의 기호주의를 이끌던 마빈 민스키는 연결주의에 비판적인 시각으로 1969년 『퍼셉트론』이라는 책을 출간하면서 기존의 연결주의의 한계 즉, 퍼셉트론의 한계를 수학적으로 증명하게 된다. 퍼셉트론의 경우 XOR 연산이 근본적으로 불가능한 모델이며, 실생활 적용에 있어 한정적이라는 사실을 비판하게 되면서 연결주의에 투자되어 있던 자금이 빠지기 시작하고, 1971년 로젠 블랫의 사망, P-NP 문제와 같은 기호주의의 한계를 다루는 논문이 인공지능이 조합의 증가(Combinational Explosion)을 다룰 수 없다고 발표되면서 소위 AI Winter라 불리는 시기가 15년동안 지속되는 계기가 되었다.

 

첫 번째 AI 겨울과 AI의 부활

마빈 민스키에 의해 퍼셉트론은 AND, OR, NAND와 같은 선형문제는 해결할 수 있으나, XOR과 같은 비선형 문제는 선형분리가 불가능하다는 한계로 인해 도래했던 첫 번째 AI 겨울은, 1986년 현재 딥러닝의 아버지라 불리는 제프리 힌튼 교수가 다층 퍼셉트론(Multi-Layer Perceptron)과 역전파(Backpropagation) 알고리즘을 제시하면서 기존의 XOR의 한계를 극복할 수 있는 것을 실험적으로 증명하게 되면서 AI가 부활하게 되었다.

 

정확히는, 1974년 하버드대의 Paul Werbos가 퍼셉트론 환경에서의 학습을 가능하게 하는 역전파 알고리즘을 고안하였고 인공지능에 대한 침체한 분위기 속 8년 후인 1982년 논문이 발표되었다. 또한 1982년 물리학자인 John Hopfield는 완벽히 새로운 경로에서 정보를 처리하고 학습할 수 있는 신경망의 형태를 증명하였고, 이 시기에 David Rumelhar는(Paul Werbos에 의해 발견된) 역전파라 불리는 신경망을 개선하기 위한 새로운 방법을 알리고 있었다. 이후 역전파 알고리즘과 다층 퍼셉트론은 1984년 얀 르쿤에 의해 다시 세상 밖으로 나오게 되었고, 병렬처리 형태로부터 영감을 받아 1986년 제프리 힌튼에 의해 세상에 알려지게 되었다.

 

두 번째 AI 겨울과 AI의 부활

다층 퍼셉트론과 역전파 알고리즘을 기반으로 1990년대 초반까지 문자 인식 및 음성 인식과 같은 프로그램의 구동 엔진으로 사용되면서 인공지능 연구에 발전을 이루었으나 Vanishing Graidnet(그래디언트 소실)과 Overfitting(과적합) 문제, 컴퓨팅 파워와 같은 한계점이 발견되면서 AI의 두 번째 겨울을 맞이하게 되었다. 하지만 꿋꿋히 인공신경망을 연구해오던 제프리 힌튼 교수는 2006년 “A fast learning algorithm for deep belief nets”라는 논문을 통해 신경망의 가중치의 초기값을 잘 설정한다면 DNN(Deep Neural Network)을 통한 학습이 가능하다는 것을 밝혀내면서 본격적으로 딥러닝이라는 용어가 사용되기 시작했으며, 2012년 제프리 힌튼 팀이 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)라는 이미지 인식 경진대회에서 AlexNet라는 모델을 통해 당시 매우 힘든일이라 판단되었던 오류율을 큰 폭으로 낮추게 되면서 압도적인 우승을 차지했고 이후 다시금 AI의 부흥기가 시작 되었다.

 

Reference

[1] https://ko.wikipedia.org/wiki/인공지능
[2] https://brunch.co.kr/@storypop/28
[3] https://insilicogen.com/blog/340
[4] https://pgr21.com/freedom/57391
[5] Logo

 

배경


데이터 프레임을 분석하는데 있어 컬럼 명이 존재하지 않아서 별도로 달아주어야 할 경우가 있다.

 

 

해결 코드


column_name = ['column1', 'column2', 'column3', 'column4', 'column5']

dataframe = pd.read_csv(fullpath)

data = frame.values.tolist()

new_dataframe = pd.DataFrame(data, columns=column_name)

 

 

코드 해설


  1. 먼저 생성할 컬럼명을 컬럼의 개수에 맞게 작성을 해준다.
  2. pandas를 통해 분석할 데이터 프레임을 읽어들인다.
  3. 데이터 프레임의 values를 모두 리스트에 넣으며 이때 리스트에 들어가는 각 요소는 데이터 프레임의 한 행이 된다.
  4. pd.DataFrame을 사용하여 columns 인자에 생성한 리스트 변수를 넣어줌으로써 컬럼명이 생성된 데이터 프레임이 생성된다.

+ Recent posts