관리 메뉴

TEAM EDA

케라스 창시자에게 배우는 딥러닝 본문

개인 공간/리뷰

케라스 창시자에게 배우는 딥러닝

김현우 2019. 7. 20. 23:07

본 포스터는 길벗에서 <케라스 창시자에게 배우는 딥러닝>책을 지원받아 작성한 리뷰 포스터입니다. 먼저 저는 비전공자이고 책의 코드인 Keras는 조금만 아는 상황입니다. 딥러닝은 텐서플로우로 입문해서 1년 가까이 공부하고 있지만 아직 딥러닝을 잘 못하는 학생입니다. 

 

1. 책소개 

케라스 창시자에게 배우는 딥러닝은 YES24 기준으로 평점9인 딥러닝교재입니다. 번역은 박해선님으로 핸즈온 머신러닝, 머신 러닝 교과서 with 파이썬, 사이킷런, 텐서플로, 파이썬 라이브러리를 활용한 머신러닝 등 유명한 책들을 많이 번역하신분으로 번역 자체는 믿고 봐도 무방합니다. 

 

책의 가격은 33,000원으로 다른 책에 비해서 싼 가격은 아니고 최신의 책도 아니지만 캐글 코리아방이나 다른 톡방에서 딥러닝 교재를 추천받았을 때 한 손안에 뽑히는 책입니다.  

 

저자의 설명에 따르면, "대상 독자는 머신 러닝과 딥러닝을 시작하려는 파이썬 프로그래밍 경험자를 위한 책입니다."라고 나와있습니다. 챕터는 총 9장으로 딥러닝의 기초부터 딥러닝을 실전에 적용하는 부분으로 이루어져있습니다. 실전은 분류, 회귀, 이미지, 텍스트 모든 분야를 아우르고 있습니다.

 

1부 : 딥러닝의 기초 

- 1장 : AI, 머신 러닝, 딥러닝에 관한 핵심 사항과 배경 지식.

- 2장 : 딥러닝을 배우기 위해 필요한 기초 개념. 텐서, 텐서 연산, 경사 하강법, 역전파 등. 

- 3장 : 신경망을 시작하기 위해 필요한 모든 것. 딥러닝 프레임워크인 케라스, 딥러닝 컴퓨터 설정 가이드, 딥러닝 예제. 

- 4장 : 대표적인 머신 러닝 작업 흐름. 흔히 나타나는 문제와 해결책. 

 

2부 : 딥러닝의 활용

- 5장 : 이미지 분류의 다양한 예제. (컴퓨터 비전)

- 6장 : 텍스트와 시계열 같은 시퀀스 데이터 처리. 

- 7장 : 딥러닝 모델을 구축하기 위한 고급 기술. 

- 8장 : 이미지와 텍스트를 생성할 수 있는 생성 모델(GAN). 

- 9장 : 결론과 리뷰 및 작가의 딥러닝에 대한 생각. 

 

2. 책 내용

책의 구성은 위에서 알 수 있듯이 1부는 딥러닝과 머신러닝에 대한 이론을 중심으로 하고, 2부에서는 위에서 배운 기본을 토대로 딥러닝 모델과 이를 적용시키는 법을 배웁니다. 예를들어, 

 

2장. 시작하기 전에: 신경망의 수학적 구성 요소 

2장에서는 딥러닝에 사용되는 개념에 대해 주로 배웁니다. 수학적으로 벡터, 행렬, 텐서라든지 계산에 유용한 브로드캐스터, 배치라든지 최적화에 필요한 경사 하강법, 옵티마이저 함수 등이 있습니다. 

 

수식적인 부분은 전혀 들어가있지 않고, 위의 경사 하강법같은 경우 변화율에 대한 개념을 먼저 소개하고 텐서의 변화율로 이어서 설명하고 있습니다. 

 

변화율 설명 

실수 x를 새로운 실수 y로 매핑하는 연속적이고 매끄러운 함수 f(x) = y를 생각해 봅시다. 이 함수가 연속적이므로 x를 조금 바꾸면 y가 조금만 변경될 것입니다. 이것이 연속성의 개념입니다. x를 작은 값 epsilon_x만큼 증가시켰을 때 y가 epsilon_y만큼 바뀐다고 말할 수 있습니다. 

 

f(x + epsilon_x) = y + epsilon_y

 

또 이 함수가 매끈하므로(곡선의 각도가 갑자기 바뀌지 않습니다) epsilon_x가 충분히 작다면 어떤 포인트 p에서 기울기 a의 선형 함수로 f를 근사할 수 있습니다. 따라서 epsilon_y는 a * epsilon_x가 됩니다. 

 

