-
3. 신경망 학습(6)AI 모델(딥러닝 기초)/3. 신경망 학습 2023. 1. 15. 10:56728x90
전반적인 신경망에 대한 공부와 신경망학습에 대한 공부를 진행한 상태이기 때문에 간단한 2층 신경망의 학습 알고리즘을 구현해보자.
※ 신경망 학습의 기본단계
1. 미니배치 - 훈련 데이터 중 일부를 무작위로 가져와서 선별한 데이터, 미니배치의 손실함수를 줄이는 것이 최종 목표
2. 기울기 산출 - 각 가중치 매개변수의 기울기를 구하여 손실함수의 값을 가장 작게 하는 방향으로 손실함수를 줄인다.(최적값 찾기)
3. 매개변수 갱신 - 가중치 매개변수를 기울기 방향으로 조금씩 갱신한다.
4. 반복 - 1~3 과정을 계속해서 반복한다.(최적값을 구할 때까지, 즉 손실함수가 가장 작을 때 까지)
■ 확률적 경사 하강법 : 미니배치로 무작위로 골라낸 데이터에 대해 경사하강법으로 매개변수를 갱신하는 방법. 딥러닝 프레임워크의 대부분이 SGD 함수로 이 기능을 구현하고 있음.
※ MNIST를 활용한 신경망 학습 class 구현
import sys, os sys.path.append(os.pardir) from common.functions import * from common.gradient import numerical_gradient class TwoLayerNet: def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01): # 가중치 초기화 self.params = {} # 신경망의 매개변수를 보관하는 딕셔너리 변수 self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) # 1층 가중치 self.params['b1'] = np.zeros(hidden_size) # 1층 편향 self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) # 2층 가중치 self.params['b2'] = np.zeros(output_size) # 2층 편향 def predict(self, x): # 예측, 추혼 함수 W1, W2 = self.params['W1'], self.params['W2'] b1, b2 = self.params['b1'], self.params['b2'] a1 = np.dot(x, W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1, W2) + b2 y = softmax(a2) return y # x : 입력 데이터, t : 정답 레이블 def loss(self, x, t): # 손실 함수 y = self.predict(x) return cross_entropy_error(y, t) def accuracy(self, x, t): # 정확도 찾기 y = self.predict(x) y = np.argmax(y, axis=1) t = np.argmax(t, axis=1) accuracy = np.sum(y == t) / float(x.shape[0]) return accuracy # x : 입력 데이터, t : 정답 레이블 def numerical_gradient(self, x, t): # 가중치 매개변수의 기울기 loss_W = lambda W: self.loss(x, t) grads = {} # 기울기 보관 변수 grads['W1'] = numerical_gradient(loss_W, self.params['W1']) grads['b1'] = numerical_gradient(loss_W, self.params['b1']) grads['W2'] = numerical_gradient(loss_W, self.params['W2']) grads['b2'] = numerical_gradient(loss_W, self.params['b2']) return grads def gradient(self, x, t): # numerical_gradient 개선법 - 기울기 고속으로 구하기 W1, W2 = self.params['W1'], self.params['W2'] b1, b2 = self.params['b1'], self.params['b2'] grads = {} batch_num = x.shape[0] # forward a1 = np.dot(x, W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1, W2) + b2 y = softmax(a2) # backward dy = (y - t) / batch_num grads['W2'] = np.dot(z1.T, dy) grads['b2'] = np.sum(dy, axis=0) da1 = np.dot(dy, W2.T) dz1 = sigmoid_grad(a1) * da1 grads['W1'] = np.dot(x.T, dz1) grads['b1'] = np.sum(dz1, axis=0) return grads
이렇게 초기화 -> 예측 -> 손실함수 구하기 -> 손실함수를 경사하강법으로 수치 미분 -> 정확도를 구하기 위한 전반적인 함수세팅을 해보았다. 이 함수들을 사용하여 손실함수를 최솟값으로 하는 최적값을 구해낼 수 있을 것이며 정확도를 높일 수 있다.
딥러닝에서는 가중치 매개변수의 초깃값이 중요하다. 초깃값을 무엇으로 설정하냐에 따라 신경망 학습의 성공을 좌우하기도 하기 때문이다.
gradient() 함수를 numerical_gradient와 gradient 두 가지로 구현했는데, gradient() 함수는 numerical_gradient() 함수의 개선 버전으로 오차역전파법을 사용하여 기울기를 고속으로 계산하는 방법이다. 신경망 학습은 오랜 시간이 걸리므로 gradient() 함수의 오차역전파법을 주로 사용한다.
728x90'AI 모델(딥러닝 기초) > 3. 신경망 학습' 카테고리의 다른 글
3. 신경망 학습(7) (0) 2023.01.15 3. 신경망 학습(5) (0) 2023.01.10 3. 신경망 학습(4) (0) 2023.01.09 3. 신경망 학습(3) (0) 2023.01.07 3. 신경망 학습(2) (0) 2023.01.07