Neural Network Introduction

들어가며

최근 Machine Learning 분야에서 가장 뜨거운 분야는 누가 뭐래도 Deep Learning이다. 엄청나게 많은 사람들이 관심을 가지고 있고, 공부하고 응용하고 있지만, 체계적으로 공부할 수 있는 자료가 많이 없다는 것이 개인적으로 조금 안타깝다. 이제 막 각광받기 시작한지 10년 정도 지났고, 매년 새로운 자료들이 쏟아져나오기 때문에 책이나 정리된 글을 찾기가 쉽지가 않다. 그러나 Deep Learning은 결국 artificial neural network를 조금 더 복잡하게 만들어놓은 모델이고, 기본적인 neural network에 대한 이해만 뒷받침된다면 자세한 내용들은 천천히 탑을 쌓는 것이 가능하다고 생각한다. 이 글에서는 neural network의 가장 기본적인 model에 대해 다루고, model paramter를 update하는 algorithm인 backpropagation에 대해서 다룰 것이다. 조금 더 advanced한 topic들은 이 다음 글에서 다룰 예정이다. 이 글의 일부 문단은 이전 글들을 참고하였다.

Motivation of Neural Network

이름에서부터 알 수 있듯 neural network는 사람의 뇌를 본 따서 만든 머신러닝 모델이다 (참고: 원래 neural network의 full name은 artificial neural network이지만, 일반적으로 neural network라고 줄여서 부른다). 본격적으로 neural network에 대해 설명을 시작하기 전에 먼저 인간보다 컴퓨터가 훨씬 잘 할 수 있는 일들이 무엇이 있을지 생각해보자.

  • 1부터 10000000까지 숫자 더하기
  • 19312812931이 소수인지 아닌지 판별하기
  • 주어진 10000 by 10000 matrix 의 determinant값 계산하기
  • 800 페이지 짜리 책에서 ‘컴퓨터’ 라는 단어가 몇 번 나오는지 세기

반면 인간이 컴퓨터보다 훨씬 잘 할 수 있는 일들에 대해 생각해보자

  • 다른 사람과 상대방이 말하고자하는 바를 완벽하게 이해하면서 내가 하고 싶은 말을 상대도 이해할 수 있도록 전달하기
  • 주어진 사진이 고양이 사진인지 강아지 사진인지 판별하기
  • 사진으로 찍어보낸 문서 읽고 이해하기
  • 주어진 사진에서 얼마나 많은 물체가 있는지 세고, 사진에 직접 표시하기

컴퓨터가 잘 할 수 있는 0과 1로 이루어진 사칙연산이다. 기술의 발달로 인해 지금은 컴퓨터가 예전보다도 더 빠른 시간에, 그리고 더 적은 전력으로 훨씬 더 많은 사칙연산을 처리할 수 있다. 반면 사람은 사칙연산을 컴퓨터만큼 빠르게 할 수 없다. 인간의 뇌는 오직 빠른 사칙연산만을 처리하기 위해 만들어진 것이 아니기 때문이다. 그러나 인지, 자연어처리 등의 그 이상의 무언가를 처리하기 위해서는 사칙연산 그 너머의 것들을 할 수 있어야하지만 현재 컴퓨터로는 인간의 뇌가 할 수 있는 수준으로 그런 것들을 처리할 수 없다.

예를 들어 아래와 같이 주어진 사진에서 각각의 물체를 찾아내는 문제를 생각해보자 (출처: 링크). 사람에게는 너무나 간단한 일이지만, 컴퓨터가 처리하기에는 너무나 어려운 일이다. 어떻게 어디부터 어디까지가 ‘tv or monitor’라고 판단할 수 있을까? 컴퓨터에게 사진은 단순한 0과 1로 이루어진 픽셀 데이터에 지나지 않기 때문에 이는 아주 어려운 일이다.

그렇기 때문에 자연언어처리, 컴퓨터 비전 등의 영역에서는 인간과 비슷한 성능을 내는 시스템을 만들 수만 있다면 엄청난 기술적 진보가 일어날 수 있을 것이다. 그렇기 때문에 인간의 능력을 쫓아가는 것 이전에, 먼저 인간의 뇌를 모방해보자라는 아이디어를 낼 수 있을 것이다. Neural Network는 이런 모티베이션으로 만들어진 간단한 수학적 모델이다. 우리는 이미 인간의 뇌가 엄청나게 많은 뉴런들과 그것들을 연결하는 시냅스로 구성되어있다는 사실을 알고 있다. 또한 각각의 뉴런들이 activate되는 방식에 따라서 다른 뉴런들도 activate 되거나 activate되지 않거나 하는 등의 action을 취하게 될 것이다. 그렇다면 이 사실들을 기반으로 다음과 같은 간단한 수학적 모델을 정의하는 것이 가능하다.

Model of Neural Network: neuron, synapse, activation function

먼저 뉴런들이 node이고, 그 뉴런들을 연결하는 시냅스가 edge인 네트워크를 만드는 것이 가능하다. 각각의 시냅스의 중요도가 다를 수 있으므로 edge마다 weight를 따로 정의하게 되면 아래 그림과 같은 형태로 네트워크를 만들 수 있다. (출처: 위키)

보통 neural network는 directed graph이다. 즉, information propagation이 한 방향으로 고정된다는 뜻이다. 만약 undirected edge를 가지게 되면, 혹은 동일한 directed edge가 양방향으로 주어질 경우, information propagation이 recursive하게 일어나서 결과가 조금 복잡해진다. 이런 경우를 recurrent neural network (RNN)이라고 하는데, 과거 데이터를 저장하는 효과가 있기 때문에 최근 음성인식 등의 sequencial data를 처리할 때 많이 사용되고 있다. 이번 ICML 2015에서도 RNN 논문이 많이 발표되고 있고, 최근들어 연구가 활발한 분야이다. 이 글에서는 일단 가장 간단한 ‘multi layer perceptron (MLP)’라는 구조만 다룰 것인데, 이 구조는 directed simple graph이고, 같은 layer들 안에서는 서로 connection이 없다. 즉, self-loop와 parallel edge가 없고, layer와 layer 사이에만 edge가 존재하며, 서로 인접한 layer끼리만 edge를 가진다. 즉, 첫번째 layer와 네번째 layer를 직접 연결하는 edge가 없는 것이다. 앞으로 layer에 대한 특별한 언급이 없다면 이런 MLP라고 생각하면 된다. 참고로 이 경우 information progation이 ‘forward’로만 일어나기 때문에 이런 네트워크를 feed-forward network라고 부르기도 한다.

다시 일반적인 neural network에 대해 생각해보자. 실제 뇌에서는 각기 다른 뉴런들이 activate되고, 그 결과가 다음 뉴런으로 전달되고 또 그 결과가 전달되면서 최종 결정을 내리는 뉴런이 activate되는 방식에 따라 정보를 처리하게 된다. 이 방식을 수학적 모델로 바꿔서 생각해보면, input 데이터들에 대한 activation 조건을 function으로 표현하는 것이 가능할 것이다. 이것을 activate function이라고 정의한다. 가장 간단한 activation function의 예시는 들어오는 모든 input 값을 더한 다음, threshold를 설정하여 이 값이 특정 값을 넘으면 activate, 그 값을 넘지 못하면 deactivate되도록 하는 함수일 것이다. 일반적으로 많이 사용되는 여러 종류의 activate function이 존재하는데, 몇 가지를 소개해보도록 하겠다. 편의상 t=iwixi라고 정의하겠다. (참고로, 일반적으로는 weight 뿐 아니라 bais도 고려해야한다. 이 경우 t=i(wixi+bi)로 표현이 되지만, 이 글에서는 bais는 weight와 거의 동일하기 때문에 무시하고 진행하도록 하겠다. - 예를 들어 항상 값이 1인 x0를 추가한다면 w0가 bais가 되므로, 가상의 input을 가정하고 weight와 bais를 동일하게 취급하여도 무방하다.)

  • sigmoid function: f(t)=11+et

  • tanh function: f(t)=etetet+et

  • absolute function: f(t)=t

  • ReLU function: f(t)=max(0,t)

