딥러닝 학습 리뷰

Source: Deep Learning on Medium

목차

I. Basic Deeplearning

II. Advanced Deeplearning

III. CNN

IV. RNN : Applications of CNN

I. Basic Deeplearning

  1. 머신러닝의 등장

우리가 사용하던 기존의 예측/분류 방법들은 처리하기 간단한(필요한 논리, 규칙을 만들기 용이한) 자료들에 한해 잘 작동되었다. 하지만 이미지 예측, 챗봇 제작 등 너무 많은 경우의 수가 존재하여 각 경우에 대한 규칙을 모두 제작할 수 없을 경우에는 기존의 방법을 사용할 수 없다. 이 때 등장하게 된 것이 바로 Machine Learning이다.

Machine Learning이란 실제 인간의 뇌 구조에서 아이디어를 따와, 기계를 학습시킨다는 의미에서 만들어진 분류/예측 시스템이다. 정답이 주어진 학습 데이터를 기반으로 학습하는 시스템을 ‘supervised learning’, 정답이 주어지지 않은 학습 데이터를 기반으로 학습하는 시스템을 ‘unsupervised learning’이라고 한다. 이렇게 Machine Learning에는 두 가지 방식이 있는데, 우리는 그 중 supervised learning 방식에 대하여 배워볼 것이다.

2. Supervised learning

Supervised learning은 regression 방식, binary classification 방식, multi-label classification의 세 가지 방식으로 나뉜다. 먼저 regression 방식은 주어진 데이터를 바탕으로 우리가 원하는 데이터를 예측하는 것이다. 예를 들면, 학생들의 중간고사 점수들을 주어진 데이터로 삼아 기말고사 점수를 예측하는 과정이 regression 방식에 속한다. classification과 대비되게 점수, 키, 몸무게 등 연속적인 데이터를 예측하는 것에 쓰이는 방식이다.

Binary classification은 해석해보면 이진 분류 기법 정도로 말할 수 있겠다. 이는 학생들의 중간고사 점수들을 주어진 데이터로 삼아 그 학생들의 과목 이수 여부, 즉 pass/fail 여부를 예측하는 것에 쓰이는 기법이다. 이를 심화시켜 multi-label classification도 구현할 수 있다. multi-label classifcation은 pass/fail이 아닌 A, B, C 등 grade처럼 여러 불연속적인 경우에 대하여 예측을 할 때 쓰이는 기법이다. 간단히 말하자면 각 A, B, C에 대해서 binary classification을 진행하여 이 학생이 A일지 아닐지, B일지 아닐지, C일지 아닐지를 예측하여 가장 확률이 높은 경우를 택해 학생이 어느 grade를 맞을지 분류하게 된다.

Supervised learinig의 이 세 가지 방식은 직렬적인 개념으로, regression 방식에서 예측된 점수가 일정 점수 이상일 때 pass를 주는 방식으로 binary classification을 구현할 수 있고, 위에서 설명한 것처럼 binary classification의 중복을 통해 multi-label classification을 구현할 수 있다. 이제 대강의 원리는 알았으니 예측의 과정들이 어떻게 일어나는지 자세히 살펴보자.

3. Linear regression

a) Hypothesis와 Cost

Hypothesis & Cost

학습 시간 대비 성적과 같이 선형적인 데이터 분석법에 쓰이는 기법이다. 우리는 주어진 데이터를 바탕으로 H(x)=Wx+b 꼴의 직선 식을 만들 것이다. 학습 시간이 1시간, 2시간, 3시간 일 때의 성적을 바탕으로 학습 시간이 4시간일 때의 성적을 예측하는 방식이다. 하지만 여기서 주어진 데이터가 꼭 완벽히 선형일 수는 없다. 만약 데이터가 완벽히 선형이라면 굳이 Machine learning을 건드릴 필요도 없이 y=ax+b의 형태에서 a와 b 두 변수만 두 가지의 데이터로 구해내면 될 것이다. 실제 상황에서는 데이터가 완전하게 선형적이지 않기 때문에, 기존의 논리를 바탕으로 하는 예측법을 쓰려면 피험자의 지능, 피험자 주변의 환경 등 예측해야 할 변수가 매우 많을 것이다. 하지만 Machine learning을 사용한다면 문제가 매우 간단해진다.

