인공 신경망(neural network)를 제대로 공부하기 위해 필요한 사전 지식: 미적분(학부 과정), 선형 대수(linear algebra, 학부 과정), convex optimization(대학원 과정).


지난 학기 컴퓨터 비전 특강이라는 대학원 수업에서 인공 신경망에 관해 공부하고 발표했습니다.


인공 신경망이 최근에 유행하는 딥 러닝에 토대가 되고, 너무나도 매력적이기 때문에 학부 때 부터 졸업을 위한 캡스톤 디자인에서 쓰려고 공부했습니다.


다만 공부하면 할 수록, 학습을 위한 해(solution, 인공 신경망에서는 weight의 set)를 찾는 과정에서, 최적해가 보장이 안된다는 점(인공 신경망의 objective function이 convex가 아니기 때문. 대학원 수업을 수강하거나 스탠포드의 Stephen P. Boyd 교수님의 convex optimization 책 참고)이 약점이라 마음이 아프군요.


스탠포드 대학의 앤드류 응 교수가 인공 신경망을 이해하기 쉽게 튜토리얼 형태로 직접 만든 위키에 올린게 있어서 그걸 토대로 발표했습니다.


만든 발표 자료가 엉성하기 짝이 없지만, 적당히 눈으로 스윽 읽고 훑어도 이해 될만하게 정리하였다 생각해서 블로그에도 올려봅니다.


(이 글은 모바일로 보셨을 때 중간에 LaTeX 적용이 안되는 부분이 몇 있습니다.)




위 슬라이드가 수업 때 발표한 걸 앞 뒤 쳐내고 인공 신경망을 이해하기 위한 부분만 남긴겁니다.


밑으로 각 슬라이드에서 이해에 도움이 될 설명을 적어보겠습니다.



이 슬라이드의 내용은 스탠포드 대학 Andrew Ng 교수님의 sparse autoencoder 튜토리얼 노트로 만들었습니다. 제가 한 일은 영어를 한글로 번역한 정도기 때문에 원문을 읽으실 분은 링크를 클릭해서 읽어보세요.


원문 링크: http://nlp.stanford.edu/~socherr/sparseAutoencoder_2011new.pdf



기계 학습(machine learning)은 크게 두 가지로 분류할 수 있습니다. Supervised learning과 unsupervised learning으로 나눌 수 있습니다. 한글로 번역하신 분들을 보면 보통 supervised learning을 지도 학습, unsupervised learning을 비지도 학습이라고 하시더군요.


의미를 잘 생각해보면, supervised learning은 학습에 필요한 데이터에 클래스 라벨이 이미 붙어 있는 경우 입니다. 클래스 라벨은 어떤 인스턴스(instance, 예시로 사람, 도시, 음식, 차...)의 데이터가 주어졌을 때, 그 인스턴스가 어느 분류에 속하는지를 나타냅니다. 예를 들어 인스턴스가 사람이라면, 사람의 키, 체중, 나이, 성별, 혈압, 주량이 주어졌을 때, 심장병에 걸릴 확률이 클래스가 될 수 있겠죠. 따라서 클래스는 연속된 값(continuous value)일 수도, 분리되서 나누어지는 값(discrete)일 수도 있습니다. 학습 데이터에 이런 클래스 정보가 없다면 unsupervised learning이 됩니다.


최고로 좋은 예측 프로그램을 만든다고 하면, supervised learning이 unsupervised learning보다 예측이 더 잘됩니다. 그러나 supervised learning의 단점은 바로 누군가가 데이터의 클래스를 입력해주어야 한다는 단점이 있습니다.



튜토리얼 노트에서 강의 순서는 supervised learning에 관해 설명하고, 여기서 간단한 인공 신경망에 관해서도 설명합니다. 그리고 unsupervised learning의 예시로 sparse autoencoder를 설명합니다.



인공 신경망에 쓰는 수학적 표기에 관한 설명입니다.


Input에서

$$x^{(i)}$$

는 입력 데이터의 i번째 인스턴스의 attribute(속성 값들. 예를 들어 어떤 사람의 키, 체중, 나이, 성별, 혈압, 주량)입니다.

$$y^{(i)}$$