보통 가장 많이 예시로 드는 activation function으로 sigmoid function이 있다. (출처는 위의 위키와 같음)

이 함수는 미분이 간단하다거나, 실제 뉴런들이 동작하는 것과 비슷하게 생겼다는 등의 이유로 과거에는 많이 사용되었지만, 별로 practical한 activation function은 아니고, 실제로는 ReLU를 가장 많이 사용한다 (2012년 ImageNet competition에서 우승했던 AlexNet publication을 보면, ReLU와 dropout을 쓰는 것이 그렇지 않은 것보다 훨씬 더 우수한 결과를 얻는다고 주장하고 있다. 이에 대한 자세한 내용은 다른 포스트를 통해 보충하도록 하겠다). 참고로 neuron을 non-linearity라고 부르기도 하는데, 그 이유는 activation function으로 linear function을 사용하게 되면 아무리 여러 neuron layer를 쌓는다고 하더라도 그것이 결국 하나의 layer로 표현이 되기 때문에 non-linear한 activation function을 사용하기 때문이다.

따라서 이 모델은 처음에 node와 edge로 이루어진 네트워크의 모양을 정의하고, 각 node 별 activation function을 정의한다. 이렇게 정해진 모델을 조절하는 parameter의 역할은 edge의 weight가 맡게되며, 가장 적절한 weight를 찾는 것이 이 수학적 모델을 train할 때의 목표가 될 것이다.

Inference via Neural Network

먼저 모든 paramter가 결정되었다고 가정하고 neural network가 어떻게 결과를 inference하는지 살펴보도록하자. Neural network는 먼저 주어진 input에 대해 다음 layer의 activation을 결정하고, 그것을 사용해 그 다음 layer의 activation을 결정한다. 이런 식으로 맨 마지막까지 결정을 하고 나서, 맨 마지막 decision layer의 결과를 보고 inference를 결정하는 것이다 (아래 그림 참고, 빨간 색이 activate된 뉴런이다).

이때, classification이라고 한다면 마지막 layer에 내가 classification하고 싶은 class 개수만큼 decision node를 만든 다음 그 중 하나 activate되는 값을 선택하는 것이다. 예를 들어 0부터 9까지 손글씨 데이터를 (MNIST라는 유명한 dataset이 있다) classification해야한다고 생각해보자. 그 경우는 0부터 9까지 decision이 총 10개이므로 마지막 decision layer에는 10개의 neuron이 존재하게 되고 주어진 데이터에 대해 가장 activation된 크기가 큰 decision을 선택하는 것이다.

Backpropagation Algorithm

마지막으로 이제 weight를 어떻게 찾을 수 있는지 weight paramter를 찾는 알고리즘에 대해 알아보자. 먼저 한 가지 알아두어야 할 점은 activation function들이 non-linear하고, 이것들이 서로 layer를 이루면서 복잡하게 얽혀있기 때문에 neural network의 weight optimization이 non-convex optimization이라는 것이다. 따라서 일반적인 경우에 neural network의 paramter들의 global optimum을 찾는 것은 불가능하다. 그렇기 때문에 보통 gradient descent 방법을 사용하여 적당한 값까지 수렴시키는 방법을 사용하게 된다.

Neural network (이 글에서는 multi-layer feed-forward network)의 parameter를 update하기 위해서는 backpropagation algorithm이라는 것을 주로 사용하는데, 이는 단순히 neural network에서 gradient descent를 chain rule을 사용하여 단순화시킨 것에 지나지 않는다 (Gradient descent에 대해서는 이전에 쓴 Convex Optimization글에서 자세히 다루고 있으니 참고하면 좋을 것 같다). 모든 optimization 문제는 target function이 정의되어야 풀 수 있다. Neural network에서는 마지막 decision layer에서 우리가 실제로 원하는 target output과 현재 network가 produce한 estimated output끼리의 loss function을 계산하여 그 값을 minimize하는 방식을 취한다. 일반적으로 많이 선택하는 loss에는 다음과 같은 함수들이 있다. 이때 우리가 원하는 d-dimensional target output을 t=[t1,,td]로, estimated output을 x=[x1,,xd] 로 정의해보자.

  • sum of squares (Euclidean) loss: i=1d(xiti)2

  • softmax loss: i=1d[tilog(exij=1dexj)+(1ti)log(1exij=1dexj)]

  • cross entropy loss: i=1d[tilogxi(1ti)log(1xi)]

  • hinge loss: max(0,1tx), 이때 은 내적을 의미한다.

상황에 따라 조금씩 다른 loss function을 사용하지만, classification에 대해서는 보통 softmax loss가 gradient의 값이 numerically stable하기 때문에 softmax loss를 많이 사용한다. 이렇게 loss function이 주어진다면, 이 값을 주어진 paramter들에 대해 gradient를 구한 다음 그 값들을 사용해 parameter를 update하기만 하면 된다. 문제는, 일반적인 경우에 대해 이 paramter 계산이 엄청 쉬운 것만은 아니라는 것이다.

Backpropagtaion algorithm은 chain rule을 사용해 gradient 계산을 엄청 간단하게 만들어주는 알고리즘으로, 각각의 paramter의 grdient를 계산할 때 parallelization도 용이하고, 알고리즘 디자인만 조금 잘하면 memory도 많이 아낄 수 있기 때문에 실제 neural network update는 이 backpropagtaion 알고리즘을 사용하게 된다.

Gradient descent method를 사용하기 위해서는 현재 parameter에 대한 gradient를 계산해야하지만, 네트워크가 복잡해지면 그 값을 바로 계산하는 것이 엄청나게 어려워진다. 그 대신 backpropataion algorithm에서는 먼저 현재 paramter를 사용하여 loss를 계산하고, 각각의 parameter들이 해당 loss에 대해 얼마만큼의 영향을 미쳤는지 chain rule을 사용하여 계산하고, 그 값으로 update를 하는 방법이다. 따라서 backpropagation algorithm은 크게 두 가지 phase로 나눌 수가 있는데, 하나는 propagation phase이며, 하나는 weight update phase이다. propagation phase에서는 training input pattern에서부터 에러, 혹은 각 뉴런들의 변화량을 계산하며, weight update phase에서는 앞에서 계산한 값을 사용해 weight를 update시킨다.

Phase 1: Propagation
  1. Forward propagation: input training data로부터 output을 계산하고, 각 ouput neuron에서의 error를 계산한다. (input -> hidden -> output 으로 정보가 흘러가므로 ‘forward’ propagation이라 한다.)
  2. Back propagation: output neuron에서 계산된 error를 각 edge들의 weight를 사용해 바로 이전 layer의 neuron들이 얼마나 error에 영향을 미쳤는지 계산한다. (output -> hidden 으로 정보가 흘러가므로 ‘back’ propagation이라 한다.)
Phase 2: Weight update
  1. Chain rule을 사용해 paramter들의 gradient를 계산한다.

이때, chain rule을 사용한다는 의미는 아래 그림에서 나타내는 것처럼, 앞에서 계산된 gradient를 사용해 지금 gradient 값을 update한다는 의미이다. (그림은 bengio의 deep learning book Ch6 에서 가져왔다.)

