개요
딥러닝과 기계 학습(Machine Learning)은 본질적으로 차이가 없다. 그러나 딥러닝은 Neural Network와 Gradient Decent에 초점을 맞추어서 Deep한 네트워크를 다루는 것에 흥미가 있다는 점이 차이가 난다. 사실 두 용어는 이름만 다르고 같은 것을 지칭하는 것이지만 딥러닝은 그중 초점을 맞추는 부분이 다른 것이다. Deep Network는 big-hype-parameter을 통해서 학습을 시키는 것을 말한다. 이렇게 할 경우 generalization은 떨어지게 되지만 딥러닝에서는 어떻게 하면 generalization을 할 수 있을까 계속 연구가 이루어지고 있다.
딥러닝
개요
인간의 뉴런에 의해서 착상된 방식으로, 인간의 뉴런보다는 훨씬 적은 규모를 가지고 있지만, 통상적으로 인간만이 할 수 있다고 생각되어진 일들을 처리하는데 특화된 네트워크 구조이다. 뉴런 네트워크의 제일 작은 구조는 Perceptron이라고 불리우는 최소단위이다. 그러나 기존의 퍼셉트론과 뉴런 네트워크의 차이점은 Activation Fuction이라는 스냅스 구조를 모방한 장치의 유무이다. 이 장치는 퍼셉트론의 결과를 토대로 Activate/Deactivate를 결정하는 함수이다. 이러한 Activate Function에는 Sigmoid Fuction이나 Non Linear Function등을 통해서 결과값을 추합하게 된다. (사실 Sigmoid Function을 사용하면 Logistic Regression과 유사한 형태가 된다.)
Perceptron
퍼셉트론은 SIngle Layer Perceptron부터 설명을 시작할 수 있다. Single Layer 퍼셉트론은 퍼셉트론 하나로 분류기를 만드는 것을 말한다. 퍼셉트론 하나는 AND나 OR과 같은 결과는 구분할 수 있지만, XOR, NOR과 같은 것은 구별할 수 없다. 쉽게 말해서, (x,y)의 순서쌍을 데카르트 좌표공간에 펼쳤을 때, 직선하나로 AND나 OR은 구분가능하지만 XOR은 구분할 수 없는 것을 말할 수 있다. 따라서 이러한 XOR을 구분하는 것은 여러개의 Perceptron을 사용함으로써 구현할 수 있는데, 이러한 Stacked Up 구조를 사용하는 것을 바로 Neural Network라고 말한다. Neural Network는 용어의 차이만 있을뿐, Deep Learning과 같은 것을 다룬다. 사실 두 용어는 같은 학문을 역사적으로 다르게 부른 것에 불과하다. By stacking up perceptrons, we can solve no linear problem. Actually we call it as hidden layer.
Hidden Layer
위에서 설명한 것처럼 퍼셉트론을 쌓아서 만들때, Hidden Layer을 통해서 더 많은 정보를 분류할 수 있게 한다. 사실 이러한 Hidden Later는 Non linear function이기때문에 Convex Function이 아니라. Convex Function이 아니기 때문에 더이상 Closed-from solution으로 풀이를 할 수 없다. 쉽게 설명하자면 네트워크 구조가 복잡해져서, 더이상 행렬과 같은 방식으로 최적의 해를 구하는 것이 불가능 해 졌다는 것이다. 과연 그렇다면 이러한 Hidden Layer를 가진 구조에서 어떻게 weight즉 각 perceptron들의 해를 찾느냐 하는 문제가 생겼다. 여기서 Perceptron의 결과를 Input에서 Output으로 전개하는 것을 Forward Pass (Forward Propagation)이라고 하며 Output에서 Input으로 전개하는 것을 Backward Pass (Backward Propagation)이라고 한다.
Back Propagation은 학습을 위해서 사용된다. 여기서 사용되는 방식은 Gradient Decent방식을 사용한다. Output의 잔차를 계산하여 잔차를 줄이는 방식으로 그라디언트를 계산, Input Later까지 Back Propagation을 사용하게 된다.
Backward propagation
Backward Propagation의 핵심은 Chain Rule이다. 체인룰을 통해서 Input의 그라디언트를 중간레이어들의 그라디언트를 통해서 구하게 된다. 예를 들어서 Input이 x, Output이 z라고 해보자. 여기서 우리는 y의 중간 hidden layer을 통해서 back propagation을 시켜야 된다. 이때 dz/dx = dz/dy * dy/dx임을 이용하여 차례로 기울기 하강을 시키면 최종적인 weight update를 수행할 수 있다. (사실 Input과 Output을 직접 연결시킨 Feed Back Network는 다른 구조이기는 하지만 기본적인 Feed Forward Network는 체인룰에 의존하고 있다.)
최적화할 함수 [math]f(\mathbf{x})[/math]에 대하여, 먼저 시작점 [math]\mathbf{x}_0[/math]를 정한다. 현재 [math]\mathbf{x}_i[/math]가 주어졌을 때, 그 다음으로 이동할 점인 [math]\mathbf{x}_{i+1}[/math]은 다음과 같이 계산된다.
- [math]\mathbf{x}_{i+1} = \mathbf{x}_i - \gamma_i \nabla f(\mathbf{x}_i)[/math]
이때 [math]\gamma_i[/math]는 이동할 거리를 조절하는 매개변수이다. (역 삼각형 기호는 그라디언트를 의미한다.)
여기서 Perceptron은 다음과 같이 정의된다. Gradient Descent참조
Universal Approximation Theorem
만약 single layer perceptron이 (하나의 hidden layer) 있다면, 그 어떤 연속 함수를 approximate할 수 있다는 정리이다. 즉 single layer perceptron으로도 어떤 데이터를 완벽히 분리해 내는 것이 가능한다. 바로 이러한 점 때문에 Nerual Network가 각광받는 이유이다. Neural Network를 잘 이용하면, Classfication문제를 이론적으론 완벽하게 해결가능하다. 하지만 perceptron의 구조가 복잡해 질수록 traning dataset에 overfitting되기 때문에 점점 효용성을 읽는다. 사실 Universal Approximation Theorem을 이용하면, tranning dataset이 전체에 접근할 수록 overfitting이 감소하기는 하지만 이러한 경우는 거의 일어나지 않기 때문에 불가능 하다. 이 정리는 1989년 George Cybenko에 의하여 정립되었다. 그러나 이 정리는 어떻게 Network를 학습시켜야 되는지를 알려주지는 않는다.