ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3. 신경망 학습(6)
    AI 모델(딥러닝 기초)/3. 신경망 학습 2023. 1. 15. 10:56
    728x90

    전반적인 신경망에 대한 공부와 신경망학습에 대한 공부를 진행한 상태이기 때문에 간단한 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
Designed by Tistory.