우잉's Development

Chapter4 신경망 학습2 본문

Deep Learning 책 리뷰/밑바닥부터 시작하는 딥러닝

Chapter4 신경망 학습2

우잉이 2022. 2. 4. 17:39
728x90
반응형

4.3 수치 미분

4.3.1 미분

여기서 말하는 미분은 고등학교 시절 배운 순간 변화율을 의미 합니다. 순간 변화율은 다음과 같습니다. (전방차분)

\( \frac{\mathrm{d}f(x) }{\mathrm{d}x} = \displaystyle \lim_{h \to 0} {{f(x+h) - f(x)} \over {h}}\)

\(h\)가 한없이 0에 가깝게 한다는 의미를  \(\displaystyle \lim_{h \to0}\)로 표현합니다. 

파이썬으로 구현하겠습니다.

 

왼쪽 구현은 잘못된 구현입니다. 여기서 개선해야 할 점이 2가지가 있습니다.

1) 반올림 오차 (rounding error) : 10e-50은 0.000...1에서 0이 49개 있다는 의미입니다. 가수가 10이므로 50에서 1개가 빠집니다. 여기서 반올림 오차가 생깁니다. 반올림 오차는 작은 값이 생략되어 최종 계산 결과에 오차가 생기게 됩니다. 그게 밑에 np.float32예제 입니다.  -> h = 0.0001로 둠

2) 함수 f의 차분관련: x+h와 x사이의 함수 f의 차분을 계산하고 있지만 이계산에는 오차가 있다는 사실에 중의 해야합니다. 두점사이의 기울기를 의미하기 때문입니다. -> 중심차분 이용

따라서 두가지 개선할 점을 가지고 개선하면 x를 중심으로 그 전후의 차분을 계산한다는 의에서 중심 차분 혹은 중앙 차분을 합니다. 아래와 같이 구분합니다.

분모에 2*h인 이유는 (x+h)-(x-h)이기 때문입니다.

 

 

 

4.3.2 수치 미분의 예

\(y=0.01x^2 + 0.1x\)를 파이썬으로 구현하고 그래프를 그려봅시다.

자 그러면 x가 5일 때와 10일 때 이함수의 미분을 계산합시다.

실제로 위의 예제를 미분하면 

