ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 4강 역전파와 신경망 (1/4, 역전파, backpropagation)
    AI 2021. 2. 5. 15:31

    오늘은 역전파와 신경망에 대해 얘기해 보겠습니다. 이제 이 강의의 핵심 내용에 접근합니다.

    지금까지 우리는 어떻게 분류기를 정의하는지 얘기했죠. 가중치 W로 파라미터 된 함수 f를 사용해서요. 이 함수 f는 데이타 x를 입력으로 받아서 여러분이 분류하고 싶은 각각의 클래스에 대한 점수의 벡터를 출력합니다. 여기서부터 우리는 손실함수를 정의할 수 있는데, 예를 들면, 얘기했던 SVM (support vector machine) 손실 함수죠. 기본적으로 우리가 생성해 낸 점수에 얼마나 행복한 지 안행복한 지를 정량화합니다. 우린 그것을 사용해서 전체 손실 항을 정의합니다. 여기 L인데, 정규화항과 합쳐진 데이타 항과의 조합이죠. 정규화항은 우리의 모델이 얼마나 간단한지를 표현하는거죠. 우리는 일반화를 더 잘 하기 위해서, 더 간단한 모델을 선호하죠. 이제 우리는 가장 낮은 손실에 해당하는 파라미터 W를 찾고 싶은데요. 즉, 우리는 손실함수를 최소화하고 싶습니다. 그러기 위해서 W에 대한 경사 L을 찾고 싶습니다.

    지난시간에 우린 최적화를 사용해서 어떻게 그걸 할 수 있는지 얘기했죠. 우리는 반복적으로 가장 경사가 심한 방향, 즉 음의 경사 방향으로 걸음을 걸을 겁니다. 이 손실 지형을 걸어 내려가서 가장 낮은 지점에 도착하기 위해서요. 또한 우리는 어떻게 이 경사 하강이 여러분의 손실 지형의 바닥에 도달하기 위해서 오른쪽 그림과 같은 경로를 갖는 지 봤습니다. 우리는 또한 경사를 계산하기 위한 여러 방법을 얘기했습니다.

    우리는 이걸 유한차분 추정을 사용해서 수치적 (numerical) 방법으로 계산할 수 있죠. 느리고 추정값이지만 동시에 작성하기 쉽죠. 이런 식으로 항상 경사를 얻을 수 있습니다. 우리는 또한 분석적 경사를 어떻게 사용하고 계산하는지 얘기했습니다. 이건 빠르고 정확하죠. 일단 분석적 경사에 대한 표현을 얻으면, 동시에 여러분은 이걸 유도하기 위한 그 모든 수학과 미분을 해야죠. 어쩌면 실수를 하기 쉽겠죠. 실제에서 우리가 하고 싶은 것은 우리는 분석적 경사를 유도해서 사용하는 겁니다. 그러나 동시에 우리의 구현을 수치적 경사로 확인해서 우리가 수학을 제대로 했는지 확인하는 거죠. 오늘 우리는 임의의 복잡한 함수에 대해서 어떻게 분석적 경사를 계산하는지 얘기할 겁니다. 계산 그래프 (computational graph)라고 불리는 프레임워크를 사용해서요.

    사실 우리가 어떤 함수를 표현하기 위해서 이런 종류의 계산 그래프를 사용할 수 있다는 겁니다. 여기서 그래프 노드는 우리가 진행할 계산의 각 단계입니다. 이 예에서, 우리가 얘기한 선형 분류기는, 입력은  x와 W이고, 곱하기 노드는 행렬 곱셈을 의미합니다. 파라미터 W와 우리의 데이타 x를 곱한 다음 우리의 점수 벡터를 출력하죠. 여기 다른 계산 노드가 있는데, 우리의 인지 손실을 표현합니다. 우리의 데이타 손실 항, Li를 계산합니다. 또한 정규화항도 아래에 있습니다. 이 노드는 우리의 정규화항도 계산하죠. 그리고 끝에 있는 우리의 전체 손실은 정규화 항과 데이타 항의 합입니다. 계산 그래프의 장점은 일단 우리가 계산 그래프로 함수를 표현하면, 역전파 (backpropagation)라고 불리는 테크닉을 사용할 수 있다는 겁니다. 그건 반복적으로 체인 룰 (chain rule)을 사용해서 계산 그래프의 모든 변수에 대해 경사를 계산합니다. 이게 어떻게 되는지 보겠습니다.

    이건 우리가 복잡한 함수를 사용하게 되면 매우 유용해지는데요. 예를 들어, 나중에 이 수업에서 얘기할 합성곱 신경망 (convolutional neural network)과 같은 함수를 사용하면 그렇죠. 여기 위에 입력 이미지가 있고, 우리의 손실은 아래에 있죠. 입력은 많은 변형 계층  (transformation layer)을 거쳐야 손실 함수에 다다를 수가 있습니다.

    이건 신경 튜링 머신과 같은 건데 정신없게 되는되요. 이건 또 다른 종류의 딥 러닝 모델이죠. 이 경우 이를 위한 계산 그래프가 정말 미친 것 같죠.

    특히, 우리는 시간에 걸쳐 언롤링 (unrolling)하게 되는데요. 만약 이 중간 변수들의 경사를 계산하고 싶다면, 사실 전혀 실용적이지 않습니다.

    역전파는 어떻게 동작하죠? 우리는 간단한 예로 시작할 건데, 다시 얘기하지만, 우리의 목표는 함수를 가지는 겁니다. 이경우 x, y, z의 함수 f는 x 더하기 y 곱하기 z죠. 우리는 각각의 변수에 대해 함수의 출력에 대한 경사를 찾고 싶습니다. 첫번째 단계는 항상 함수 f를 계산 그래프로 표현하는 거죠. 여기 계산 그래프가 오른쪽에 있죠. 여기 우선 더하기 노드가 있어서, x 더하기 y죠. 그 다음 오른쪽에 두번째 계산을 위한 곱하기 노드가 있죠. 그 다음 이 네트워크를 순방향으로 통과합니다. 여기 주어진 변수 값은, x는 -2, y는 5, z는 -4죠. 우리의 계산 그래프를 다 채워보겠습니다. 여기서 우린 중간 값들을 계산할 수 있죠. x 더하기 y는 3이고, 최종적으로 마지막 곱하기 노드를 통과하면, 우리의 함수 f의 마지막 노드는 -12이죠.

    우리는 모든 중간 변수에 이름을 줄 겁니다. 여기 더하기 노드 다음 중간 변수를 q라고 할거구요. 그럼 q는 x + y죠. 그럼 중간 노드를 이용하면 f는 q * z죠. 또한 x와 y에 대한 q의 경사는 그냥 1이라고 적었죠. 왜냐면 더하기 때문에요. q와 z에 대한 f의 경사는, z와 q로 각각 적었습니다. 왜냐면, 곱하기 규칙때문에요. 그래서 우리가 찾고 싶은 것은 x, y, z에 대한 f의 경사를 찾고 싶은 겁니다. 역전파는 체인 룰의 반복적인 적용이라서 우리는 계산 그래프의 제일 마지막인 뒤에서부터 시작할 겁니다. 그리고 우리는 거꾸로 작업하면서 경로를 따라 모든 경사를 계산할 겁니다.

    그래서 만약 제일 뒤에서 시작한다면, 마지막 변수인 f에 대한 출력의 경사를 계산하고 싶죠.

    이 경사는 그냥 1입니다. 간단하죠.

    거꾸로 가면, 우리는 z에 대한 경사를 구하고 싶네요. 우리는 dz분의 df가 q라는 것을 알고 있습니다.

    q 값은 3이니까, dz 분의 df는 3이죠. 그다음으로 dq 분의 df를 하고 싶다면, 값은 뭐죠?

    dq 분의 df는 z고 , z 값은 -4죠.

    그래서 dq 분의 df는 -4죠.

    계속해서 거꾸로 가보죠. df 분의  dy를 구하고 싶은데요. 그러나 이 그래프의 이 부분에서 y에 관한 경사는 f와 직접적으로 연결되어 있지 않죠. 그건 중간 노드인 q를 통해 연결됩니다. 그래서 우리가 하려는 방식은 체인 룰을 이용하는 건데요

    dy분의 df는 dq분의 df * dy분의 dq죠. 이 직관은, f에 대한 y의 영향을 찾기 위해서는 이건 사실 우리가 이미 알고 있는 q 곱하기 f에 대한 q죠. dq분의 df는 -4죠. 우리는 그것과 q에 대한 y의 영향, dy분의 dq를 곱합니다. 이 경우 dy분의 dq는 얼마죠? 1이죠. dy분의 dq가 1이라는 것은 우리가 y를 조금 바꾸면, q도 대략 같은 정도로 바뀔거라는 것을 의미합니다. 이게 영향이죠. 이게 하는 것은, 내가 y를 조금 바꾸면, q에 대한 y의 영향은 1일거고, 그리고 f에 대한 q의 영향은 대략 -4배라는 걸 말합니다. 맞죠? 그다음 우리는 이걸 곱해서, 우리는 f에 대한 y의 영향을 얻는데, 그건 -4죠.

    이제 같은 것을 x에 대한 경사에 할 겁니다. 같은 절차를 따라보죠. 뭐가 답이죠?

    이 경우 우리는 또 체인 룰을 적용할 건데, f에 대한 q의 영향은 -4고, 여기 또 같은 더하기 노드가 있기 때문에, dx분의 dq는 1이죠. 우리는 -4 * 1을 얻죠. x에 대한 경사는 -4가 됩니다.

    역전파에서 우리가 하는 것은, 사실 우리가 이 노드들을 계산 그래프에 갖고 있는데, 이 노드들은 오직 자신의 바로 옆에 있는 것들만 인지하고 있죠. 우리는 각각의 노드에서 이 노드와 연결된 그 지역 입력만 갖죠. 값들은 노드로 흘러들어와서 이 노드로부터 바로 나오는 출력을 갖습니다. 여기서 지역 입력은 x와 y고 출력은 z죠.

    이 노드에서, 우리는 또한 지역 경사를 알게 됩니다. 우리는 x에 대한 z의 경사를 계산할 수 있고, y에 대한 z의 경사를 계산할 수 있습니다. 이것들은 일반적으로 간단한 연산입니다.각각의 노드는 우리가 앞의 예에서 봤듯이, 더하기나 곱하기 같은 것들입니다. 여기서 우리는 경사를 적을 수 있고, 이걸 찾기 위해서 매우 복잡한 미분을 할 필요가 없죠. 우리는 이 지역 노드들이 있고, 각 노드는 사실 들어오는 입력들이 있고 다음 노드로 전달되는 출력이 잇죠. 또한 우리는 우리가 계산한 이 지역 경사들이 있는데, 들어오는 입력에 대한 노드에서 바로 나온 출력의 경사죠.

    역전파를 할 때, 우리는 제일 뒤에서 시작합니다. 그리고 끝에서 시작점으로 작업해 나가죠. 우리는 각 노드에 도달할 때, 각 노드에서 직접적인 출력에 대한 거꾸로 오는 업스트림 경사 (upstream gradient)를 갖게 됩니다. 그래서 역전파에서 이 노드에 도달할 쯤에, 우리는 이미 z에 대한 우리의 최종 손실 L에 대한 경사를 계산한 겁니다.

    이제 우리가 다음으로 찾고 싶은 것은, 노드 바로 앞의 것, x와 y값에 대한 경사죠. 앞에서 봤듯이, 우리는 체인 룰을 사용해서 이걸 합니다. 체인 룰로부터 우리는 x에 대한 이 손실 함수의 경사는 z에 대한 경사 곱하기 이 x에 대한 z의 지역 경사입니다. 그래서 이 체인 룰에서 우리는 항상 이 내려오는 업스트림 경사를 받아서 지역 경사로 곱해서 입력에 대한 경사를 얻습니다.

    y에 대한 L의 경사에 대해서도 같은 아이디어를 갖습니다. 체인 룰을 사용해서 z에 대한 L의 경사를 얻고 y에 대한 z 경사를 곱합니다. 체인 룰로 이 둘을 곱해서 경사를 얻는거죠.

    일단 이걸 얻으면 이 값들을 이 노드와 연결된 바로 앞선 노드들로 전달합니다. 여기서 중요한 점은 각각의 노드에서 우리는 우리가 계산한 지역 경사를 얻고 싶고 이걸 추적하다가, 역전파 중에 업스트림으로부터 오는 수치적 경사 값들을 받아서 그걸 지역 경사로 곱합니다. 그리고 이걸 연결된 노드, 즉 뒤쪽에 있는 다음 노드로 다시 전달하는 겁니다. 바로 연결된 것들 외에는 신경쓸 필요가 없죠.

     

    댓글

Designed by Tistory.