[이전 포스트]
[Goal]
[정리]
•
Learning은 특정한 함수의 최솟값을 찾는 것이다.
•
Cost Function 은 으로 정의된다.
◦
예측값
◦
정답값
•
Cost Function을 minimize하기 위해 기울기를 사용한다. 기울기가 양수이면 왼쪽으로, 음수이면 오른쪽으로 이동하자.
•
Gradient Descent는 현재 시점의 기울기를 이용해서 여러번 반복적으로 weight 를 업데이트하면서 최적의 weight 값을 찾는 과정이다.
•
출발지점을 어디로 했느냐에 따라서 도착하는 골짜기(minimum)이 달라진다. 따라서, 도착한 골짜기가 반드시 global minimum 인 것을 보장해주지 않는다.
•
업데이트 시 부호(+/-), 크기를 고려한다.
•
가중치 패턴을 살펴보면 사실상 ‘pixel → edge → pattern → label’ 로 동작하지 않는다.
Introduction
이전 글에서 신경망이 무엇인지 배웠다면, 이번 챕터에서는 신경망을 어떻게 학습시키는지 알아보게 된다.
Figure 1 —
우리의 목적은 1장과 동일하게 MNIST 데이터를 활용해 신경망을 학습시키는 것이다. 이때, MNIST는 x 크기의 숫자 이미지와 해당 숫자에 대한 라벨로 구성되어 있다. 이 MNIST 데이터를 우리는 training data 로 쓰게 된다.
“Machines Learning”은 SF소설처럼 기계가 학습한다기 보다는 미적분 문제에 더 가깝다. 앞으로 설명하겠지만 Learning은 특정한 함수의 최솟값을 찾는 과정을 말한다. 이것은 학습하는 방법에 대해서 알게 되면 자연스럽게 알게 된다.
Cost Function
Figure 2 —
처음에는 Weight와 Bias를 완전히 무작위로 설정한다. 당연하게도 3 숫자 이미지를 넣었을 때 제대로된 확률값이 출력되지 않을 것이다. Figure 2와 같이, 3에 대한 확률값이 높게 나오는 것이 아니라 엉뚱한 숫자 라벨의 확률값이 더 높게 나오는 것이다.
따라서 제대로된 확률값으로 나올 수 있도록 우리는 Cost Function 을 정의하게 된다.
Figure 3 —
Figure 3의 왼쪽 그림처럼, 우리는 엉망으로 예측된 확률값과 정답 확률값 간의 cost를 측정하기 위해 Figure 3의 오른쪽 그림처럼 두 값의 차를 제곱하여 모두 더한다. 신경망이 이미지를 올바르게 분류할수록 이 합계는 작아지게 된다.
Figure 2-3에서는 단지 하나의 이미지만을 사용해 Cost를 계산하는 예시를 보여주었다. 하지만, 우리는 Network가 단일 이미지에서 어떻게 작동하는지에 관심이 있는 것이 아니다. 실제 성능을 측정하기 위해서는 수만 개의 훈련 사례에 대한 평균 Cost를 고려해야 한다. 따라서 cost function은 모든 훈련 데이터의 평균 cost로 정의되며, cost 함수를 최소화한다는 것은 결국 모든 샘플들에서 더 나은 성능을 보여준다는 것이다.
Parameter
Parameter(파라미터)는 함수 또는 모델의 동작을 정의하는 변수이다. 이 변수들은 시스템 내부에서 고정되거나 조정되어 결과를 결정하는 역할을 한다. Neural Network Function과 Cost Function을 정의하면서 각 함수의 파라미터가 무엇인지 정의해보자.
Parameter vs Hyperparameter
➊ Neural Network Function
Figure 4 —
Neural Network는 함수이다. 이때 입력은 784개의 Pixel 값이고, 출력값은 10개의 확률값이다. 그리고 파라미터는 13,002개의 weights와 biases를 의미한다. 이 파라미터들은 초기에는 설정된 상태로 고정되어 있다가, 학습 과정에서 조정되는 값들이다.
➋ Cost Function
Figure 5 —
Cost Function의 입력은 13,002개의 weights와 bias 값이다. 왜 입력값이 weights와 bias인지 이해하려면 Cost를 정의할 때를 떠올려 보면 간단하다. 10개의 확률값을 구하기 위해서는 weights와 bias를 거치기 때문에, 이들이 입력값이 되는 것이다. 출력값은 1개의 숫자값으로, 이는 cost 값에 해당한다. 파라미터는 많은 학습 데이터에 해당한다. 학습 데이터는 Cost 를 계산할 때 고정된 값으로 사용된다. 그러나 다른 학습 데이터를 사용하면 다른 Cost 값을 관찰할 수 있다.
Minimizing the Cost Function
앞서 우리는 Cost Function을 정의했다. 하지만 여기서 끝이 아니라 정의한 Cost Function을 minimize하면서 weight와 bias를 어떻게 바꿀건지를 알아야 한다.
이를 쉽게 생각해보기 위해 입력값이 13,002개나 되는 Cost Function이 아니라 입력값과 출력값이 각각 하나인 함수를 상상해보자.
Figure 6 —
를 minimize 하는 지점은 어디일까? 바로 기울기가 0인 지점이다. 따라서 기울기가 0이 되는 지점의 값이 바로 우리가 찾고자 하는 최적의 weight 값이다.
Figure 7 —
그런데 쉽게 이해하기 위해서 입력값이 1개인 경우로 가정했지만, 사실은 입력값은 13,002 개나 된다. 따라서 Figure 7과 같이 복잡한 함수가 될 수밖에 없으며, 기울기가 0인 지점도 여러 개 존재하게 된다.
그렇다면 입력값이 13,002개, 출력값이 Cost 값 1개인 그래프를 시각화한다고 생각해 보면 어떨까? 당연히 13,003차원의 그래프를 시각적으로 표현하는 것은 불가능에 가깝다는 것을 알 수 있다. 결국 입력값이 13,002개나 되는 신경망의 cost function에서는 최적의 weight를 확실하게 알지 못한다.
이러한 이유로, 신경망 학습에서는 현재 시점의 기울기를 이용하여 여러 번 반복적으로 weight를 업데이트하면서 최적의 weight 값을 근사적으로 찾아낸다. 이 과정이 바로 Gradient Descent이다. 우선 Gradient Descent 를 이해하기 위해 기울기를 어떤식으로 활용하는지부터 살펴보자.
기울기가 양수면 왼쪽, 기울기가 음수면 오른쪽으로 이동하자
앞서 언급했듯이 13,003 차원의 그림을 그릴 수 없기 때문에, 좀 더 유연한 전략으로 한 입력값이 주어졌을 때 어떤 방향으로 이동해야 출력값을 낮출 수 있을지를 파악한다. 이때, 이동해야할 방향을 알기 위해서 기울기를 이용한다.
Figure 8 —
Figure 8에서 보는 것처럼 기울기가 양수이면 왼쪽으로 이동해야 최소값과 가까워지고, 만약 기울기가 음수라면 오른쪽으로 이동해야 최소값과 가까워지는 것을 알 수 있다.
왜 하필 기울기가 양수이면 왼쪽 방향(-), 음수이면 오른쪽 방향(+)일까? 다변수 미적분에 익숙하다면 함수의 Gradient가 가장 가파른 상승 방향을 알려준다는 것을 알 것이다. 따라서 자연스럽게 Gradient의 음의 방향이 가장 빠르게 함수값을 낮출 수 있는 방향임을 알게 된다.
따라서 그 지점에서의 기울기를 구한 후 적절한 뱡향으로 이동하고 그리고 또 다시 기울기를 구해서 적절한 뱡향으로 이동하는 식으로 반복하면서 함수의 local minimum에 접근할 수 있다.
이때, 이동할 거리를 기울기에 비례해서 결정하게 되면 Overshooting 을 방지할 수 있다. Overshooting이란, 이동하는 거리가 너무 커서 우리가 목표로 하는 최적점인 local minimum을 지나쳐버리는 현상을 말한다.
Figure 9 —
그런데 여기서 한가지 생각해봐야할 것은 출발지점을 어디로 했느냐에 따라서 각기 다른 골짜기에 도착한다는 것이다. 이를 Figure 9에서 확인할 수 있다. 즉, 도착한 골짜기가 cost function에서 가장 작은 출력값(global minimum)이라는 것을 보장해주지 않는다는 것이다. 따라서 출발 지점을 잘 설정할 필요가 있는 것이다.
Figure 10 —
차원을 확장해서 이제는 Input 공간을 1차원이 아닌 2차원으로 생각해볼 수 있다. input 공간이 1차원일 때는 왼쪽과 오른쪽만 고려하면 됐지만, 2차원에서는 이동 방향을 360도 방향으로 다 고려해야 한다.
Gradient Descent
여태까지 배운 내용을 토대로 Gradient Descent 알고리즘을 정리하면 다음과 같다.
Step ➋ 가중치 업데이트
Figure 11 —
우선, 신경망의 13,002개의 weight와 bais를 거대한 열벡터 로 표현한다. 그렇게 되면 ‘cost function의 gradient의 음의 방향’ 또한 13,002 값을 가진 벡터일 뿐이다.
어떻게 동작하는지 에를 들면, 의 첫번째 요소 값인 2.25에서 의 첫번쨰 요소 값 0.18을 더함으로써 weight 를 업데이트 하는 것이다. 이런식으로 각 요소 값에 대해서 적절한 방향으로 업데이트를 해준다.
Figure 12 —
이때 (1)부호와 (2)크기가 어떤 의미를 가지는지 살펴보면 다음과 같다.
우선 부호의 종류는 +와 -가 있다. 부호가 +라면 weight가 increase가 될 것이며, 부호가 -라면 weight가 decrease된다.
크기는 다양할테지만 다소 크기가 적을 수 있고 그리고 클 수 있다. 가중치 값과 가중치 값이 있다고 가정하고 라면, 가중치 를 조정하는 것이 다른 가중치를 조정하는 것보다 cost function에 더 큰 영향을 미칠 수 있을 것이다. 즉, 몇 개만 조정하더라도 대박을 칠 수 있는 것이다.
훈련 데이터에 따라 값의 크기가 달라지므로 훈련데이터에 민감하다고 볼 수 있다.
Figure 13 —
예를 들어 Figure 13과 같이 식이 있다고 하고 값이 이라면, 를 조정하는 것이 를 조정하는 것보다 3배 중요하다고 볼 수 있다.
Analyze Network
저번 챕터에서 신경망이 다음과 같이 작동하기를 원한다고 하였다.
그런데 실제로 신경망이 이런 과정이 일어나고 있을까? 가중치를 픽셀 패턴으로 나타내면 절대 아니라는 것을 알 수 있다.
Figure 14 —
두번째 레이어에서 각 뉴런의 가중치를 시각화해보면 독립된 테두리를 인식한다기 보다는 가운데 보이는 패턴을 제외하고는 아무렇게나 생긴것처럼 보인다.
Figure 15 —
심지어 신경망에 무작위 이미지를 넣게 되면 5라고 자신있게 답하게 된다. 이처럼 신경망은 99% 정확도를 달성하며 숫자 이미지를 아주 잘 인식한다고 하더라도 숫자를 그릴 줄은 모른다는 것이다. 이는 너무 엄격하게 제한된 훈련 환경 때문이다. 이때 제한된 훈련 환경이라는 것은 다음 사항에 해당된다.
1.
x 격자 안에서만 있는 명백한 숫자 0~9만 생각한다.
2.
라벨을 0~9만 예측한다.
3.
cost function 은 오직 신경망이 자신의 결정에 대해서만 확신을 가지게 장려한다.
Conclusion
정리하자면, 우리가 예측한 확률값이 정답 확률값과 가까워지기 위해 우선 Cost Function을 정의하였다. 그리고 그 Cost Function을 최소화하기 위해서 기울기를 사용하여 어느 방향으로 움직일지 알아내었다. 이때 기울기의 부호와 크기에 따라 업데이트 양상이 달라진다. 또한, 저번 챕터에서 ‘pixel → edge → pattern → label (number)’ 와 같이 동작할 것이라 생각했지만 사실상 그렇지 않다는 것 또한 알았다.