ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 4강 역전파와 신경망 (2/4, 역전파 심화, advanced backpropagation)
    AI 2021. 2. 5. 17:47

    이제 다른 예를 해보죠. 이번엔 좀 더 복잡한데요, 왜 역전파가 유용한 지 볼 수 있을 겁니다. 이 경우에는 우리의 W와 x의 함수 f는 1 / ( 1 + e^-(w0x0 + w1x1 + w2)이죠. 우리의 첫번째 단계는 항상 이걸 계산 그래프로 그리는 거죠. 이 경우에는 이 그래프에서 먼저 w와 x항을 곱합니다. w0과 x0을 w1과 x1을 곱하고 그리고 w2를 다 함께 더하죠. 그다음 -1배를 하고 그다음 지수화하고 1을 더하고 이 전체 항을 1로 나눕니다. 그다음 우린 모든 값들을 채워 넣었습니다. 여기 x들과 w들에 주어진 값에 대해서 우리는 순방향 패스 (forward pass)를 할 수 있습니다. 그리고 사실상 계산의 각 단계에서 값이 무엇인지 계산할 수 있습니다.

    여기 아래쪽에 앞으로 도움이 될 미분을 위한 표현을 적었습니다. 간단한 예로 했을 때와 마찬가지죠.

    여기서 우린 역전파를 거칩니다. 그래프의 제일 마지막에서부터 시작할 겁니다. 마지막 변수에 대한 출력의 경사는 그냥 1이죠. 간단하죠. 이제 한단계 뒤로 갑니다. x분의 1 바로 앞의 입력에 대한 경사는 뭐죠?

    이 경우 업스트림 경사가 빨간색으로 쓰여진 숫자인데요. 이제 지역 경사를 찾아야 합니다. 이 노드 즉, x분의 1에 대한 지역 경사는 여기 빨간색 박스에 x에 대한 함수 f는 x분의 1이라고 되어 있죠. dx분의 df는 -1 / x^2이죠. 여기 - 1 / x^2을 받아서 순방향에 사용했던 x의 값을 집어넣습니다. 1.37이죠. 이 변수에 대한 우리의 최종 경사는 - 1 / (1.37)^2 곱하기 1이죠. 계산하면 - 0.53이네요. 다음 노드로 한칸 뒤로 가보죠. 같은 절차를 거칠 겁니다.

    업스트림으로부터의 경사는 -0.53이죠. 여기의 지역 노드는 +1이구오. 아래쪽의 미분을 위한 참고를 보면, 상수 더하기 엑스에 대해서는, 지역 경사가 그냥 1이네요. 체인 룰을 사용하면 이 변수에 대한 경사는 얼마죠?

    그건 업스트림 경사인 -0.53에 지역 경사 1을 곱하는 거죠. 그럼 -0.53이네요.

    한 단계 더 뒤로 가보죠. 여기 지수가 있는데요. 내려오는 업스트림이 얼마죠? 네 그건 -0.53이죠. 여기의 지역 경사는 얼마죠? 그건 e^x이죠.

    이건 지수 노드여서, 우리의 체인 룰은 우리의 경사가 -0.53 곱하기 e^x (e의 x제곱)이라고 얘기하고 있죠. 이 경우 우리의 순방향 패스에서 보면 x는 -1인데, 그럼 우리의 최종 경사는 -0.2네요.

    노드 하나를 더 해볼까요. 우리가 도착한 다음 노드는 곱하기 -1인데요. 내려오는 업스트림 경사가 얼마죠? -0.2죠. 지역 경사는 얼마죠? 참고 시트를 봐도 됩니다. 그건 -1이죠. 왜냐면 우리의 지역경사가 말하길 그건 df/dx인데 우리는 x * -1을 했죠.

    그래서 경사는 -1 * -0.2고 결국 0.2죠.

    이제 더하기 노드에 도달했는데요. 이 경우 우리는 이 노드에 연결된 2개의 가지가 있죠. 업스트림 경사가 뭐죠? 다른 것과 마찬가지로 0.2죠.

    이제 여기서 이 가지들의 각각에 대한 경사는, 우리의 이전의 간단한 예에서 봤듯이, 우리가 더하기 노드가 있으면, 더하기 노드의 입력 각각에 대한 경사는 1이 됩니다. 여기서 우리의 탑 스트림 (top stream)을 바라보는 지역 경사는 1 * 업스트림 경사 0.2니까, 총 경사는 0.2죠. 그리고 아래쪽 가지에 대해서는 같은 것을 합니다. 업스트림 경사가 0.2고, 지역경사가 1이니까, 총 경사는 0.2죠. 이것에 대해서는 모두 명확하죠?

    더 채워야할 경사가 더 있는데요. 뒤로가서 우리는 w0와 x0에 도달했습니다. 여기 곱하기 노드가 있죠. 이전에도 곱하기 노드를 봤는데, 그건 입력들 중 하나의 대한 경사는 다른 입력의 값이었죠. 이 경우 w0에 대한 경사는 뭐죠? -0.2죠.

    w0에 대해서는 우리는 업스트림 경사 0.2가 있고, 이것 곱하기 x값을 곱하면, 즉, -1을 곱하면, 우리는 -0.2를 얻죠. x0에 대한 경사를 위해똑같은 것을  할 수 있고, 0.2 곱하기 w0, 즉 2를 곱하면 0.4를 얻죠. 이제 경사 대부분을 채웠는데요. 앞서 왜 이게 어떤 변수에 대해 분석적 경사를 미분하는 것보다 더 간단하냐는 질문이 있었죠. 여기서 보듯이, 우리가 다룬 것은 우리가 적어야 했던 지역 경사들을 위한 표현이었습니다. 일단 우리가 이 지역 경사를 위한 표현식들을 갖기만 하면, 우리가 가진 각각의 값들을 넣고, 체인 룰을 사용해서 이것들을 곱하면서 거꾸로 가는 것만 하면 됩니다. 그러면 모든 변수에 대한 경사를 얻죠.

    이제 x1과 w1에 대한 경사도 같은 방식으로 적을 수 있죠. 주의하고 싶은 건 이 계산 그래프를 만들 때, 우리는 이 계산 노드를 우리가 원하는 입상 (granularity)으로 정의할 수 있다는 겁니다. 이 경우 우리가 할 수 있는 만큼 완전히 간단하게 쪼갤 수 있다는 겁니다. 우리는 더하기와 곱하기로 쪼갰죠. 사실 이보다 더 간단할 수가 없죠. 그러나 실제에선, 우린 이 노드들 중 몇개를 묶어서 더 복잡한 노드로 만들 수 잇습니다. 우리가 원한다면요. 우리가 그 노드에 대한 지역 경사를 적을 수 있기만 하다면요. 그래서 한 예로, 시그모이드 (sigmoid) 함수를 보면, 오른쪽 위에 시그모이드 함수를 정의했는데요. x에 대한 시그모이드는 1 / (1 + e^-x)죠. 이건 굉장히 흔한 함수라서 앞으로 강의에서 많이 볼 겁니다. 이에 대한 경사를 계산할 수 있는데요. 이걸 분석적으로 수학을 통해서 한다면 값을 적을 수 있죠. 결국 좋은 표현식을 얻을 겁니다. 이 경우 그건 1 - x의 시그마이고 이 함수의 출력값 곱하기 x의 시그마죠. 그리고 이 경우 이 그래프에 있는 이 시그모이드를 만드는 모든 계산을 받아 들여서, 그것을 하나의 큰 노드로 만들면, 그게 시그모이드입니다. 왜냐면 우리는 이 게이트에 대한 지역 경사를 알기 때문이죠. 그건 dx분의 x에 대한 시그모이드 표현이죠. 여기서 중요한 건, 원하는 그룹을 묶어서 좀 더 복잡한 노드를 만들 수 있다는 겁니다. 그것에 대한 지역 경사를 적을 수 만 있다면요. 이 모든건 사실 트레이드 오프 (trade-off)죠. 더 간결하고 단순한 그래프를 얻기 위해서 얼마나 많은 수학을 여러분이 하고 싶은지와 여러분의 경사 각각이 얼마나 더 단순해지길 원하는 지의 사이에서요. 그 다음 여러분은 원하는 복잡한 계산 그래프를 그릴 수 있습니다.

    이 계산 그래프를 생각하면 좋은 점은 매우 편안하게 느껴진다는 점입니다. 경사를 취하고 경사를 찾아야 할 때마다, 경사를 구할 표현식이 무섭게 보여도, 그게 시그모이든지 더 나쁜 것이라도, 원한다면, 이것을 유도할 수 있죠. 자리에 앉아서 계산 그래프에 관해 작성하기만 하면 됩니다. 필요한 수준으로 간단하게 할 수 도 있고, 항상 역전파와 체인 룰을 적용할 수 있습니다. 그러면 필요한 경사를 다 구할 수 있습니다. 여러분이 어떤 경사를 구하는데 어려움을 겪는다면, 그걸 계산 그래프로 생각해 보고, 이런 부분들도 쪼개 보고 체인룰을 적용해 보세요.

    우리가 어떻게 이 노드 집합을 하나의 시그모이드 게이트로 묶을 수 있는지 얘기했죠. 이게 정확하게 동등한 것이라는 것을 확인하기 위해서, 이걸 여기 집어 넣을 수 있습니다. 시그모이드 게이트에 대한 입력이 여기 있는데 1이구요. 초록색이죠. 출력은 0.73이죠. 여러분이 이걸 시그모이드에 집어 넣으면 맞게 나옵니다. 이제 우리가 경사를 취하고 싶다면, 우리는 이 전체 시그모이드를 하나의 노드로 취급해서, 우리가 여기 유도한 지역 경사를 사용해야 합니다. 1 - x의 시그모이드 곱하기 x의 시그모이드죠. 그래서 우리가 이걸 집어 넣으면, 시그모이드의 x값이 0.73이었다는 것을 알죠. 그래서 이 값을 집어 넣으면, 이 경사 값이 0.2라는 것을 알게 됩니다. 이 지역 경사 값이 0.2니까, 업스트림 경사인 1을 곱하면 우리는 정확히 시그모이드 사용 이전의 즉, 더 작은 계산으로 쪼갰을 때와것과 동일한 값을 얻죠.

    댓글

Designed by Tistory.