뉴럴네트워크 코드 짜는 법 배우기

이 글은 저자 Per Borgen의 허락을 받아 Learning How To Code Neural Networks의 듀토리얼 글을 번역한 것입니다. 원문도 꼭 읽어보셨으면 합니다. 반년 전, 뉴럴네트워크에 관해 입문하기에 굉장히 쉽고 좋은 글을 만났습니다. 저 또한 많은 도움을 받았습니다. 번역한지는 좀 되었지만 이제서야 글을 올리게 되었습니다.


이 글은 ‘짧은 시간동안 새로운 것를 배우기’ 시리즈의 두번째 글입니다. 시리즈의 첫 번째 글은 한 주동안 머신러닝 배우기에서 보면 됩니다.

이번 시간에는 뉴럴네트워크 공부를 해 보았습니다. 여러가지 이유로, 이것을 한 주동안 끝내지는 못했고 2015년 여름과 가을동안 기본적인 이해를 마쳤습니다.

기본적인 이해라 함은, 저 혼자 스크래치 언어로 간단한 뉴럴네트워크를 만들 수 있는 정도 였습니다.

이 글에서는 이 글을 보고 관심을 가지는 분들이 따라하실 수 있도록, 제가 사용한 것들을 활용해서 몇 가지 설명과 가이드를 하고자 합니다.

1단계: 뉴런 그리고 전향 전파법(forward propagation)

그래서, 뉴럴네트워크는 무엇일까요? 먼저 네트워크 부분은 제쳐두고 하나의 뉴런으로 시작해봅시다.

뉴런은 함수와 같다. 몇 가지 입력값을 넣으면 촤라락 계산해서 결과값이 나온다.

아래의 원은 인공 뉴런을 설명합니다. 입력값은 5이고 결과는 1입니다. 입력값은 뉴런과 연결된 세 개의 시냅스의 합입니다.(왼쪽 화살표 3개를 의미합니다).

이미지1

왼쪽에 보이는 값은 두 입력값과 바이어스(bias) 값이 더해진 것 입니다. 바이어스 값이 -2로 설정되어 있는 동안(갈색 숫자), 입력값은 1혹은 0(초록색 숫자)입니다.

이 입력값들은 두 가지 서로 다른 특징(feature)들을 숫자로 대변합니다. 스팸필터를 만든다고 생각했을 때, 한 특징은 하나의 알파벳 대문자를 포함한다거나, 다른 특징은 ‘비아그라’라는 단어를 포함한다면 스팸으로 분류한다는 것을 예로 들 수 있겠네요..

두 입력은 7과 3이라는 weight라 불리는 값들로 곱해집니다. (파란색 숫자)

최종적으로 이 값들을 바이어스 값과 함께 더 한 후에 위 경우에는 5라는 결과값을 내놓습니다. (빨간색 숫자). 이것이 인공뉴런의 입력값입니다.

alt text

뉴런은 이 숫자들을 가지고 어떠한 계산을 합니다. - 지금 이 경우에는 시그모이드 함수로 계산한 후 결과값이 툭하고 튀어나올 것입니다. 5를 넣고 계산한 시그모이드 값은 반올림하면 1이 나올 것입니다. (시그모이드 함수에 관한 설명은 아래에 나옵니다)

스팸필터라면 결과 값이 1이라는 의미(0과 반대)는 뉴런이 메일에 ‘스팸’이라고 붙여놓은 것을 의미합니다.

alt text

이 뉴런들을 네트워크를 통해서 연결한다면, 독자들은 전향적인(forward) 뉴런네트워크를 가질 수 있습니다. 입력값부터 결과까지 시냅스를 통해서 각각이 연결되면 이미지처럼 연결된 뉴런이 되게 됩니다.

이 과정에 좀 더 직관적인 설명을 보고 싶으시다면 Welch Labs videos on YouTube 이 영상을 강추하고 싶습니다!

2단계 : 시그모이드 함수 이해하기

웰치 랩 비디오를 본 후에는 뉴럴 네트워크 영역을 다루는 cousera 머신러닝강의 4주차를 들어보는 것도 좋은 생각입니다. 강의를 보고 나면 어떻게 동작하는 지 좀 더 직관적으로 이해될 것입니다.