두 그림 모두 zx를 구하는 것이 목적인데, 직접 그 값을 계산하는 대신, y layer에서 이미 계산한 derivative인 zy와 y layer와 x에만 관계있는 yx를 사용하여 원하는 값을 계산하고 있다. 만약 x 아래에 x이라는 parameter가 또 있다면, zx와 xx을 사용하여 zx을 계산할 수 있는 것이다. 때문에 우리가 backpropagation algorithm에서 필요한 것은 내가 지금 update하려는 paramter의 바로 전 variable의 derivative와, 지금 paramter로 바로 전 variable을 미분한 값 두 개 뿐이다. 이 과정을 output layer에서부터 하나하나 내려오면서 반복된다. 즉, output -> hidden k, hidden k -> hidden k-1, … hidden 2 -> hidden 1, hidden 1 -> input의 과정을 거치면서 계속 weight가 update되는 것이다. 예를 들어서 decision layer와 가장 가까운 weight는 직접 derivative를 계산하여 구할 수 있고, 그보다 더 아래에 있는 layer의 weight는 그 바로 전 layer의 weight와 해당 layer의 activation function의 미분 값을 곱하여 계산할 수 있다. 이해가 조금 어렵다면 아래의 예제를 천천히 읽어보기를 권한다.

이 과정을 맨 위에서 아래까지 반복하면 전체 gradient를 구할 수 있고, 이 gradient를 사용해 parameter들을 update할 수 있다. 이렇게 한 번의 iteration이 진행되고, 충분히 converge했다고 판단할 때 까지 이런 iteration을 계속 반복하는 것이 feed-forward network의 parameter를 update하는 방법이다.

이를 그림으로 표현하면 아래와 같다. (출처: 링크)

이렇듯 backpropagation은 직접 weight를 바로 변화시키는 것이 아니라 오직 error만을 보고 gradient descent method based approach를 사용해 error를 minimize하는 방향으로 계속 weight를 update시키는 것이다. 또한 한 번 error가 연산된 이후에는 output layer에서부터 그 이전 layer로 ‘역으로’ 정보가 update되기 때문에 이를 backpropagation, 한국어로는 역전사라고 하는 것이다.

Stochastic Gradient Descent

Gradient를 계산했으니 이제 직접 Gradient Descent를 써서 parameter만 update하면 된다. 그러나 문제가 하나 있는데, 일반적으로 neural network의 input data의 개수가 엄청나게 많다는 것이다. 때문에 정확한 gradient를 계산하기 위해서는 모든 training data에 대해 gradient를 전부 계산하고, 그 값을 평균 내어 정확한 gradient를 구한 다음 ‘한 번’ update해야한다. 그러나 이런 방법은 너무나도 비효율적이기 때문에 Stochastic Gradient Descent (SGD) 라는 방법을 사용해야한다.

SGD는 모든 데이터의 gradient를 평균내어 gradient update를 하는 대신 (이를 ‘full batch’라고 한다), 일부의 데이터로 ‘mini batch’를 형성하여 한 batch에 대한 gradient만을 계산하여 전체 parameter를 update한다. Convex optimization의 경우, 특정 조건이 충족되면 SGD와 GD가 같은 global optimum으로 수렴하는 것이 증명되어있지만, neural network는 convex가 아니기 때문에 batch를 설정하는 방법에 따라 수렴하는 조건이 바뀌게 된다. Batch size는 일반적으로 메모리가 감당할 수 있을 정도까지 최대한 크게 잡는 것 같다.

Backpropagation Algorithm: example

이전에 chain rule로 gradient를 계산한다고 언급했었는데, 실제 이 chain rule이 어떻게 적용되는지 아래의 간단한 예를 통해 살펴보도록하자. 이때 계산의 편의를 위해 각각의 neuron은 sigmoid loss를 가지고 있다고 가정하도록 하겠다.

이때 각각의 neuron의 input으로 들어가는 값을 ino5, output으로 나가는 값을 outh3와 같은 식으로 정의해보자 (이렇게 된다면 in과 out은 outh3=σ(inh3) 으로 표현 가능하다. - 이때 σ는 sigmoid function). 먼저 error를 정의하자. error는 가장 간단한 sum of square loss를 취하도록 하겠다. 우리가 원하는 target을 t라고 정의하면 loss는 E=12(t5outo5)2+12(t6outo6)2가 될 것이다 (1/2는 미분한 값을 깔끔하게 쓰기 위해 붙인 상관없는 값이므로 무시해도 좋다). 그리고 우리가 원하는 값들은 Ew13,Ew14,,Ew46이 될 것이다. 이제 가장 먼저 Ew35 부터 계산해보자.

Ew35=Eouto5outo5ino5ino5w35.

즉, 우리가 원하는 derivative를 계산하기 위해서는 세 개의 다른 derivative (Eouto5,outo5ino5,ino5w35)를 계산해야한다. 각각을 구하는 방법은 다음과 같다.

  • Eouto5: error를 E=12(t5outo5)2+12(t6outo6)2라고 정의했으므로, Eouto5=outo5t5이다. - 이때 outo5와 t5는 weight update이전 propagation step에서 계산된 값이다.

  • outo5ino5o5는 sigmoid activation function을 사용하므로 outo5=σ(ino5)이다. 또한 sigmoid function의 미분 값은 σ(x)x=σ(x)(1σ(x))으로 주어지므로, 이 값을 대입하면 outo5ino5=outo5(1outo5)가 된다. - 역시 여기에서도 미리 계산한 outo5를 사용한다.

  • ino5w35o5로 들어온 값의 총 합은 앞선 layer의 output과 o5로 들어오는 weight를 곱하면 되므로 ino5=w35outh3+w45outh4이고, 이것을 통해 ino5w35=outh3가 됨을 알 수 있다. - outh3 역시 이전 propagation에서 계산된 값이다.

따라서 Ew35의 derivative 값은 위의 세 값을 모두 곱한 것으로 계산 할 수 있다. 그림으로 표현하면 아래와 같은 그림이 될 것이다. 즉, ‘backward’ 방향으로 derivative에 대한 정보를 ‘propagation’하면서 parameter의 derivative를 계산하는 것이다. 마찬가지 방법으로 w36,w45,w46에 대한 derivative도 계산할 수 있다.

그럼 이번에는 그 전 layer의 paramter들 중 하나인 w13의 derivative를 계산해보자. 이번에 계산할 과정도 위와 비슷한 그림으로 표현해보면 아래와 같다.

그러면 이제 Ew13을 구해보자.

Ew13=Eouth3outh3inh3inh3w13.

마찬가지로 각각을 구하는 방법에 대해 적어보자.

  • Eouth3E=12(t5outo5)2+12(t6outo6)2를 E=Eo5+Eo6로 decompose 하면 이 미분 식은 Eo5outh3+Eo6outh3로 쓸 수 있다. 각각의 계산은 다음과 같다.

    • Eo5outh3=Eo5ino5ino5outh3으로 쓸 수 있다. 이 중 앞의 값인 Eo5ino5은 이미 전 과정에서 계산했던 Eouto5과 outo5ino5의 곱으로 계산가능하다. 뒤의 값은 ino5outh3=w35이므로 간단하게 계산할 수 있다.

    • Eo6outh3도 위와 같은 방법으로 연산이 가능하다.

  • outh3inh3outo5ino5와 같다. 따라서 outh3(1outh3)이다.

  • inh3w13ino5w35와 같다. 따라서 outi1이다.

