Kim Seon Deok

밑바닥부터 시작하는 딥러닝 1 : 4장 - 신경망 학습 본문

AI/Deep Learning

밑바닥부터 시작하는 딥러닝 1 : 4장 - 신경망 학습

seondeok 2022. 3. 8. 00:55

 

4-1. 데이터에서 학습

 

 학습 : train data로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것

손실함수(loss) : 신경망이 학습할 수 있도록 해주는 지표

학습의 목표 : 손실함수의 결괏값을 가장 작게 만드는 가중치 매개변수를 찾는 것

 

<신경망의 방식>

s   >   신경망(딥러닝)   > 결과

모아진 데이터로부터 규칙을 찾아내는 것 - 기계

이미지를 벡터로 변환할 때 사용하는 특징 설계 - 사람

 

종단간 기계학습 : 데이터(입력)에서 결과(출력)을 사람의 개입 없이 얻는다.

 

범용능력 : 아직 보지 못한 데이터(train data에 포함되지 않는 데이터)로도 문제를 올바르게 풀어내는 능력 >> 기계학습의 최종 목표

 

기계학습 

1. train data

2. test data

1로만 학습해 최적의 매개변수를 찾음. 2로 앞서 훈련한 모델의 실력을 평가

 

overfitting : 한 dataset에만 지나치게 최적화된 상태

 

 

 

4-2. 손실함수

신경망 학습 = 최적화

현재 상태를 '하나의 지표'로 표현 & 그 지표를 가장 좋게 만드는 가중치 매개변수 값을 탐색

손실함수(loss function) : 신경망 학습에서 사용하는 지표 > 성능의 나쁨을 나타냄

 

1. 오차제곱합(sum of squares for error)

# 오차제곱합
def sum_squares_error(y,t):
  return 0.5 * np.sum((y-t)**2)

 

2. 교차 엔트로피 오차(cross entropy)

# 교차 엔트로피 오차
def cross_entropy_error(y,t):  # y와 t는 넘파이 배열
  delta = 1e-7
  return -np.sum(t * np.log(y+ delta))

 

미니배치 학습 : training data의 수가 매우 많을 때, 모든 데이터를 대상으로 lossfunction을 구하기엔 시간이 오래 걸리므로, mini - batch로 학습을 수행

 

mini-batch : training data로부터 일부만 골라낸 데이터

import sys, os
sys.path.append(/content/drive/MyDrive/bottom/deep-learning-from-scratch-master/deep-learning-from-scratch-master/ch06)
import numpy as np
from dataset.mnist import load_mnist

(x_train, x_test),(x_test, t_test) = load_mnist(normalize = True, one_hot_label = True)
print(x_train.shape) # (60000,784)
print(t_train.shape) # (60000,10)

train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size, batch_size) # train데이터에서 무작위로 10장 빼냄>>미니배치로 뽑아낼 인덱스로 활용

#(배치용) 교차 엔트로피 오차 구현(정답 레이블 t가 one-hot-encoding일 때)
def cross_entropy_error(y,t):  # y: 신경망의 출력, t : 정답 레이블
  if y.ndim == 1:
    t = t.reshape(1,t.size)  # reshape : 데이터의 형상을 바꿈
    y = y.reshape(1,y.size)
  batch_size = y.shape[0]
  return -np.sum(t*np.log(y+1e-7)) / batch_size  # 배치의 크기로 나누어 정규화한 후 1장당 평균의 교차 엔트로피 오차를 계산
 
 #(배치용) 교차 엔트로피 오차 구현(정답 레이블 t가 숫자 레이블일 때)
def cross_entropy_error(y,t):  # y: 신경망의 출력, t : 정답 레이블
  if y.ndim == 1:
    t = t.reshape(1,t.size)  # reshape : 데이터의 형상을 바꿈
    y = y.reshape(1,y.size)
  batch_size = y.shape[0]
  return -np.sum(np.log(y[np.arrange(batch_size),t] + 1e-7)) / batch_size

 

 

 

* 손실함수를 설정하는 이유? - 신경망 학습에서 '미분'의 역할

신경망 학습에서는 최적의 매개변수(가중치, 편향)을 탐색할 때, 손실함수의 값을 가능한 작게 하는 매개변수 값을 찾는다. 이때 매개변수의 미분을 계산하고, 그 미분값을 단서로 매개변수의 값을 서서히 갱신한다.

 

가중치 매개변수의 손실함수의 미분 = 가중치 매개변수의 값을 아주 조금 변화시켰을 때 손실함수가 어떻게 변하는가.

 

미분값 > 0  매개변수를 -방향으로

미분값 < 0  매개변수를 + 방향으로

미분값 = 0  가중치 매개변수 값 갱신 멈춤

 

*정확도를 지표로 삼으면 안되는 이유?

매개변수의 미분값이 대부분의 장소에서 0이 되기 때문이다. 따라서 매개변수 갱신이 불가능 하다.

 

*정확도를 지표로 삼으면 매개변수의 미분이 대부분의 장소에서 0이 되는 이유?

매개변수를 약간만 조정해서는 정확도가 개선되지 않고 일정하게 유지된다.

정확도는 매개변수의 미소한 변화에는 거의 반응을 보이지 않고, 반응을 보이더라도 그 값이 불연속적으로 갑자기 변한다.

 

 

 

4-3. 수치미분

경사법 : 기울기(경사)값ㅇ르 기준으로 나아갈 방향 정함.

해석적 미분 : 한순간의 변화량 - x변화량에 따른 f(x)의 변화

수치미분 : (x+h)와 x 사이의 기울기 - 근사로 구한 접선(오차를 포함)

편미분 : 변수가 여럿인 함수에 대한 미분 - 여러 변수 중 목표변수 하나에 초점을 맞추고 다른 변수는 값을 고정

기울기(gradient) : 모든 변수의 편미분을 벡터로 정리한 것

기울기는 각 지점에서 낮아지는 방향을 가리킨다 > 기울기가 가리키는 쪽 = 각 장소에서 함수의 출력값을 가장 크게 줄이는 방법

 

경사법(gradient method) : 현 위치에서 기울어진 방향으로 일정거리만큼 이동

                                   이동한 곳에서도 마찬가지로 기울기를 구하고, 기울어진 방향으로 나아가길 반복해 함수의                                       값을 점차 줄임.

 

 

 

경사법은 기울기가 0인 장소를 찾지만 그것이 반드시 최솟값이라 할 수는 없다.

 

learning rate : 한 번의 학습으로 얼마만큼 학습해야 할 지 매개변수 값을 얼마나 갱신하느냐를 정하는 것

 

*learning rate를 적절히 설정해야 하는 이유?

    learning rate가 너무 크면 큰 값으로 발산, 너무 작으면 거의 갱신되지 않고 끝나기 때문이다.

 

Comments