cost 함수란 위에서 주어진 데이터를 바탕으로 만든 H(x)와 실제 값, 즉 주어진 데이터의 정답과의 차이의 제곱을 모두 더한 후 데이터의 개수로 나눠줌으로써 평균을 낸 것이다. 위 사진에서 x(i)는 i번째로 주어진 학습 시간, y(i)는 i번째로 주어진 성적이라고 말할 수 있겠다. 우리는 cost 함수를 최대한 작게 만드는 H(x)가 필요하다. 그 H(x)가 바로 가장 실제값에 가까운 예측값이기 때문이다. 따라서 cost 함수를 토대로 H(x)를 구하게 된다. 여기서 의문점이 생길 수 있다. cost 함수에 H(x)가 이미 들어가 있는데, 어떻게 cost 함수로 H(x)를 구한다는 것일까? 마치 계란이 먼저냐 닭이 먼저냐 하는 문제에 빠지게 될 것이다. 이는 초기에 임의의 H(x)를 정해줌으로써 해결된다. 이에 관련한 문제는 추후에 다루도록 하겠다.

b) Gradient descent

cost 함수를 자세히 살펴보면, 변수는 오직 H(x) 안의 W와 b임을 알 수 있다. 그리고 cost 함수는 W와 b에 대하여 각각 2차 함수 형태를 띤다. 따라서 우리는 초기에 주어진 H(x)를 바탕으로 cost 함수를 구해내고, cost 함수의 gradient(편미분 값)을 현재 W, b에 관하여 구해주고, 거기에 학습률이라는 조그마한 수를 곱해주어 W, b값에서 빼준다. cost 함수가 W에 관하여 양의 기울기를 가진 경우를 보면, 극솟값으로 가기 위해서는 기울기의 반대방향으로, 즉 W가 감소하여야 극솟값으로 갈 수 있을 것이다.

만약 우리가 예측율을 높이기 위하여 학습 시간 뿐만 아니라 피험자의 지능지수 등 다수의 feature들을 사용하게 된다면 위의 식에서 W를 행렬로 생각하면 된다. b는 우리가 원하는 결과, 성적의 feature가 하나이므로 그대로 한 개라고 생각할 수 있다. 만약 우리가 원하는 결과가 성적과 피로도라면 b는 두 개가 될 것이다.

그리고 cost 함수는 convex 형태를 띠고 있어야 한다. 그렇지 않으면 극솟값이 여러 지점에서 발생할 경우 기울기 값이 0인 지점에 머물러 있을 수 있다.

4. Logistic regression

a) binary classification

위의 과정을 다 이해하였다면, 우리는 regression 방식의 Machine learning 과정을 이해한 것이다. 이제 classification 방식을 구현하기 위하여 새로운 개념들을 도입해보겠다.

Sigmoid func.

만약 학생들의 중간고사 점수가 주어지고, 중간과 기말의 평균이 70점 이상이 pass인 시험의 통과율을 예측해야 한다고 하자. 우리는 regression 방식에 따라 학생들의 중간고사 점수를 입력하여 기말고사 점수를 예측하고, 이를 토대로 중간고사와 기말고사의 평균을 구한 후 70점을 기준으로 pass/fail을 예측할 수 있을 것이다. 하지만 실제 많은 자연, 사회 현상은 pass/fail을 구분 짓는 확률의 분포가 선형적이지 않고 위에 사진으로 첨부된 sigmoid fuction을 따른다. 따라서 우리는 regression 방법을 통해 구한 값을 sigmoid function에 넣고, decision boundary를 통해 pass/fail을 예측하게 된다. decision boundary란 sigmoid function의 값이 일정 값 이상이면 pass, 일정 값 이하이면 fail을 부여하는 장치이다.

Cost func. of Sigmoid func.

