본문 바로가기
Stay Hungry Stay Foolish/ML & DL

[밑바닥부터 시작하는 딥러닝] 4장 신경망 학습

by HANNI하니 2021. 2. 1.

제가 발표했던 자료 및 설명 공유합니다.

"밑바닥부터 시작하는 딥러닝" 책의  4장 신경망 학습 내용입니다.

 

 

 

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

신경망이 학습할 수 있도록 해주는 지표인 손실 함수를 알아보자 !!

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

손실함수의 값을 가급적 작게 만드는 기법으로 함수의 기울기를 활용하는 경사법 소개 ~

 

신경망의 특징 : 데이터를 보고 학습할 수 있다는 점. 매개변수의 값을 데이터를 보고 자동으로 결정한다.

알고리즘을 밑바닥부터 설계하는 것 대신 주어진 데이터를 잘 활용해서 해결한다.

이미지에서 특징feature(입력 이미지에서 중요 데이터를 정확하게 추출할 수 있도록 설계된 변환기) 추출 -> 그 패턴을 기계학습 기술로 학습

: 이미지 데이터 -> 백터 변환 -> 지도학습방식의 대표 분류 기법인 SVM,KNN등으로 학습한다

개의 얼굴을 구분하려할때는 숫자인식때와는 달리 다른 특징을 사람이 적절한 특징을 찾아내야한다.

 

5번 반복에 경계선을 잘 찾아내었다.

 

“얼마나 성능이 나쁜가”

손실함수는 일반적으로 오차제곱합과 교차 엔트로피 오차를 사용한다.

 

가장 많이 쓰이는 손실 함수. Mean squared error

작을수록 good

Y k : 신경망의 출력(추정값)

T k : 정답

K : 데이터의 차원 수

3장 내용 복습

Minst dataset 숫자 0~9 분류해내기

총 원소 10개짜리 데이터

Y 소프트맥스 함수의 출력

T 원핫인코딩

 

두번째로 많이 쓰이는 손실 함수.

Y k : 신경망의 출력(추정값)

T k : 정답

K : 데이터의 차원 수

원핫인코딩t k 이기 때문에 해당 원소만 1이라서

정답일때의 추정의 자연로그를 계산하는 식이다.

정답일때의 출력 -> 전체 값 결정

y=logx 자연로그 그래프로 값 설명 (x 1일때 y 0, x0일때 y는 마이너스 무한) -> 추정값이 정답일수록 CEE0으로 다가감, 정답일 때의 추정값이 작으면 CEE 플러스 무한대

값 작을수록 good

1.정답일때의 출력 0.6인 경우 -> CEE 0.51 -> 정답일 가능성 높다.

2.정답일때의 출력 0.1인 경우 -> CEE 2.3

 

Train 데이터 -> 손실 함수 대입 -> 그 값을 최대한 줄여주는 매개변수 찾기

모든 train 데이터에 대한 손실 함수 값을 구해야한다. ->

데이터 하나에 대한 손실 함수 식에 N개 데이터 구해서 합하여

