딥러닝
-
오차역전파법 - 배치용 Affine 계층딥러닝 2020. 2. 1. 00:06
바로 계산 그래프 보시죠. 입력 하나짜리와 차이점은 X(N, 2) 이 부분밖에 없군요. 하지만 주의할 게 있습니다. 덧셈의 역전파는 오른쪽의 값을 왼쪽으로 그대로 전달하면 되는 것으로 배웠습니다. 여기에서 편향의 역전파는 단순히 그렇게 생각하고 값을 넘기면 안됩니다. 책에서는 이렇게 나옵니다. 순전파의 편향 덧셈은 각각의 데이터(1번째 데이터, 2번째 데이터...)에 더해집니다. ---- 1 그래서 역전파 때는 각 데이터의 역전파 값이 편향의 원소에 모여야 합니다. ---- 2 1번의 의미 입니다. 2번의 의미를 코드로 표현했습니다. import numpy as np dY = np.array([[1, 2, 3], [4, 5, 6]]) print(dY) print("------------") dB = np..
-
오차역전파법 - Affine 계층 구현하기딥러닝 2020. 1. 31. 22:01
신경망의 순전파의 과정을 봅시다. X : 입력값 W : 가중치 매개변수 B : 편향 라고 가정하면 Y = np.dot(X, W) + B .....식 1 Z = H(Y) ......식 2 여기서 Z가 은닉층 1개의 출력값이 됩니다. 식 1 부분이 Affine계층이 하는 일 입니다. 이때, X, W, B 가 각각 (2, ), (2, 3), (3, )인 다차원 배열입니다. 이때의 계산 그래프를 봅시다. 순전파는 EASY한 부분 인지지용~~? 권지지ㅣㅈ지용~~? 그럼 역전파를 볼까요 이렇게 됩니다. W,와 X 위의 T는 전치행렬이라는 뜻입니다. 이렇게 말이죠. 그런데 의문이 듭니다. 수학을 못하지만 최대한 기억을 살려 미분을 해봐도 저 전치행렬이 왜 있는지 모르겠습니다. 책에는 '행렬끼리의 곱을 하기 위해서는 ..
-
오차역전파법 - Softmax-with-Loss계층 구현하기딥러닝 2020. 1. 28. 17:35
잠시 앞의 내용복습을 하겠습니다! 신경망은 그림1과 같은 층들이 여러 개 있는 것입니다. (그림이 조금 엉망이네요...ㅎㅎ) 이때 그림1의 h() 함수를 활성화 함수라고 하죠. 활성화 함수에는 계단, 시그모이드, ReLu 등 이 있습니다. 출력층의 활성화 함수는 항등함수와 소프트맥스 함수가 있습니다. 이제는 각 층을 하나의 클래스로 구현한다고 했습니다. (그림2) 그래서 이제는 소프트맥스함수를 구현해봅시다. 학습과정이므로 손실함수가 필수입니다. 그러므로 손실 구현도 같이 하겠습니다. ! 신경망에서 수행하는 작업은 학습과 추론 두 가지입니다. 추론에서 답을 하나만 낼 때는 소프트맥스 함수가 필요없습니다. 소프트맥스 함수는 입력값을 출력의 합이 1이 되도록 정규화하는 함수이기 때문입니다. (입력값과 출력값이..
-
오차역전파법 - 덧셈 계층, 곱셈 계층딥러닝 2020. 1. 27. 00:39
덧셈 계층과 곱셈 계층을 구현해봅시다. 각각 순전파와 역전파 모두 구현해야겠죠. 우선 덧셈 계층부터 봅시다. 순전파는 그냥 덧셈해주면 됩니다. 역전파는 각 입력에 대해 미분을 해주고 그 값을 곱해주면 됩니다.(합성함수 미분의 원리) 두 개 모두 미분값이 1이군요. 구현해봅시다. class AddLayer: def __init__(self): pass #순전파 def forward(self, x, y): return x + y #역전파 def backward(self, dout): dx = dout * 1 dy = dout * 1 return dx, dy 덧셈 계층은 역전파에서 순전파의 값을 이용하지 않습니다. 그래서 초기화가 필요없습니다.(pass : 아무것도 하지 말라) 곱셈 계층을 봅시다. 순전파는 ..
-
오차역전파법 - 계산 그래프딥러닝 2020. 1. 27. 00:11
왜 오차역전파법을 배우나? 오차역전파법은 가중치 매개변수의 기울기를 계산하는 방법입니다. 굳이 수치미분 대신 사용하는 이유는 오차역전파법이 빠르기 때문입니다. 많은 양의 데이터를 다뤄야하므로 조금이라도 빠른 것이 좋겠죠. 오차역전파법은 계산 그래프를 활용하여 구현되어집니다. 그럼 계산 그래프는 무엇일까요? 요런 것입니다. 저 f의 자리에는 +, -, *, exp(x) 등이 들어갈 수 있겠군요! 사용예시를 봅시다. 화살표의 방향으로 진행하는 것이 순전파입니다. 이 계산 그래프의 특징은 뭘까요? 분할정복처럼 국소적 계산을 전파함으로써 최종결과를 얻을 수 있다는 것입니다. 그렇다면 역전파는 순전파의 역방향일 것이고.. 구하고자 하는 것은 기울기이니.. 계산 그래프의 저런 특징이 기울기 또한 구하기 쉽게 만드는..
-
미니배치 학습 구현하기딥러닝 2020. 1. 16. 17:38
미니배치 학습이란 훈련 데이터 중 일부를 꺼내고(미니배치), 그 미니배치에 대해서 경사법으로 매개변수를 갱신하는 것 앞의 2층 신경망 클래스와 MNIST 데이터셋을 사용하여 구현해 봅시다. 이때 학습과정에서 오버피팅이 일어나지 않게 해야합니다. 어떻게 할까요? 학습 도중에 시험 데이터로 오버피팅이 일어나는지 안나는지 확인하면서 학습을 하면 됩니다. (신경망은 범용성을 가져야하므로 시험 데이터는 훈련 데이터와 달라야겠죠.) 오버피팅이 일어나면 학습을 중단하고 다른 데이터셋으로 훈련을 하면 됩니다. 일정 구간마다 평가를 하고 정확도를 기록하면 좋을 거 같네요. 구현 import numpy as np from dataset.mnist import load_mnist from two_layer_net impor..
-
2층 신경망 클래스 구현하기딥러닝 2020. 1. 16. 17:26
미니배치 학습을 구현해보기 전에 우선 2층 신경망 클래스를 구현해보겠습니다. 2층 신경망에 필요한 메소드(기능)는 무엇이 있을까요? 매개변수(가중치, 편향) 초기화, 예측값, 손실함수의 기울기, 정확도... 이 정도가 있겠네요. 그럼 구현해봅시다. import sys, os sys.path.append(os.pardir) from common.functions import* from common.gradient import numerical_gradient #2층 신경망 class TwoLayerNet: #가중치 초기화 #input_size : 입력층의 갯수 #hidden_size : 은닉층의 갯수 #output_size : 출력층의 갯수 #weight_init_std : ?? def __init__(s..