인공신경망과 딥 러닝
앞선 포스팅에서는 인공신경망의 개념, 퍼셉트론과 퍼셉트론의 업그레이드 버전인 에이다라인 알고리즘에 대해 알아봤다.
오늘은 딥 러닝에 대해 이야기해보고자 한다.
딥 러닝 (Deep Learning)
컴퓨터 과학 혹은 통계학을 하는 사람이라면, 아니 어쩌면 일반인중에서도 딥 러닝이라는 단어를 못 들어본 사람은 아마 없을 것이다.
장안의 화제인 딥 러닝은, 많은 레이어를 가진 인공신경망을 효율적으로 훈련하기 위한 알고리즘의 세트이다.
힌튼(G.E. Hinton) 교수가 다중 레이어 신경망의 훈련법에 대한 해답 (역전파 알고리즘)을 제시하면서 다시 각광받은 알고리즘으로,
원래는 명확한 한계점이 있다고 학계에서 외면받았던 알고리즘 이기도 하다.
하지만 현재 학계와 산업계를 이끄는 것은 바로 이녀석이다.
딥 러닝의 핵심은 역전파 알고리즘을 이용한 다중 레이어 학습이라고 할 수 있다.
퍼셉트론, 에이다라인 등의 알고리즘을 단일 레이어 네트워크라고 부르는데,
이러한 단일 뉴런 알고리즘 으로 부터 업그레이드 된 다중 레이어 신경망 네트워크가 딥 러닝이다.
단일 레이어 네트워크는 가중계수를 학습함에 있어서 역전파가 필요하지 않지만, 다중 레이어가 된다면 상황은 달라지기 때문에 역전파 알고리즘은 정말정말 중요한 딥 러닝의 핵심이다. 자세한 내용은 아래에서 설명하겠다.
이제 다중 레이어 신경망 네트워크란 무엇인지 조금 더 자세히 살펴보자.
앞서 여러 개의 단일 뉴런을 연결한 것이 다중 레이어 신경망이라고 하였다.
아래의 그림을 살펴보자. 그림에서 히든 레이어가 하나 이상의 개수를 가지는 경우가 딥 러닝의 레이어 구성이다.
우리는 레이어의 갯수, 단위의 갯수를 하이퍼파라미터로 생각하여 알고리즘을 작성 하듯이 모델 구성이 가능하다.
이것의 조합을 요즘 수많은 논문과 산업계에서 쏟아내는 것이다.
활성함수를 바꿔가며 성능을 극적으로 끌어올리기도 하며, (ReLU 등) 레이어를 순환시켜 사람의 휘발성 메모리를 흉내내기도 하고(RNN), 활성함수를 필터의 개념으로 바꿔서 input value의 새로운 특징을 학습하기도 한다(CNN).
또한 특정 도메인의 지식과 연결하고, 고성능 컴퓨터의 도움을 받아 최적의 구성 요소 조합을 생각하기도 한다.
하지만 딥 러닝의 코어가 되는 개념들을 학습하고 나면, 위와 같은 응용 개념들을 학습하는 데에는 그리 큰 어려움이 들지 않을지도 모른다.
배니싱 그래디언트(Vanishing Gradient)
레이어가 증가할 경우 오차 그래디언트를 계산함에 있어서 배니싱 그래디언트 (Vanishing Gradient)문제가 발생하는데, 이것이 바로 딥 러닝의 오랜 기간 골칫거리였다.
배니싱 그래디언트는 Gradient Descent 방식으로 비용함수를 딥 러닝에 적용하려고 할 때에 흔히 발생하는 문제점으로,
근본적 원인은 뉴럴넷 알고리즘의 문제라기 보다 활성함수의 문제이다.
이는 레이어가 많은 인공신경망, 즉 딥 러닝에서 그래디언트 디센트를 통해 학습하는 경우 레이어간 활성함수에 따라 학습의 성능이 결정되기 때문에 그렇다.
그래디언트 디센트 방식은 input parameter value의 변화가 output에 얼마나 영향을 미치는 지에 따라 학습의 결과가 의존적이게 되는데, 활성함수가 어떻게 구성되느냐가 input to output 변화의 핵심이다.
조금 더 자세히 들여다보자.
만약 레이어간 활성함수가 sigmoid 혹은 tanh 라고 할 때, 초기의 input value와 상관 없이 히든 레이어에서는 input value의 range가 (-1,1), (0,1)과 같이 작은 범위로 맵핑이 일어나게 된다. 따라서 전체 신경망의 output은 매우 작은 변화만이 감지되며 결과적으로 레이어가 많아질수록 output range의 변화는 점점 작아지게 된다.
이는 error rate가 낮아지지 못한 채로 수렴해버리는 것이고 이러한 문제점을 배니싱 그래디언트라고 하는 것이다.
(반대로, 지나친 선형성의 반영으로 인해 input value의 변화가 크게 감지되는 것을 exploding 현상이라고 한다)
이로 인해 등장한 활성함수가 바로 ReLU같은 반 선형적 성질을 가진 활성함수이다.
ReLU등의 활성함수를 사용하면 input range에 따른 선형성이 보장되며, 이에 따라 output range는 input value의 변화를 수월하게 캐치할 수 있다. (RNN등의 특수한 경우는 exploding의 우려 때문에 ReLU가 역효과가 될 수도 있다.)
(ReLU 의 역효과참고 : 배니싱 그래디언트로부터 자유로워진 ReLU는 backpropagation 과정에서 비용함수를 계산하는 계수를 온전히 전달하지만, input값에 음수가 포함이 된다면 기울기가 0이 되버리므로, 미분을 하면 backpropagation 과정 중간에 꺼져버리는 상황이 발생한다. Chain rule로 미분을 하기 때문에 음수가 한번 나오면 뒤에서도 다 꺼진다. 따라서 input 데이터에서 음수값이 포함되지 않도록 0~1사이의 값으로 정규화 시키는 과정을 거치는 것이 좋다.)
순전파(feed forward)와 역전파(back propagation)의 개념
- 순전파
피드포워드 방식은 한 레이어에서의 활성함수의 output이 다음 레이어의 input으로써 사용되는 순차적 feed 방식을 말하는 것이다.
조금 더 자세히 설명하자면,
이전 레이어의 input value X 가중계수들(w1,w2…)의 합이 순 입력값 z라고 할때, 활성함수에 z를 넣은 출력값이 다음 레이어의 input value가 되는 방식이다.
후에 설명할 RNN(Recurrent Neural Network)와 대조되는 진행이다.
이러한 피드포워드 방식에서의 가중치 최적화는 일반적인 머신러닝 알고리즘보다 훨씬 어렵다.
최적화 해야하는 계수가 매우 많고, 이를 컨트롤하는 하이퍼 파라미터의 숫자도 더 많기 때문이다(감소상수, 적응적 학습률 등).
그래서 그래디언트 디센트를 최적화 알고리즘으로 사용하는 경우, local minimum에 빠질 확률이 훨씬 높아지게 된다.
- 역전파
일반적인 머신러닝 알고리즘에서는 y^ 값을 도출한 뒤, 오차를 계산하여 가중계수들을 학습하게 된다.
하지만 기존의 가중계수 업데이트 방법은 다중 레이어를 가진 신경망에서는 제대로 동작하지 않는다.
각 레이어에서의 가중계수가 최종 output에 미치는 영향을 알 수 없기 때문이다(연쇄적으로 레이어간 input과 output이 맞물려있기 때문).
이를 알아내기 위해서 생겨난 개념이 바로 역전파 연산이다.
역전파 알고리즘의 메인 아이디어는 Chain Rule에 기반하여, 각 레이어에서 편미분을 수행하고, 그 값을 알아냄으로써 레이어 가중계수마다의 영향력을 알게되는 것이다.
이러한 역전파 연산을 사용한다면 신경망 알고리즘에서 가중계수들을 효과적으로 학습하는 것이 가능하다.
참고 : 범용 근사 정리 (Universal Approximation Theorem)
Universal Approximation Theorem이란 1개의 히든 레이어를 가진 Neural Network를 이용해 어떠한 함수든 근사시킬 수 있다는 이론을 말한다. (단, 모든 활성함수는 비선형)
물론 레이어의 개수가 늘어날수록 성능이 좋아지는 것은 당연한 이치지만, 단 하나의 레이어만으로도 모든 것을 설명할 수 있다는 이 개념은, 신경망 알고리즘의 전지전능함(?)을 대변하는 이론이다. 석사논문의 형태로 처음 제기되었던 개념이라고 알고있는데 논문도 그다지 어렵지 않다고 하니 꼭 한번 읽어볼 가치가 있다고 생각한다.
조만간 시간을 내어 이 이론을 간단하게 구현해 봐야겠다.
참고 2 : 신경망의 비지도학습
신경망 알고리즘에서의 비지도학습은 오토인코더와 RBM이 있다.
(이 방법들은 어디까지나 분류 문제에 직접 쓰이지 않는 pretraining의 용도이다. 피처를 추상화하고 학습에 용이하게 변환되는 데에 사용된다.)
오토인코더
인풋과 아웃풋 데이터를 맞추고 히든레이어를 보통 작게 둠으로써, 정보를 압축하여 분류한다.
이 압축을 다시 풀게 되면, 결과적으로는 PCA 처럼 분류의 효과가 나타난다.
PCA와 다른 점은 PCA는 선형 transformation만 가능했다면, 오토인코더는 non-linear 한것도 가능하다는 것이다.
뿐만 아니라 히든레이어를 쌓을 수 있는 신경망 알고리즘의 특성상, 더욱 정교하고 강력하게 분류가 가능하다.
아래의 그림은 오토 인코더의 히든 레이어 개수를 증가시킨 Stacked Outo-Encoder를 나타낸 그림.
오토인코더 역시 간단한 구현을 통해 눈으로 확인해보는 과정을 거쳐야 할 것 같다.