이렇게 Eouth3에서는 앞에서 계산했던 값들을 재활용하고, 아래의 값들은 activation function과 network의 topological property에 맞는 derivative를 곱하는 방식으로 Ew13을 구할 수 있다.

이렇듯 backpropagation algorithm은 forward propagation을 통해 필요한 값들을 미리 저장해두고, backward propagation이 진행되면서 위에서부터 loss에 대한 derivative를 하나하나 계산해나가면서 다음 layer에서 바로 전 layer에서 계산한 값들과 각 neuron 별로 추가적으로 필요한 derivative들을 곱해나가면서 weight의 derivative를 계산하는 알고리즘이다.

이렇게 한 번 전체 gradient를 계산한 다음에는 learning rate를 곱하여 전체 parameter의 값을 update한 다음, 다시 처음부터 이 과정을 반복한다. 보통 에러가 감소하는 속도를 관측하면서 ‘이 정도면 converge한 것 같다’ 하는 수준까지 돌린다.

익숙해지려면 다소 시간이 걸리지만, 개념적으로 먼저 ‘error를 먼저 계산하고, 그 값을 아래로 전달해나가면서 바로 전 layer에서 계산한 미분값들을 사용해 현재 layer의 미분값을 계산한 다음, 그 값을 사용해 다음 layer의 미분값을 계산한다.’ 라고 개념만 이해해두고 다시 차근차근 chain rule을 계산해나가면서 계산하면 조금 편하게 익숙해 질 수 있을 것이다.

Backpropagation Algorithm: In Practice

실제 backpropagtion을 계산해야한다고 가정해보자. 편의상 l번째 hidden layer를 yl 이라고 해보자. 이 경우 각 layer에 대해 backpropagation algorithm을 위해 계산해야할 것은 총 두 가지 이다. Loss를 E라고 적었을 때 먼저 layer l의 parameter θl의 gradient인 Ewl을 구해야한다. 이 값은 Ewl=Eylylwl을 통해 계산한다. 이때, Eyl=Eyl+1yl+1yl이므로 Eyl은 바로 전 layer에서 넘겨준 Eyl+1의 값을 사용하여 계산하게 된다. 정리하면 실제 계산해야하는 값은 yl+1yl,ylwl 두 가지이고, 이 값들을 사용해 Eyl,Ewl을 return하게 된다. 앞의 값은 다음 layer에 넘겨줘서 다음 input으로 사용하고, 두 번째 값은 저장해두었다가 gradient descent update할 때 사용한다.

두 가지 예를 들어보자. 먼저 Inner Product layer 혹은 fully connected layer이다. 이 layer가 inner product layer라고 불리는 이유는 input yl에 대해 output yl+1이 간단한 inner product 들이 모여있는 형태로 표현되기 때문이다. 예를 들어 yl+1,i를 l+1 번째 layer의 i 번째 node라고 한다면, yl+1,i=jwijyl,j으로 표현할 수 있음을 알 수 있다. 그런데 이 값은 사실 vector w와 yl의 inner product로 표현됨을 알 수 있다. 그렇기 때문에 fully connected layer를 inner product라고 부른다. 다시 본론으로 돌아와서 inner product의 output은 input과 weight의 matrix-vector multiplication인 yl+1=Wlyl으로 표현할 수 있다.

따라서 yl+1yl=Wl이고, ylWl=yl이다. 이 값을 통해 실제 return하는 값은 Eyl=Eyl+1Wl와 Ewl=Eyl+1yl이 된다.

두 번째로 많이 사용하는 ReLU non-linearity의 gradient를 계산해보자. 이때 activation function은 마치 하나의 layer가 더 있는 것처럼 생각할 수 있다. 즉 yl+1=max(0,yl)로 표현할 수 있을 것이다. Parameter는 없으니까 생략하면 만약 yl0라면 yl+1yl=1이고, 아니라면 0이 될 것이다. 따라서 yl0라면 Eyl=Eyl+1이 되고, 0보다 작다면 0이 될 것이다.

정리

Deep learning을 다루기 위해서는 가장 먼저 aritifitial neural network의 model에 대한 이해와 gradient descent라는 update rule에 대한 이해가 필수적이다. 이 글에서는 가장 기초적이라고 생각하는 feed-forward network의 model을 먼저 설명하고, paramter를 update하는 gradient descent algorithm의 일종인 backpropagation에 대한 개념적인 설명을 다루었다. 조금 어려울 수 있는 내용이니 다른 글들을 계속 참고하면서 보면 좋을 것 같다.

Reference

출처 : http://sanghyukchun.github.io/


쉽게 풀어쓴 딥러닝(Deep Learning)의 거의 모든 것

요즘 딥 러닝(Deep Learning)이 핫합니다. 몇 년전부터 기계학습(Machine Learning)이 일반인들에게 알려지기 시작하더니, 지금은 기계학습의 한 종류인 딥 러닝이 아예 기계학습이란 단어를 대체할 듯한 기세인 듯 합니다. 특히 구글이 딥 러닝 전문가 기업인 딥 마인드(Deep Mind)를 인수하고, 페이스북이 딥 러닝 대가인 뉴욕대학의 얀 러쿤(Yann LeCun) 교수를 인공지능 센터장으로 모셔갔으며, 중국의 구글이라 불리는 바이두에서도 기계학습 분야의 스타 학자 스탠포드 대학의 앤드류 응(Andrew Ng) 교수를 모셔가는 등, 지금은 바야흐로 딥러닝 인재전쟁에 가까운 모습입니다.

페이스북 인공지능 연구소 수장, 얀 러쿤(Yann LeCun) 교수 (사진출처)

그렇다면 딥 러닝이란 과연 무엇일까요? 오늘은 딥 러닝의 전반적인 개념에 대해 거칠게 한번 훑어보도록 하겠습니다.
(업데이트) 이 글의 후속편인 Convolutional Neural Network에 대한 이해가 업데이트 되었습니다. 이 글을 읽으신 후 꼭 한번 읽어보세요!

출처 : Terry's Facebook, https://goo.gl/Yo3Tvi

딥 러닝은 사실 새로운 개념이 아닙니다. 오래전부터 있어오던 인공신경망(Artificial Neural Network, ANN)과 크게 다를 바 없죠. '인공신경망'이라고 하면 단어에서 나오는 뽀대(?) 때문인지 막 복잡한 뇌 구조가 생각하면서 꿈 같은 이야기가 펼쳐질 것 같은 느낌 드는데요, 사실 인공신경망은 그렇게 판타스틱한 개념은 아닙니다.

그저 선형 맞춤 (linear fitting)과 비선형 변환 (nonlinear transformation or activation)을 반복해 쌓아올린 구조에 불과하죠. 다시 말해, 인공신경망은 데이터를 잘 구분할 수 있는 선들을 긋고 이 공간들을 잘 왜곡해 합하는 것을 반복하는 구조라고 할 수 있습니다. 선 긋고, 구기고, 합하고, 선 긋고, 구기고, 합하고, 선 긋고, 구기고, 합하고...(먹고 뜯고 맛보고 즐기고...-_-..)

