서평 전 잡담(이 책을 읽은 이유)
저는 군대를 전역하고 연구실에 조인하여 딥러닝을 공부하기 시작한 지 1달 조금 더 지났습니다. 학부 때 저는 이론적인 기초지식을 차곡차곡 쌓아가며 공부하는 학자형 스타일을 고수하였습니다. 하지만 김영한 님의 강의로 백앤드를 공부하며 이론을 모르더라도 일단 실무적으로 삽질하며 부딪히는 야생형 스타일이 굉장히 빠르게 무엇인가를 습득할 수 있다는 것을 깨달았습니다. 그래서 저는 연구실에 조인하고 1달 동안은 파이토치를 활용해 무작정 데이콘 대회에 참여해 딥러닝으로 문제를 해결하려고 하였습니다. 정말 빠른 시간에 파이토치를 사용하는 방법을 익힐 수 있었지만 왜 그렇게 해야 되는지에 대하여 납득이 되지 않았습니다. 왜? 미분(backward)을 하기 전에 예측(forward)을 수행해야 하는지, 그리고 미분이 왜 backward인지? 그리고 무엇보다 하이퍼 파라미터의 적절한 값을 찾는 것과 모델의 다양한 옵션 중 어느 것을 선택해 사용할지를 판단하는데 많은 문제가 있었습니다. 그래서 이론적인 부분을 공부하고자 딥러닝 입문서중 굉장히 유명한 밑바닥부터 시작하는 딥러닝 책을 읽게 되었습니다.
책 소개
- 책 이름 : 밑바닥부터 시작하는 딥러닝
- 저자 : 사이토 고키
- 출판사 : 한빛 미디어
밑바닥부터 시작하는 딥러닝은 2022년 기준으로 총 3편이 구성되어 있습니다. 1편은 딥러닝이 학습되는 기초적인 이론적인 지식에서부터 합성곱 신경망까지 구성이 되어 있습니다. 2편은 딥러닝의 자연어로 구성되어 있습니다. 최근에는 Transformer가 Vision 분야에서도 굉장히 핫하게 사용되고 있기 때문에 Vision을 공부하시는 분들도 읽으면 많은 도움이 될 것 같습니다.(저는 아직 2권의 중간정도 밖에 읽지 못했습니다. 그런데 생각보다 내용이 1편에 비해 어렵습니다. 어느 정도 기본적인 수학적인 지식이 필요한 것 같습니다.) 3편은 프레임워크를 직접 만드는 과정으로 구성되어 있습니다.
책 내용 구성 및 소개
1장 헬로 파이썬
1.1 파이썬이란?
1.2 파이썬 설치하기
__1.2.1 파이썬 버전
__1.2.2 사용하는 외부 라이브러리
__1.2.3 아나콘다 배포판
1.3 파이썬 인터프리터
__1.3.1 산술 연산
__1.3.2 자료형
__1.3.3 변수
__1.3.4 리스트
__1.3.5 딕셔너리
__1.3.6 bool
__1.3.7 if 문
__1.3.8 for 문
__1.3.9 함수
1.4 파이썬 스크립트 파일
__1.4.1 파일로 저장하기
__1.4.2 클래스
1.5 넘파이
__1.5.1 넘파이 가져오기
__1.5.2 넘파이 배열 생성하기
__1.5.3 넘파이의 산술 연산
__1.5.4 넘파이의 N차원 배열
__1.5.5 브로드캐스트
__1.5.6 원소 접근
1.6 matplotlib
__1.6.1 단순한 그래프 그리기
__1.6.2 pyplot의 기능
__1.6.3 이미지 표시하기
1.7 정리
2장 퍼셉트론
2.1 퍼셉트론이란?
2.2 단순한 논리 회로
__2.2.1 AND 게이트
__2.2.2 NAND 게이트와 OR 게이트
2.3 퍼셉트론 구현하기
__2.3.1 간단한 구현부터
__2.3.2 가중치와 편향 도입
__2.3.3 가중치와 편향 구현하기
2.4 퍼셉트론의 한계
__2.4.1 도전! XOR 게이트
__2.4.2 선형과 비선형
2.5 다층 퍼셉트론이 출동한다면
__2.5.1 기존 게이트 조합하기
__2.5.2 XOR 게이트 구현하기
2.6 NAND에서 컴퓨터까지
2.7 정리
3장 신경망
3.1 퍼셉트론에서 신경망으로
__3.1.1 신경망의 예
__3.1.2 퍼셉트론 복습
__3.1.3 활성화 함수의 등장
3.2 활성화 함수
__3.2.1 시그모이드 함수
__3.2.2 계단 함수 구현하기
__3.2.3 계단 함수의 그래프
__3.2.4 시그모이드 함수 구현하기
__3.2.5 시그모이드 함수와 계단 함수 비교
__3.2.6 비선형 함수
__3.2.7 ReLU 함수
3.3 다차원 배열의 계산
__3.3.1 다차원 배열
__3.3.2 행렬의 내적
__3.3.3 신경망의 내적
3.4 3층 신경망 구현하기
__3.4.1 표기법 설명
__3.4.2 각 층의 신호 전달 구현하기
__3.4.3 구현 정리
3.5 출력층 설계하기
__3.5.1 항등 함수와 소프트맥스 함수 구현하기
__3.5.2 소프트맥스 함수 구현 시 주의점
__3.5.3 소프트맥스 함수의 특징
__3.5.4 출력층의 뉴런 수 정하기
3.6 손글씨 숫자 인식
__3.6.1 MNIST 데이터셋
__3.6.2 신경망의 추론 처리
__3.6.3 배치 처리
3.7 정리
4장 신경망 학습
4.1 데이터에서 학습한다!
__4.1.1 데이터 주도 학습
__4.1.2 훈련 데이터와 시험 데이터
4.2 손실 함수
__4.2.1 평균 제곱 오차
__4.2.2 교차 엔트로피 오차
__4.2.3 미니배치 학습
__4.2.4 (배치용) 교차 엔트로피 오차 구현하기
__4.2.5 왜 손실 함수를 설정하는가?
4.3 수치 미분
__4.3.1 미분
__4.3.2 수치 미분의 예
__4.3.3 편미분
4.4 기울기
__4.4.1 경사법(경사 하강법)
__4.4.2 신경망에서의 기울기
4.5 학습 알고리즘 구현하기
__4.5.1 2층 신경망 클래스 구현하기
__4.5.2 미니배치 학습 구현하기
__4.5.3 시험 데이터로 평가하기
4.6 정리
5장 오차역전파법
5.1 계산 그래프
__5.1.1 계산 그래프로 풀다
__5.1.2 국소적 계산
__5.1.3 왜 계산 그래프로 푸는가?
5.2 연쇄법칙
__5.2.1 계산 그래프에서의 역전파
__5.2.2 연쇄법칙이란?
__5.2.3 연쇄법칙과 계산 그래프
5.3 역전파
__5.3.1 덧셈 노드의 역전파
__5.3.2 곱셈 노드의 역전파
__5.3.3 사과 쇼핑의 예
5.4 단순한 계층 구현하기
__5.4.1 곱셈 계층
__5.4.2 덧셈 계층
5.5 활성화 함수 계층 구현하기
__5.5.1 ReLU 계층
__5.5.2 Sigmoid 계층
5.6 Affine/Softmax 계층 구현하기
__5.6.1 Affine 계층
__5.6.2 배치용 Affine 계층
__5.6.3 Softmax-with-Loss 계층
5.7 오차역전파법 구현하기
__5.7.1 신경망 학습의 전체 그림
__5.7.2 오차역전파법을 적용한 신경망 구현하기
__5.7.3 오차역전파법으로 구한 기울기 검증하기
__5.7.4 오차역전파법을 사용한 학습 구현하기
5.8 정리
6장 학습 관련 기술들
6.1 매개변수 갱신
__6.1.1 모험가 이야기
__6.1.2 확률적 경사 하강법(SGD)
__6.1.3 SGD의 단점
__6.1.4 모멘텀
__6.1.5 AdaGrad
__6.1.6 Adam
__6.1.7 어느 갱신 방법을 이용할 것인가?
__6.1.8 MNIST 데이터셋으로 본 갱신 방법 비교
6.2 가중치의 초깃값
__6.2.1 초깃값을 0으로 하면?
__6.2.2 은닉층의 활성화 분포
__6.2.3 ReLU를 사용할 때의 가중치 초깃값
__6.2.4 MNIST 데이터셋으로 본 가중치 초깃값 비교
6.3 배치 정규화
__6.3.1 배치 정규화 알고리즘
__6.3.2 배치 정규화의 효과
6.4 바른 학습을 위해
__6.4.1 오버피팅
__6.4.2 가중치 감소
__6.4.3 드롭아웃
6.5 적절한 하이퍼파라미터 값 찾기
__6.5.1 검증 데이터
__6.5.2 하이퍼파라미터 최적화
__6.5.3 하이퍼파라미터 최적화 구현하기
6.6 정리
7장 합성곱 신경망(CNN)
7.1 전체 구조
7.2 합성곱 계층
__7.2.1 완전연결 계층의 문제점
__7.2.2 합성곱 연산
__7.2.3 패딩
__7.2.4 스트라이드
__7.2.5 3차원 데이터의 합성곱 연산
__7.2.6 블록으로 생각하기
__7.2.7 배치 처리
7.3 풀링 계층
__7.3.1 풀링 계층의 특징
7.4 합성곱/풀링 계층 구현하기
__7.4.1 4차원 배열
__7.4.2 im2col로 데이터 전개하기
__7.4.3 합성곱 계층 구현하기
__7.4.4 풀링 계층 구현하기
7.5 CNN 구현하기
7.6 CNN 시각화하기
__7.6.1 1번째 층의 가중치 시각화하기
__7.6.2 층 깊이에 따른 추출 정보 변화
7.7 대표적인 CNN
__7.7.1 LeNet
__7.7.2 AlexNet
7.8 정리
8장 딥러닝
8.1 더 깊게
__8.1.1 더 깊은 네트워크로
__8.1.2 정확도를 더 높이려면
__8.1.3 깊게 하는 이유
8.2 딥러닝의 초기 역사
__8.2.1 이미지넷
__8.2.2 VGG
__8.2.3 GoogLeNet
__8.2.4 ResNet
8.3 더 빠르게(딥러닝 고속화)
__8.3.1 풀어야 할 숙제
__8.3.2 GPU를 활용한 고속화
__8.3.3 분산 학습
__8.3.4 연산 정밀도와 비트 줄이기
8.4 딥러닝의 활용
__8.4.1 사물 검출
__8.4.2 분할
__8.4.3 사진 캡션 생성
8.5 딥러닝의 미래
__8.5.1 이미지 스타일(화풍) 변환
__8.5.2 이미지 생성
__8.5.3 자율 주행
__8.5.4 Deep Q-Network(강화학습)
8.6 정리
부록 A Softmax-with-Loss 계층의 계산 그래프
A.1 순전파
A.2 역전파
A.3 정리
참고문헌
출처 - 교보문고
이 책은 딥러닝을 위한 기초적인 파이썬 지식으로 시작하며 신경망을 학습하는 과정을 소개하고 마지막으로 CNN과 딥러닝의 적용분야에 대하여 소개하는 것으로 구성되어 있습니다. 파이썬을 활용하여 딥러닝을 위한 모델들을 직접 구현하는 코드를 제공합니다. 그리고 이에 대하여 굉장히 자세하게 설명을 붙여주어 처음 접하는 지식이어도 쉽게 이해할 수 있을 것입니다.
파이썬의 라이브러리인 Pandas와 Numpy를 어느 정도 사용해본 경험이 있다면 Chapter 1을 건너뛰고 Chapter 2부터 읽는 것을 추천합니다. 그리고 과거에 머신러닝을 공부하였거나 유튜브의 '모두를 위한 딥러닝'과 같은 강의를 들었던 경험이 있는 사람이라면 Chapter 3부터 책을 읽으셔도 이해하는데 어려움이 없을 것입니다.
Chapter3부터 Chapter 6까지는 딥러닝을 수행할 때 선택하는 활성화 함수, Loss Function, Optimizer에 대하여 그리고 학습이 이루어지는 과정인 forward와 backward의 과정 그리고 Optimizer가 학습을 하는 방법에 대하여 자세히 다룹니다.
이 책의 장점은 글을 짜임새 있게 작성하여 이해에 많은 도움을 줍니다. 항상 코드를 제시하기 전에 지금 하고자 하는 것을 명확히 소개합니다. 그리고 어떻게 구성이 되어있는지 위 사진처럼 그림을 그려 독자의 이해를 도와줍니다. 그러고 나서 코드를 제시하고 그 코드에 대하여 이해를 위한 설명을 덧붙여줍니다. 마지막으로 개선해야 하는 점이나 고려해야 하는 점을 설명하며 자연스럽게 다음 주제로 넘어가며 위 문맥을 계속해서 반복하며 독자의 이해와 흥미를 유발하도록 책을 작성하였습니다.
개인적으로 이해하기 어려웠던 미분 원리인 역전파(backpropagation)의 원리와 직접 역전파를 수행하며 미분을 하는 방법을 계산 그래프로 다루면서 굉장히 쉽게 이해를 할 수 있었습니다. (계산 그래프는 스탠포드 대학의 cs231n의 수업을 참고하였습니다.)
이 책의 저자는 계산 그래프를 활용하여 역전파를 설명하여주었습니다. 역전파의 핵심인 체인 룰과 각 노드들의 미분된 값에 대하여 설명을 도우며 자연스럽게 각 노드들을 미분하는 원리를 소개합니다. 그리고 이를 간단한 예제에 적용하여 직접 미분을 수행하며 독자의 이해를 끌어냅니다.
서평
저는 이 책을 딥러닝의 기초적인 지식을 쌓고 싶은 사람들에게 적극 추천합니다. 하지만 딥러닝을 완전 처음 접하는 사람들에게는 바로 이 책을 권유하지는 않을 것 같습니다. 만약 딥러닝을 전혀 모르는 분이라면 위 책을 읽기 전에 김성훈 교수님의 '모두를 위한 딥러닝'이라는 강의를 듣는 것을 추천드립니다. 아무리 기초적인 이야기를 세세하게 설명을 한다고 하더라도 전체적인 흐름을 이해하지 못하고 세세한 부분을 익히게 된다면 다소 난해하고 글이 잘 안 읽힐 수 있기 때문입니다. 물론 책에서 전체적인 흐름을 언급하며 글을 진행하지만 영상으로 시청하며 익히는 정보와 글로 익히는 정보를 이해하는 데에는 차이가 있을 것이라고 생각합니다.
제가 이 책을 읽으며 느낀 3가지에 대하여 정리하며 서평을 마치도록 하겠습니다.
- 글의 짜임새가 좋다.
책을 읽으며 전혀 지루함을 느낄 수 없었습니다. (이론 - 코드 - 코드 설명, 원리설명 - 문제 혹은 다음 주제 - 이론 - 코드 ···)의 순서로 글이 매끄럽게 작성되어 있습니다. - 딥러닝의 기초지식을 자세하게 다루어준다.
딥러닝을 위한 기초적인 지식을 자세하게 다룹니다. 활성화 함수를 예를 들면 시그모이드 함수, Relu함수를 소개시켜주고 시그모이드의 한계를 설명해주며 자연스럽게 Relu함수를 사용해야하는 이유를 제시합니다. 약간 아쉬운 점은 Relu의 구조로 인한 문제점으로 만들어지는 Leaky Relu함수와 같은 것에 대하여는 약간의 소개정도만 할 뿐 자세히 다루지는 않습니다.(약간 깊은 내용에 대하여 배우고자 하는 분들은 위 책 + 구글링과 같이 직접 찾아보는 노력이 필요할 것 같습니다.) - 독자의 이해를 돕기 위해 많은 자료를 제시한다.
이해하기 어려운 부분에 대하여 시각적인 자료를 적절히 제시하여 독자들에게 많은 이해를 도와줍니다. 그리고 책에서 간단히 다루어본 내용에 대하여 세세하게 알려주기 위한 참고자료를 제시합니다. 또한 옮김이님이 독자들이 읽으며 이해가 어려울 것 같은 부분에 대하여 추가적인 코멘트를 달아주었습니다.
이 서평은 저의 주관적인 견해로 작성된 서평입니다.
'Etc > Book Review' 카테고리의 다른 글
차가운 학교의 시간은 멈춘다(상,하) (0) | 2021.11.13 |
---|---|
하루 10분, 구글 영어의 힘 (0) | 2021.07.15 |