Story of CowHacker

딥러닝 3.5 신경망 학습 본문

공부/딥러닝

딥러닝 3.5 신경망 학습

Cow_Hacker 2020. 8. 14. 12:53
728x90

이번 글에서는 신경망 학습 알고리즘에 대해 알아볼 것이다.

 

지금 까지 알아온 

 

손실 함수

미니 배치

기울기

경사 하강법

등 많은 걸 봤다.

 

이것은 신경망 학습 절차에 그대로 적용된다.

 

신경망 학습 절차

 

 

0. 전제 신경망에는 적응 가능한 가중치와 편향이 있고, 이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을

학습이라고 한다.

 

 

1. 미니 배치

 

훈련 데이터 중 일부를 무작위로 가져온다.

이렇게 선별한 데이터를 미니 배치라고 한다.

이 미니 배치의 손실 함숫값을 줄이는 것이 목표다.

 

 

2. 기울기 산출

 

미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구한다.

기울기는 손실 함수의 값을 가장 작게 하는 방향을 제시한다.

 

 

3. 매개변수 갱신

 

가중치 매개변수를 기울기 방향으로 아주 조금 갱신한다.

 

 

4. 반복

 

1 ~ 3 단계를 반복합니다.

 

 

 

다음은 2층 신경망에서 클래스를 구현해보겠다.

 

 

 

 

 

# coding: utf-8

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)

        self.params['b1'] = np.zeros(hidden_size)

        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)

        self.params['b2'] = np.zeros(output_size)

 

    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):

        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

 

위 코드는 

출처 : https://github.com/WegraLee/deep-learning-from-scratch

 

WegraLee/deep-learning-from-scratch

『밑바닥부터 시작하는 딥러닝』(한빛미디어, 2017). Contribute to WegraLee/deep-learning-from-scratch development by creating an account on GitHub.

github.com

 

저기서 다운로드한 파일에 ch04/two_layer_net.py라는 코드 파일에서 들고 온 것이다.

 

위 코드는 앞에서 알아본 신경망의 순 전파 처리 구현과 공통되는 부분이 많다.

 

일단은 이 클래스가 사용하는 변수와 메서드를 알아보겠다.

 

 

 

 

 

 

TwoLayerNet 클래스가 사용하는 변수 설명표

 

그림1

 

 

 

 

 

TwoLayerNet 클래스의 메서드 설명표

그림2

 

 

이제 한번 실행 값을 보겠다.

1번째 층의 가중치 매개변수는 params [ 'W1' ] 키에 넘 파이 배열로 저장이 된다.

마찬 가지로 1 번째 층의 편향은 params [ 'b1' ] 키로 접근을 한다.

 

한번 파이썬으로 확 이해 보겠다.

 

net = TwoLayerNet ( input_size = 784, hidden_size = 100, output_size = 10 )

print ( net.params [ 'W1' ].shape )

print ( net.params [ 'b1' ].shape )

print ( net.params [ 'W2' ].shape )

print ( net.params [ 'b2' ].shape )

 

 

결괏값은

(784, 100)
(100,)
(100, 10)
(10,)

으로 확인을 할 수 있다.

 

위의 결과로 params 변수에는 이 신경망에 필요한 매개변수가 모두 저장된다는 걸 알 수 있다.

 

이 params변수에 저장된 가중치 매개변수는 예측 처리 ( 순방향 처리 )에서 사용된다.

먼저 예측 처리를 파이썬으로 구현해보겠다.

 

 

예측 처리 코드

 

x = np.random.rand ( 100, 784 )

y = net.predict ( x )

 

x = np.random.rand ( 100, 784 )은 더미 입력 데이터를 100장 분량으로 하겠다는 것이다.

 

 

 

grads 변수에는 params 변수에 대응하는 각 매개변수의 기울기가 저장된다.

예를 들어 numerical_gradient() 메서드를 사용해 기울기를 계산하면 grads 변수에 기울기 정보가 저장된다.

 

그렇게 되는지 파이썬으로 확인해보겠다.

 

 

 

 

 

grads 변수에 기울기 저장 확인 코드

 

x = np.random.rand ( 100, 784 )

t = np.random.rand ( 100, 10 )

 

grads = net.numerical_gradient ( x, t )

 

print ( grads[ 'W1' ].shape )

print ( grads[ 'b1' ].shape )

print ( grads[ 'W2' ].shape )

print ( grads[ 'b2' ].shape )

 

위 코드에서

x는 더미 입력 데이터가 100장 분량이다.

t는 더미 정답 레이블이 100장 분량이다.

 

결과는

(784, 100)

(100,)

(100, 10)

(10,)

이 나오는 걸 볼 수 있다.

 

 

이까지 신경망 학습의 알고리즘에서

2층 신경망 클래스 구현하기를 해봤다.

 

 

이번 신경망 학습에서 배운것

 

1. 신경망 학습은 손실 함수를 지표로, 손실 함수의 값이 작아지는 방향으로 가중치 매개변수를 갱신 한다.

2. 아주 작은 값을 주었을 때의 차분으로 미분하는 것을 수치 미분이라고 한다.

728x90

'공부 > 딥러닝' 카테고리의 다른 글

딥러닝 4.1 오차역전파법  (0) 2020.08.17
딥러닝 4.0 오차역전파법  (0) 2020.08.16
딥러닝 3.4 신경망 학습  (0) 2020.08.13
딥러닝 3.3 신경망 학습  (0) 2020.08.13
딥러닝 3.2 신경망 학습  (0) 2020.08.13
Comments