\(y' = 0.02x+0.1\)이다. 여기에 5와 10을 대입하면 0.2와 0.3이 나옵니다 . 옆의 결과와 비교했을 때 오차가 매우 작습니다.

 

4.3.3 편미분

편미분은 앞의 미분과 달리 변수가 2개라는 점에 주의 해야됩니다.

\(f(x_0, x_1) = x_0^2 + x_1^2 \) 를 구현해봅시다.

이러한 변수가 2개인 식에서는 어느 변수에 대한 미분이냐를 구별 해야됩니다. 

편미분은 아래와 같고 두 문제를 풀어봅시다.

 

\(  \frac{\partial f}{\partial x_0} = 2x_0\)

\(  \frac{\partial f}{\partial x_1} = 2x_1\)

 

문제1. \(x_0 = 3, x_1 = 4\)일 때, \(x_0\)에 대한 편미분을 구하여라.

위에서 첫 번째 식에 \(x_0 = 3\)을 대입하면 6과 비슷하게 나와야된다. 구현해보자.

<- 4.0**2은 \(x_1\)은 4를 대입한 것이다.

 

<- 6과 오차가 적은 수가 출력

 

 

문제2. \(x_0 = 3, x_1 = 4\)일 때, \(x_1\)에 대한 편미분을 구하여라.

위에서 두 번째 식에 \(x_1 = 4\)을 대입하면 8과 비슷하게 나와야된다. 구현해보자.

<- 3.0**2는 \(x_0\)가 3이므로 대입

 

 

<- 8과 작은 오차로 결과가 나옴

 

 

4.4 기울기

위에서 편미분을 벡터로 정리한 \( (\frac{\partial f}{\partial x_0},  \frac{\partial f}{\partial x_1}) \) 을 기울기 gradient라 한다. 기울기는 다음과 같이 구현할 수 있습니다.



 

(3, 4), (2, 0), (3, 0)에서의 기울기를 구해보면 위와 같다.
이 기울기라는게 의미하는건 뭘까? 밑에 그림으로 그려 보면 이해가 됩니다. 기울기의 결과에 마이너스를 뭍인 벡터를 그려보겠습니다. 그럼 아래와 같은 그림이 나옵니다.

이 그림을 보면 기울기는 함수의 '가장 낮은 장소( 최솟값 )'를  가리킵니다. 또한 가장 낮은 곳에서 멀어질수록 화살표의 크기가 커짐을 알 수 있습니다. 기울기가 가르키는 쪽은 각 장소에서 함수의 출력 값을 가장 크게 줄이는 방향입니다. 

 

4.4.1 경사법(경사 하강법)

기계학습 문제 대부분은 학습단계에서 최적의 매개변수를 찾아냅니다. 신경망 역시 최적의 매개변수인 가중치와 편향을 학습시에 찾아야 합니다. 최적이란 손실함수가 최솟값이 될 때의 매개변수 값입니다.

기울기를 잘 이용해 함수의 최솟값 또는 가능한 한 작은 값을 찾으련느 것이 경사법입니다.

그러나 함수값을 낮추는 방안을 제시하는 지표가 기울기이지만 가리키는 방향에 정말 함수의 최솟값이 있는지 보장 할 수 없습니다. 즉  고등학교때 배운 수학을 떠올리면 기울기가 0이라고 해서 최솟값이 아닌 극솟값과 극댓값을 생각하면 됩니다.  기울어진 방향이 꼭 최솟값을 가리키는 것은 아니나, 그 방향으로 가야 함수의 값을 줄일 수 있습니다. 

 

그래서 등장한 경사법은 현위치에서 기울어진 방향으로 일정 거리 만큼 이동합니다. 그런 다음 이동한 곳에서도 마찬가지로 기울기를 구하고, 또 그 기울어진 방향으로 나아가기 반복합니다. 이렇게 해서 함수의 값을 점차 줄이는 것이 경사법입니다. 

경사법을 수식으로 나타내겠습니다.

\(x_0 = x_0 - \eta \frac{\partial f}{\partial x_0} \)

\(x_1 = x_1 - \eta \frac{\partial f}{\partial x_1 }\)

\(\eta\) 에타는 갱신하는 양을 나타냅니다. 이를 신경망 학습에서는 학습률(learning rate)라고 합니다. 매개병수 값을 얼마나 갱신하느냐를 정하는 것이 학습률입니다. 학습률 값은  0.01이나  0.001등 미리 특정 값으로 정해두어야 하는데 일반적으로 이 값이 너무 크거나 작으면 '좋은 장소'로 찾아 갈 수 없습니다. 

여기서 학습률은 가중치와 편향처럼 훈련데이터와 학습알고리즘으로 인해 자동으로 획득하는 매개변수와 달리, 사람이 직접 설정해야되는 매개변수입니다. 학습률같은 매개변수를 하이퍼파라미터(hyper parameter)이라고 합니다.

경사 하강법을 아래와 같이 간단히 구현할 수 있습니다. 

경사법으로 아래와 같은 문제를 풀어봅시다.

문제 :  경사법으로 \(f(x_0, x_1) = x_0^2 + x_1^2\)의 최솟값을 구하여라 

실제로 최솟값은 (0, 0)인데 비슷한 값을 추리한 것을 확인할 수 있습니다. 

 

4.4.2 신경망에서의 기울기

\(W = \begin{pmatrix} w_{11}&w_{12} &w_{13} \\ w_{21} & w_{22} & w_{23} \\ \end{pmatrix}\) W : 가중치, L : 신경망

\( \frac{parial L}{\partial W} = \begin{pmatrix} w_{11}&w_{12} &w_{13} \\ w_{21} & w_{22} & w_{23} \\ \end{pmatrix}\)

 

- \(\frac{parial L}{\partial w_{11}} \) = \(w_{11}\)을 조금 변경 했을 때, 손실함수 \(L\)이 얼마나 변화 하느냐 

- \(W\)와 \(\frac{parial L}{\partial W}\)의 형상은 모두 2X3

 

간단한 신경망을 예로 들어 실제로 기울기를 구하는 코드를 구현해보겠습니다.

먼저 simpleNet클래스를 살펴봅시다.

simpleNet클래스는 형상이 2X3인 가중치 매개변수 하나를 이스턴스 변수로 갖습니다. 메서드는 2개인데, 하나는 예측을 수행하는 predict(x)이고, 다른 하난는 손실함수의 값을 구하는 loss(x, t)입니다.(x: 입력데이터, t: 정답레이블)

simpleNet으로 실험을 해봅시다.


이어서 기울기를 구해봅시다. 

dW은  numerical_gradient(f, net.W)의 결과로, 그 형사은 2X3의 2차원 배열입니다. 

예를들면, \((\frac{partial L}{\partial w_{11}}\)은 대략 0.1입니다. 이는\(w_{11}\)을 h만큼 늘리면 손실함수의 값은 0.1h만큼 증가한다는 의미입니다. \((\frac{partial L}{\partial w_{13}}\)은 대략 -0.4입니다. 이는 \(w_{13}\)을 h만큼 늘리면 손실함수의 값은 0.4h만큼 감소하는 것입니다. 그래서 손실함수를 줄인다는 관점에서는 \(\frac{partial L}{\partial w_{13}}\)은 양의 방향으로 갱신하고 \(w_{11}\)은 음의 방향으로 갱신해야 함을 알 수있습니다. 

 

4.5 학습알고리즘 구현하기

신경망 학습의  절차 (확률적 경사 하강법, Stochastic gradient descent, SGD)

- 전제  : 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정(=학습)

  1단계  - 미니배치

             : 훈련데이터 중 무작위로 선별한 데이터를 미니배치라 하며, 이 미니배치의 쇤실함수 값을 줄이는 것이 목표

  2단계  - 기울기 산출

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

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

  3단계  - 매개변수 갱신

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

  4단계  - 반복

             :1 ~ 3단계 반복

 

- 손실함수의 값 : 훈련 데이터의 미니배치에 대한 손실함수의 값

- 에폭 (epoch) : 1에폭은 학습에서 훈련데이터를 모두 소진했을 때의 횟수, 단위

                     ex ) 10000장 -> 100장 미니배치 학습  -> 100회 1epoch

- 정확도를 1 에폭마다 계산하는 이유 :

   for문 안에서 매번 계산하기엔 시간이 오래걸리고, 또 그렇게까지 기록 할 필요가 없다.

4.5.1 2층 신경망 클래스 구현하기

위의 코드에서 사용한 변수와 메서드를 설명하겠습니다.

1) 변수

① params : 신경망의 매개변수를 보관하는 딕셔너리 변수(인스턴스 변수)

                params['W1'] -> 1번째층의 가중치

                params['b1'] -> 1번째층의 편향 

                ..

② grads :  기울기를 보관한느 딕셔너리 변수 (numerical_gradient()매서드의 반환 값)

               grads['W1'] -> 1번째 층의 가중치의 기울기

               grads['b1'] -> 1번째 층의 편향의 기울기

 

2) 매서드

①  __init__(self, input_size, hidden_size, output_size) : 초기화 수행

② predict(self, x) : 예측(추론) 수행, x는 이미지 데이터

③ loss(self, x, t) : 손실함수의 값을 구함 

④ accuracy(self, x, t) : 정확도 

⑤ numerical_gradient(self, x, t) : 가중치 매개변수의 기울기

⑥ gradient(self, x, t) : 가중치 매개변수의 기울기를 구한다 -> ⑤의 개선판 구현은 다음장에서 실행

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

입력이미지  input_size = 784 = 28X28

출력값 output_size = 10 = 0~9 숫자

으로 지정하고 hidden_size는 적당한 값을 설정 합니다.

초기화는 나중에 더 설명 하겠지만 여기서는 정규분포를 따르는 난수로 편향은 0으로 초기화했다고 생각하면됩니다.

 

 

 

 

 

 

 

4.5.2 미니배치 학습 구현하기

728x90
반응형

'Deep Learning 책 리뷰 > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

Chapter4 신경망 학습  (0) 2022.01.28
Chapter3. 신경망 2  (0) 2022.01.25
Chaper 3 신경망  (2) 2022.01.20
Chapter2. Perceptron(퍼셉트론)  (0) 2022.01.18
Comments