본문 바로가기

Machine Learning

[Deep Learning from Scratch] 4장. 신경망 학습

우리는 3장에서 신경망이 무엇인지에 대해 알아보았습니다.
이번 챕터에서는 만든 신경망을 어떻게 학습하는지를 알아볼 것입니다.

신경망은 데이터에서 답을 찾고 패턴을 발견하면서 학습해나갑니다. 이것을 흔히 말하는 기계학습이라고 하죠. 사람은 데이터를 보고 직관적으로 정보를 추출해는 반면 컴퓨터는 그렇게 할 수가 없습니다. 손글씨를 보고 이 글씨가 무엇인지 판단할 때 우리가 어떻게 판단을 하나요?

여기서 이 숫자를 판단할 때 머릿속으로 직선과 곡선의 교점들을 보면서 판단하는 사람은 없을 것입니다. 사람도 모르는데 이것을 파악하는 알고리즘을 구현하기란 정말 어려운 일입니다. 그래서 우리는 알고리즘 자체를 만드는 것이 아니라 충분히 많은 데이터를 통해 알고리즘을 스스로 학습할 수 있는 모델을 만들고자 하였고 이것이 기계학습의 시초입니다.

1. 손실 함수

우리가 공부를 할 때 공부를 한 정도를 공부하면서 파악하고 충분히 많이 했다고 판단될 때 시험을 통해 파악하게 됩니다. 신경망 또한 똑같습니다. 계속 학습을 하면서 충분히 학습이 이뤄졌다고 생각하면 시험을 보게 됩니다.(물론 시험 전날 공부를 시작해서 시간이 없는 것처럼 충분히 학습이 이뤄지지 않고 볼 수도 있습니다.)

신경망에서는 이 학습이 이뤄진 정도를 손실 함수라는 것으로 정의합니다. 여기서는 손실 함수가 작아야 학습이 많이 이뤄졌다고 보는데 그 이유는 보통 손실 함수를 정답과 내 예측값의 차이로 잡기 때문입니다.

즉 신경망은 이 손실 함숫값을 최소화시키기 위한 방향으로 학습을 진행하게 되고 만약 손실 함수가 공부 한 정도와 크게 연관이 없는 함수라면 잘못된 방향으로 공부를 하게 되어 시험 때 터무니없이 낮은 점수를 받게 될 것입니다.

1.1. 오차제곱합

가장 많이 쓰이는 손실 함수는 오차제곱합(sum of squares for error, SSE)입니다.
$$E={1\over2}\Sigma_k{(y_k-t_k)^2}$$
y는 신경망이 예측한 값, t는 실제 정답을 의미합니다.

1.2. 교차 엔트로피 오차

다음 손실 함수는 교차 엔트로피 오차(cross entropy error, CEE)입니다.
$$E=-Sigma_k{t_k log y_k }$$

위 두 개의 손실 함수는 딥러닝, 머신러닝을 할 때 제일 기본이 되는 손실 함수입니다. 답이 틀리면 커지고 답이 같으면 작아지는 것은 같으나 손실 함수 값의 크기 차이가 학습하는데 큰 영향을 미치기에 학습의 목표에 따라 적절한 손실 함수를 선택해서 사용하면 됩니다.

1.3. 왜 손실함수가 필요한가

여기서 다음과 같은 의문을 가진다면 끊임없는 사고를 한 분일 것입니다.

전체 중에서 정답을 맞은 정답률을 최대화시키는 방향으로 학습시켜도 되지 않을까?

이 질문에 대한 답은 신경망 학습의 원리에 대해서 이해하고 다시 돌아오도록 하겠습니다.

2. 경사하강법

방금 알아본 손실 함수는 공부를 얼마나 잘 했는지에 대한 척도였습니다. 이제 이 손실 함수를 어떻게 최소화하는지, 지식을 어떻게 습득하는지 그 방법을 알아야 할 것입니다. 공부하는 방법에는 정말 많은 방법이 있지만 제일 기본적인 방법인 경사 하강법(gradient descent method) 을 알아보겠습니다.

여기서는 다른 예시를 들어보겠습니다. 우리가 지금 한라산 꼭대기에 있다고 해봅시다. 제주도에서 제일 낮은데로 가려면 어떻게 해야할까요? 제일 간단한 방법은 지금 현재 위치에서 제일 기울기가 심한 곳으로 한발자국씩 가는 것입니다. 바로 이 방법이 경사하강법입니다. 그러나 조금만 생각해보면 이 방법이 비효율적이라는 것을 알 수 있습니다. 극저점에서 더 이상 내려갈 수 없다는 점, 한발자국에 한번씩 탐색해야 하므로 속도가 매우 느린 점, 현재 당장은 제일 빠른 방향으로 가지만 크게 보면 제일 빠른 방향이 아닐 수 있는 점 등등 여러가지 단점들이 있습니다. 이 단점들을 해결하기 위한 새로운 공부법에 대해서는 다음 장인 오차역전파법에서 배울 수 있습니다.

3. 학습 알고리즘 구현

구현은 책을 참고해서 직접 해보면 어렵지 않게 하실 수 있습니다.
구현을 해서 알고리즘을 돌려보았을 때 제대로 되고 있는지 어떻게 확인할 수 있을까요?

데이터셋을 먼저 80:20정도로 나눕니다. 여기서 80은 훈련데이터, 20은 테스트데이터가 됩니다. 이 80을 가지고 공부를 하고 이 나머지 20으로 시험을 보는 것이죠. 여기서 데이터는 문제라고 생각하면 됩니다. 80문제를 풀고 20문제로 테스트를 보는거죠. 즉 80문제를 반복적으로 풀면서 공부를 어느정도 했는지 확인하고 최종적으로는 20문제로 시험을 보면 됩니다. 만약 80문제는 다 맞췄지만 20문제를 많이 틀렸다면 이는 오버피팅이 일어난 것입니다. 오버피팅이란 80문제에 대해서 답을 외워서 푸는것을 의미합니다. 훈련데이터에만 너무 초점을 맞추고 다른 문제를 풀 수 없게끔 학습을 한 것입니다. 학습을 할 때는 반드시 오버피팅이 일어나지 않도록 주의해야 합니다.

1-3. 왜 손실함수가 필요한가
경사하강법을 배우면 이 질문에 대한 답을 알 수 있습니다. 손실 함수가 아닌 정답률로 학습을 한다면 한라산 꼭대기에서 사방이 계단으로 이루어진 꼴이 됩니다. 지금 당장 서 있는 위치에서는 기울기가 사방이 0이 되어 어디로 가야될지 정할 수가 없게 됩니다. 정답률처럼 불연속적인 값이 아닌 손실 함수처럼 연속적인 값을 가져야 오차를 쉽게 줄여나갈 수 있습니다.

이제 5장에서 오차역전파법으로 돌아오겠습니다. 안녕~~