- ImageNet에서 120만개의 고해상도 image를 대상으로 1000개의 클래스를 분류하는 문제에 대해 좋은 결과를 내었음
- 6000만개의 parameter와 650,000여개의 뉴런 [5개의 CONV 층(maxpool), 3개의 FullyConnected 층(마지막은 1000개 클래스를 구분하는 softmax층)]으로 구성 - training을 빨리 하기 위해 포화되지 않은(non-saturating) 뉴런들과 효과적인 GPU를 사용 - overfitting을 줄이기(reduce)위해 dropout(매우 효과적으로 증명된 regularized method)을 사용
- ILSVRC-2012 대회에서 2등인 26.2%에 비해 15.3%의 error rate를 성취하였음 (Imagenet Large-scale Visual Recognition Challenge)
1. 서론 (Introduction)
- 현재 사물인식에서 기계학습(machine learning)방식의 사용은 필수적이다. - 이를 위해 다음과 같은 방법으로 향상을 시키는데, 더 많은 데이터셋, 강력한 모델 및 더 좋은 과적합을 막는 기술등이 있다. 과거, MNIST와 같은 데이터들은 적은 양으로도 가능하였지만 현실에서는 상당히 다양하며(considerable variablility) 따라서 더 많은 training set을 필요로 하는 것은 필수불가결한 사항이 되어버렸다.
- 수많은 사물을 구분하려면 많은 학습능력을 지녀야 한다. 하지만, 사물인식의 거대한 복잡도의 문제는 ImageNet같은 거대한 dataset에서 명시될 수 없다는 점이다.
- 학습능력은 depth와 breadth를 다양화하면서 조정할 수 있는데, feedforward neural network와 비교했을 때, CNN은 더 적은 연결과 parameter를 갖기에 train하기 쉽고 이론적으로 최상의 효과를 약간의 단점만으로 낼 수 있다.
2.The Dataset
- ImageNet을 이용했는데, ImageNet은 22,000개의 카테고리, 1500만개의 라벨링된 고해상도의 사진으로 이루어져 있다. - 따라서 image를 down-sample하여 해상도를 256X256으로 맞춰 image를 rescale하였다. - raw RGB의 pixel로 train을 진행하였다.
3.The Architecture
3.1 ReLU Nonlinearity
- Deep CNN에서 tanh unit의 사용보다 ReLU의 사용이 훨씬 빠르다는 것을 알 수 있다. 이런 빠른 학습은 큰 데이터셋을 갖는 large한 모델에 매우 훌륭한 영향을 준다. 위 그림에 대한 설명이다. - 실선: 4개의 Conv층 (with relu), 6배 더 빠르다. - 점선: 4개의 Conv층 (with tanh) - ReLu는 지속적인 학습의 진행으로 saturating neuron보다 더 빠르게 학습한다. 우리는 여기서 미리 포화된(large neural net)뉴런 모델을 굳이 경험할 필요가 없음을 알 수 있다.
3.2 Training on Multiple GPUs
-single GTX 580 GPU 코어는 메모리가 3GB이기에 훈련가능한 신경망의 최대크기가 제한된다. - 따라서 2개의 GPU에 신경망을 흩어뜨리는GPU병렬화(parallelization scheme)를 이용한다. -이때, 2개의 GPU net이 1개의 GPU net보다 훈련에 더 적은 시간이 걸리고 오류율도 1.2~1.7%정도 감소시켰다.
3.3 Local Response Normalization
- ReLU는 포화(saturating)방지를 위한 입력 정규화를 필요로 하지 않는 바람직한 특성을 갖는다. - ReLU는 local 정규화 일반화에 도움이 된다.
- 위의 식은 다음과 같이 해석된다.
kernel i의 위치 (x,y)를 적용해 계산된 뉴런의 activity이다. 여기에 ReLU의 비선형성을 적용한다.
이때, 합은 동일한 공간위치에서 n개의 '인접한(adjecent)' kernel map에 걸쳐 실행된다. (N은 layer의 총 kernel수) kernel map의 순서는 training이 시작하기 전에 임의로(arbitrary) 결정된다. 이런 반응정규화(response normalization)의 종류는 영감을 받은(inspired) 측면억제(lateral inhibition)형태를 구현, 이를 통한 다른 커널의 사용으로 계산된 뉴런 출력간의 large activity에 대한 경쟁(competition)을 생성한다.
상수 k, n, α, β는 validation set을 사용하여 값이 결정되는 hyper-parameter로 각각k = 2, n = 5, α = 10-4, β = 0.75를 사용하며 특정 layer에서 ReLU의 비선형성을 적용한 후 이 정규화를 적용했다(3.5 참조).
Jarrett의 local contrast normalization과 비슷하지만 mean activity를 빼지(subtract)않았기에 우리의 이 정규화를 'brightness normalization'이라 더 장확하게 부를 것이다.
3.4 Overlapping Pooling
CNN에서의 pooling layer는 동일한 kernel map에서 '인접한(adjacent)' 뉴런 그룹의 output을 summarize한다. 보편적으로 adjacent pooling으로 요약되면 unit들이 겹치지 않는다. 즉,pooling layer는 픽셀들 사이에 s만큼의 간격을 둔 pooling unit들의 grid로 구성되며, 각각은 pooling unit의 위치를 중심으로 한 크기(zxz)의 neighbor를 요약한다. 만약위에서의 s를 s = z로 설정하면 CNN에서 일반적으로 사용되는 보편적인 local pooling을 얻을 수 있으며, s < z를 설정하면 overlapping pooling을 얻을 수 있다.
이때문에 전반적인 신경망에서 s=2나 s=3으로 사용하는 것이다. 또한 일반적인 training에서는overlapping pooling이 있는 모델이 모델을 과적합하기가 약간 더 어렵다는 것을 알 수 있다
3.5 Overall Architecture
총 8개의 weight를 갖는 layer로 구성되어 있다. - 5개의 CONV (convolution layer) -3개의 FC (Fully-connected layer) + 마지막은 1000개의 클래스를 구분하는 softmax층
이 모델은 다항식 logistic regression 분석목표를 최대화 하는데, 이는 예측분포(prediction distribution)하에서 올바른 label의 log확률(log-probability)의 training cases에 대한 평균(average)을 최대화하는 것과 같다.
2, 4, 5번째의 CONV의 kernel은 동일한 GPU에 있는 이전 layer의 kernel map에만 연결된다. (아래그림 참조) 3번째 CONV는 2번째 CONV의 모든 kernel map들과 연결되며 완전히 연결된 층의 뉴런은 이전 층의 모든뉴런들과 연결된다.
response-normalization층들은 1, 2번째 CONV를 따르며 3.4절에 기술된 종류의 MaxPooling은 response-normalization layer와 5번째 CONV layer를 모두 따른다.
ReLU의 비선형성은 모든 CONV와 FC의 출력에 적용되며 첫 번째 CONV은11×11×3의 96개의 kernel을 가지며 224×224×3(150,528 차원)의 input image를 stride=4로 filtering을 진행한다. (신경망의 뉴런수는 다음과 같다. 150,528-253,440–186,624–64,896–64,896–43,264–4096–1000)
2번째 CONV는 첫번째 CONV의 출력을 입력으로 받아5×5×48의 256개의 kernel로 filtering을 진행하며 3번째 CONV는3×3×256의 384개의 kernel을 두번째 CONV output과 연결하고 4번째 CONV는 3×3×192의 384개의 kernel로, 5번째 CONV는3×3×192의 256개의 kernel로 filtering하며 3, 4, 5번째 CONV는 어떠한 간섭(intervening)pooling과 normalization layer없이 서로 연결된다.
또한 FC (Fully-Connected layer)는 각각 4096개의 뉴런을 갖는다.
4.Reducing Overfitting
4.1 Data Augmentation
① image translation. &. horizontal reflection - image translation: 한 도메인의 입력 이미지를 다른 도메인의 해당 이미지로 변환하는 것 - 이 방법을 통해 train에 상호의존적일 수 있고 이런 scheme이 없었다면 overfitting의 어려움을 겪었을 것이다.
② altering intensities of the RGB channels - ImageNet의 training set 전체의 RGB픽셀값에 PCA를 수행 - 각 train image에 해당 eigenvalues(고유값)에 비례하는 크기와 평균 0, 표준편차 0.1을 갖는 zero-mean Gaussian 분포(정규분포)에서 도출된 random변수를 곱해 나온 주요 구성요소의 배수를 추가한다. - 따라서 RGB 픽셀 Ixy =[IR , IG , IB ]T에 아래 값을 추가한다. - 이때, pi와 yi는 각각 RGB pixel의 3x3 covariance(공분산)행렬의 i번째 eigenvector와 eigenvalue이며 αi는 이전에 설명한 random 변수이다. 각 αi는 해당 이미지가 다시 훈련에 사용될 때까지 특정 훈련 이미지의 모든 픽셀에 대해 한 번만 그려지며, 이 시점에서 다시 그려진다.
4.2 Dropout
- Dropout은 전진의 기여도를 없애고 역전파를 관여하지 못하게 하는 방식으로 많고 다른 뉴런들의 부분집합을 random하게 결합시키는데 유용하다. - 0.5의 비율로 FC의 처음 2개의 layer에 적용하였으며 dropout이 없으면 상당한 과적합을 보여주었다.
<-- wi에서 평가된 w의 미분(derivative)의 i번째 batch Di의 평균으로 Loss function의 기울기을 의미한다.
<초기화> 표준편차가 0.01인 zero-mean Gaussian 분포로 각 층의 weight를 초기화 2,4,5 CONV층과 FC층은 상수 1로 , 나머지 층은 0으로 bias를 초기화 validation error가 개선되지 않으면 학습율을 10으로 나눔 (0.01로 초기화 하였으며 종료전에 3배정도 감소하였음)
6.Results
- ILSVRC-2010에 대한 결과의 요약은 다음과 같다. 신경망은 37.5%와 17.0%5의 상위 1위와 상위 5위의 테스트 세트 오류율을 달성하는 것을 볼 수 있다.
ILSVRC-2010 경쟁에서 달성된 최고의 성능은 서로 다른 기능에 대해 훈련된 6개의 spase coding 모델에서 생성된 예측을 평균화하는 접근 방식으로 47.1%와 28.2%였다. 그 이후 가장 잘 발표된 결과는 Fisher Vectors (FVS)에 대해 훈련된 두 분류기의 예측을 평균화하는 접근 방식으로 45.7%와 25.7%였으며 두 가지 유형의 조밀하게 샘플링된 특징으로부터 계산되었다.
- 또한 ILSVRC-2012 대회에서의 결과는 다음과 같다. 단락(paragraph)의 나머지 부분에서는 검증 및 테스트 오류율이 0.1% 이상 차이가 나지 않기 때문에 서로 교환하여 사용한다.
이 논문에서 설명한 CNN은 다음과 같은 성과를 거두었다 상위 5위 이내의 오류율 18.2%. 5개의 유사한 CNN의 예측을 평균하면 16.4%의 오류율을 얻었다.
- 마지막 pooling layer에서 추가적으로 6차 컨볼루션 레이어가 있는 CNN 하나를 교육하여 ImageNet Fall 2011 release (15M images, 22K categories)를 분류한 다음 ILSVRC-2012에서 "미세 조정(fine-tuning)"하면 16.6%의 오류율을 얻을 수 있다. 앞서 언급한 5개의 CNN으로 2011년 가을 전체 릴리스에서 사전 훈련된 2개의 CNN의 예측을 평균하면 15.3%의 오류율을 얻을 수 있다. 두 번째로 우수한 콘테스트 항목은 다양한 유형의 조밀하게 샘플링된 기능에서 계산된 FV에 대해 훈련된 여러 분류기의 예측을 평균화하는 접근 방식으로 26.2%의 오류율을 달성했다.
- 마지막으로, 우리는 또한 10,184개의 범주를 가진 Fall 2009 version of ImageNet에 대한 오류율을 보고한다 그리고 890만 장의 이미지가 있는데, 이 dataset에서 우리는 학습을 위해 이미지의 절반을 사용하고 테스트를 위해 이미지의 절반을 사용하는 문헌의 관례를 따른다. 확립된 testset이 없기 때문에, 우리의 분할은 반드시 이전 저자들이 사용한 분할과 다르지만, 이것은 결과에 크게 영향을 미치지 않으며 이 dataset에서 상위 1위와 상위 5위의 오류율은 67.4%와 40.9%이며, 위에서 설명한 순으로 달성되나 마지막 pooling layer에 비해 6번째 컨볼루션 계층이 추가된다. 이 데이터 세트에 대한 가장 잘 알려진 결과는 78.1%와 60.9%이다.
6.1 Qualitative Evaluations
이 그림은 신경망의 두 data-connected layer에 의해 학습된 Convolution kernel을 보여준다. 신경망은 다양한 frequency 및 orientation-selective kernels 뿐만 아니라 다양한 색상 blob들을 사용한 것 또한 알 수 있다.
3.5에서 설명한제한된 연결의 결과로 두 GPU가 보여주는 전문화에 주목한다. GPU 1의 커널은 대부분 색상에 구애받지 않는 반면 GPU 2의 커널은 대부분 색상에 따라 다르기에이러한 종류의 전문화는 모든 실행 중에 발생하며 특정 random weight 초기화(GPU의 모듈로 번호 변경)와 무관하다.
위 사진의왼쪽은 다음과 같다. - 8개의 테스트 이미지에 대한 상위 5개 예측을 계산하여 신경망이 무엇을 배웠는지 정성적으로 평가(qualitatively assess)한다. - 이때, 진드기(mite)같이 중심을 벗어난 물체도 net로 인식할 수 있다는 점을 유의해야 한다. (상위 5개의 label은 대부분 합리적인 것으로 보인다.)
위 사진의오른쪽은첫 번째 열에 5개의 ILSVRC-2010 테스트 영상으로나머지 열은 테스트 이미지의 특징 벡터로부터 유클리드 거리(Euclidean distance)가 가장 작은 마지막 숨겨진 레이어에서 특징 벡터를 생성하는 6개의 훈련 이미지를 보여준다.
- 두 이미지가 작은 Euclidean separation으로 특징 활성화 벡터(feature activation vectors)를 생성할 때, 신경망의 고수준이 유사하다 간주한다고 할 수 있다.
- 그림은 testset의 5개 이미지와 이 측정에 따라 각 이미지와 가장 유사한 training set의 6개 이미지를 보여주는데, 픽셀 수준에서 검색된 교육 이미지는 일반적으로 첫 번째 열의 query image의 L2에서 가깝지 않다. 예를 들어, 회수된 개들과 코끼리들은 다양한 포즈로 나타나며 우리는 보충 자료에서 더 많은 train image에 대한 결과를 제시한다.
- 두 개의 4096차원 실제 값 벡터 사이의 Euclidean distance 사용하여 유사성을 계산하는 것은 비효율적이지만, 이러한 벡터를 짧은 이진 코드로 압축하도록 auto-encoder를 훈련시킴으로써 효율적으로 만들 수 있다. 이는 image label을 사용하지 않기에 의미적으로(semantically) 유사한지 여부에 관계없이 edge들과의 유사한 패턴을 가진 이미지를 검색하는 경향이 있는 raw-pixel에 auto-encoder를 적용하는 것보다 훨씬 나은 이미지 검색 방법을 생성해야 한다.
7. Discussion
- 크고 깊은 CNN이 기록을 깨는 좋은 결과를 내는 것을 알 수 있다. - 또한 중간층을 일부 삭제하더라도 성능이 떨어지는 것을 알 수 있듯, 깊이가 정말로 우리의 결과를 이룩하는데 중요하다는 것을 알 수 있다.
- 실험을 단순화하기 위해, 특히 label이 지정된 데이터의 양에서 그에 상응하는 증가를 얻지 않고 신경망의 크기를 크게 늘릴 수 있는 충분한 계산 능력을 얻는 경우에 도움이 될 것으로 예상했음에도 불구하고 unsupervised pre-training을 사용하지 않았다.
🧐 논문 감상_중요개념 핵심 요약
"ImageNet Classification with Deep Convolutional Neural Networks" Alex Krizhevsky, Ilya Sutskever 및 Geoffrey Hinton이 2012년에 발표한 연구 논문으로 이 논문은 2012년 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)에서 최첨단 성능을 달성한 AlexNet이라는 심층 합성곱 신경망을 제안한다.
[핵심 개념]
1. Convolutional Neural Networks Convolutional 및 Subsampling 층의 여러 layer로 구성된 Deep CNN Architecture와 Fully-Connected layer를 제안한다.
2.Rectified Linear Units(ReLU) 이 논문은 Sigmoid 및 tanh와 같은 기존 활성화 함수보다 더간단하고 효율적인 ReLU 활성화 함수의 소개 및 활용을 진행한최초의 논문이기에 더욱 중요하다고 볼 수 있다.
3. Local Response Normalization(LRN) 이 논문은 일종의 측면 억제(lateral inhibition)를 제공하여 일반화 성능을 개선하는 데 도움이 되는LRN이라는 정규화 유형을 제안한다.
4. Dropout 이 논문은 과적합을 방지하기 위해 훈련 중에 일부 뉴런을 무작위로 제거하는 드롭아웃이라는 정규화 기술을 소개하였다.
5. Data Augmentation 이 논문은 training set의 크기를 늘리고 model의 견고성을 늘ㄹ리기 위해random crop, vertical flip같은 기술을 사용했다.
6. State-of-the-Art Performance (최신 성능) 이 논문은 ILSVRC 2012 분류 작업에서 최신 성능을 달성하여 이전 방법보다 훨씬 뛰어난 성능을 보여준다.
전반적으로 이 논문은Convolution신경망, ReLU 활성화 함수 및 데이터 증강의 사용과 같은 딥 러닝의 몇 가지 중요한 개념을 소개하고 까다로운 컴퓨터 비전 작업에서 최첨단 성능을 달성하는 데 있어 그 효과를 입증했다.
🧐 논문을 읽고 Architecture 생성 (withtensorflow)
import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, Dropout
def AlexNet(input_shape, num_classes):
input_layer = Input(shape=input_shape)
# first convolutional layer
x = Conv2D(96, kernel_size=(11,11), strides=(4,4), padding='valid', activation='relu')(input_layer)
x = MaxPooling2D(pool_size=(3,3), strides=(2,2))(x)
x = Dropout(0.25)(x)
# second convolutional layer
x = Conv2D(256, kernel_size=(5,5), strides=(1,1), padding='same', activation='relu')(x)
x = MaxPooling2D(pool_size=(3,3), strides=(2,2))(x)
x = Dropout(0.25)(x)
# third convolutional layer
x = Conv2D(384, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu')(x)
x = Dropout(0.25)(x)
# fourth convolutional layer
x = Conv2D(384, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu')(x)
x = Dropout(0.25)(x)
# fifth convolutional layer
x = Conv2D(256, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu')(x)
x = MaxPooling2D(pool_size=(3,3), strides=(2,2))(x)
x = Dropout(0.25)(x)
# flatten the output from the convolutional layers
x = Flatten()(x)
# first fully connected layer
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
# second fully connected layer
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
# output layer
output_layer = Dense(num_classes, activation='softmax')(x)
# define the model with input and output layers
model = tf.keras.Model(inputs=input_layer, outputs=output_layer)
return model
model = AlexNet(input_shape=(224,224,3), num_classes=1000)
model.summary()
이때, window가 움직이면서 표본을 계속 뽑아 연산을 해 새로운 값을 도출하는 기법. (sliding되는 것을 window(kernel) = filter라고도 부른다.)
- 또한, 상하좌우와 channel검사도 해야해서 3중for문으로 구현해야한다. - 이때, filter로 인해 발생한 표본집단을 patch라고 한다. - mean filter = patch와 kernel의 합성곱이 patch의 평균값이 되는 것
이를 이용해 blurring이 가능하다. (average blurring)
if sharp한 image의 경우:
(차이가 큰 value) mean filter의 사용은 sharpness를 없앤다.
이때, 평균이 아닌 중앙값을 이용한 median filter를 사용하면?
-> sharpness의 특성을 위보다 더 살릴 수 있다.
단, 나머지 픽셀의 정보를 소실한다.
-> 여러번 반복하면 소실이 반복, 남는 픽셀의 개수가 줄어든다.
-> 즉, 반복이 많아질수록 정보의 손실이 커진다.
🤫 NLP(Natural Language Processing)란? 컴퓨터의 언어가 아닌, 인간이 사용하는 언어를 처리하는 분야이다.
🤫 token? 그게 뭐지?? 글 ⊃ 문장 ⊃ 단어로 글은 이루어져 있는데, 단어는 글의 의미있는 부분 중 가장 작은단위이다. 이때, 문법적으로 가장 작은 단위를 토큰(token)이라 하며, 전체 글을 토큰으로 나누는 것을 토큰화(tokenization)라한다.
이렇게 토큰화를 이용하면 기본적인 분석이 가능한데, 예를들어 어떤 토큰이 자주 사용되는지를 알 수 있는데, 이를 워드 카운트(word_counts)라 한다.
🧐 단어를 벡터로 변환
🤫 token을 벡터로 변환?? token을 벡터로 표현하는 방법의 하나는 one-hot encoding인데, 이에 대해 아래 코드로 살펴보자.
🧐 단어 임베딩 (embedding)
🤫 token을 벡터로 변환?? token을 벡터로 표현하는 one-hot encoding은 장점도 있지만 단점이 명확한 방법이다. 만약 단어 인덱스가 100,000개 존재한다면? → 하나의 단어를 표현하기 위해 100,001길이의 벡터가 필요하게 된다는 점!
따라서 단어 임베딩(Embedding)이라는 방법을 사용한다. 단어 임베딩은 단어 벡터의 길이를 사용자가 직접 지정할 수 있다는 장점이 있다. 즉, 인덱스 길이에 상관없이 사용자가 지정한 벡터의 길이로 모든 단어를 표현한다. 임베딩의 원리: '바꾸고'라는 단어를 임베딩하는 과정임베딩하려는 단어의 벡터를 준비하고 임베딩을 위한 행렬을 준비한다. [행: 임베딩할 단어의 개수 // 열: 임베딩 벡터의 크기]
위에서의 실습에서 벡터의 길이가 6이었지만, 아래는 해당 문장을 벡터의 길이가 3으로 지정해 임베딩하는 것을 보여주는 코드이다.
🧐 seq2seq model
기존의 딥러닝 - 기존의 딥러닝은 input과 output데이터의 차원이 고정된 벡터인 경우에만 사용 - 하지만 실제 문제들은 벡터의 길이가 사전에 알 수 없는 sequence로 표현되는 경우가 많음
🤫 seq2seq란? 입력값으로 sequence를 받고 출력값으로 다른 sequence를 출력하는 모형 입력 sequence와 출력 sequence를 맵핑하는 model으로 다음 2가지 경우가 존재 1. input sequence와 output sequence가 같은 경우 (input sequence의 길이정보가 필수적) 2. input sequence와 output sequence의 길이가 다른 경우 (targe예측을 위한 input sequence 전체가 요구됨)
🤫 seq2seq에 대한 개념적, 구조적 접근 개념적: RNN과 Auto-Encoder를 합친 형태 구조적: 2개의 RNN을 합친 형태 (특히 LSTM과 GRU를 자주 사용) 아래 예시를 통해 이해해 보자. 인코더 내부에서 1개의 step마다 한개의 LSTM모형이 존재하기에 결과적으로 여러 LSTM이 존재하고 큰 차원의 벡터를 입력받을 수 있다. 이때, 인코더는 입력시퀀스를 처리하고 은닉"상태(state)"를 return한다. 즉, encoder의 output은 버리고 오직 "상태"만 전달시키는데, 이때 인코딩 과정에서 입력데이터를 하나의 벡터로 압축하는 context vector를 진행한다. 인코딩 과정을 거친 은닉벡터를 입력받아 출력 시퀀스를 출력한다. 이때, 디코더는target sequence의 한 시점 이전 문자가 주어지면, 바로 다음 문자를 예측하도록 학습되며 중요한 점은 디코더는 인코더의 출력벡터인 context vector를 초기 벡터로 사용한다! 즉,target sequence를 같은 sequence로 변하게 학습하지만 한시점 미래로 offset을 하는, 교사강요(teacher forcing) 학습과정을 진행한다. ex) input sequence가 주어지면 디코더는 target값[..t]가 주어질 때, target값[t+1..]를 예측하도록 학습한다. 이를 통해 디코더는 어떤 문자를 생성할 것인지에 대한 정보를 구할 수 있다.
이때, <sos>는 start-of-string을, <eos>는 end-of-string을 의미한다.
🤫 seq2seq. Algorithm 1. input sequence를 context 벡터로 encoding, 출력 2. size가 1의 target sequence로 시작.(target sequence는 단지 start-of-string문자) 3. 다음 문자를 예측하기 위해 decoder에 상태벡터와 1-char target sequence를 넣는다. 4. 이러한 예측법으로 다음 문자를 sampling 5. 뽑힌 문자를 target sequence에 추가 6. 이러한 과정을 <eos>가 나오거나 문자 한계치에 도달할 때까지 반복
🤫 입력시퀀스 (x1, . . . , xn)을 입력받았을 때, 출력시퀀스(y1, . . ., yn')를 출력하는 모델에 대해 살펴보자. 입력시퀀스에 대한 출력시퀀스의 조건부확률 P(y1, . . ., yn' | x1, . . . , xn)를 추정해야 하는 것이 목적이므로 아래와 같은 식을 사용해 구할 수 있다. 위 식에서 v는 입력데이터 시퀀스 데이터 x가 인코더를 거친 후 출력되는 context vector를 의미하며 P(yt |v, y1, . . . ,yt-1)는 모든 가능한 출력 후보에 softmax함수를 적용한 값이다.
🧐 Attention
🤫 seq2seq보다 좀 더 발전시켜볼까? 이름처럼 주위에 신경을 기울인다는 뜻으로 출력단어를 예측하는 매 시점 encoder에서 전체 입력문장을 참고하는 방식. 앞서 배운 seq2seq(일명 바닐라 seq2seq)는 직전 벡터에 가장 큰 영향을 받아 시간이 지나면서 정보를 잃는 한계점이 존재 반면, attention은 모든 decoding과정마다 encoder내부의 모든 hidden layer를 참고한다. 이때, encoder의 은닉상태를 동등하게 참고하지 않고 출력단어와 연관이 있는 부분을 좀 더 집중(attention)해서 참고한다.
attention의 세부단계는 총 5단계를 거치는데, 다음과 같다. 1. 내적 - decoder의 은닉상태 벡터 · encodeer의 은닉상태 벡터 = 각각의 은닉상태 벡터에 대한 attention score 2. attention의 분포 구하기 - softmax함수를 이용해 분포를 구하며 확률분포이기에 모두 합하면 1이 된다. - 이때, 막대의 크기가 가장 큰 것이 How에 해당하는 attention score이기에 How와 연관이 크다는 것을 알 수 있다. 3. attention의 output구하기 - attention 분포 ⊙ encoder 은닉상태 = attention output. (원소곱 진행) 4. output layer의 input 구하기 - 출력층 입력 = attention output과 해당단계의 decoder 은닉상태를 이어붙인 후 w를 곱하고 b를 더해 activation 함수에 넣음 5. predict한 값 구하기 - 최종 예측값 = 4에서 구한 출력층 입력벡터에 w행렬을 곱하고 b를 더한 후 softmax를 사용
🤫 Auto - Encoder란? input을 code(hidden layer)로 encoding하는 encoder부분과 encoding된 code를 다시 decoding하는 decoder부분으로 구성되어 있다. Encoding은 원래 data를 차원축소(dimensionality reduction)하는 것이다. - 이때, 입력층보다 적은 수의 노드로 이루어진 은닉층(일명, code)을 중간에 넣어 차원을 줄인다. Decoding은 차원축소(dimensionality reduction)된 data를 원래 data로 복원하는 것이다. - code를 다시 원래 입력층과 같은 크기의 결과물로 출력한다.
원래 auto-encoder는 이전 기계학습에서 말했듯, PCA(주성분 분석)과 같은 차원축소를 위해 사용했었다. 하지만, 현재는 데이터 생성모형으로도 사용되고 있으며, 이때 auto-encoder는 비지도학습(unsupervised learning)에 속한다.
🤫 Auto-Encoder의 내부 구조 및 formula
입력데이터와 출력층의 벡터를 𝜒, code(은닉층)에 해당하는 벡터를 𝟋 라 할 때, encoder ɸ와 decoder 𝜓에 대해 아래의 수식과 같을때,
은닉층에 해당하는 code는 아래와 같이 나타낼 수 있다. h = ɸ1 (W1x + b1). (이때, ɸ는 은닉층의 활성함수를 의미, W와 b는 random하게 초기화, 역전파법으로 학습됨)
은닉층에 해당하는 code를 decoding하는 과정은 아래와 같이 나타낼 수 있다. 𝜒' =ɸ2 (W2x+ b2).
이후 auto-encoder는 입력 데이터 벡터 𝜒와 출력층으로 복원된 data벡터𝜒'간의 복원 에러를 줄이는 방향으로 학습한다.
= || x - ɸ2 (W2(ɸ1(W1x + b1)) + b2) || ^2
🤫 Auto-Encoder의 효과
🤫 Auto-Encoder vs. GAN
GAN: original과 상관없는 결과물을 생성 Auto-Encoder: original의 특징을 잘 살린 결과물을 생성
🧐GAN (Generative Adversarial Networks)
🤫 GAN이란? 초기 딥러닝: Drop-out과 BackPropagation을 기반으로 판별모델(discriminative model)을 사용 이는 데이터 판별에서 좋은 성능을 발휘했는데, 대표적으로 classification, regression이 있다. 반면, 생성모델(generative model)의 경우, 복잡한 확률계산으로 어려움을 겪었다.
GAN(Generative Adversial Network)은 판별모델과 생성모델, 두 신경망의 경쟁(adversial)을 통해 학습시키는 신경망이다. 판별모델의 목적:주어진 데이터가 original인지 생성모델이 만든 가짜인지 구분하는 것 생성모델의 목적:판별모델이 구분할 수 없도록 진짜같은 가짜 데이터를 생성하는 것 이런 GAN은 판별모델이 진짜와 가짜의 구분이 불가할 때까지 발전하는데, 아래와 같다.
1. 가짜 데이터는 판별모델의 학습단계에서 target data 0을 라벨링해 판별모델의 학습대상이 된다. 2. 생성모델의 학습단계에서 가짜데이터의 target data를 1로 설정, 가짜를 진짜로 판별하는 확률을 구한다. 이때, 경쟁의 대상이 되는 진짜는 판별모델의 학습단계에서 target data를 1로 받아 판별모델을 거친다.
🤫 Auto-Encoder vs. GAN
GAN: original과 상관없는 결과물을 생성 Auto-Encoder: original의 특징을 잘 살린 결과물을 생성
🧐GAN Algorithm
1. 랜덤 데이터 분포 Pz로부터 랜덤데이터 z를 추출.
2. 1에서 추출한 random data를 생성모델에 넣고 생성모델을 통해 가짜를 생성.
3. 2에서 얻은 가짜중 m개를 추출해 미니 배치 {z1, . . . , zm}으로 설정.
4. 진짜데이터인 train dataset 분포 Pdata(x)에서 m개를 추출, 미니 배치 {x1, . . . , xm}으로 설정.
5. 아래와 같은 gradient를 이용, 판별모델을 update. 판별모델은 가치함수(value function)를 최소화하는 것이 아닌 최대화 하는 것이 목적. 따라서 아래와 같은 gradient ascent방법을 사용한다.