본문 바로가기

딥러닝/밑바닥부터 배우는 딥러닝

4장 신경망 학습

4.1 신경망 학습

3단원에서는 이미 W와 b에 대해 최적의 값이 찾아져 있었고 그 값으로 X에서 Y를 예측한 후 실제 Y값과 비교하여 정확도를 예측하고, 이 과정을 배치처리로도 해보았다.

4단원 에서는 gradient descent 과정을 거치면서 Loss function을 최소화 하기 위한 W와 b값을 점진적으로 학습할 것이다. 

- 2장의 퍼셉트론에서는, 가중치와 편향의 값을 직접 설정했지만 실제로는 직접 설정하지 못하고, 기계학습을 통해 기계가 스스로 적절한 가중치와 편향 값을 학습하여야 한다. (end-to-end 방식: 입력부터 출력까지 사람의 개입 없이 기계가 학습한다.)

- 데이터를 train set과 test set으로 나누는 이유: 모델의 범용성을 평가하기 위함

 

4.2 손실 함수

4.2.1 오차제곱합(sum squares error)

(yk: 신경망의 출력, 즉 신경망이 예측한 y값, tk: 실제 y값(정답), k: 데이터의 차원 수)

하나의 example에 대해서 위와 같이 오차제곱합으로 오차를 측정할 수 있다.

4단원의 손글씨 데이터에서 load_mnist로 데이터셋을 불러올 때, one_hot_encoding=True로 설정하면, t_train 또는 t_test가 '3'이 아닌 [0 0 0 1 0 0 0 0 0 0]와 같이 여러 원소로 구성된다. 

반면 예측된 y값은 softmax 함수를 사용하므로 각 label이 정답일 확률이 나온다.

위의 example에 대한 오차 제곱합은 아래와 같이 구할 수 있다.

 

4.2.2 교차 엔트로피 오차(cross entropy error)

 

(yk: 신경망의 출력, 즉 신경망이 예측한 y값, tk: 실제 y값(정답), k: 데이터의 차원 수)

오차제곱합과는 달리, tk에 logyk가 곱해져서, tk가 0인 값에 대해서는 yk값이 무시되어, 실제 label에 대한 확률값만 곱해진다.

delta 값은, yk가 0일 때 log yk가 발산하는 것을 막기 위해 더해주는 아주 작은 값이다. 

 

여러 example에 대한 cross entropy error 값은 위와 같이 구하는데, example 각각에 대해 구하기 때문에 시간이 오래 걸린다는 단점이 있어서 미니배치 학습법 사용.

 

미니 배치 학습

총 60000개의 train data set이 있을 때, 이 중 몇 개만을 골라서(ex. 100개) 학습을 하고 학습 능력을 평가함. 

이렇게 훈련 데이터 중 몇 개만 골라서 랜덤으로 x_train, t_train에서 빼올 수 있음.

 

미니 배치에 대해서만 cross entropy error을 구하는 과정인데, if 구문이 이해가 잘 안간다...여튼

여기서는 batch size를 y의 행 수만큼 설정을 해줬다. (t는 one hot encoding=False인 상태)

CEE를 할 때는 tk가 1인 값에 대해서만 계산해 주면 되기 때문에 y의 각 행에서 정답에 해당하는 값들만 sum 해준다. 여기서도 log yk에서 yk=0임을 방지하기 위해 아주 작은 delta 값을 더해줬다.

 

손실함수이어야 하는 이유

손실함수를 가중치 매개변수로 미분하고 그 미분값을 단서로 매개변소 값을 서서히 갱신하면서 최적의 가중치를 찾는 과정을 거쳐야 함. 미분이 0이 되는 부분에서 보통 가중치 학습이 종료되는데, 정확도를 매개로 모델을 평가하면 미분이 0이 되는 부분이 너무 많기 때문

 

4.3 수치 미분

보통 요롷게 계산한다.

함수값을 결정하는 변수가 여러개 있을 때는 편미분으로 각각 하나의 변수에 대해서만 미분을 수행한다.

 

4.4 기울기

