도서 : 신경망 첫걸음(한빛미디어)

지음 : 타리크라시드(송교석 옮김)


  •  가중치의 진짜 업데이트
    • 우리는 아직 인공 신경망에서 가중치를 어떻게 업데이트해야 하는가의 핵심적인 질문에 답하지 않았습니다. 신경망에서의 노드는 단순한 선형 분류자가 아닙니다. 노드는 입력되는 신호에 가중치를 적용한 후 이의 합을 구하고 다시 여기에 시그모이드 활성화 함수를 적용하는 식으로 좀 더 복잡한 구조를 가집니다.
    • 신경망에서는 너무나도 많은 가중치의 조합이 존재합니다. 또한 신호가 여러 개의 계층을 타고 전파되어나갈 때 한 계층을 거칠 때마다 직전 계층의 출력 값이 다음 계층의 입력 값이 되므로 함수의 함수, 함수의 함수의 함수... 같은 식으로 수 많은 함수의 조합이 필요하게 됩니다. 따라서 수학 연산의 과정이 너무 복잡하게 되므로 가중치를 한 방에 풀어주는 대수학을 활용할 수 없습니다.
    • 3개 노드로 구성되는 3개의 계층으로 이루어진 간단한 신경망이 있다고 생각해봅시다. 첫 번째 입력 노드와 두 번째 은닉 노드 간의 가중치를 얼마나 바꿔주면 세 번째 출력 노드의 결과 값이 0.5만큼 증가하는가에 대해 쉽게 구할 수 없을 것입니다.
    • 무차별 대입(brute force) : 가중치들을 랜덤하게 추측해서 구해보는 것, 비밀번호를 크래킹(cracking)하는 데에 사용되기도 함
    • 만약 가중치가 -1과 1 사이의 값으로 설정되어 있고 1000가지 값 중 하나, 예를 들어 0.501, -0.203, 0.999 등으로 가진다고 상상해 보겠습니다. 3개의 노드를 가지는 3개의 계층으로 구성된 신경망에는 총 18개의 가중치가 존재하므로 우리는 총 18000가지의 경우에 대해 테스트해보면 되는 것입니다.
    • 좀 더 현실적으로 500개의 노드를 가지는 3개의 계층이라면? 총 가중치의 개수는 50만 개가 될 것이며 우리는 총 5억 가지의 가능성에 대해 가중치를 테스트하게 될 것입니다. 하나의 조합을 연산하는데 1초가 걸린다고 치고 계산해보면 단 하나의 학습 데이터를 학습하고 가중치를 업데이트하는데 무려 16년이 걸린다는 말이 됩니다. 학습 데이터가 1000개라면 16000년이 걸린다는 뜻입니다.
    • 이를 통해 현실적으로는 제대로 된 신경망에서 무차별 대입이 전혀 실용적이지 못하다는 사실을 알게 되었습니다.
  • 경사 하강법
    • 신경망을 학습시킬 때 학습 데이터가 충분하지 않은 경우가 있습니다. 때로는 학습 데이터 자체에 오류가 있는 경우도 존재합니다. 또 경우에 따라서는 신경망 자체가 문제를 해결하기에 충분한 수의 계층이나 노드를 갖지 않기도 합니다.
    • 이러한 사실은 우리가 한계점을 명확히 인식하고 현실적인 접근법을 취해야 한다는 점을 의미합니다. 수학적으로는 정확하지는 않을지 모르겠지만, 이상적인 가정에 기반을 두지는 않을 테니 결과적으로는 더 나은 결과를 얻을 수 있게 될 것입니다.
    • 경사 하강법(gradient descent) : 쉽게 말해 한 걸음을 내딛고 나서 다시 한번 어느 방향이 우리의 목적지로 가는 가장 빠른 지름길인지를 파악하기 위해 주변을 살피게 됩니다. 그러고 나서 그 방향으로 다시 한 걸음을 내딛습니다. 목적지에 도달할 때까지 이 과정을 수없이 반복하게 됩니다.
    • 우리는 매 상황에서 경사(기울기)가 가장 급한 방향으로 한 걸음씩 내딛는 과정을 반복하게 됩니다.
    • 우리는 복잡한 함수에 대한 이해가 없더라도 경사 하강법을 이용해 최저점을 찾을 수는 있습니다.
    • 경사 하강법과 신경망의 연결 고리는? - 복잡하고 어려운 함수가 신경망의 오차라고 한다면, 최저점을 찾기 위해 아래로 내려가는 것은 오차를 최소화해나가는 과정이라고 할 수 있겠습니다. 우리는 신경망의 결과 값을 개선해 나갑니다.
    • 경사 하강법을 이해하기 위해 간단한 예제
    1. 이 그래프는 y = (x-1)^2 + 1을 나타냅니다. 만약 이 함수에서 y가 오차라면 이 y를 최소화하는 x를 찾아야 합니다.
    2. 빨간색 점이 시작 위치라고 가정한다면이 시작점부터 경사 하강법을 적용합니다.
    3. 이 경우는 음(-)의 기울기임을 볼 수 있습니다. 최저점을 찾아야 하므로 x축 방향으로 오른쪽으로 이동합니다. -> x값 증가
    1. 이번 그래프는 아까와 다른 지점에서 시작한 경우입니다.
    2. 이번에는 기울기가 양(+)의 기울기 이므로 왼쪽으로 이동하게 됩니다. -> x값 감소
    3. 이번에도 실제 최저점 방향으로 보다 근접하게 되고 이러한 과정을 반복하다 보면 더 이상 개선의 정도가 너무 작아 무시할 수준 정도가 되어, 최저점에 도달하게 될 것입니다.
  • 한 가지 주의해야 할 점은 x의 증가량과 감소량을 잘 조정해야 한다는 것입니다. 너무 크면 최저점을 단숨에 지나치게 되며(오버슈팅) 영원히 최저점에 도달하지 못하고 양쪽을 왔다 갔다 하는 결과가 되기 때문입니다.
  • 최저점에 가까워질수록 기울기는 완만해진다는 것을 가정하고 기울기가 완만해질수록 x값의 증가량이나 감소량을 줄이는 방식을 사용한다면 보다 정확한 최저점을 찾을 수 있을 것입니다.
  • 그러나 보통 수학자들이 불연속(discontinuity)이라고 부르는 지그재그 형태의 복잡한 함수에 대해서는 올바른 가정이 아닐 것입니다.
  • 이러한 접근 방식은 y라는 값이 x라는 변수 하나에 의해 결정되는 것이 아니라 a,b,c,d... 등 많은 변수에 의해 결정되는 경우입니다.
  • 신경망의 결과 값 및 오차 값은 바로 이처럼 많은 가중치 매개변수에 의해 결정됩니다. 보통 수백개가 넘습니다.
  • 2개의 매개변수를 가지는 조금 더 복잡한 함수의 예를 들어 경사 하강법을 적용해본 그림입니다.
    1. 이 그림을 보면 우리가 의도한대로 엉뚱한 계곡으로 진행될 수도 있지 않을까라는 의문이 생길 수 있습니다.
    2. 복잡한 함수는 1개의 계곡이 아니라 여러 개의 계곡을 가질 수 있으므로 경사 하강법이 때로는 잘못된 계곡에 빠지고 여기에서 벗어나지 못하는 경우가 있습니다.
    3. 이처럼 잘못된 계곡에 빠지는 것을 피하려면 각각 다른 출발점에서 시작해 여러번 학습하는 방법을 취할 수 있습니다. 매개변수의 초기 값을 다르게 준다는 것입니다. 즉 인공 신경망에서는 가중치의 초기 값을 다르게 준다는 것을 의미합니다. 
  • 제대로 된 최저점을 global minimum, 잘못된(국소적) 최저점을 local minimum이라고 부르기도 합니다.


  • 여러 가지 오차함수

    • 경사 하강법을 신경망에 적용하려면 오차함수(error function)를 올바르게 선택해야 합니다.

    • 신경망의 결과함수(output function) 자체는 오차함수가 아닙니다. 하지만 오차는 학습 목표 값과 실제 값 간의 차이를 의미하므로 우리는 결과 함수를 이용해 오차함수로 변환할 수 있습니다.

    • 다음 표에는 3개의 출력 노드에 대한 목표 값, 실제 값과 함께, 오차함수로 쓸 후보가 세 가지 있습니다.

  1. 첫 번째 후보의 경우에서 오차함수는 (목표 값 - 실제 값)입니다. 그러나 양의 오차와 음의 오차가 서로 상쇄되어 오차의 합이 0으로 나왔습니다. 이는 이 방식이 오차를 구하는 합리적인 방법이 아니라는 사실을 알려줍니다.

  2. 두 번째 후보의 경우에는 첫 번째의 문제점을 없애기 위해 절댓값(absolute value)을 취합니다. 이렇게 하면 오차 간에 상쇄되는 일은 없기 때문에 잘 동작하지만 V자 형태의 계곡에 빠지게 되면 최저점에 가지 못하고 그 주위를 계속 맴도는 경우가 생길 수 있습니다.

  3. 세 번째 후보는 제곱오차(squared error) 방식이라고 합니다. 이 방식은 두 번째 방식보다 선호되며 많이 사용됩니다. 그 이유는 다음과 같습니다.

    1. 경사 하강법의 기울기를 구하는 대수학이 간단해진다.

    2. 오차함수가 부드럽고 연속적이므로 경사 하강법이 잘 동작하게 된다. 값이 갑자기 상승하거나 빈 틈이 존재하지 않게 된다.

    3. 최저점에 접근함에 따라 경사가 점점 작아지므로 목표물을 오버슈팅할 가능성이 작아진다.


  • 미분으로 오차함수 구하기

    • 경사 하강법을 사용하려면 가중치에 대한 오차함수의 기울기를 구해야 합니다. 이 작업을 하기 위해서는 미분(calculus)이 필요합니다.

    • 은닉 계층(j)과 출력 계층(k)사이에 존재하는 연결 가중치에 집중해서 보겠습니다.

    • 오차함수는 n개의 노드에 대해 목표 값과 실제 값의 차를 구해 이를 제곱한 다음에 모두 더한 합입니다.

    • 노드 n에서의 결과 값 On은 오직 이와 연결되는 연결 노드로부터만 영향을 받습니다. 다시 말해 노드 k의 결과 값인 Ok는 그와 연결되는 가중치 w(j,k)에 의해서만 영향을 받는다는 뜻입니다. 이 의미는 위의 합으로부터 w(j,k)의 연결 노드인 Ok 외의 모든 On을 제거할 수 있다는 뜻입니다.

    • 이제 미분을 하기 위해서 연쇄 법칙을 이용하도록 하겠습니다. t의 값은 학습데이터이므로 상수입니다.

    • Ok는 노드 k의 결과 값으로 입력 신호의 가중치 합에 시그모이드 함수를 적용한 것이므로 이를 적용하면 다음과 같이 쓸 수 있습니다.

    • Oj는 최종 출력 계층의 출력 값이 아니라, 직전 은닉 계층의 노드로부터의 출력 값입니다.

    • 시그모이드 함수의 미분 값은 생각보다 복잡하지 않았습니다. 이런 점이 신경망의 활성화 함수로 인기 있는 이유 중 하나입니다.

    • 그러므로 최종 수식은 다음과 같습니다.

    • 첫 번째 항은 단순한 오차, 두 번째 항의 입력 값은 단순히 이전 계층으로 부터의 입력 신호에 불과하므로 간단히 ik라고 표기할 수도 있습니다. 마지막 항은 이전 은닉 계층의 노드 j의 결과 값입니다.

    • 이제 은닉 계층과 은닉 계층 사이에 있는 가중치들에 대해서도 유사하게 오차 기울기를 찾아보겠습니다. 이를 위해 몇 가지 짚고 넘어가야 할 부분이 있습니다.

      1. (목표 값 - 실제 값)이 은닉 계층에서 재조합된 역전파 오류가 됩니다. 이 값을 ej라고 부르겠습니다.

      2. 시그모이드 부분은 동일하지만, 합 부분이 은닉 계층의 노드 j로 들어오는 입력 값에 가중치를 적용한 결과가 됩니다. 이 입력 값을 ij라고 표현하겠습니다.

      3. 마지막 부분은 첫 번째 계층의 노드 Oi의 결과 값이 됩니다.

      4. 따라서 입력 계층과 은닉 계층 사이의 가중치에 대한 오차함수의 기울기는 다음과 같이 표현할 수 있습니다.


  • 학습률

    • 가중치는 기울기와 반대 방향으로 진행됩니다.

    • 학습률 인자를 적용함으로써 변화의 정도를 조정하겠습니다.

    • 업데이트된 새로운 가중치는 방금 구한 오차 기울기에 상수를 곱한 값을 원래 가중치에서 빼줌으로써 구할 수 있습니다. 양의 기울기일 경우에는 가중치를 줄이고, 음의 기울기일 경우에는 가중치를 늘리기 위함입니다. 여기서 상수 α는 오버슈팅을 방지하기 위해 변화의 강도를 조정하는 역할을 하며, 이를 바로 학습률이라고 합니다.

    • 이 수식은 은닉 계층과 출력 계층 사이의 가중치뿐만 아니라, 입력 계층과 은닉 계층 사이의 가중치에도 동일하게 적용됩니다.

    • 이러한 계산을 행렬곱으로 어떻게 표현할지 보겠습니다. 가중치 변화 행렬의 각 원소들이 어떻게 구성되는지 적어보겠습니다.

    • 가중치 변화의 행렬은 한 계층의 노드 j와 다음 계층의 노드 k를 연결하는 가중치 wjk를 조정하는 역할을 합니다. 뒤 항은 행이 하나인 행렬로 바로 직전 계층 Oj로부터의 결과 값의 전치 행렬입니다.

    • 이러한 가중치 업데이트 행렬은 다음과 같이 표현할 수 있습니다.

+ Recent posts