Kim Seon Deok
밑바닥부터 시작하는 딥러닝 1 : 4장 - 신경망 학습 본문
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가 너무 크면 큰 값으로 발산, 너무 작으면 거의 갱신되지 않고 끝나기 때문이다.
'AI > Deep Learning' 카테고리의 다른 글
밑바닥부터 시작하는 딥러닝 1 : 6장 - 학습관련 기술들 (0) | 2022.03.08 |
---|---|
밑바닥부터 시작하는 딥러닝 1 : 5장 - 오차역전파법 (0) | 2022.03.08 |
밑바닥부터 시작하는 딥러닝 1 - 3장 : 신경망 (0) | 2022.03.08 |
밑바닥부터 시작하는 딥러닝1 - 2장 : 퍼셉트론 (0) | 2022.03.08 |
7. Numpy & NLTK (0) | 2022.01.21 |