모든 변수의 편미분을 벡터로 정의한 것을 기울기라고 한다. 

신경망은 손실함수가 최솟값이 될 때의 최적의 매개변수를 경사하강법을 이용해 찾는다.

경사하강법: 현 위치에서 기울어진 방향으로 일정 거리만큼 이동하여 함수값을 점차 줄이는 것

변수-학습률*미분값

적절한 학습률을 설정해 주는 것도 중요함.

f 함수의 최솟값을 찾기 위해 경사 하강법을 이용하는 함수이다. init_x를 초기값으로 갖고, 학습률은 0.01, 그리고 점진적으로 x를 변화하시키는 과정을 100번 거칠 것이다.

 

신경망에서의 기울기

손실 함수가 가장 작아지도록 하는 가중치와 편향 값을 구해야 하고 이 과정을 경사하강법으로 구할 것이다. 

가중치가 W와 같을 때 손실함수 L을 줄여주기 위해 필요한 gradient 값을 구하겠다는 것이다.

simpleNet class에서 일단 랜덤한 값을 갖는 2*3 shape의 가중치 W를 만들 것이다. predict는 입력값인 X와 W를 곱한 값을 내준다. loss는 입력값 X와 정답값 t로 predict에 대한 Loss를 구할 것이다.

f가 loss function이 되고, dW로 numerical gradient로 L의 W에 대한 미분값을 구할 수 있다. 

 

4.5 학습 알고리즘 구현하기

1단계 - 미니 배치: 총 60000개의 train data 중 mini batch로 일정 수의 데이터만을 학습한다.

2단계 - 기울기 산출: mini batch로 뽑은 작은 train set에서 W,b를 이용하여 predict 하고 정답값과 비교해서 loss를 구한 후 그 loss를 w에 대해 미분하여 기울기를 구한다.

3단계 - 매개변수 갱신: 경사 하강법을 통해 매개변수를 갱신한다

stochastic gradient descent(SGC): 미니배치로 데이터를 선정하여 gradient descent를 이용하는 방법

 

2층 신경망 class 구현하기

params: 초기화된 W,b이 들어감. (W는 모든 원소를 0으로 초기화 하면 학습에 문제가 생겨서 random 한 작은 값으로 채워주고 b는 0으로 채워줌)

predict: 초기화한 W,b를 이용하여 X를 y로 예측

loss: 예측한 y와 실제 정답값 t를 비교하여 loss 계산

accuracy: 예측한 y와 실제 정답값 t를 비교하여 정확도 계산

numerical gradient: Loss를 W와 b에 대해 미분하여 grad에 저장

 

미니배치 학습 구현하기

 

하이퍼 파라미터: gradient descent를 iter num만큼 학습시킬 것이고 총 60000개의 train data 중 100개의 mini batch로 매개변수를 학습시킬 것이다. gradient descent에서 learning rate는 0.1이다. twolayernet class에서 predict, loss, accuracy, numerical gradient 값을 가져올 수 있고 이를 network에 저장하겠다. 

for 문: for문이 한 번 돌아갈 때마다 train set에서 batch size(100)만큼 random하게 값을 가져와서 x_batch,t_batch에 저장한다. for 문이 한 번 돌 때마다 100개의 random 한 train set에 대해서 W,b값이 학습이 이루어진다.

network의 numerical gradient로 현재 W,b값에 대해 grad를 계산한다.

gradient descent를 해준 뒤 params에 저장한다.

loss도 계산한다.

계산한 loss를 바탕으로 iteration에 따른 loss를 plot 한다. 시행 횟수가 늘어남에 따라 loss가 계속 줄어들다가 일정 값으로 수렴한 것을 확인할 수 있다. 

 

시험 데이터로 평가하기는 생략

'딥러닝 > 밑바닥부터 배우는 딥러닝' 카테고리의 다른 글

7장. 합성곱 신경망(CNN)  (0) 2021.03.02
6장. 학습 관련 기술들  (0) 2021.02.23
5장. 오차역전파법  (1) 2021.02.10
3장 신경망  (0) 2021.02.01