이 경우 cost 함수는 앞서 했던 경우와 다른 형태를 띤다. regression에서 사용된 cost 함수를 쓴다면 cost 함수가 더 이상 convex의 형태를 띠지 않게 된다. 따라서 위와 같은 형태로 정의하면 함수가 구간 내에서 convex 하고, 예측과 일치할 경우 cost 함수의 값이 0이 되므로 바람직한 cost함수라고 할 수 있겠다. 이후에는 regression과 같이 gradient descent을 진행하여 예측을 진행한다.

b) multi-label classification

Soft max func.

multi-label classification의 경우, 만약 우리가 학생이 맞을 등급을 A, B, C 중에 예측한다면, 위의 decision boundary의 과정은 생략하고 각 등급에 대해 세 번의 sigmoid function에 대입하는 방식으로 학생의 등급이 A일 확률, B일 확률, C일 정도(확률과 비슷한 개념)를 예측한다. 각 등급일 정도를 계산하는 것에 필요한 가중치는 당연히 다 다르게 학습된다. 그리고 저 세 개의 sigmoid function의 결과값을 softmax라는 함수에 넣어줌으로써 확률값으로 치환해준다. 위에서 각 등급일 정도라는 표현을 쓴 것은 바로 이 때문이다. 확률은 총합이 1이어야 하는데, sigmoid function에 넣어준 것만으로는 이를 반영하지 못한다. 따라서 softmax 함수에 넣어주게 되는데, softmax 함수에 넣어주면 각 등급일 정도의 값의 차이가 극대화되어 어느 등급일지 쉽게 예측할 수 있는 효과가 있다. 그 후 argmax 함수를 통하여 어느 등급일지 예측을 하게 된다.

Cost func. of softmax. Cross entropy

softmax의 cost 함수는 위와 같이 정의된다. 위에서 cost 함수는 convex 해야 한다고 말했는데, -log 형태를 취해주어 S(i)의 값이 0~1 사이 값이므로 그 구간 내에서 convex 하도록 만들어 준다. 또 label이 1일 때 S(i)가 1이면 cost의 함수의 값이 0이 되게 만들어 준다. 따라서 적절한 cost 함수임을 알 수 있다. 전체 Loss, 즉 오차는 cross entropy의 합들을 cross entropy의 개수로 나눠준 것으로 정의한다. 이후에는 또 gradient descent를 진행하여 신경망을 학습시키고 값을 예측하게 된다.

5. Application

a) Learning rate

학습률을 너무 크게 설정해주면 극솟값에 도달하지 않고 극솟값을 지나 다른 엉뚱한 값의 W가 나오게 될 것이다. 따라서 학습률은 대부분 통상적으로 0.01의 작은 값을 취해준다. 너무 작은 값을 취해주게 되면 학습에 필요한 시간이 너무 길어지게 되니 적당한 값을 취해주도록 하자.

b) Data processing

주어진 데이터를 분석하기 이전에 데이터를 알맞은 형태로 가공하는 작업이 필요하다. 가령 너무 튀거나 필요없는 데이터들이 있으면 제거하고, 데이터의 분포를 데이터의 평균, 표준편차를 구해 정규화 시키는 방법, 각 데이터에 데이터의 최솟값을 뺀 후 데이터의 최댓값-데이터의 최솟값 값으로 나눠주어 데이터의 구간을 0에서 1사이로 만들어주는 등의 방법을 사용한다. raw data의 경우 data의 분포가 일정하지 않아 신경망을 학습시키기 적절치 않기 때문에 이러한 전처리과정은 필수적이다.

c) Over fitting

Regularization

학습을 시킬 수 있는 데이터의 양은 유한한다. 그리고 학습을 시키는 과정에서 같은 dataset 내의 batch로 학습을 진행하다보면 일반적인 경우에 알맞는 신경망이 아닌 학습을 진행한 dataset에 한해 정확한, 일반적인 경우는 잘 맞추지 못하는 신경망이 탄생할 수 있다. 이러한 현상을 overfitting이라고 한다. 반대로 학습의 횟수가 너무 적어 주어진 dataset에 대해서도 학습이 잘 되지 않은 경우를 underfitting이라고 한다. Overfitting은 regularization이라는 방법으로 그 정도를 줄일 수 있다. 위 사진에서, θ(i) 들 중 지배적인 항의 영향력을 줄여주는 방법이다. λ를 크게 설정하면 θ(i)의 기여도가 같아지게 되어 overfitting을 해결할 수 있다는 아이디어이다.