는 입력 데이터의 i번째 인스턴스의 class(예를 들어 어떤 사람의 심장병 확률)입니다.


Hypothesis는 우리말로 가설이라 할 수 있습니다. 여기서는 인공 신경망에 인스턴스 x의 데이터를 넣었을 때 얻을 수 있는 클래스 y에 관한 함수입니다.



뉴런은 인공 신경망의 최소단위입니다.


앞서 설명드린 수학적 표기법을 다시 떠올려보시면, 입력값은 attribute들이고(x의 첨자가 위, 아래에 있을 때 의미하는 게 다르다는 점에 주의), 출력값은 이 뉴런에 입력값을 넣었을 때 얻을 수 있는 예상 클래스입니다.


그림에는 보이지 않지만, 입력값들은 가중치와 곱의 합(입력 vector와 가중치 vector의 product)이 활성함수에 들어가서 출력됩니다.


이 경우는 sigmoid function을 썼으므로 출력 범위는 [0, 1]이 됩니다.



활성함수는 위에서 sigmoid function 외에도 hyperbolic tangent도 쓰입니다. 그러면 출력 범위는 [-1, 1]이 되겠죠. 출력층의 뉴런 하나는 클래스 하나를 대변하구요. 그게 0인지 1인지에 따라 어느 클래스일지 예측할 수 있게됩니다(sigmoid function의 경우).


