공부 : 밑바닥부터 시작하는 딥러닝 1 chapter 6.1 이전에는 매개변수 갱신을 경사 강하법(SGD)을 이용해 구현하였습니다. SGD 이외의 방법에 대해서도 알아봅시다. 매개변수 갱신은 매개변수의 손실함수의 기울기를 최소화하는 방향으로 이루어져야 합니다. 이를 하는 방법에는 SGD, Momentum, AdaGrad, Adam 등이 있습니다. 1. SGD : 확률적 경사 강하법 가장 구현이 쉬운 방법입니다. 하지만 속도가 느리고 경우에 따라 다른 최적화 방법보다 성능이 떨어지기도 합니다. 하지만 아직 많이 사용 중입니다. 식과 코드는 다음과 같습니다. class SGD: def __init__(self, lr=0.01): self.lr = lr def update(self, params, grads)..
책 : 밑바닥부터 시작하는 딥러닝 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의 조상 노드에 대해서 다시 탐..