파란선과 빨간선의 영역을 구분한다고 생각해보자. 그냥 구분 선을 긋는다면 아마 왼쪽처럼 불완전하게 그을 수 있을 것이다. 하지만 공간을 왜곡하면 오른쪽 같이 아름답게 구분선을 그릴 수 있다. 이처럼 인공신경망은 선 긋고, 구기고, 합하고를 반복하여 데이터를 처리한다. (사진출처: colah's blog)

예를 들어 컴퓨터가 사진 속에서 고양이를 검출해내야 한다고 생각해보죠. '고양이'라는 추상적 이미지는 아마 선, 면, 형상, 색깔, 크기 등 다양한 요소들이 조합된 결과물일 것입니다. 이것은 아마 '선 30cm 이상은 고양이, 이하는 고양이 아님', 또는 '갈색은 고양이, 빨간색은 고양이 아님' 처럼 간단한 선형 구분으로는 식별해 낼 수 없는 문제겠죠. 딥러닝은 이 과제를 선 긋고 왜곡하고 합하고를 반복하며 복잡한 공간 속에서의 최적의 구분선을 만들어 내는 목적을 가지고 있습니다.(1)

그럼 어떠한 규칙으로 선을 긋고 공간을 왜곡하냐고요? 바로 데이터에 근거하는 거죠. 일단 대충 선을 긋고 그것들을 살살살살 움직여가며 구분 결과가 더 좋게 나오도록 선을 움직이는 겁니다. 이러한 과정을 최적화(optimization)이라고 하는데요, 딥러닝은 아주 많은 데이터아주 오랜 시간의 최적화를 통해 데이터를 학습합니다. 양에는 장사 없다고나 할까요?

여러 개의 뉴런(선형 맞춤 + 비선형 변환)이 합쳐지면 복잡한 형상의 함수도 추정할 수 있다. (사진출처)

사실 인공신경망은 1940년대에 이미 개발된 방법이었고, 1980년대에 역전파(back propagation) 방법이라는 최적화 방법이 소개되며 인공신경망 연구가 절정기애 이른 바 있습니다. 이후 인공신경망은 영상처리, 인공지능, 제어 등 다양한 분야에 적용 되었는데요, 90년대에 이르러 그 연구가 포화 상태에 이르고, 이내 한계가 보이기 시작하더니 곧 암흑기를 만나게 됩니다. 심지어 2000년대 초반 논문 심사에서는 '인공신경망'이란 단어만 나오면 '뭐야, 이거 옛날거자나?'라며 리젝을 하기도 했었으니까요. 그렇게 인공신경망은 사라져 갔고, 2000년 대에는 비선형 함수를 이용한 다양한 커널 방법(e.g. Support Vector Machine, Gaussian Process)들이 기계학습의 대세를 이루게 됩니다.

딥 러닝의 일등 공신, 토론토 대학의 힌톤 교수 (사진출처: 토론토대학)

모두가 인공신경망을 외면하던 암흑기 시절, 그래도 꿋꿋하게 인공신경망 외길을 걸어오던 학자가 있었으니 바로 그가 딥러닝의 일등 공신, 토론토 대학의 제프리 힌톤(Geoffrey Hinton) 교수입니다. 인공신경망이 외면받는 여러 한계들 중 대표적인 문제는 바로 최적화가 쉽지 않다는 점이었습니다. 생각해보세요. 수 만개의 뉴론들이 수 백만개의 선들에 의해 연결되어 있고 여러분들은 이 선들에 적당한 값들을 할당해야 합니다. (일명 parameter training이죠.)

이걸 최적화 알고리즘을 통해 해줘야 하는데, 최적화 알고리즘이 만약 진짜 최적값이 아닌 잘못된 최적값에 도달하면 어쩌죠? 예를 들어 최고 높은 산봉오리에 올라가야 하는게 목적이라고 하면, 앞만 보고 막 달려서 산 봉우리에 올랐더니 '엥? 이 산이 아닌게벼...?'라고 하면 어쩌냔 말입니다. 인공신경망은 그 구조가 워낙 복잡했기에 이런 문제가 발생했을 때 그야 말로 속수무책이었죠. (그래서 제 예전 지도교수님은 인공신경망을 'black magic'이라고도 하셨으니까요ㅎㅎ)

하지만 힌톤 교수는 이러한 함정(local minima)들을 데이터의 전처리과정(pre-training)을 통해 크게 해결할 수 있음을 밝혔습니다. 이 연구가 바로 "A fast learning algorithm for deep belief nets"라는 2006년의 논문인데요, 힌톤 교수는 이 논문을 통해 인공신경망의 각 층들을 먼저 비지도학습 방법(unsupervised learning)을 통해 잘 손질해주고, 그렇게 전처리한 데이터를 여러 층 쌓아올려 인공신경망 최적화를 수행하면 '이 산이 아닌게벼?' 없이 훌륭한 결과를 만들어 낼 수 있다는 것을 보였습니다.

출처 : Terry's Facebook, https://goo.gl/Yo3Tvi

이 논문을 기점으로 인공신경망 연구는 새 전기가 열리게 됩니다. 특히 인공신경망은 빅데이터와 찰떡궁합이었죠. 2006년 이전의 많은 연구들이 데이터에 대한 구체적 형상 파악에 그 노력을 쏟았었다면, 이젠 그냥 어마어마한 구조의 인공신경망엄청난 데이터를 막 때려 넣는겁니다. 그리고선 2006년 이후 개발된 세련된 최적화 기법을 써서 몇날 며칠을 학습하면 '짜잔~'하고 최고의 결과를 내놓는다는 거죠. 딥러닝 기법은 이 후 각종 머신러닝 대회의 우승을 휩쓸며 (그것도 압도적인 성능으로...) 자신이 유아독존의 기법임을 과시했고, 현재는 다른 기계학습 방법을 통해 영상처리, 음성인식 등을 연구하셨던 분들 역시 딥러닝으로 대동단결하는 양상을 보이고 있습니다.

기계학습 관련 기업들. 이 중 Facebook, Google, Baidu 등은 모두 딥러닝에 사활을 걸고 있다. (사진출처)

그렇다면 그토록 오랜 암흑기였던 인공신경망을 성공적인 딥러닝으로 환골탈태하게 한 요인은 뭘까요? 그 요인에는 크게 다음과 같은 네 가지를 꼽을 수 있습니다.

1. Unsupervised Learning을 이용한 Pre-training

앞서 힌톤 교수가 2006년에 제안했던 것이 바로 이 방법입니다. Unsupervised learning이라고 하면 (대충 말해서) '이건 사과', '이건 고양이', '이건 사람' 이런 "가르침" 없이 그냥 사과, 고양이, 사람을 다 던져놓고 구분하라고 시키는 학습 방법인데요, 그렇게되면 아무래도 컴퓨터는 비슷한 것끼리 군집(cluster)을 찾게 되겠죠. 알고리즘은 군집화하는 과정 속에서 특이한 놈들은 과감하게 개무시(;;), 결과적으로 노이즈 감소의 효과를 얻게 됩니다. 이렇게 unsupervised learning 방법으로 데이터를 고르게 잘 손질할 수 있고, 이것을 깊은 인공신경망(=딥러닝망)에 넣으면 앞서 제기한 함정들에 훨씬 적게 빠진다는 것입니다. 이것이 바로 딥러닝의 최초 진일보였죠.

2. Convolutional Neural Network의 진화

기계학습은 data→knowledge 로 바로 학습을 진행할 수도 있지만 보통 중간 단계인 특징 추출(feature extraction)을 거쳐 data→feature→knowledge 의 단계로 학습하는 것이 보통입니다. 예를 들어 사진 속에서 사물을 인식하기 위해 픽셀 값에서 먼저 특징적인 선이나 특징적인 색 분포 등을 먼저 추출한 후 이를 기반으로 '이건 사과다' '이건 바나나다'라는 판단을 내리는 것이죠. 이러한 중간 표현단계를 특징 지도 (feature map)이라고 하는데요, 기계학습의 성능은 얼만큼 좋은 특징들을 뽑아내느냐에 따라 그 성능이 매우 크게 좌지우지 됩니다. (이는 이미지 처리 뿐만 아니라 음성 인식, 자연어 분석 등 대부분의 기계학습에 적용되는 이야기입니다.)

원본 이미지(우측)와 convolutional network에 의해 추출된 특징 지도(좌측) (출처: M. Zeiler)

딥러닝의 성공 요인 중 하나를 꼽자면, 예전엔 사람의 예측에 의해 뽑히던 이 특징들을 지금은 이 마저도 기계학습을 이용해 뽑는다는 것입니다. 다시 말해, 예전엔 '선들을 추출해서 학습시키면 사물인식이 잘 될거야'와 같이 사람이 먼저 이 선들을 추출하는 알고리즘을 만들어 주었는데, 이제는 특징 추출과 학습 모두가 딥러닝 알고리즘 안에 포함되었다는 것이죠. 다단계로 특징을 추출해 학습하는 Convolutional Neural Network은 현재 딥러닝의 대세로서 특히 이미지 인식에서 큰 발전을 이룩하고 있습니다.

3. 시계열 데이터를 위한 Recurrent Neural Network

딥러닝 알고리즘을 크게 세 분류로 나누자 대략적으로 다음과 같이 나눌 수 있습니다.
- Unsupervised Learning을 기반으로 한 방법
  (e.g., Deep Belief Network, Deep Auto-encoder)
- Convolutional Neural Network의 다양한 변형들
- 시계열 데이터를 위한 Recurrent Neural Network와 게이트 유닛들
  (e.g. Long-Short Term Memory (LSTM))
시계열 데이터(Time-series data)란 시간의 흐름에 따라 변하는 데이터를 말하는데요, 예를 들면 주가도 시간에 따라 변하고, 사람의 움직임도 시간에 따라 변하고, 비디오도 시간에 따라 변하고... 이러한 시계열 데이터에서 탁월한 성능을 보여주는 딥러닝 방법이 바로 Recurrent Neural Network (RNN) 입니다. RNN은 매 순간마다의 인공신경망 구조를 쌓아올렸다고 생각하시면 되는데요, 예를 들면 100초면 100개의 인공신경망을 쌓아올린거죠. (그래서 딥러닝 중에 가장 깊은 구조라고도 불립니다.)

예전의 RNN은 인공신경망이 너무 깊어서 오랜 시간 전의 데이터들을 까먹는 현상(vanishing gradient problem) 때문에 학습이 힘들었는데요, Jurgen Schmidhuber 교수의 Long-Short term Memory (LSTM) 이란 게이트 유닛을 각 노드마다 배치하여 이러한 문제를 극복, 현재는 Convolutional Network의 가장 강력한 경쟁 상대로 자리매김하고 있습니다.

매 순간의 인공신경망을 쌓아 올린 Recurrent Neural Network (사진출처)

4. GPU 병렬 컴퓨팅의 등장과 학습 방법의 진보

사실 예전엔 '많은 데이터로 가지고 이렇게 저렇게 하면 아마 잘 될거야...'라는 생각들은 가지고 있더라도 그것을 구현하는 것이 쉽지 않았습니다. 잘 될지 안될지도 모르는데 수십 대의 컴퓨터를 몇 달간 돌리고 있을 수는 없는 노릇이니까요. 하지만 GPGPU (General-Purpose computing on Graphics Processing Units)이란 개념이 개발되며 저렴한 가격으로 CPU와 병렬처리를 할 수 있는 GPU 제품들이 출시되었고, 이를 효율적으로 이용하는 언어구조(e.g. CuDA)들이 개발되며 딥러닝은 그 컴퓨팅 시간이 수십분의 일로 줄어 들었습니다.

연구에 사용할 수 있는 데이터 풀도 많아져 예전엔 기껏해야 몇 만개의 손 글씨 데이터(e.g. MNIST)가 전부이던 것이 지금은 천 만장의 고해상도의 사진들(e.g. ImageNet)은 물론, 필요하다면 구글이나 유튜브에서 자료를 끌어올 수도 있었으니 말이죠.

그리고 인공신경망 알고리즘적인 문제로는 비선형 변환에 쓰이는 Rectified Linear Unit (ReLU)의 개발과 거대 망을 선택적으로 학습하는 Drop-out의 발견이 딥러닝의 성능을 크게 향상 시켰답니다. 이러한 잔기술(?)에 대해서도 할 얘기가 많지만 깊은 얘기는 언젠가 또 해드리도록 하죠. ('언젠가 밥 한번 먹자'와 비슷 한 얘기입니다..;;)

구글은 2012년 1000대의 컴퓨터로 1000만 개의 유튜브 이미지를 딥러닝으로 분석해 사람과 고양이를 구분해 냈다. 내게도 컴퓨터 지원 좀 해달라... (출처 : Q. Le)

지금까지 딥러닝에 대해 알아봤습니다. 요약하자면 딥러닝은 사실 오래 전부터 있어오던 인공신경망과 크게 다를 바 없지만 알고리즘적인 발전과 하드웨어의 발전, 그리고 빅데이터의 힘에 의해 현재 최고 성능을 가진 기계학습 방법으로 평가받고 있으며, 미래 인공지능의 희망으로 떠오르고 있다는 이야기였습니다.

그렇다면 딥러닝 말고 다른 기계학습 방법들은 모두 사라져야 하는 걸까요? 물론 그것은 아닙니다. 일단 딥러닝은 많은 양의 데이터많은 컴퓨팅 자원을 필요로 합니다. (저도 이번에 80만원짜리 GPU를 구매...ㅠ) 따라서 핸드폰이나 웨어러블과 같은 포터블 기기는 이러한 컴퓨팅이 불가능할테니 딥러닝을 적용하기 쉽지 않겠죠. 또한 로봇과 같이 실시간성(real-time)이 보장되어야 하는 분야 역시 다른 기계학습 방법을 취하는게 좋을 수도 있을 것입니다. (이건 마치 컴퓨터엔 윈도우, 핸드폰엔 안드로이드와 같은 맥락이라 할 수 있죠.)

하지만 그렇다고 딥러닝이 이들 분야와 무관하냐하면 꼭 그렇지만은 않습니다. 여러분이 컴퓨터가 좋아서 구글 검색 결과가 좋나요? 다 구글 서버에서 알아서 처리해주니 그런거지요. 딥러닝도 마찬가지로 만약 디바이스가 사물인터넷을 이용해 머리 좋은 서버와 잘 교신한다면 포터블 디바이스 역시 딥러닝의 은총을 받을 수 있을 것이라 생각합니다. 특히 구글이 로봇의 미래라 생각하는 클라우드 로보틱스를 구현한다면 여러 로봇이 집단 지성을 발휘하며 문제를 해결해 나가는 것을 미래에 볼 수도 있겠지요. (참고: "구글의 새 로봇 수장, 제임스 커프너는 누구인가")

딥러닝, 인공지능의 가장 희망적인 미래임은 분명합니다. 이 분야와 관계 없으시더라도 여러분도 아마 공부 좀 하셔야 할걸요? ^^ 앞서 말씀드렸듯 이 글의 후속편인 Convolutional Neural Network에 대한 이해도 꼭 한번 읽어보세요!

(1) 쉽게 말씀드리려고 제가 딥러닝과 classification 문제를 섞어서 말씀드린 건데요, 사실 딥러닝은 real-value를 다루는 regression문제에도 적용될 수 있습니다. 

* T-Robotics의 글은 facebook과 rss reader로도 받아보실 수 있습니다.


'머신러닝 > 딥러닝' 카테고리의 다른 글

Neural Network  (0) 2016.07.06
<웹진 175호 : 공학 트렌드> 인공지능 - 딥 러닝 편  (0) 2016.05.12
DeepMind moves to TensorFlow  (0) 2016.05.09

ICT 산업에 종사하지 않는 사람들도 알파고의 영향으로 인공지능 (Artificial Intelligence) 대한 관심도가 높아지고 있다. 인공지능은 인간의 학습과 추론, 지각, 언어 능력을 소프트웨어로 구현한 기술이다.

이미 오래 전에 알려진 인공지능은 특정 분야에서 어느 정도 성과를 냈지만 실제 인간의 지능과 차이를 보여 크게 발전하지는 못했다. 하지만, ICT 기술의 발달은 인공지능에 대한 연구를 급속히 이끌었고, 최근에는 인공지능의 가시적인 성과가 다른 산업에 막대한 영향을 미칠 것으로 예측된다.

이번 공학트렌드는 인공지능의 분야로 최근 주목 받고 있는 러닝에 대해 살펴보겠다. 러닝에 대한 정확한 정의와 학습 방법의 유형을 이해하고, 최근에 적용된 사례를 살펴보면서 러닝을 활용하는데 좋은 가이드가 되기를 기대한다.


딥 러닝의 정의

딥 러닝은 인간의 신경망 (Neural Network) 이론 기반의 인공 신경망 (ANN; Artificial Neural Network) 의 일종이다. 입력층(Input layer)과 출력층(Output layer), 그 사이에 하나 이상의 중간층 (Hidden layer) 을 갖고 있는 계층 구조 (Layer Structure) 로 구성된다 ( 그림 1 참조 ).


< 그림 1> 신경망 계층 구조


인공 신경망 (Artificial Neural Network)

사람의 뇌는 250 억 개의 신경 세포 (Neuron) 로 구성되어 있고, 신경 세포 간 신호를 전달하며 정보를 교환한다. 인공 신경망(ANN)은 인간의 뇌를 모방하여 만든 수학적 모델이고, 뇌의 신경망에 대응하는 노드(Node), 입력(Input), 출력(Output), 가중치(Weight) 속성을 가지고 있다( 1 참조).


< 1> 인공 신경망의 속성

구분

설명

노드 (Node)

신경 세포

입력 (Input)

다른 세포로부터 신호를 입력

출력 (Output)

다른 세포에게 신호를 출력

가중치 (Weight)

입력과 출력을 연결해주는 연결부

 

뉴런은 다른 여러 뉴런들과 거미줄처럼 연결되어 상호 작용을 하게 된다. 이를 그래프로 표시할 수 있으며, 이를 인공 신경망 모델이라고 한다. 인공 신경망 모델에서 각 노드는 뉴런을 나타내며, 각 노드를 연결하는 연결부는 뉴런 간의 가중치 (연결강도 )를 나타낸다 (그림 2 참조 ).

 

<그림 2> 인공 신경망 가중치


<그림 2> 를 살펴보면, 다른 노드에서 값을 받아 가중치를 반영하여 입력 값을 산출하는데 이값이 노드에 전달된다. 학습해야 할 문제가 복잡해지면 중간층의 개수가 늘어나는데, 이 것을 심층 신경망 (Deep Neural Network) 이라 하고, 이 학습 과정을 딥 러닝이라고 말한다.


< 그림 3> 인공 신경망 모델의 예


<그림 3> 살펴보면, 예를 들어, 자동차가 입력되면 노드 간의 가중치에 따라 출력노드가 “car_mag” 결정되는 것이 정상이다. 만약, 다른 것이 선택된다면 가중치 값을 조절해서 정상적인 선택이 때까지 다시 학습한다. 인공 신경망을 통해 여러 마리 고양이를 입력하여 고양이로 출력되도록 학습 시켰다면 사람이 보는 것처럼 다른 고양이를 입력해도 고양이라고 인식한다.

심층 신경망의 경우, 학습 해야 하는 계층이 많아지면 너무 많은 학습 시간이 소요되거나 학습에 필요한 데이터가 부족했고 제대로 동작하지 않는 경우도 많았다. 과거 인공 신경망이 좋은 기술인데도 외면 받는 이유였다. 하지만, 최근에 빅데이터로 인해 충분한 학습 데이터가 확보되고 컴퓨터의 처리 속도가 높아져 학습 시간이 대폭 줄어들면서 개선된 학습 알고리즘이 나오기 시작했고 러닝은 재조명 받기 시작했다. 인공 신경망에서 사용되는 계산식은 공학트렌드에서는 언급하지 않으니 아래 사이트를 참고한다.

 

 

< 참고사이트 >

인공 신경망에서 출력 값을 계산하는 방법

프로그래밍 언어별 딥러닝 라이브러리 정리

 

딥 러닝의 중요도

오래 전부터 인공지능 이론과 기계가 만들어지면서 다양한 산업에 인공지능이 활용되었지만 인공지능의 내부 로직을 살펴보면, 대부분 입력에 따른 출력이 정해진 매트릭스 형태였다. 다양한 경우의 수를 미리 정해두고 입력에 따라 정해진 결과를 출력하기 때문에 스스로 판단하는 기능은 부족했다. 이런 점에서 러닝은 기존의 인공지능과 명확한 차이가 있다. 러닝의 향후 발전이 주목되는 이유다.

 

 

딥 러닝의 역할

러닝의 가장 중요한 역할을 본다면 학습에 의한 예측이다. 사람의 경우, 학습을 해도 어느 시점부터는 잊어버리지만 기계에 의해 학습되어 저장된 것은 잊어버릴 수가 없다. 학습한 것을 모두 기억한다면 조만간 인간보다 똑똑한 인공지능이 나타날 있을 것이고 학습 시간도 상상할 없을 만큼 인간보다 빠를 것이다(그림 4 참조).


 

<그림 4> 인공지능의 자가학습과 성장 모델

자료 : 솔루룩스 (http://www.saltlux.com/)


<그림 4> 살펴보면, 러닝의 학습을 위해서는 반드시 학습 데이터가 제공되어야 한다. 최근에 러닝 연구가 활발해진 가장 이유 중의 하나가 빅데이터를 학습 데이터로 제공하기 때문이다. 사람이 나이가 많아지면 지식이 많아지는 것처럼 러닝도 학습을 하면 할수록 정교한 예측을 있다. 체스나 바둑의 경우, 사람은 시간이나 체력의 한계 때문에 많은 대전을 없지만 러닝의 경우 짧은 시간에도 수많은 대전을 학습할 있다.

하지만, 러닝에서도 학습 데이터를 벗어나는 예측은 하지 못한다. 바둑을 학습했다면 바둑은 최고가 있지만 학습 데이터가 없었던 체스는 최고가 없다. 아직까지 학습한 지식을 모아 다른 분야의 예측이나 판단을 하기는 어렵다.


 

< 참고 >

알파고의 능력

얼마 전 우리나라 이세돌 9 단과 인공지능 컴퓨터인 알파고의 바둑 대결이 있었다. 일반인들의 예상과는 다르게 알파고가 4 1 승리를 거뒀다. 이 결과를 두고 많은 사람들은 알파고의 능력이 다른 분야에서도 성과를 거둘 수 있을 것이라 말했다. 하지만, 알파고에게 다른 학습 데이터를 입력하지 않았다면 알파고의 능력은 바둑에 한정된다. 알파고가 가지고 있는 신경망의 내부 값은 바둑을 위한 것이기 때문이다. 알파고가 스타크래프트 대결을 원한다면 스타크래프트 학습을 반드시 거쳐야만 가능한 일이다. 다만, 알파고가 가지고 있는 학습 알고리즘은 재사용할 수 있다.

 

인공지능의 구분

딥 러닝의 관점으로 인공지능을 본다면, 인공지능은 학습에 의한 예측이고 학습하지 않는 것은 예측을 할 수 없는 것이 현재의 딥 러닝이다. 학습하지 않은 것을 예측하거나 판단하기 위해서는 사람처럼 자아가 있어야 한다. 인공지능을 자아의 유무에 따라 크게 강인공지능과 약인공지능으로 구분할 수 있다( 2 참조).


< 2> 인공지능의 구분

강인공지능

약인공지능

- 다양한 분야에서 보편적으로 활용

- 알고리즘을 설계하면 AI 가 스스로 데이터를 찾아 학습

- 정해진 규칙을 벗어나 능동적으로 학습해 창조 가능

- 특정 분야에서만 활용 가능

- 알고리즘은 물론 기초 데이터 , 규칙을 입력해야 이를 바탕으로 학습 가능

-규칙을 벗어난 창조는 불가

자료 : 보스턴컨설팅


< 2>를 기준으로 아직까지 강인공지능은 알려진 바가 없다. 잘 알려진 구글의 알파고나 IBM 의 왓슨도 바둑과 같은 제한된 데이터를 학습하여 예측하는 약인공지능이다.

하나의 분야만 학습한 알파고나 왓슨과는 다르게 다양한 빅데이터를 학습한다면 강인공지능도 가능하다. 2030년 전후로 자아가 있는 인공지능이 개발될 것이라고 말하는 인공지능 학자들도 있다.


딥 러닝의 활용

아직까지 인공지능의 전통적인 분야인 영상 인식, 문자 인식, 음성 인식에 딥 러닝이 많이 활용되고 있다( 3 참조). 영상, 음성 인식은 이미 오래 전부터 연구가 되었지만 딥 러닝 기술이 적용되면서 더욱 빠르게 발전하고 있다.


< 3> 딥 러닝의 활용 사례

적용 회사

주요 적용 사례

페이스북 (Facebook)

게시하는 사진에서 사람을 인식 (Deep Face) 하고 ,
이를 누구와 공유해야 하는지 판단

구글 (Google)

Google+ 에서 사진 태깅 , 음성 인식 기능

마이크로소프트 (Microsoft)

음성 인식 기능을 통해 영어 , 중국어 등 통역 서비스

 

빅데이터 기반의 활용

빅데이터 분석 시 딥 러닝을 활용한다면 매우 효과적인 결과를 얻을 수 있다. 최근에 빅데이터를 활용하여 활발히 연구하는 분야는 의료 분야이다. 의료도 임상 결과를 통계에 적용하기 때문에 임상 결과의 빅데이터화가 가장 필요한 분야 중 하나다.

분당서울대병원은 빅데이터 기반의 임상의사결정지원시스템을 개발하였다. 환자 개인의 특이사항을 확인하여 임상적 의사결정을 지원하는 것으로, 시스템 도입 후 부적절한 신독성 약물 처방률이 30.6% 로 감소하였다. 해당 시스템은 빅데이터를 분석하여 자연어 검색을 지원하고 의약품의 처방과 조제, 안정성 정보도 제공하고 있다. 현재는 관리되는 빅데이터 요소들을 수작업으로 처리하고 있지만 딥 러닝이 반영된다면 자동 학습을 통해 숨겨진 인사이트를 찾아낼 수 있을 것이다. IBM 의 왓슨은 의료 분야에 딥 러닝을 반영해서 암 치료에 획기적인 효과를 나타내고 있다. 진료 기록으로 환자의 상태를 진단하고 의심 질환을 의사에게 전달하는 역할도 담당한다.


타 산업과의 연계

딥 러닝이 적용되는 산업은 점점 늘어가고 있다 . 최근에 가장 주목 받는 산업은 스마트 카 내세우는 자동차 산업이다 . 운전자가 없어도 자동차 스스로 목적지로 이동하기 위해서는 운전 중에 발생할 수 있는 다양한 상황을 미리 학습을 해야 한다 . 자동차 산업에서는 딥 러닝을 통해 이를 해결하고 있다 .

러닝은 지금까지 학습 결과를 데이터로 출력하여 활용하는 경우가 대부분이었지만 러닝의 활용을 고도화하기 위해서는 스마트 카와 같이 학습 결과를 산업의 비즈니스에 적용되도록 고민하는 것이 필요하다.

외에도, 미래창조과학부에서는 러닝을 위한 고성능 컴퓨팅(HPC) 시스템과 러닝 핵심 소프트웨어인 다중 노드 분산처리 SW 프레임워크 개발하여, 단일 서버가 수행하던 모델 트레이닝을 분산해서 처리한다(그림 5 참조). 다양한 기업과 학계에서 활용될 있어 러닝 국가 경쟁력 확보에 도움이 것으로 기대된다.

 

 

< 그림 5> 이종 가속기 기반 딥러닝 HPC 시스템


마무리 하며

최근 수년 동안 빅데이터는 ICT 산업에서 가장 주목받는 분야였다. 과거에는 상상도 없을 만큼의 데이터를 분석해서 객관적인 데이터로 정리하고 미래 예측까지 있다는 것은 빅데이터에 대한 무한한 기대감이 있었다. 하지만, 워낙 많은 데이터를 다뤄야 하다보니 사람의 능력으로 감당하기가 어려웠다. 러닝은 사람의 한계를 넘는 빅데이터를 다뤄줄 있고, 빅데이터를 활용해 새로운 정보를 알아내는 능력까지 갖추고 있다. 학습 알고리즘이 정교하게 완성된다면 예측 분야에서도 많은 역할이 기대된다.

'머신러닝 > 딥러닝' 카테고리의 다른 글

Neural Network  (0) 2016.07.06
쉽게 풀어쓴 딥러닝(Deep Learning)의 거의 모든 것  (0) 2016.06.01
DeepMind moves to TensorFlow  (0) 2016.05.09

DeepMind moves to TensorFlow

오늘 구글은 블로그를 통해 딥마인드(Deepmind.com)가 토치(Torch)에서 텐서플로우(TensorFlow)로 연구, 개발 프레임워크를 교체한다고 발표하였습니니다.

토치는 그동안 딥마인드와 페이스북이 사용하면서 코드 기여도 상당했었지만 딥마인드가 토치를 더이상 사용하지 않게 됨으로써 토치 진영에는 페이스북과 트위터가 남게 되었습니다. 어찌보면 예상된 수순이었을지 모르겠습니다. 이세돌과 알파고가 바둑대전을 할 때 제프딘이 언급한 것 처럼 이미 알파고에 텐서플로우가 일정 부분 사용되고 있었기 때문입니다.

며칠 전 선다 피차이(Sundar Pichai) 구글 CEO가 보낸 창업자의 편지(Founder’s letter)에서 앞으로 세상은 모바일 퍼스트(mobile first)에서 AI 퍼스트(AI first)로 변할 것이라고 말하고 있습니다.

“We will move from mobile first to an AI first world.”

이런 비전의 첫 교두보인 텐서플로우가 무엇보다도 널리 쓰이길 바라는 것이 구글에서는 당연할 것입니다. 딥마인드는 지난 몇 달간 기존의 연구를 텐서플로우로 변경하면서 테스트를 해왔고 이제 앞으로 딥마인드에서 수행하는 모든 연구는 텐서플로우를 이용할 것이라고 합니다.

물론 텐서플로우를 PR 하는 것이라고 비아냥 거리는 냉소도 인터넷에 돌아다니긴 합니다.

+ Recent posts