2018-12-10 15:59:52

오늘은 딥러닝에서 가장 기초적인 알고리즘인 인공신경망(artificial neural network)에 대해서 다루도록 하겠습니다. 참고로 인공신경망은 피드포워드신경망(feedforward neural network)으로 불리기도 합니다. 

 

사람의 뇌에는 V1, V2, V3, V4, MT와 같이 나름대로의 역할을 가지는 피질 영역(cortical area)들이 있습니다. 그 피질 영역 내에는 수많은 뉴런들이 존재하고, 그 뉴런들은 시냅스들로 서로 연결되어 있습니다. 그것을 신경망이라고 부릅니다. "인공" 신경망은 말 그대로 사람의 뇌에 있는 뉴런들의 연결, 즉 신경망을 인공적으로 흉내낸 것입니다.

 

뉴런과 뉴런은 시냅스를 통해 연결된다 [출처: https://commons.wikimedia.org/wiki/File:Axo-axonic_synapse.svg]

 

인공신경망은 입력층(input layer)과 은닉층(hidden layer) 그리고 출력층(output layer)으로 구성되어 있습니다. 은닉층은 필요에 따라 여러 층을 쌓아줄 수 있습니다. 각 층 마다 여러 개의 노드(뉴런)들로 구성되어 있고, 또 각 층에 있는 노드들은 전, 후 층의 노드들과 연결되어 있습니다. 이때 같은 층의 노드들과는 서로 연결되어 있지 않습니다. 

 

인공신경망의 구조 [출처: https://commons.wikimedia.org/wiki/File:Artificial_neural_network.svg]

 

인공신경망에서는 가중치(weight)라는 것이 매우 중요합니다. 가중치는 시냅스를 모방한 것입니다. 좀 전에 한 층의 노드들이 다음 층의 노드들과 연결되어 있다고 했는데, 그 연결의 강도를 가중치가 결정해줍니다. 한 노드와 또 다른 노드 사이의 가중치가 크다면 서로 강하게 연결되어 있는 것이고, 작으면 약하게 연결되어 있는 것입니다.

 

이 가중치는 처음에는 랜덤한 값으로 설정됩니다. 그렇기 때문에 이 상태에서 네트워크에 어떤 값을 입력해주면 우리가 원하는 값이 출력되지 않습니다. 따라서 훈련 또는 학습을 통해서 인공신경망이 원하는 결과를 출력해낼 수 있도록 이 가중치들이 적합한 값을 갖도록 만들어줘야 합니다. 일반적으로 사용되는 훈련 방법은 오차 역전파(error backpropagation)라는 방법인데, 링크건 포스팅에서 아주 상세하게 설명해놓았으니 참고하시기 바랍니다. 간단하게 말씀드리면, 출력된 값과 ground-truth 라벨값의 차이, 즉 오차를 네트워크에 역방향으로 전파해서 그 오차를 줄이는 방향으로 가중치가 조정되도록 하는 방법입니다. 잘 훈련된 인공신경망에 어떤 값을 입력해주면, 인공신경망은 우리가 기대하는 값을 출력해줍니다.

 

인공신경망은 기존의 서포트벡터머신(SVM)과 같은 머신러닝 알고리즘과 견줄 만한 성능을 보이기도 하지만, 또 한계점도 많이 있습니다. 대표적인 것이 은닉층의 갯수가 많아지면 앞쪽에 있는 은닉층들의 가중치가 제대로 훈련되지 않는 현상입니다. 그것을 경사감소소멸(gradient descend vanishing)이라고 부릅니다. 이러한 한계들을 극복하기 위해 DBN(deep belief network), SAE(stacked auto-encoder), CNN(convolutional neural network) 등의 딥러닝 알고리즘들이 인공신경망을 기반으로 해서 생겨났습니다.

 

관련 글

오차 역전파(error backpropagation) 개념 제대로 파악하기

딥러닝 알고리즘의 대세, 컨볼루션 신경망(convolutional neural network, CNN)  

[Anaconda+python] 의상 분류기 만들어서 훈련시키고 테스트하기1(인공신경망)