또 overfitting은 주어진 dataset을 잘 활용하는 방식으로 줄일 수 있다. 주어진 dataset에서 한 batch를 뽑고, 다시 dataset을 랜덤하게 섞은 뒤 batch를 뽑는 방식으로 랜덤한 batch들로 신경망을 학습해주면 실제상황에 보다 더 적합한 신경망을 구성할 수 있다.

II. Advanced Deeplearning

  1. 딥러닝의 역사

딥러닝의 역사에 관해 간략하게 살펴보자면, 처음 딥러닝보다 앞단계의 인공지능이 나왔을 때는 전세계가 떠들썩 했었다. 저자도 딥러닝을 처음 접했을 때는 정말 신기했다. 한 번 신경망 모델을 구현하기만 하면, 논리를 따로 구현해줄 필요 없이 출력값이 나오기 때문이다. 이를 응용할 분야는 정말 무궁무진하다. 하지만 곧 난관에 빠지게 되는데, 바로 XOR 문제이다. OR, AND는 기존 하나의 노드로 표현이 가능하였지만, XOR은 하나의 노드로 도저히 표현할 수 없었다. 이를 해결해낸 것이 바로 노드를 여러 개 사용하는 것이다. 노드란 하나의 자료 처리 단위를 뜻한다.

위와 같이 세 개의 노드를 이용하면, 간단한 계산을 통해 XOR 논리가 표현됨을 확인할 수 있다. 하지만 XOR 문제가 해결되었더라도 아직 한 가지 어려움이 남았다. 바로 cost 함수에 대한 각 노드의 가중치의 편미분값을 계산하기 어렵다는 점이다. 이는 back propagation, 한글로 역전파 기법을 통하여 계산한다. 미분의 chainrule(df/dt=df/dx*dx/dt)을 알고 있다면 쉽게 이해할 수 있다(본문에서는 편의상 편미분과 전미분 notation을 혼용하여 기술하였지만 모두 편미분 개념이다).

Back propagation

dg/dz를 계산하려면 어떻게 해야 할까? 바로 chain rule에 의해 dg/dx를 구하고, dx/db를 구하고, db/da를 구하고, da/dz를 구해 모두 곱해주면 된다. 위 주어진 예제를 보면, dg/dz=-1/x², dx/db=b, db/da=exp(a), da/dz=-z이므로 모두 곱해주고 각 변수를 z에 관한 식으로 나누어주면 위의 g(z)를 z로 미분한 식과 같은 결과가 나오게 된다.

2. Relu function

Relu func.

우리는 앞서, 활성화 함수를 sigmoid 함수로 사용하였다. 이 말로 활성화 함수가 어떠한 역할을 하는지 잘 알 수 있을 것이다. 활성화 함수란 우리의 연산결과를 극대화시키는 작업을 말한다. 하지만 sigmoid 함수는 그래프의 양쪽 끝에서의 기울기가 0에 가까워진다. 따라서 0에 가까운 편미분 값이 back propagation을 진행하며 곱해질수록 매우 작아져 결국에 기울기 값이 소실되는 Vanishing gradient 현상이 일어날 수 있다. 따라서 우리는 활성화 함수로 sigmoid 함수가 아닌 Relu 함수를 고안해냈다. Relu 함수는 x<0 : 0, x≥0 : x 인 함수로 x가 0보다 작을 경우 모두 0을 취하고, x가 0보다 크면 기울기가 1로 일정하여 기울기값이 소실되지 않도록 고안한 함수이다.

3. Weight initialization

Xavier Initialization

