책 : 밑바닥부터 시작하는 딥러닝 1 chapter 5.7 신경망 학습의 큰 그림 1. 미니배치 : 훈련 데이터 중 무작위로 뽑는다. 선별된 데이터를 미니배치라 한다. 미니배치의 손실함수 값을 줄이는 것이 목표 2. 기울기 산출 : 미니배치의 손실함수 값을 줄이기 위해 각 가중치의 매개변수의 기울기를 구한다. 기울기는 손실함수의 값을 최소화하는 방향으로 제시한다. 3. 매개변수 갱신 가중치 매개변수를 기울기 방향으로 조금씩 갱신한다. 4. 반복 1~3을 반복한다. 1. 2층 신경망 구현 오차역전파법을 이용해 2층 신경망 구현을 위한 class는 다음과 같다. (층이 늘어난다면, 계층 생성 과정을 늘려주기만 하면 된다.) import sys, os sys.path.append(os.pardir) # 부모 ..
1. Affine 구현 Affine 함수는 신경망의 순전파 연산에서 행렬연산에 해당하는 것이다. 입력 값이 행렬임을 이용하면 역전파 식은 다음과 같다. ( X, W->dot -> X*W, B -> + -> Y 인 경우, 자세한 내용 책 참고) (행렬에 대해 미분한 걸 생각하면 어렵지 않게 구할 수 있다.) 구현 코드 class Affine: def __init__(self, W, b): self.W = W self.b = b self.x = None self.original_x_shape = None self.dW = None self.db = None def forward(self, x): self.original_x_shape = x.shape # 일반적인 행렬 계산 위해 x = x.reshape(x..
책 : 밑바닥부터 시작하는 딥러닝 1 chapter 5 오차역전파법에 사용하기 위한 활성화 함수를 구현하자. (ReLU, sigmoid) 1. ReLU 계층 활성화함수로 사용되는 ReLU 함수와 이에 대한 dy/dx는 다음과 같다. 순전파와 역전파의 그림은 다음과 같이 나타낼 수 있다. 코드는 다음과 같다. (설명 : 주석 참고) class Relu: def __init__(self): self.mask = None def forward(self, x): # 순전파, x : 입력값 (array) self.mask = (x dL/dy * dy/dx =0 dx = dout # 순전파 입력값 x의 원소 중 0보다 큰 값에서는 dy/dx=1 => dL/dy * dy/dx = dL/dy return dx 2. s..
www.acmicpc.net/problem/11437 11437번: LCA 첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정 www.acmicpc.net 최소공통조상 트리 문제이다. 트리가 연결되어있을 때 두 노드의 최소 공통 조상을 구하는 문제이다. 예를 들어 3-4-5, 3-6-7 으로 트리가 연결되어있으면 5와 7의 최소공통조상은 3인 것이다. 틀렸던 풀이 1. 처음에는 두 노드 중 더 위에 (깊이가 안 깊은) 있는 노드 A에 대해서 dfs를 이용해 트리를 탐색해 찾고자하는 더 깊은 노드 B가 있는지 판단하고, 없으면 A의 조상 노드에 대해서 다시 탐..
오차 역전파법 : 신경망의 가중치 매개변수에 대한 손실함수의 기울기를 빠르게 구하기 위함 (효율적으로) 계산 그래프 : 계산 과정을 그래프로 나타낸 것 (노드와 엣지 이용) 순전파 : 순서대로 진행한 것 역전파 : 역으로 계산한 것 => 이를 이용해 미분을 구한다. 연쇄 법칙 이용해 계산 그래프의 역전파 계산 덧셈의 경우 z=x+y 일 때 dz/dx=1, dz/dy=1 이므로 역전파시 E값에 1을 곱한다. (E=dL/dz) 곱셈의 경우 z=x*y 일 때 dz/dx=y, dz/dy=x 이므로 역전파시 x방향 E값에 y, y방향 E값에 x를 곱한다. (E=dL/dz) 예제) 다음 그림과 같은 경우에서 역전파법으로 계산 그래프를 완성하자. 코드 class MulLayer: def __init__(self): ..