f(x + epsilon_x) = y + a * epsilon_x 

 

이 선형적인 근사는 x가 p에 충분히 가까울 때 유효합니다. 이 기울기를 p에서 f의 변화율(derivative)이라고 합니다. 이는 a가 음수일 때 p에서 양수 x만큼 조금 이동하면 f(x)가 감소한다는 것을 의미합니다. a가 양수일 때는 음수 x만큼 조금 이동하면 f(x)가 감소됩니다. a의 절댓값(변화율의 크기)은 이런 증가나 감소가 얼마나 빠르게 일어날지 알려 줍니다. 

 

모든 미분 가능한(미분 가능하다는 것은 변화율을 유도할 수 있다는 의미로, 예를 들어 매끄럽고 연속적인 함수입니다) 함수 f(x)에 대해 x의 값을 f의 국부적인 선형 근사인 그 지점의 기울기로 매핑하는 변화율 함수 f'(x)가 존재합니다. 예를 들어 cos(x)의 변화율은 -sin(x)이고, f(x) = a * x의 변화율은 f'(x) = a입니다. 

 

f(x)를 최소화 하기 위해 epsilon_x만큼 x를 업데이트하고 싶을 때 f의 변화율을 알고 있으면 해결됩니다. 변화율 함수는 x가 바뀜에 따라 f(x)가 어떻게 바뀔지 설명해 줍니다. f(x)의 값을 감소시키고 싶다면 x를 변화율의 방향과 반대로 조금 이동해야 합니다. 

 

5장. 컴퓨터 비전을 위한 딥러닝. 

5장에서는 합성곱 신경망을 이용하여 강아지와 고양이를 분류하는 모델을 만듭니다. 먼저 합성곱 신경망이 무엇인지를 소개하고, 아래의 그림과 같이 합섭공 신경망이 학습을 어떻게 하는 지를 살펴봅니다.  

그리고 합성곱 신경망에서 사용되는 풀링, 패딩, 필터, 스트라이드 등에 대해 설명하고 데이터를 받아서 전처리하고 모델을 만들고, 모델의 결과가 나온 과정을 시각화하는 부분과 다양한 튜닝방법들에 대해 설명합니다. 책에서 합성곱에 대한 설명이 나온 부분(p173)을 작성해보면 아래와 같습니다. 

 

> CNN 설명 

완전 연결 층과 합성곱 층 사이의 근본적인 차이는 다음과 같습니다. Dense 층은 입력 특성 공간에 있는 전역 패턴(예를 들어 MNIST 숫자 이미지에서는 모든 픽셀에 거친 패턴)을 학습하지만 합성곱 층은 지역 패턴을 학습합니다. 이미지일 경우 작은 2D 윈도우로 입력에서 패턴을 찾습니다. 

 

이 핵심 특징은 컨브넷에 두 가지 흥미로운 성질을 제공합니다. 

  • 학습된 패턴은 평행 이동 불변성을 가집니다. 컨브넷이 이미지의 오른쪽 아래 모서리에서 어떤 패턴을 학습했다면 다른 곳(예를 들어 왼쪽 위 모서리)에서도 이 패턴을 인식할 수 있습니다. 완전 연결 네트워크는 새로운 위치에 나타난 것은 새로운 패턴으로 학습해야 합니다. 이런 성질은 컨브넷이 이미지를 효율적으로 처리하게 만들어 줍니다.(근본적으로 우리가 보는 세상은 평행 이동으로 인해 다르게 인식되지 않습니다.) 적은 수의 훈련 샘플을 사용해서 일반화 능력을 가진 표현을 학습할 수 있습니다. 
  • 컨브넷은 패턴의 공간적 계층 구조를 학습할 수 있습니다(그림 5-2 참고). 첫 번째 합성곱 층이 에지 같은 작은 지역 패턴을 학습합니다. 두 번째 합성곱 층은 첫 번째 층의 특성으로 구성된 더 큰 패턴을 학습하는 식입니다. 이런 방식을 사용하여 컨브넷은 매우 복잡하고 추상적인 시각적 개념을 효과적으로 학습할 수 있습니다(근본적으로 우리가 보는 세상은 공간적 계층 구조를 가집니다). 

