'제로부터 시작하는 딥러닝'을 읽고

February 03, 2017

차일피일 미루고 있던 기계학습 공부를 시작해야겠다, 마음먹은 찰나에 주변에서 들려오는 ‘제로부터 시작하는 딥러닝’의 평이 워낙 좋아서 짬이 난 김에 한번 읽어봤습니다. 읽었으니 글을 하나 써야하는 것이 인지상정.

내용 정리하는 글을 써볼까했으나, 별로 재미도 없을거 같고 찾으면 다 나오는 것들이라 어차피 가볍게 읽을 수 있는 책이기도 하니, 간단하게 감상글이나 남기기로 결정.

책에서 다루는 내용

제목에서도 알 수 있듯 딥러닝에 대해서 정말로 밑바닥부터 시작하여 개념을 살펴봅니다. ‘퍼셉트론 -> 신경망 구성하기 -> 학습시키기 -> 심화과정’이라는 순서로 구성되어 있으며, 무엇보다 좋았던 점은 수식을 그다지 좋아하지 않는 분들을 위해서 스크래치부터 신경망을 만드는 법을 설명한다는 것입니다. 수식이 잘 이해가 가지 않더라도 코드를 보면 안심하고 이해할 수 있는 것이 개발자 아니겠습니까.

실용적인 코드

책에 나오는 코드는 그저 이해를 돕기 위한 작은 규모의 코드입니다만, 대량의 데이터를 학습하는 경우를 고려하여 배치 처리가 가능한 코드가 작성되어 있습니다. 물론 이걸로 실무를 하려는 사람은 없겠지만, 최대한 실제 상황을 고려한 코드는 그 자체로도 흥미로웠습니다.

쉽고 친절하지만 지루한 설명

전체적인 난이도는 대학 전공 수업에서 들을 수 있는 인공지능 수업 정도의 레벨입니다. 화상처리에 익숙하지 않으신 분들이라면 후반부의 CNN에서 혼란에 빠질 수 있을 수도 있습니다만, 그렇다고 하더라도 쫓아가지 못할 정도는 아닙니다. 무엇보다 코드와 설명을 오가면서 충분히 이해할 수 있도록 저자가 충분하게 배려하고 있는 느낌이 매우 좋습니다.

다만 한 권 안에 필요한 설명을 최대한 쉽게 하려다보니, 곁가지로 새는 일이 없이 설명, 코드, 설명, 코드… 읽다보면 졸고 있는 자신을 발견할 수 있을지도 모릅니다. 그야말로 교과서같다고 말할 수 있겠네요. :)

가끔 튀는 이상한 코드

대표적인 예시를 하나.

def f(W):
   return net.loss(x,t)

dW = numerical_gradient(f, net.W)

그라디언트를 계산하는 코드인데, W를 더미 파라미터로 주고 net.loss(x, t)를 반환하게끔 만든 함수를 수치 미분하라고 넘겨줍니다. 뭔가 이상한 느낌. 어딜 어떻게 봐도 f는 상수를 반환할 거 같은데 말이죠. 미분할 함수가 상수라면 0이 나와야 할텐데 어째서인지 멀쩡해보이는 수치가 반환되는 상황.

책을 대충 읽은 제가 나쁜거긴 하지만, 범인은 numerical_gradient였습니다. 코드 구현을 일부 발췌하면,

def numerical_gradient(f, x):
    # ...
    
    it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
    while not it.finished:
        idx = it.multi_index
        tmp_val = x[idx]
        x[idx] = float(tmp_val) + h # 네트워크의 가중치를 갱신
        fxh1 = f(x) # f(x+h)
        
        x[idx] = tmp_val - h 
        fxh2 = f(x) # f(x-h)
        grad[idx] = (fxh1 - fxh2) / (2*h)
        
        x[idx] = tmp_val # 네트워크의 가중치를 되돌림
        it.iternext()   
        
    return grad

넘겨 받은 네트워크의 가중치를 직접 변경하고 손실 함수를 계산한 뒤, 값을 되돌려 놓습니다. 설명을 위한 구현체라고는 하지만, -적어도 저에게는- 동작을 이해하기에 좋은 인터페이스로 보이진 않았네요.

학습 기법에 대한 자세한 설명

학습에 대해서 어떤 전략을 취하는게 좋을까에 대해서 잘 설명되어 있는 것도 장점입니다.

이런 내용은 학습 주기나 전략에 대해서 막연한 흐름만 알고 있었던 저에게는 꽤 좋은 자료였습니다.

CNN

개인적으로는 화상처리보다는 언어처리에 관심이 많아서, CNN은 이미지 처리에 유용하다, 정도의 상식만 알고 있었습니다만, 이번 기회로 CNN이 이미지 처리에 유리한 구조라는 점을 명확하게 이해할 수 있었습니다.

RNN도 좀 다루어주었으면 좋았겠지만 분량을 생각하면 거기까진 욕심이겠죠.

마무리

최대한 책의 소개를 짧게 줄여보자면, “스크래치로 시작하는 신경망, 퍼셉트론부터 CNN까지” 라고 할 수 있겠습니다. 위에서부터 주욱 읽어오셨다면, 최근 유명한 라이브러리의 이름은 정말 하나도 안나왔다는 점을 눈치채셨을 텐데요. 편리한 행렬 계산을 위한 numpy 말고는 사용하는 라이브러리가 전혀 없습니다. 말 그대로 신경망 자체에 대해서 설명하고 있어서 심리적인 장벽을 많이 낮춰주지 않을까 싶습니다.

이 책은 2016년 9월 28일 첫 발행, 무척 잘 팔리는 모양인지 4달만에 벌써 7쇄까지 나온 책입니다. 일본에서 발매된 책이며, 발매일을 생각하면 당연하지만 아직 한국어판이 없습니다. 다만 온라인에서 이북을 구입할 수 있으니, 일본어 가능 && 딥러닝 초심자 또는 관심이 있으신 분이라면 읽어봄직 하네요. 번역서가 이미 있었다고 합니다. 잘못된 정보를 안내해서 죄송합니다(_ _)

제보 주신 bestalign님 감사합니다.

Reference