1. 딥러닝이란? 

딥러닝 (Deep Learning, 이후 DL)은 기계학습 (Machine Learning, 이후 ML)의 한 종류다. 전통적인 ML 알고리즘과 다른 점은 인공신경망(Artificial Neural Network, 이후 NN)을 기반으로 하고 있어 파라미터 개수가 훨씬 많고, 성능도 대체로 더 좋다는 것.

지도학습 딥러닝은 결국, 전통적인 ML과 같이 독립변수와 종속변수의 관계를 가장 잘 설명하는 최적의 파라미터의 값을 찾는 모델을 만드는 과정이다. (딥러닝 모델에서 파라미터는 가중치)

최적의 파라미터는 모델을 학습시켜 얻은 종속변수의 예측치와 실제 값의 차이, 즉 오차를 최소화하는 파라미터다. 이는 파라미터에 대한 함수인 비용함수(가중치에 대한 함수)를 최소화함으로써 구할 수 있다. 

아래 그림은 은닉층이 2개인 간단한 NN 아키텍처다. 


출처 : Jinwon Lee님의 텐서플로으 2.0 강의 자료



은닉층이 3개 이상이면 다층 신경망(Deep NN, DNN)이라고 부른다. 

은닉층을 몇 겹으로 할 것인지, 각 은닉층의 노드(뉴런)의 수를 몇 개로 할 것인지는 연구자가 정하는 하이퍼 파라미터다. 은닉층 뉴런의 수는 일반적으로 입력층이나 출력층보다 많다. (예외, auto encoder??) 


2. 활성화 함수란? 

인공신경망은 이름이 잘 보여주듯 생물의 신경망에서 아이디어를 얻어 고안된 방법이다. (feat. McCulloch와 Pitts의 인공뉴런 모델) 생물의 신경망에 있는 뉴런들이 모든 자극에 대해 반응하는 것이 아니라 일정 수준 이상 자극에만 반응하는 원리를 따라 뉴런에 들어온 인풋의 가중치(weight, w)와의 선형 결합과 활성화 함수를 통해 아웃풋이 나온다. 

보통 같은 레이어의 노드들은 같은 종류의 활성화 함수를 갖는다. 은닉층은 반드시 활성화 함수를 갖고, 출력층은 경우에 따라 활성화 함수를 가질 수도 있고 가지지 않을 수도 있다. 

DL으로 풀려는 문제가 회귀 문제일 경우 출력층은 활성화 함수를 갖지 않거나 ( 혹은 활성화 함수가 항등식 형태라고 볼 수도 있다) 분류 문제일 때는 활성화 함수를 갖는다. 

좀 더 들어가면, 분류 문제는 '한 카테고리로 분류될 수 있는 문제'와 '카테고리 복수 선택이 가능한 문제'가 있는데, 전자의 경우 소프트맥스 함수를 사용하고 후자의 경우 시그모이드 함수를 사용한다. 

카테고리 복수 선택의 가능한 문제의 예를 들어보자. 가령, 영화 장르를 분류하는 문제를 DL으로 해결하려고 할 때 영화 A는 '코미디', '가족', '드라마' 등 여러 카테고리에 동시에 속할 수 있다. 이럴 때 시그모이드 함수를 사용한다.  (그런데 정확히 왜 그런거지?) 

여러 활성화 함수. 위 그림에는 빠졌지만 렉티파이 ReLU도 많이 사용된다.



3. NN 작동 원리 

신경망 작동 원리를 설명하기 위해 은닉층이 1개인 NN 아키텍처를 그렸다. b는 bias, 즉 편향을 뜻한다. 1차 함수의 절편과 같은 역할을 한다.

출처 : 갓상엽 교수님


이 NN은 설명을 위해 은닉층을 1개만 만들어 아주 간단하게 구성한 것이다. 그런데도 계산해야 할 게 꽤나 많고, 이 복잡한 계산을 위해 선형대수를 이용한다. 

입력 노드들에 들어오는 각 관측치에 대한 독립변수들에 편향노드를 +1하고, 입력층과 은닉층 사이에 있는 가중치 행렬과 행렬X행렬을 해준다. 

실제로는 행렬화 해 계산되지만, 설명을 위해 관측치를 하나씩 입력해보자. 그리고 바이어스 노드를 생략해 더 간단한 NN 아키텍처를 보자.


출처 : 갓상엽 교수님


위 NN은 아주 간단한 형태임에도 가중치 즉, 파라미터가 6개나 된다. 


출처 : 갓상엽 교수님


위와 같은 방식으로 y^(종속변수 y의 예측치)를 구했다. 이제 이 예측치를 실제 y와 비교해서 오차(E)를 구한다. DL을 '학습'시킨다는 것은 w에 따른 오차를 최소화할 수 있는 모델을 찾는 것이다. 

구체적으로는 가중치를 여러번 바꿔가며 (= 업데이트하며) 비용함수를 최소화 하는 가중치를 찾는다. 비용함수는 회귀 문제의 경우 MSE, 분류 문제의 경우 교차 엔트로피를 사용한다. (related post : MSE, MLE 차이)


4. 비용함수 최소화 

비용함수를 최소화하는 파라미터 값을 찾는 방법(= optimization)은 크게 3가지가 있다.  (읽어볼 것)

1) normal equation using POC 