저는 파이썬을 조금 더 선호하지만, 이 수업은 꽤나 수학적인데다 옥타브(매트랩 무료버전)을 사용하기에 저는 프로그래밍 연습문제는 하지 않았습니다. 제가 배워야 하는 부분들에 대해서만 비디오를 통해서 이해했습니다.

제일 먼저 시그모이드 함수에 대해서 조금 더 공부해야겠다고 생각했습니다. 많은 뉴럴네트워크에서 매우 중요한 부분으로 보였기 때문입니다. 함수에 대해 이해는 조금 하고 있었지만, 같은 강의의 3주차에 이 함수에 대해서 설명 해줍니다. 그래서 돌아가 강의를 들었습니다.

alt text

그러나 강의를 듣는 것만으로 모든 것을 이해할 수 없습니다. 정말 이해하기 위해서는 밑바닥부터 코드로 만들어봐야겠다고 생각했습니다.

그래서 (시그모이드 함수에 사용되는) 로지스틱 회귀 알고리즘부터 스크래치로 만들어보기 시작했습니다.

하루종일 걸린데다 로지스틱 회귀의 좋은 향상기법은 아니었을 것입니다. 그렇지만, 어떻게 동작하는 지 이해했기 때문에 상관없었죠. 코드는 여기서 확인해보시면 됩니다.

독자들은 이 모든 과정들을 직접 다 해 볼 필요는 없는데다 비용함수(cost function)와 경사하강법(gradient descent)에 대해 어느정도 지식을 요구하기에, 여기서 이 모든 것을 할 필요는 없습니다.

그렇지만 어떻게 시그모이드 함수가 동작하는지는 확실하게 알아야합니다.

3단계 : 역전파법(Backpropagation)에 대해 이해하기

입력값에서 결과값이 나오기까지 뉴럴 네트워크가 동작하는 과정을 이해하는 것은 별로 어렵지는 않습니다. 최소한 개념적으로는요.

실제 데이터 샘플들을 가지고 뉴럴 네트워크가 어떻게 배우는 지 이해하는 것이 좀 더 어렵습니다.

이 개념이 바로 역전파법(Backpropagation)입니다.

기실 의미하는 바는 네트워크가 예측한 것에 비해 얼마나 잘못된 것인지이고, 그에 따라 얼마만큼 네트워크 weight를 조정하는 것에 달려있다.

본 글 시작지점에서 보이는 뉴런그림 안에서 파란색 숫자가 weight 입니다.

이 과정은 거꾸로 진행됩니다. 네트워크가 끝나는 부분에서 시작되기 때문이죠. (네트워크가 추측하는 것이 ‘얼마나’ 잘못됐는지 보는 것입니다). 입력값에 도달하기까지 weight를 조정하면서 네트워크에서 반대방향으로 진행됩니다.

이것을 손으로 계산하려면 몇몇 미적분 방법들을 사용하는데, 네트워크 weight에서 미분된 몇몇 값들을 포함합니다. 전 이걸로 공부하지는 않았지만(전 미적분을 대학에서 배웠습니다) 칸 아카데미 미적분 수업이 조금 도움이 될 것이라 생각합니다.

Note: 미분을 계산해주는 많은 라이브러리들이 있어서 당신이 수학적으로 모든 것을 이해하기 전에라도 뉴럴 네크워크 코딩을 시작하고 싶다면 이 라이브러리들을 사용해서 충분히 할 수 있을 것입니다.

이미지1

제가 생각하기에 역전파법(Backpropation)을 이해하기에 가장 좋은 글 3개는 다음과 같습니다.

A Step by Step Backpropagation Example — by Matt Mazur
Hackers Guide to Neural Nets —by Andrej Karpathy
NeuralNetworksAndDeepLarning — by Michael Nielsen

특히 첫 번째 두 글들은 반드시 글들을 읽으면서 코드를 작성 해보아야 합니다. 언젠가 헷갈릴 때 돌아와서 볼 수 있도록 몇몇 샘플 코드등을 제공합니다.

