본문 바로가기

책/밑바닥부터 시작하는 딥러닝

(11)
8장 딥러닝 층을 깊게 하는 이유 층일 깊게 한 신경망은 깊지 않은 경우보다 적은 매개변수로 같거나 그 이상의 수준에 달하는 표현력을 달성할 수 있다. 이 경우 필요한 매개변수를 5x5=25이다. 이러한 연산은 3x3 두 번으로 대체될 수 있다. 후자의 경우 매개변수가 2x3x3=18개이다. 이처럼 작은 필터를 겹쳐 신경망을 깊게 할 때의 장점은 매개변수 수를 줄여 넓은 수용영역을 소화할 수 있다. 그리고 층과 층 사이에 ReLU, BN 등을 끼움으로써 신경망의 표현력 또한 개선된다. VGG VGG는 합성곱 계층와 풀링 계층으로 구성되는 기본적인 CNN이다. VGG에서 주목할 점은 3x3의 작은 필터를 사용한 합성곱 계층을 연속으로 거친다는 것이다. GoogLeNet GoogLeNet은 세로 방향만 깊을 뿐 아니라 ..
7장 CNN (2) CNN 구현하기 MNIST 데이터를 위한 간단한 CNN을 구현한다. 구조는 다음과 같다. class SimpleConvNet: def __init__(self, input_dim=(1, 28, 28), conv_param={'filter_num':30, 'filter_size':5, 'pad':0, 'stride':1}, hidden_size=100, output_size=10, weight_init_std=0.01): filter_num = conv_param['filter_num'] filter_size = conv_param['filter_size'] filter_pad = conv_param['pad'] filter_stride = conv_param['stride'] input_size = in..
7장 CNN (1) 전체 구조 지금까지 본 신경망은 FFNN이었다. CNN은 뭐가 다를까? - Affine-ReLU 연결이 Conv-ReLU-(Pooling)으로 바뀌었다. - 상위 층에는 여전히 Affine-ReLU 연결을 사용할 수도 있다. 합성곱 계층 FFNN의 문제점 이미지 데이터는 3차원 형상이며, 이 형상에는 공간적 정보가 담겨있다. FFNN으로 이 이미지를 처리하기 위해서는 Flatten을 수행하여 형상을 무시하고 모든 입력 데이터를 동등한 뉴런으로 취급하여 형상에 담긴 정보를 살릴 수가 없다. 한편 CNN은 이 형상을 유지하여 데이터를 제대로 이해할 가능성이 있다. 합성곱 연산 합성곱 연산은 필터의 위도우를 일정 간격으로 이동해가며 입력 데이터에 적용한다. 여기에 사용되는 연산은 단일 곱셈-누산으로 원소별 곱..
6장 학습 관련 기술들 (2) 가중치의 초깃값 은닉층의 활성화값 분포 가중치의 초깃값에 따라 은닉층의 활성화값들이 어떻게 변하는지 알아보자. 시그모이드 활성화 함수를 사용하는 5층 신경망에 무작위로 생성한 입력 데이터를 흘려 각 층의 활성화 값 분포를 히스토그램으로 그려보자. - 각 층의 활성화 값들이 0과 1에 치우져 분포되어 있다. - 시그모이드 함수는 출력이 0 또는 1에 가까워 질수록 gradient가 0에 다가간다. 그러면 역전파의 기울기가 점점 작아지다가 사라지게 된다. 이것이 gradient vanishing으로 알려진 문제이다. 표준편차를 0.01로 바꿔보자 - 0과 1에 치우치진 않아서 기울기 소실 문제가 일어나지는 않지만 0.5 부근에 집중되어 있다. - 활성화 값들이 한 쪽으로 치우졌다는 것은 표현련 관점에서 문제..
6장 학습 관련 기술들 (1) 매개변수 갱신 최적화(optimization) : 매개변수의 최적값을 찾는 문제 확률적 경사 하강법(SGD) 앞장에서 보았던 가장 간단한 방법 파이썬으로 구현해보자 class SGD: """확률적 경사 하강법 (Stochastic Gradient Descent)""" def __init__(self, lr=0.01): self.lr = lr def update(self, params, grads): for key in params.keys(): params[key] -= self.lr * grads[key] 초기화 때 learning rate을 받고 update 메서드에서 가중치 매개변수와, gradient가 저장된 딕셔너리를 받아 매개변수를 갱신한다. SGD의 단점 손실함수의 그래프가 다음과 같은 모습..
5장 오차역전파법 (2) Softmax-with-Loss 크로스 엔트로피를 손실함수로 사용하는 Softmax 계층이다. 계산 그래픈느 다음과 같다. 복잡해 보이지만 뒤에서부터 차근차근 이해하면 어렵지 않다. 결론적으로 이 계층의 역전파 결과는 $Y-T$로 깔끔하게 떨어진다. 이러한 부분이 오차역전파가 계산량을 획기적으로 줄여주는 이유이다. 책에서는 이러한 결과가 우연이 아니고 크로스 엔트로피라는 함수가 이렇게 설계되었다고 한다. 이를 클래스로 구현해보자 class SoftmaxWithLoss: def __init__(self): self.loss = None self.y = None self.t = None # (one-hot) def forward(self, x, t): self.t = t self.y = softmax(x) ..
5장 오차역전파법 (1) 계산 그래프 계산 그래프는 계산 과정을 그래프로 나타낸 것이고, 노드와 에지로 표현된다. 이렇게 생겼다. 역전파는 반대 방향의 굵은 화살표로 표현한다. 역전파의 엣지 값이 전달되는 미분 값이다. 근데 솔직히 이렇게 숫자로 되어있는 것으로 보면 더 헷갈린다. 그냥 수식으로 보는게 낫다 계산 그래프의 역전파 노드를 기준으로 $y = f(x)$ 라는 수식을 정의하고 ${\partial y}/{\partial x}$ 을 구한뒤 상류에서 흘러들어온 미분값 E에 ${\partial y}/{\partial x}$ 을 곱해서 하류에 전달한다. 이 규칙만 지키면 된다. 덧셈 노드의 역전파 $z = x + y$라는 식이 있고, z의 x에 대한 편미분, y에 대한 편미분은 다음과 같다. 이를 계산 그래프로 표현하면 다음과 ..
4장 신경망 학습 (2) 학습 알고리즘 구현하기 1단계 - 미니배치 훈련 데이터 중 일부를 무작위로 가져온다. 이렇게 선별한 데이터를 미니배치라 하며, 그 미니배치의 손실 함수 값을 줄이는 것이 목표이다. 2단계 - 기울기 산출 손실함수에 대한 각 가중치 매개변수의 기울기를 구한다. 3단계 - 매개변수 갱신 가중치 매개변수를 learning rate 만큼 기울기 방향으로 갱신한다. 4단계 - 반복 1~3단계를 반복한다. 2층 신경망 클래스 구현하기 class TwoLayerNet: def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01): # 가중치 초기화 self.params = {} self.params['W1'] = weight_init_s..