appropriate when the cost function is convex. But, usually the cost function of DL is not convex ( a lot more complex)    , 참고 : [ML] Linear Regression

2) 뉴턴-랩슨법

경사 하강법과 유사하지만, 비용함수를 두 번 미분해야 하기 때문에 계산 시간이 더 오래 걸린다. 때문에 잘 안 쓰인다.

3) 경사 하강법  (Gradient Descent)

딥러닝에서는 주로 사용되는 방법


경사 하강법은 한번 파라미터(=가중치)를 업데이트할 때 사용하는 데이터 포인트의 양에 따라 크게 3가지 종류가 있다. 

1) Batch Gradient Descent : 가지고 있는 모든 관측치를 사용해서 비용함수 계산해서 가중치들 업데이트. 모든 데이터 포인트를 계산해야 하므로, 시간이 오래 걸린다. 

2) Stochastic Gradient Descent : 학습 데이터에 있는 가중치들 중 랜덤하게 뽑힌 하나의 관측치 정보만 사용해서 비용함수를 계산해 가중치들 업데이트 -> 반복 

Batch에 비해 계산 시간이 덜 걸리지만, converge가 잘 안 되거나 핑퐁을 많이 칠 수 있다. 특히 랜덤하게 뽑힌 관측치가 아웃라이어일 경우 그렇다. 

3) Mini-batch Gradient Descent : Batch + Stochastic hybrid. 

학습 데이터 한 번만 사용하지 않고 여러 번 사용한다. epoch size가 10이면 학습 데이터에 있는 (예를 들어) 100개의 관측치를 10번 사용한다는 뜻이다. 즉, 학습 데이터 포인트가 100개, epoch size가 10일 때 총 100번 업데이트 한다. 

신경망 아키텍트에서 업데이트를 무조건 많이 한다고 좋은 게 아니다. 시간도 고려해야 하고 .. 


어떤 방식을 사용하든 가중치가 업데이트 되는 방식은 같다.  즉 가중치를 업데이트 하는 것은 아래 공식을 계산하면 되는데 비용함수를 업데이트 하고자 하는 가중치로 미분한 마지막 항, 즉 경사만 달라진다. 
출처 : 갓상엽 교수님
가장 처음 가중치current는 순전파 계산으로 구하고, 그 다음부터 역전파를 사용한다.

SGD를 사용한다고 한다면, 랜덤하게 뽑힌 하나의 관측치에 대하여 위 NN 총 9개의 가중치들이 업데이트 되는 것이다. 


5. 오차 역전파 🍀🍀


그렇다면, NN에서 가중치는 구체적으로 어떻게 업데이트 되는가, 이 부분이 중요하다. '오차 역전파' 라는 개념을 잘 알아야 한다. 







위 NN에 존재하는 총 6개의 가중치들이 경사하강법을 이용해 어떻게 업데이트 되는가를 이해하기 위해서 필요한 개념이 오차 역전파다.  

신경망의 경우, 경사하강법에서 사용되는 경사를 계산하기 위해 사용되는 게 chain rule이다. chain rule은 합성함수를 미분할 때 사용되는 방법이다. 

출처 : 갓상엽 교수님


합성함수는 서로 다른 함수가 2개 이상 있고 서로 합성돼 있는 형태를 뜻한다. 
예를 들어 함수 2개가 합성돼 있다고 하면, 

y = f(z)
z = g(x)

함성함수 : y = f(g(x))

우리가 관심 있는 건 x가 변할 때 y가 얼마나 변하는 지다. 이를 구하기 위해서는 x값이 변함에 따라 1차적으로 변하는 z의 값을 알아야 하고, 이 변한 z에 의해 변하는 y값을 찾아야 한다. y는 z에 대한 함수이기 때문이다. 

이런 과정을 거쳐서 x가 변했을 때 y가 달라지는데, 가중치 업데이트를 위해서는 이와 같은 합성함수에 대해 도함수, 즉 미분값을 구할 수 있어야 한다. 


즉, 위 식에서 가중치 w1, 1이 달라짐에 따라 달라지는 비용함수 E의 달라지는 값을 계산하는 것을 합성함수 관점에서 표현하면 다음과 같다. 



같은 NN에 있는 또 다른 가중치 업데이트 과정 역시 풀어 써보자. 




빨간색 점선으로 하이라이트한 부분이 w1.1(2)와 중복된다. 따라서 네트워크에서 가중치들 업데이트를 계산할 때 w1.1(2)를 먼저 계산해 중복 부분이 계산된 값을 구해 놓고, 해당 부분이 나왔을 때 미리 계산해 놓은 값을 대입하며 계산을 덜 복잡하게 하는 것이 '오차 역전파(error backpropagation)' 방법이다. 

오차 역전파를 직접적으로 이해할 때 다이나믹 프로그래밍(dynamic programming)을 떠올리면 쉽다. 다이나믹 프로그래밍은 큰 문제를 한 번에 해결하기 어려워 작은 여러 개의 문제로 나눠서 푸는 기법이다. 작은 문제들을 풀다보면 같은 문제들을 반복해서 푸는 경우가 생기는데 이때 그 문제들을 매번 다시 계산하지 않고 값을 저장해두었다가 재사용하는 기법이다. 



오차 역전파 참고 글 : 안드레 카패시의 블로그