활성함수를 이런 얘들로 쓰는 이유는, 최적 가중치를 찾을 때 gradient method를 쓰는데요(Stephen P. Boyd 교수님의 convex optimization 책 참고. Newton's method). 그 때 미분을 두 번하게됩니다. 미분이 편리하게 잘 되도록 저런 함수를 쓴다고 이해하면 되겠습니다. (레이어 사이에 활성 함수를 사용하는 이유는 모델을 비선형화 하기 위해서기도 함. 예를 들어 레이어 사이에 활성함수를 하나도 안쓰면 그냥 선형모델이 됨) 



인공 신경망(neural network)의 최소 단위는 뉴런(neuron)이라고 말씀드렸는데요. 그 뉴런이 여러개 모여 망(network)를 이룬 것이 바로 뉴럴 네트워크입니다.



이 그림에서 +1로 표시된 원은 입력 값에 관해 가중치들이 편향되지 않도록 넣는 꼼수 뉴런입니다.



위 용어들은 인공 신경망이 다층 구조로 되어있을 때 수학적으로 표현하기 위한 용어입니다.



새로운 수학적 표기가 등장했는데요. a는 활성함수를 통해 나온 값을 의미합니다. 앞서 뉴런 하나 짜리에서 입력의 벡터와 가중치 벡터의 product를 sigmoid function에 넣었을 때 나오는 결과가 바로 activation이고 이 노트에서는 a로 표기합니다.


식 (2) - (4)로 입력값이 은닉층을 통과하구요. 그 activation들이 다음 가중치와 product를 통해 마지막 출력값 h(x)가 나옵니다.



인공 신경망에서 결과를 얻기 위해서 앞에서부터 출력층 까지 차례로 값을 계산하여 전달해야합니다. 이를 feedforward라고 합니다.



앞서 까지는 입력층, 은닉층 하나, 출력층의 유닛 하나 짜리인 단순한 인공 신경망을 보았는데요. 이번 예제는 은닉층이 두 개, 출력층의 유닛이 두 개인 경우입니다.


이런 인공 신경망은 멀티 클래스 문제에 쓸 수 있습니다. 예를 들어, 의료 처방 응용프로그램을 만든다고 할 때, 입력 벡터 x는 환자가 갖고 있는 모든 증상의 attribute의 집합이 되구요. 출력 벡터 y는 각각의 질병의 유무가 되겠습니다. 즉 출력 유닛의 두 뉴런이

$$y = <심장병, 간암> = <0.80, 0.01>$$

위와 같은 형태로 표현될 수 있다는 것입니다.



Supervised learning에서 인공 신경망에 입력값과 출력값이 어떤 값이 들어가야하고, 어떤 값이 나와야하는지 알고 습니다. 그래서 가중치를 적절히 조정해서 딱 들어맞는 인공 신경망을 만들 수 있겠죠. 가중치를 찾기 위한 목적식은 위와 같습니다.


비용함수라고 표현했는데요. 목적식이라고 부를 수도 있습니다. 비용함수의 우변을 보면, h(x)는 인공 신경망을 통해 예측된 값이구요. y는 실제 클래스의 값입니다. 예측값과 실제값이 최대한 같아야 하므로, 그 차이의 2차원 norm이 최소가 되는 가중치 벡터를 찾으면 되겠죠.


이 때 가중치는 attribute의 차원 수 만큼의 차원을 갖는 벡터 공간에 존재합니다. 그리고, 이 비용함수는 convex function이 아닐 수도 있죠.


이 문제의 최적해를 찾을 때는 batch gradient descent로 찾습니다(예시 Newton's method). 이 방법은 비용함수가 3차원일 때, 3차원 공간에 그래프를 그려보면 조각 작품 처럼 생긴게 나오는데요. 여기에 눈을 감고 손으로 더듬어가면서 가장 좋은 가중치가 있는 점을 찾는걸 상상해보면 됩니다. 또는 눈을 감고 산을 오를 때, 한발자국씩 움직여서 점점 가장 높은 곳을 올라서 마지막에는 최고점(또는 최고점 근처)에 도달하는 걸 생각하시면 됩니다.



그런데 앞서 이 목적식(비용함수)가 convex가 아니라고 했는데, 그 때문에 최고로 좋은 해는 찾지 못할 수도 있습니다. 하지만 현실 문제에서는 최적해가 아니어도 예측이 잘되기 때문에 무시하는 편입니다.



Batch gradient descent로 최적의 가중치를 찾아갈 때, 이런 식으로 가중치를 갱신합니다. 앞서 설명드린 것처럼 미분이 필요하죠. 한편, 학습률 α는 gradient descent로 값을 찾아갈 때 한 번에 보폭을 얼마나 할지 정하는 값이라고 보시면 됩니다.



실제로 갱신에 필요한 식을 찾기 위해, 목적식을 편미분하면 위와 같은 결과가 나옵니다.



앞서 보신 인공 신경망을 학습시키는 과정이 이와 같습니다.

그걸 일반적인 의사코드로 표현하면 위와 같습니다.



지금까지 supervised learning을 보았는데요. Autoencoder는 unsupervised learning입니다. 그래서 출력값 y가 없고, 이걸 입력값이 대신하죠.



그림으로 구조를 살펴보면 위의 인공 신경망과 같습니다. 입력 attribute의 개수만큼, 출력 뉴런의 개수가 있죠.


이 경우 목적식을 구하기 위해 평균 activation을 이용합니다.


이 목적식이 대략적으로 어떤 작은 값이 될거라고 생각해서 위 그림의 둘째 등식이 나옵니다.


이걸 풀어낸 것 중 하나가 위 그림의 마지막 식이 됩니다.



이걸 KL-발산을 써서 (손으로)쓰기 쉽게 바꿉니다.

그렇게 구한 비용함수(목적식)은 위와 같이 됩니다.


그리고 가중치를 업데이트할 때 위 그림의 둘째 등식을 씁니다.





지금까지 알아본 autoencoder를 구현해서 10 X 10 크기의 이미지를 학습시켰을 때 위와 같은 결과가 나온다고 합니다.





마무리로 다른 이야기를 하자면...


처음에 말씀드린 것처럼, 인공 신경망을 학습시켜 얻은 가중치가 최적해라는 걸 알 수 없습니다. 그런데, 예측은 잘되죠. 결과가 어떻게 왜 이렇게 잘 나오는지 모르니 함부로 쓰기에 위험한 부분이 있습니다.


학기 중에 로지스틱 리그레션(logistic regression)을 배우고, 직접 Java로 구현해보았는데요. 실제로 인공 신경망이나 로지스틱 리그레션이나 둘 다 성능이 비슷한 걸로 알고 있습니다. 그래서 누군가 데이터를 몽땅 주면서 예측 어플리케이션 만들어보라고 하면, 둘 중에 로지스틱 리그레션을 계속 쓸 것 같습니다.


Posted by 공돌이pooh
,