더해서, 이 표현은 아무리 강조해도 지나치지 않습니다.

"You don't learn much by reading about neural nets, you need to practice it to make the knowledge stick"
"뉴럴 네트워크에 대해서는 단순히 읽어서는 많이 배울 수 없고, 무언가를 만들면서 연습해야 한다." 

세 번째 글 또한 멋지지만, 책 한 권의 일반적인 듀토리얼처럼 다 읽기 보다는, 위키처럼 몇몇 부분들을 참조하였습니다. 이 글은 뉴럴 네트워크의 중요한 모든 개념들을 이해하게 해줍니다.

이 글들은 뉴럴 네트워크 안에서 역전파법 만큼 중요한 역할을 하는 비용함수(cost function)와 경사하강법(gradient desent)과 같은 중요개념들도 이해하게 도와줍니다.

4단계 : 뉴럴 네트워크 코딩하기.

몇몇 글들이나 듀토리얼에서는 작은 뉴럴네트워크를 실제로 코딩하보며 마무리합니다. 여태까지 편하게 온 만큼, 이 원칙하에 해보길 추천한다. 정말 재밌고 효율적으로 배우는 방법입니다.

또 제가 정말 많이 배운 글은 A Neural Network in 11 Lines Of Python by IAmTrask입니다.

(역자 주: 제 블로그에 이 글을 번역한 글도 있습니다)

alt text

이 예시로 코딩해 본 다음에는 듀토리얼 없이 한 번 더 향상시킨 이 글 하단의 것으로도 해보아야 합니다. 이는 정말로 개념을 이해하는 데 도움이 될 것이고, 별로 즐겁지는 않은 지식의 구멍이 있는 허점들을 드러내 줄 것입니다. 그러나 끝까지 하고 난 다음에는 새로운 초능력을 얻는 기분이 들 것 입니다.

짧은 사이드 노트: 전 평상시에 연습을 할 때, 몇몇 듀토리얼에서 사용하는 벡터화 향상기법이 약간 헷갈립니다. 이것들은 몇몇 선형대수가 필요합니다. 다시 한번 더 cousera ML 수업으로 돌아가서, 첫 주 동안 선형대수를 총체적으로 다룹니다. 이것은 어떻게 네트워크에서 매트릭스와 벡터가 어떻게 곱해지는 지 이해할 수 있을 것입니다.

끝나고 나시면, Denny BritzWild ML tutorial로 넘어가기 바랍니다. 조금 더 나은 뉴럴 네트워크를 만드는 데 도움을 줄 것입니다.

alt text

이 즈음에서, 스크래치로 당신만의 뉴럴네트워크를 만들고 시도해보든 당신이 만들어놓은 몇 뉴럴네트워크를 가지고 놀아보세요.

데이터셋이 필요하면 쩨 사이드 프로젝트인 (부끄럽지만 셀프 홍보하자면) Datasets.co에서 원하시는 것들로 찾아보시기 바랍니다.

alt text

어찌되었건, 이러한 것들로 실험해보는 것이 내 조언을 따르는 것보다 더 흥미로울 것입니다.

개인적으로는 최근에 뉴럴네트워크를 쉽게 만들기 위해서 Theano, Lasagne, nolearn 같은 파이썬 라이브러리들을 어떻게 사용할 지 배우고 있습니다. Kaggle에 사용해보며 대회에 참여하고 있습니다. 둘다 재미있고 많이 배우고 있습니다.

행운을 빕니다!

여러분이 이 글이 괜찮다고 느낀다면 하트표를 누르기 바란다. (역자 주 : Learning How To Code Neural Networks 에 가셔서 꼭 눌러주세요!)


읽어주셔서 고맙습니다. 내 이름은 Per Borgen이고 대부분 새로운 것들을 배우면서 쓴다.

질문이 있거나 연락을 하고 싶으면 편히 연락해주길 바란다. ]Twitter](https://twitter.com/OsloKommunePer), Github, linkedin 혹은 그냥 perhborgen@gmail.com로 편하게 연락주시면 된다.