합성곱 연산은 특성 맵이라고 부르는 3D 텐서에 적용됩니다. 이 텐서는 2개의 공간축(높이와 너비)과 깊이 축(채널 축이라고도 합니다)으로 구성됩니다. RGB 이미지는 3개의 컬러 채널(빨간색, 녹색, 파란색)을 가지므로 깊이 축의 차원이 3이 됩니다. MNIST 숫자처럼 흑백 이미지는 깊이 축의 차원이 1(회색 톤)입니다. 합성곱 연산은 입력 특성 맵에서 작은 패치(patch)들을 추출하고 이런 모든 패치에 같은 변환을 적용하여 출력 특성 맵을 만듭니다. 

 

 

3. 책 소감

책을 읽고나서 느낀점은 33,000원 476페이지라는 어마무시한 양답게 많은 내용이 담겨 있습니다. 책에 대해 받은 장점과 단점을 정리하면 아래와 같습니다. 

 

3.1 장점

첫째, 책을 읽는 대상자가 머신 러닝, 딥러닝 입문자로 책이 쉽게 쓰여져있습니다. 책의 내용에 수학적인 수식이 거의 들어가있지 않았고, 케라스를 만든 저자가 직접 설명을 하기 때문에 설명이 직관적이고 코드에 대한 설명이 정말 잘되어있습니다. 번역 또한 책을 읽는데 불편한 점이 없었습니다. 

 

둘째, 책의 내용이 풍부합니다. 딥러닝이 적용되는 이미지, 자연어, 시계열, 정형데이터 모든 분야에 대해 예제가 있습니다. 그리고 생성모델(GAN)이라든지 실전에 적용하면서 주의해야 할 점 등을 배울 수 있었습니다. 

셋째, 가장 큰 장점으로 케라스를 만든분이 설명했기에 코드의 설명이 잘되어있고 어떻게 실전에 적용하는지 충분히 학습할 수 있습니다. 웬만한 코드에서는 모두 주석이 달려있어서 이론과 함께보면 코드를 이해하는 것에는 큰 무리가 없었습니다. 이 부분은 https://github.com/gilbutITbook/006975 의 코드에서 한번 보시면 더 좋을 것 같습니다. 

def generate_pattern(layer_name, filter_index, size=150):
    # 주어진 층과 필터의 활성화를 최대화하기 위한 손실 함수를 정의합니다
    layer_output = model.get_layer(layer_name).output
    loss = K.mean(layer_output[:, :, :, filter_index])

    # 손실에 대한 입력 이미지의 그래디언트를 계산합니다
    grads = K.gradients(loss, model.input)[0]

    # 그래디언트 정규화
    grads /= (K.sqrt(K.mean(K.square(grads))) + 1e-5)

    # 입력 이미지에 대한 손실과 그래디언트를 반환합니다
    iterate = K.function([model.input], [loss, grads])
    
    # 잡음이 섞인 회색 이미지로 시작합니다
    input_img_data = np.random.random((1, size, size, 3)) * 20 + 128.

    # 경사 상승법을 40 단계 실행합니다
    step = 1.
    for i in range(40):
        loss_value, grads_value = iterate([input_img_data])
        input_img_data += grads_value * step
        
    img = input_img_data[0]
    return deprocess_image(img)

3.2 단점 

첫째, 이론의 설명이 부실합니다. 수학적인 수식이 없고, 입문자들을 위해 쉽게 쓰여졌기 때문에 내용은 직관적이고 좋았지만 이 방법을 왜 사용해야하는지 장점은 무엇이고 단점은 무엇인지, 이론적으로 어떤 역할을 하는지 등에 대한 설명이 부족했다고 생각합니다. 예를 들어, CNN에서 나오는 풀링, 패딩, 필터, 스트라이드에 대한 개념은 알려주지만, 장점, 단점, 왜 사용해야하는지 등에 대한 이유가 불충분하고 LSTM을 설명할 때도 수식이 전혀 없다보니 개념은 알겠지만 왜 좋은지 등에 대한 이론의 자세한 내용은 알기 힘들었습니다.

 

그래서 다른 모든 부분이 마음에 들었지만 이론 부분이 너무 얕지 않았나 생각이 듭니다. 

4. 결론

책 자체는 정말 좋다고 생각합니다. 다른 책들과 비교했을 때, 번역도 좋고 설명도 친절합니다. 밑바닥 부터 시작하는 딥러닝시리즈와 비교해보면 이론적인 설명은 부족하지만 케라스라는 프레임워크를 설명하는 교재중에서는 코드나 설명이나 가장 괜찮다고 생각합니다. 만일 케라스라는 언어에 입문하고 싶은 분들에게는 이 책을 추천하고, 다른 언어나 딥러닝의 토대가 되는 이론을 배우고 싶은 사람에게는 다른 책을 추천하고 싶습니다. 

 

참고

- 책의 오타 및 수정사항

- 깃허브 코드