N으로 나누어 정규화 ( "평균 손실 함수“ ) -> 시간 많이 걸림

Train 데이터로부터 일부만 골라 학습 수행

배치 입력 데이터를 하나로 묶어서 한번에 처리하는 것 <내용 복습>

미니배치로 학습한다.

 

똑같이 minist load하여 데이터 읽고,

원핫인코딩하여 x ytraintestsplit 해준다 (생략했음)

무작위로 10장만 뽑으려면 배치 사이즈를 10으로 지정하고

np.random.choice()함수 사용한다.

미니배치 학습은 전체 훈련 데이터의 대표로서 무작위로 선택한 작은 덩어리(미니 배치)를 사용하는 학습 방법이다.

 

배치 데이터를 처리할 수 있는 교차 엔트로피 오차 구하기

1. 원핫인코딩 = True

Y1차원일 경우 reshapeshape을 바꾸고

배치 크기로 나누어 정규화

이미지 1장당 평균 교차 엔트로피 오차를 계산

2. 원핫인코딩 =False. T가 숫자 레이블로 주어진 경우

원핫인코딩일때 t0인 원소는 교차 엔트로피도 0이므로 계산은 무시하여 신경망의 출력값만으로 교차 엔트로피 오차를 계산할 수 있음.

원핫인코딩이 안된 경우는 숫자로 출력값을 표현한 경우라 y값을 조정해줘야함.

만약,

batch_size5이면 np.arrange(batch_size) = [0,1,2,3,4]

T에는 레이블이 [2,7,0,9,4]와 같이 저장됨

y[np.arange(batch_size),t]는 각 데이터의 정답 레이블에 해당하는 신경망의 출력을 추출 -> 첫번째는 숫자 2로 출력….

y[np.arange(batch_size),t] = [y[0,2], y[1,7], y[2,0], y[3,9], y[4,4]] 넘파이 배열 생성

 

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

정확도는 예를 들어 15%이면 미소한 변화에도 15%이고 개선된다 하더라도 불연속적인 값으로 바뀌어버린다.

계단 함수/시그모이드 함수

계단 함수를 활성화 함수로 사용하지 않는 이유와도 같다.

만약 활성화 함수로 계단 함수를 사용하면 신경망 학습이 이뤄지지 않는다.

불연속적인 함수를 미분하면 0이외의 모든 장소에서 0이다.

 

수치 미분 : X가 변했을 때 f(x)가 얼마나 변화되는가?

그림 4-5

2. X 변화시키는 정도가 아주 작은 변화인 것

수치 미분 : 아주 작은 차분으로 미분하는 것

 

수치 미분

df(x)/dx = 0.02x+0.1

X=5일 때 미분값구하기

편미분

변수 여러 개인 f(x)

어느 변수에 대한 미분인지를 구한다.

X0에 대한 미분일 때는 x1은 상수처럼 생각

2x0+x1**2

기울기

편미분을 동시에 묶어서 계산하기

모든 변수의 편미분을 벡터로 정리한 것.

 

변수가 하나인 수치 미분과 비슷

Np.zeros_like(x) : x와 같은 차원이고 값이 모두 0인 배열을 만듬

Numerical_gradient(f,x)x넘파이 배열이므로

X의 각 원소에 대해서 인덱싱을 하여 수치 미분을 구한다.

F(x+h)-f(x-h)/2h

Function_2 = f(x0,x1)

 

Enumerate : 반복문 사용 시 몇 번째 반복문인지 확인할때 사용

def function_2(x): if x.ndim == 1: return np.sum(x**2) else: return np.sum(x**2, axis=1)
함수 그리기 axis=1 세로축

 

극대/극소값/안장점 개념 링크확인

위의 식은 1회에 해당하는 갱신이고, 이 단계를 반복

변수의 값을 여러번 갱신하면서 서서히 함수의 값을 줄임

학습률 값을 변경하면서 올바르게 학습하는 지 확인하면서 진행.

학습률은 미리 특정값을 지정한다.

너무 크거나 작으면 '좋은 장소'를 찾을 수 없음.

신경망 학습에서는 학습률 값을 변경하면서 올바르게 학습하고 있는지를 확인하면서 진행한다.

 

2*3차원이라면

수식확인

simpleNet 클래스는 2X3인 가중치 매개변수 하나를 인스턴스 변수로 가짐

predict(x) 메소드, loss(x,t) 메소드

인수 x는 입력 데이터, t는 정답 레이블

 

simpleNet 클래스를 활용. W, predict, 최대값인덱스, 정답레이블

Numerical_gradient(f,x) 써서 기울기gradient 구하기

dL/dw11 = -0.1129187

w11h만큼 늘리면 손실함수는 -0.11h만큼 감소.

손실함수를 줄이려면 '양의 방향' 으로 갱신해야 함.

w23은 대략 0.06

w23h만큼 늘리면 손실함수는 0.06h만큼 증가.

손실함수를 줄이려면 '음의 방향' 으로 갱신해야 함.

밑은 똑같은 방식으로 lambda 표현한 것.

 

지금까지의 신경망 학습 절차 확인하기

1. 훈련 데이터 중 일부를 무작위로 가져온다. 미니배치의 손실 함수 값을 줄이는 것이 목표

2. 미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구한다. 기울기는 손실함수의 값을 가장 작게 하는 방향을 제시한다.

3. 가중치 매개변수를 기울기 방향으로 갱신한다.

 

2층 신경망을 하나의 클래스로 구현. 클래스명은 TwoLayerNet

더미 입력 데이터 (0 또는 1만 가지는 범주형 데이터)

 

1. 가중치 초기화 self, input_size, hidden_size, output_size

input_size: 입력층의 뉴런수, hidden_size: 은닉층의 뉴런수, output_size: 출력층의 뉴런수

.mnist 데이터

28*28 입력 이미지데이터가 총 784장이고 출력은 숫자0~910

Input_size=784,output_size=10,hidden_size는 적당한 값 설정

변수 params : 신경망의 매개변수를 보관하는 딕셔너리

params['W1'] : 1번째 층의 가중치, params['b1'] : 1번째 층의 편향

params['W2'] : 2번째 층의 가중치, params['b2'] : 2번째 층의 편향

2. predict(x) 메소드 - 예측, loss(x,t) 메소드 손실함수값 구하기

인수 x는 입력 데이터

 

2. predict(x) 메소드 - 예측, loss(x,t) 메소드 손실함수값구하기(=predict()결과와 정답 레이블을 바탕으로 교차 엔트로피 오차 구하기)

인수 x는 입력 데이터, t는 정답 레이블

3. accuracy(self, x, t) - 정확도

Yt의 가장 높은 정확도

4. numerical_gradient(self, x, t) – 각 메서드의 가중치 매개변수의 기울기를 구함

변수 grads : 기울기를 보관하는 딕셔너리

grads['W1'] : 1번째 층의 가중치, grads['b1'] : 1번째 층의 편향

grads['W2'] : 2번째 층의 가중치, grads['b2'] : 2번째 층의 편향

5. gradient(self, x, t) - 가중치 매개변수의 기울기를 구함. numerical_gradient의 성능 개선판.

 

미니배치에 대해 경사법으로 매개변수를 갱신하는. 신경망 학습 절차 쭈욱~ 구현하기

앞서 구현한 TwoLayerNet 클래스 사용. 데이터는 MNIST 데이터셋을 사용하여 학습을 수행.

#하이퍼파라미터

Iters_num 반복횟수. 경사법에 의한 갱신 횟수는 10,000번으로 설정.

미니배치 크기 100으로 지정

-> 한번 돌때마다60000개의 훈련 데이터에서 임의로 100개의 데이터를 추려낸다.

#1에폭당 반복 수

에폭 : 학습에서 훈련 데이터를 모두 소진했을 때의 회수에 해당. 훈련데이터 10000개를 100개의 미니배치로 학습할 경우, 100회가 1에폭.

 

100개의 미니배치를 대상으로 확률적 경사 하강법을 수행해 매개변수를 갱신한다.

갱신할 때마다 손실 함수를 계산하고 그 값을 배열에 추가

 

위쪽은 10,000회 반복까지의 추이, 아래쪽은 1,000회 반복까지의 추이

1000회가 10000회의 앞 부분을 확대한 부분임

1000에서 10000회로 학습 회수(iteration)가 늘어나면서 손실 함수의 값(loss)줄어듬

-> 학습이 잘 되고 있다는 뜻

데이터를 반복해서 학습함으로써 최적 가중치 매개변수로 서서히 다가서고 있다!

 

훈련 데이터로 신경망이 잘 학습되고 있음을 알아봤으면 오버피팅이 발생하진 않았는지, 다른 데이터셋에서도 올바르게 인식하는지를 확인해야한다. <범용 능력>

앞서 구했던 정확도를 그래프로 표현.

train,test 데이터에 대한 정확도 그래프

오버피팅 발생하면 두 그래프 다르다.

 

 

댓글