[기계 학습 #2] 인공 신경망 학습 살펴보기

컴퓨터과학 2020년 04월 25일

저번 글에서는 인공 신경망이 의미하는 것이 무엇인지를 논하였고, 결론적으로 인공 신경망은 일종의 함수다라는 결론을 내렸습니다.

인공 신경망이란
인공 신경망의 개념과 인공 신경망을 활용하는 이유에 대한 설명

이번 글에서는 저번 글에 이어서 인공 신경망을 분석하여 보려고 합니다. 이번에 분석할 것은 인공신경망이 학습한다는 것이 무엇인지, 그리고 그것이 어떻게 이뤄지는지입니다.


1. 원의 둘레를 모르는 철수

이런 문제 상황을 설정 해 보겠습니다.

양의 실수 \(r \)에 대하여, \(r \)을 반지름의 길이로 하는 원의 둘레의 길이 구하기

저번 글을 읽으신 독자분이라면, 아마 의아 해 하실 겁니다. 왜냐하면, 필자는 저번 글에서 분명히 이런 관계를 찾아낼 때에는 인공 신경망을 활용할 필요가 없다고 했기 때문입니다.

그럼에도 불구하고, 이 문제를 가지고 온 것은, 여러분들께서 이미 알고 계시는 문제로 시작하였을 때 더 쉽게 접근할 수 있기 때문입니다. 따라서 인공 신경망으로 풀기에 적합한 문제는 아닙니다만, 이 문제를 채택하게 되었습니다. 이 정도면, 썩 괜찮은 변명이었다고 생각합니다.

본격적으로 설명을 시작하겠습니다. 먼저, 아래의 그림을 보세요.

여기에서 우리가 해결하려는 문제의 경우 입력은 \(r \)이고, 출력은 \(S \)가 됩니다. 우리는 신경망이 \(S = 2 \pi r \)연산을 시행해 줄 것을 기대하고 있습니다. 우리는 그래서 일단은 신경망의 함수 \(f \)를 \(f(x) = cx (단, c는 상수) \)로 두기로 하겠습니다. 물론 우리는 \(c = 2 \pi \)라는 사실을 알고 있지만, 신경망은 처음에는 랜덤하게 \(c \)를 잡기 때문에, 모릅니다.

아마 신경망처럼 고대에 살던 사람들도 몰랐을 것입니다. 그래서 저는 지금부터 친숙하지 않은 신경망이라는 개념 대신 대신 철수라는 고대인을 데려와 비유로 설명하도록 하겠습니다. 철수는 처음에 \(c \)를 6으로 추측했다고 하겠습니다.

이 말인 즉슨, 철수는 반지름 2인 원의 둘레가 12, 5인 원의 둘레가 30이라고 생각한다는 얘깁니다. 위의 계산 값은 실제 값에서 상당히 차이가 나는 값이죠. 우리는 철수가 더 정확한 추측을 하도록 도움을 주려고 합니다. 하지만, 그냥 '차이난다'라는 느낌만 가지고는 철수가 추측을 수정하는데 하등히 도움이 되지 못하겠죠.

따라서, 이 '차이난다'라는 설명을 자세히 하기 위해서 비용 함수라는 개념을 도입합니다. 여기서는 평균 제곱 오차 (MSE)라는 비용 함수를 가져오겠습니다. 함수의 모습은 다음과 같습니다.

\[\frac{1}{n} \sum_{k=1}^{n} (y_k - \hat{y}_k)^{2} \]

\(y_k \)는 실제값, \(\hat{y}_k \)는 관측값을 의미합니다. 이것이 합으로 나타나지는 이유는, 여러 개의 관측에 대해서 평균을 내어 사용하기 때문입니다.

지금 철수의 상황 같은 경우는 MSE의 값은 다음과 같이 계산할 수 있습니다. 철수는 반지름이 2인 원의 둘레를 12, 5인 원의 둘레를 30이라고 추측했으므로

\[MSE = \frac{1}{2} \times \{(2 \pi \times 2 - 12)^{2} + (2 \pi \times 5 - 30)^{2} \} \]

이 됩니다.

이제 이것으로 철수는 자신이 얼마나 틀렸는지 알 수 있을 겁니다.


2. 원주율을 때려맞히는 철수

 철수에게 얼마나 틀렸는지 알려주었다고 해서, 그가 바로 정답을 맞출 수 있는 것은 아닙니다. 그렇다면, 어떻게 해야 철수는 원의 넓이를 구하는 바른 공식을 유도 해 낼 수 있을까요?

여러 방법이 있겠지만, 그 중 한 가지 방법은 때려 맞히는 방법입니다. 철수는 지금 \(c \)가 상당히 부정확한 값이라는 사실을 알고 있습니다. 따라서, 철수는 다른 값을 채택해야한다는 사실을 깨달았을 겁니다.

여기에서, 철수가 6에서 먼 값 - 예컨대, 100, 1000... 등을 예상하는 것은 별로 효과적이지 못합니다. 첫 번째에 얻은 6에 대한 정보를 많이 활용할 수 없기 때문이죠. 그래서, 철수는 그 대신 조금만 값을 바꾸기로 합니다. 철수가 6을 5.99로 바꾸었다고 합시다.

그러면, 철수의 추측은 오차가 더 커집니다. 이를 통해 철수는, 다음 예측을 6.05와 같이 6보다 큰 수를 고르게 됩니다. 그 이유는, 5.99에 대해서 차이가 더 크다면, 구하려는 값은 6에 더 가까웠다는 말, 즉, 6보다 컸다는 말이 되기 때문입니다.

이런 방식을 계속 반복하다 보면, 언젠가는 철수가 상당히 정확한 값을 추정할 수 있게 될 것입니다.

하지만, 이것은 상당히 비효율적인 방법입니다. 이 방법에서 착안하되, 다른 방법을 사용해야 겠습니다.


3. 방향성을 제시하자

철수가 계속 추측을 하며 비용 함수를 줄여나가는 것은 너무 오래 걸리고, 비효율적인 일입니다. 철수에게 어느 방향으로 추측을 해야 하는지를 알려주는 것이 좋겠습니다.

이 말은 즉슨, 철수가 상수 \(c \)의 값을 늘려야 할지, 아니면 줄여야 할지를 알려주겠다는 말과 같습니다. 당연한 말이지만, 철수가 예측한 값이 \(2 \pi \)보다 작으면 값을 키워야 하고, 크면, 값을 줄여야 합니다.

하지만, 대부분의 문제의 경우, 목표값을 모르는 채로 문제에 직면하게 됩니다. 목표값을 찾으려고 학습하는 건데, 목표값을 알고 있을리가 없겠죠. 그러니까 위의 방법은 유용한 방법이지만, 다른 경우 불가능한 방법입니다.

문제를 다르게 생각하면, 어느 방향이 비용 함수가 감소하는 방향이냐를 묻는 것과 같다고 볼 수 있습니다. 함수가 감소하는 방향? 미적분 시간에 많이 배운 개념입니다.

함수 \(C(x) \)가 비용 함수라고 합시다.  이 함수가 미분가능하다면, 함수가 감소한다는 것은, \(\frac{dC}{dx} < 0 \) 이라는 말과 같습니다. 그러면, 함수가 감소하는 방향으로 진행한다는 것은 이런 말과 똑같지 않을까요?

함수 \(C(x) \)의 정의역에 속한 값, \(x = a \)에서의 미분 계수, \(C'(a) \)가 \(C'(a) < 0 \)이면, \(x \)값을 키우고, \(C'(a) > 0 \)이라면, \(x \)값을 줄인다.

예를 들어서, 다음 그림을 보면,

빨간색 점에서의 미분계수는 음수이기 때문에, 우리는 \(x \)값을 키울 것이고, 파란색 점에서의 미분계수는 양수이기 때문에, 우리는 \(x \)값을 줄이게 됩니다. 그렇게 함으로써, 언젠가는 함수의 극소에 도달할 수 있을 겁니다.

같은 원리로, 철수에게 방향성을 제시 해 봅시다.


4. 학습

먼저, 철수가 학습해야 할 것은 무엇일까요? 철수가 학습해야 할 것이 \(x \)가 아니라 \(c \)라는 점에 주의해야 합니다. 평소 우리는 \(x \)에 대한 변화율을 구하는 것에 친숙하지만, 여기서 \(x \)는 입력으로, 주어진 것입니다. 학습을 시키겠다라는 말을 할 수도 없는 대상이라는 것입니다.

다시 말해서, 우리는 상수 \(c \)를 학습시켜야 합니다. 그런데, 비용 함수를 보면 좀 이상합니다.

\[\frac{1}{n} \sum_{k=1}^{n} (y_k - \hat{y}_k)^{2} \]

여기에는 그 어디에도 \(c \)에 대한 서술이 없습니다. 그러면, 어떻게 해야 미분계수를 구할 수 있을까요?

이때 사용하는 개념이 연쇄 법칙입니다. 우리는 일반적으로 다음이 성립함을 배웠습니다.

\[\frac{dx}{dy} = \frac{dx}{dt} \times \frac{dt}{dy} \]

이것을 우리는 연쇄 법칙이라고 합니다. 같은 원리로 이 비용 함수를 분석 해 보겠습니다.

입력을 1개 했다고 했을 때, 비용 함수는 \((y_k - \hat{y}_k)^{2} \)가 됩니다. MSE가 여러개를 평균 내는 것인데, 지금은 1개의 입력만을 받고 있기 때문입니다. 따라서, MSE를 \(y_k \)로 미분하게 되면,

\[C'(y_k) = 2(y_k - \hat{y}_k) \]

\(\hat{y}_k \)는 주어진 값으로, 상수이기 때문에, 영향을 받지 않습니다.

여기서, 우리는 \(y_k = f(x) = cx \)라는 사실을 활용할 수 있습니다. 이것은, 우리가 인공 신경망을 굉장히 단순하게 봐서 그 함수가 \(f(x) = cx \)로 표현된다고 가정했기 때문입니다.

따라서, \(c \)에 대한 변화율은 연쇄 법칙을 적용하면,

\[\frac{dC}{dc} = \frac{dC}{dy_k} \times \frac{dy_k}{dc} = 2(y_k - \hat{y}_k) \times x \]

여기서, \(y_k, \hat{y}_k, x \)는 주어진 값이므로, 위의 값은 계산할 수 있습니다.

\(2x(y_k - \hat{y}_k) \)가 양수라고 먼저 가정 해 봅시다. \(2x(y_k - \hat{y}_k) \)가 양수라면, 변화율이 양수라는 의미이기 때문에, 우리는 \(c \)의 값을 줄여야한다는 결론을 얻을 수 있을 겁니다. 이번에는 반대로, \(2x(y_k - \hat{y}_k )\)가 음수라고 해 봅시다. 그러면, 우리는 변화율이 음수라는 의미로부터 \(c \)의 값을 키워야한다는 결론을 얻을 수 있습니다. 이를 그림으로 확인합시다.

그림에서 검은색 화살표로 표현한 부분이 함수가 '가장 커지는 방향'이라고 할 수 있습니다. 빨간색 점에서의 미분계수는 음수이기 때문에, 이 방향이 검은색 화살표의 방향과 같습니다. 즉, 함수가 가장 커지는 방향미분계수의 방향과 같고, 함수가 가장 작아지는 방향미분계수의 반대 방향이라는 것을 알 수 있습니다.

여기서 매우 작은 양수 \(\varepsilon \)을 도입 해 봅시다. 함수가 가장 작아지는 방향이 미분계수의 방향과 반대라고 했기 때문에, 우리는, \(c \)의 값을 \(-2x(y_k - \hat{y}_k) \times \varepsilon \)만큼 바꾸어야 한다는 결론에 도달하게 됩니다.

또 다른 의문이 듭니다.

방향이 반대라는 것을 적용한다고 해서, 꼭 \(\varepsilon \)에 곱하는 계수의 크기가 \(2x(y_k - \hat{y}_k) \)와 같을 필요는 없지 않을까요?

급한 구간에서는 더 크게, 완만한 구간에서는 더 작게 움직이기 위해서 그렇게 설정하는 것입니다. 변화가 완만하다는 것은 함수의 변화율이 0에 가까워지고 있다는 얘기이고, 이것은 극점에 더 가깝다는 얘기기도 합니다. 거꾸로 변화가 크다는 것은 아직 함수의 변화율이 0이 되기에는 한참 남았다는 얘기이고, 이것은 아직 극점에서 더 멀다는 얘기가 됩니다. 따라서, 미분계수에 비례하도록 값을 바꾸면, 극점에 가까워지면 질수록 더 조금 바뀌게 됩니다. 그래서 극점에 도착하기도 수월 해 집니다. 또, 멀리 있을 때에는 더 많이 움직일 테니까, 극점에 도착하는 것이 더 빨라지기도 하겠죠.


5. 경사 하강법

철수로의 비유를 마치고, 다시 신경망으로 돌아오겠습니다.

\(c \)를 수열이라고 생각 해 보면, \(c_{n+1} = c_n - \varepsilon \times 2x(y_k - \hat{y} - k) = c_n - \varepsilon \times \frac{dC}{dc_n} \)가 되겠습니다. 이 것을, 경사하강법이라고 합니다. 경사하강법은 다음과 같이 표현할 수 있습니다.

\[x_{n+1} = x_n - \gamma \bigtriangledown f(x_n) \]

원한다면 \(\gamma \)를 변수 취급하여, 경우에 따라 바꾸어 쓸 수 있습니다. 뒤의 \(\bigtriangledown \)의 의미는 다음 글에서 설명하도록 하겠습니다. 지금은, \(\bigtriangledown f(x_n) \)이 함수의 기울기를 나타낸다라고만 하겠습니다.

인공 신경망은 기본적으로는 경사 하강법을 이용하여 학습을 시킵니다. 여기서, \(\hat{y}_k \)의 값은 경우에 따라 다릅니다. 그것은, 우리가 이미 알고 있는 값일 수도 있고, 알지 못하는 값일 수도 있습니다. 하지만, 확실한 것은 \(\hat{y}_k \)라는 값이 우리가 인공신경망에게 학습하도록 기대하는 값이라는 것입니다.


6. 이번 글을 마치며

이번 글에서는 인공 신경망이 학습을 하는 과정을 간략하게 살펴 보았습니다. 그리고, 경사하강법이라는 알고리즘까지 도달하게 되었습니다.

본문에서는 입력 변수가 1개일 때에 대해서, 그리고, 입력 데이터도 1개일 때에 대해서 서술했지만, 실제로 그런 경우는 그다지 흔하지 않습니다. 그렇지만, 다른 경우에 대해 이해하기 위해서는, 고등학교 수학만으로는 부족합니다.

그래서 다음 글에서는 인공 신경망의 개념 이해에 사용 될 행렬, 방향 도함수와 기울기 벡터에 대해 설명하도록 하겠습니다. 위 3가지 개념을 알게 되면, 인공 신경망에 대해 쉽게 이해할 수 있으리라 생각합니다.

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.