앞서 우리는 맨 처음 H(x)를 설정할 때 임의의 W, b값을 사용한다고 했다. 그러나 완전히 임의의 값만을 사용하면 최솟값에 도달하지 못할 수 있다. 위 사진의 오른쪽 그림에서, 우리의 W가 A지점에서 시작했다고 생각해보자. 그러면 W는 gradient descent에 의해 기울기 값이 0인 local minima에 빠지거나 saddle point에 정체되어있을 수 있다. 하지만 Xavier initialization을 쓴다면 그런 상황을 조금 피할 수 있다. 이는 가중치를 평균은 0, 분산은 2/(Input channel의 개수+Output 채널의 개수)인 분포에서 추출하여 초기화 하는 방법이다. Relu 함수를 위한 최적의 가중치 초기화 기법은 He initialization이라고 알려져있는데, 이 또한 평균은 0, 분산은 Xavier initialization의 경우의 2배인 분포에서 가중치를 추출하는 방법이다.

4. Dropout

신경망의 구현까지는 완벽했지만, 현재까지 딥러닝을 괴롭히고 있는 문제가 하나 있다. 바로 학습을 위한 충분한 dataset이 확보되어야 한다는 점이다. 유한한 dataset의 효율을 조금이라도 더 높이기 위하여 우리는 dropout이라는 기법을 사용한다. dropout은 우리가 신경망을 학습시킬 때 전체 노드를 모두 사용하는 것이 아닌, 일부 노드들만 사용한 후 학습이 끝났을 때 전체 노드를 사용하는 방법이다. 이를 이용하여 주어진 dataset보다 몇 배의 데이터를 이용하여 학습을 시킨 효과, 여러 신경망 구조를 결합한 결과를 가져올 수 있다.

5. Batch normalization

학습을 진행하며 초기 레이어의 가중치가 한 방향으로 쏠린 output을 뱉어낼 경우, 이 output이 뒷 레이어에 input으로 전달되며 한쪽으로 치우친 input에 대한 학습만을 하게 될 위험성이 있는데, 이를 바로 internal covariate shift라고 한다. 학습이 진행되며 가중치가 치우쳐진 input에 익숙하게 학습되어 제대로 된 습이 이루어지지 않는 것이다. 이를 해결하기 위해 각 레이어에서 내보낸 output의 분포를 강제로 평균을 빼고 분산으로 나누어주고 scaling, shifting을 진행하는 과정이 바로 barch normalization이다.

III. CNN

  1. Convolution & Pooling

CNN의 아이디어는 바로 동물의 시각에서 온다. 동물이 이미지를 입력받을 때 어떻게 처리되나 실험을 해보았는데, 그림의 각 부분을 다른 뉴런들이 서로 관장하여 이미지를 처리하는 것을 관찰하였다. 따라서 우리또한 이미지를 여러 부분으로 나누어 그 부분의 대푯값을 모아 새로운 이미지들을 만들어내고(convolution), 이를 다시 부분으로 나누어 그 부분 중 가장 진한 부분 혹은 평균값을 꺼내어 새로운 축소된 이미지 형태로 나누어 이를 앞에서 배운 Fully connected 신경망에 전달하는 형태로 신경망이 구성된다. 위에서 regression 방식, binary classification, multi-label classification이 직렬적으로 연결된 개념이었던 것처럼 DNN, CNN, RNN은 직렬적인 과정이라 할 수 있겠다.

a) Convolution

그럼 먼저 convolution부터 살펴보자. convolution은 부분의 대푯값을 모아 새로운 이미지를 만드는 것이라 했다. 여기서 filter라는 개념이 필요한데, 이미지의 대푯값을 뽑아내기 위한 연산자 정도로 이해하면 되겠다. 예를 들어 32*32*3의 이미지에 5*5*3의 필터를 사용한다면, 32*32에는 5*5가 28*28번 들어갈 수 있으므로 결과값은 28*28의 이미지가 된다. 5*5*3 구조에서 일단 5*5 부터 살펴본다면, 25개의 칸에는 각각 고유한 가중치가 들어있다. 따라서 이미지의 [0,0]~[4,4]까지 하나의 행렬로 취급하여 필터의 가중치값과 행렬곱을 취해줘 25개의 칸의 정보를 하나의 정보로 요약해준다. 이를 32*32 모든 칸에 반복해 작업해주면 28*28의 정보가 나오고, 이를 R, G, B의 3가지 채널에 대해 연산을 수행해준 후 모두 더해주면 28*28의 정보가 나오게 된다. 결론적으로 n개의 필터를 사용할 경우 28*28*n의 이미지 정보가 나오게 되는 것이다. 여기서 stride라는 개념과 padding의 개념을 설명하겠다. stride란 필터를 적용할 간격을 말하는 것이다. 위 경우는 stride=1인 경우이고, 9*9*1이미지에 3*3*1 필터를 stride=2로 적용한다면 결과값은 4*4가 된다. padding은 이렇게 결과값이 기존의 이미지보다 작게 나오는 것을 방지하기 위하여 이미지의 외곽을 0으로 둘러싸는 작업이다.

b) Pooling

Pooling은 보통 convolution이 진행된 다음에 적용한다. 앞서 convolution이 필터를 통해 행렬곱을 계산했다면, Pooling에서의 필터는 단순히 연산이 적용될 범위를 뜻한다. 적용되는 연산에는 Max, Avg 두 가지 경우가 많이 쓰인다. 이는 인간의 눈이 가장 진한 부분을 캐치하는지, 이미지의 부분의 평균값을 캐치하는지에 따라 적용을 다르게 해 본 것이다. Convolution과 stride, padding의 개념은 똑같이 쓰인다. 주의할 점은 padding=same의 기준은 stride가 1일 때의 기준이므로 보통 pooling의 기본값이 2*2 필터, stride=2인 것을 감안할 때 이미지의 크기는 pooling을 적용하기 전 2n*2n 이었다면 pooling을 적용한 후 padding=same을 적용하였더라도 이미지의 크기가 n*n이 된다는 것이다.

2. Sequantial, Functional, Model subclassing(Model ensemble)

  • Sequantial 방식은 layer가 직렬형태일 때 사용할 수 있다. input은 맨 처음 layer에만 선언해주면 되며, 기본적으로 바로 전 레이어의 output을 input으로 받도록 설계되어있다.
  • 따라서 sequantial 방식은 병렬적인 구조를 구현할 수 없다. 이 때는 functional 방식을 이용하면 된다. Functional 방식과 sequantial 방식의 가장 큰 차이점은 functional 방식에서는 input을 지정해줄 수 있다는 것이다. input값을 지정해줌으로써 우리가 상상할 수 있는 대부분의 구조를 구현할 수 있다.
  • Model subclassing은 model, 즉 신경망의 형태를 class형태로 지정하는 것이다. 이렇게 하게 되면 여러 개의 model 동시에 이용할 수 있다.

3. Data augmentation

위에서도 벌써 두 번이나 언급했듯, 딥러닝에서 유한한 dataset의 활용도를 높이는 것은 큰 과제이다. 주어진 데이터에서 최고의 효율을 뽑아내기 위하여 데이터를 가공하여 개수를 늘리고 신경망에 넣어 학습을 진행하는 방법을 고안했는데, 이것이 바로 data augmentation이다. 이는 이미지를 몇 도 씩 회전시키거나, 몇 픽셀씩 평행이동시켜 이미지를 가공한다. 중간에 빈 픽셀이 생기는 곳에는 가공 전 이미지의 평균값을 넣어주어 새로운 이미지를 생성해준다.

IV. RNN : Applications of CNN

  1. CNN의 한계, RNN의 등장
RNN

CNN은 이미지와 같이 각 데이터(픽셀)의 일부분의 연산의 결과가 독립적인 역할을 하는 정보처리에는 용이했지만, 단어 혹은 문장과 같은, 데이터의 일부분의 연산의 결과가 결과값에 영향을 주는 정보처리에는 사용할 수 없었다. 그래서 input이 하나씩 들어올수록 그 결과값에 새로운 input을 조합하여 결과값을 내는 방법이 바로 RNN이다. 위 그림을 참고한다면 이해가 쉬울 것이다.

2. 여러 RNN 방식

Various usage of RNN

RNN은 CNN과 같은 one to one 방식, one to many 방식 등 여러가지 방식이 있다. One to many 방식은 연관 검색어를 생성할 때, many to one 방식은 문장의 긍정적, 부정적 느낌을 판단할 때, many to many는 문장에 대한 답을 하는 챗봇을 제작할 때 쓰인다.