Computational Graphs

analytic gradient를 어떻게 계산할까?

 

computational graph를 이용하면 어떠한 함수도 표현이 가능하다.

 

위 그림에서 각 노드는 연산 단계를 나타내며,

 

input이 x, w인 선형 classifier를 보여준다.

 

곱셉 노드는 행렬 곱셈을 나타내며, 데이터 x와 가중치 w의 곱을 통해 score vector를 출력한다.

 

그 다음 hinge loss라는 계산 노드가 있다.

 

loss를 계산하는데 하단에 regularization 노드가 더해져서 최종 loss가 된다.

 

이렇게 computational graph를 이용하여 함수를 표현하면,

 

gradient를 계산하기 위해 computational graph 내부의 모든 변수에 대해

 

chain rule을 재귀적으로 사용하는 backpropagation을 사용할 수 있다.

 

AlexNet

computational graph는 복잡한 함수를 이용하여 작업할때 유용하다.

 

위의 AlexNet(CNN)은 top에 input image가 들어가고

 

bottom에 loss가 계산된다.

 

top에서 bottom까지 많은 layer를 거치게 된다.

 

복잡한 구조를 computational graph로 표현했다고 상상해보자.

 

graph가 매우 복잡해보일 수 있겠지만

 

결국은 풀리게 된다.

 

Example of Backpropagation

위의 그림은 간단한 backpropagation의 예시이다.

 

일단 함수가 있다. f(x, y, z) = (x+y)z

 

그리고 f에 대한 어떤 변수의 gradient를 알고 싶은 것이다.

 

위 함수 f를 computational graph로 표현하면 오른쪽 그림과 같다.

 

x, y에 대해 덧셈 노드가 있고 z와의 곱셈 노드가 있다.

 

여기에 예시로 값을 전달한다. x = -2, y = 5, z = -4

 

x + y 덧셈 노드를 q로 정의하면 f = q x z가 된다.

 

값을 기준으로 각 노드를 계산하면 q = 3, f = -12가 된다.

 

x와 y 각각에 대한 q의 gradient는 덧셈 노드이기 때문에 1이 된다. (수학 카테고리 참조)

 

q와 z 각각에 대한 f의 gradient는 곱셈 노드이기 때문에 각각 z와 q가 된다. (수학 카테고리 참조)

 

우리는 x, y, z 각각에 대한 f의 gradient를 알고 싶다.

 

앞서 말했듯이 backpropagation은 chain rule의 재귀적 응용이다.

 

chain rule에 의해 뒤에서부터 계산이 된다.

 

Example of Backpropagation

위의 그림에서 볼 수 있듯이 f에 대한 gradient는 1이 된다.

 

다음은 z에 대한 gradient를 계산해보자.

 

z에 대한 f의 미분은 q이다. (파란색 박스 오른쪽)

 

q의 값은 3이기 때문에 z에 대한 f의 미분값은 3이 된다.

 

미분값은 빨간색으로 초록색 값 하단에 표시됨.

 

다음은 q에 대한 f의 미분으로 정답은 z이다.

 

z의 값은 -4이기 때문에 q에 대한 f의 미분값은 -4가 된다.

 

Example of Backpopagation

이제 y에 대한 f의 미분값을 알아보자.

 

그런데 y는 f에 바로 연결되어 있지 않다.

 

f는 z와 연결되어 있다. chain rule을 이용하여 계산할 수 있다.

 

Example of Backpropagation

chain rule에 의해 y에 대한 f의 미분은

 

q에 대한 f의 미분과 y에 대한 q의 미분의 곱으로 나타낼 수 있다.

 

q에 대한 f의 미분은 z이고, y에 대한 q의 미분은 1이기 때문에

 

-4 * 1로 y에 대한 f의 미분값은 -4인것을 알 수 있다.

 

같은 방법으로 x에 대한 f의 미분은

 

q에 대한 f의 미분과 x에 대한 q의 미분의 곱으로 나타낼 수 있다.

 

q에 대한 f의 미분은 마찬가지로 -4가 되고, x에 대한 q의 미분 또한 1이 되기 때문에

 

-4 * 1로 x에 대한 f의 미분값 역시 -4인 것을 확인할 수 있다.

 

Example of Backpropagation
Local Gradient

computational graph는 모든 노드를 표현한다.

 

하지만 각 노드는 각 노드와 각 노드에 연결된 local 입력만 알고 있다.

 

위의 예시에서의 local 입력은 x, y이고 출력은 z가 된다.

 

위의 노드에서 우리는 local gradient를 계산할 수 있다. (빨간색 박스)

 

x에 대한 z의 gradient, y에 대한 z의 gradient를 계산할 수 있다.

 

Local Gradient

 

최종 loss L이 이미 정해져 있고

 

여기에서 z에 대한 L의 gradient를 나타낼 수 있다.

 

이제 x와 y의 값에 대한 gradient를 계산해보자.

 

chain rule을 이용하면 z에 대한 L의 미분값과 x에 대한 z의 미분값의 곱으로 계산할 수 있다.

 

여기서 x에 대한 z의 미분값은 x에 대한 z의 local gradient이므로

 

z에 대한 gradient와 local gradient의 곱으로 표현할 수 있다.

 

Local Gradient

마찬가지로 y의 gradient는

 

z에 대한 L의 미분값과 y에 대한 z의 미분값의 곱으로 계산할 수 있다.

 

여기서 y에 대한 z의 미분값은 y에 대한 z의 local gradient이므로

 

z에 대한 gradient와 local gradient의 곱으로 표현 할 수 있다.

 

이것을 통해 상위 노드 방향으로 출력 gradient와 local gradient의 곱으로

 

입력에 대한 gradient를 계산할 수 있다는 것을 알 수 있다.

 

이처럼 각 노드가 local gradient를 갖고 있으며,

 

backpropagation을 통해 상위 노드 방향으로 계속 전달되고

 

이것을 전달받아 local gradient와 곱하기만 하면 되는 것이다.

 

하지만 실제 입력값들은 scalar가 아닌 vector로 구성되어 있다.

 

그래서 backpropagation을 vectorized operation을 통해 수행해야한다.

 

mini-batch 크기의 jacobian matrix를 계산하게 되는데

 

이 부분은 생략하기로 한다. (...)

 

이제 신경망(neural network)에 대해 살펴보자.

 

Neural Networks

 

위의 2-layer NN을 보면

 

처음에는 선형 layer인 w와 x의 행렬 곱이고

 

이를 비선형성 함수인 max(0, w)를 이용하여 max를 얻는다.

 

그리고 여기에 선형 layer인 행렬 곱을 통해

 

최종적으로 score 함수를 얻을 수 있다.

 

여기서 비선형 변환이 중요하다.

 

이 비선형 변환이 없이 선형 함수만 추가된다면

 

f(f(f(x))) 이런식이 되어버린다.

 

이 결과는 다시 입력의 선형 함수가 되어버린다.

 

이렇게 되면 layer를 쌓을 수 없게 된다. 선형 함수를 쌓아봤자 선형적인 함수가 되버린다.

 

비선형의 복잡한 함수를 만들기 위해 간단한 함수들을 계층적으로 여러개 쌓아올린다.

 

Neural Networks

기존에 선형 layer 행렬곱에 의한 score 함수를 보자. f=Wx

 

가중치 행렬 w의 각 행이 클래스 각각의 템플릿과 비슷한지 비교하였다.

 

W1을 하단 이미지로 표현한거라고 생각하자.

 

여기에서 문제는 각 클래스 마다 오직 하나의 템플릿만 가지고 있다는 것이다.

 

예를 들어, 자동차는 색상이 다양할 수 있지만 위의 자동차 템플릿은 빨간색을 주로 찾는거로 보인다.

 

또한 자동차가 트럭일수도 있고 여러 종류가 될 수 있지만 위의 템플릿은 스포츠가 느낌이 난다.

 

우리는 다양한 형태의 자동차를 분류하기를 원한다.

 

multi layer network는 이러한 것을 가능하게 한다. (W2 추가)

 

Neural Networks

다른 비선형 행렬 w3로 곱하면 3-layer NN이 된다.

 

물론 중간에 비선형 함수 max를 거친다.

 

이런식으로 layer를 쌓으면서 deep neural network라는 용어가 생겼다.

 

Diagram of Neuron

왼쪽 위의 그림은 뉴런의 다이어그램을 나타낸다.

 

각 뉴런은 수상돌기(dendrite)를 지니고 있다.

 

수상돌기는 뉴런에서 들어오는 신호를 받는다.

 

세포체(cell body)는 들어오는 신호를 종합한다.

 

합쳐진 모든 신호는 하류 뉴런과 연결된 다른 세포체로 축삭(axon)을 통해 이동된다.

 

이는 위에서 살펴봤던 computational node가 실제 뉴런과 비슷하게 동작한다는것을 알 수 있다.

 

오른쪽 하단 그림을 보면

 

computational graph에서 노드가 서로 연결되어 있고

 

입력되는 신호는 x이다.

 

모든 x(x0, x1, x2)는 가중치 w와 결합되어 합쳐진다.

 

그리고 활성 함수를 적용하여 출력값을 얻으며 아래로 연결된 뉴런에게 전달된다.

 

왼쪽 하단의 그림은 활성화 함수 sigmoid이다.

 

Neural Networks: Architectures

위의 그림은 FC(fully-connected) layer로 구성된 신경망이다.

 

각 layer는 행렬곱을 했고, 2-layer NN은 선형 layer를 2개 가지고 있는 것을 의미한다.

 

이것을 하나의 hidden layer network라고 나타낼 수 있다.

 

행렬 곱의 수를 세는 대신 히든 레이어의 수를 센다.

 

그래서 2 layer NN을 1 hidden layer NN이라고 부를 수 있다.

 

마찬가지로 3 layer NN을 2 hidden layer NN이라고 부를 수 있다.

 

Example feed-forward computation of a neural network

위의 그림에 f는 sigmoid 함수이다.

 

데이터를 x로 받고, 가중치 w1과 행렬곱을 한다.

 

그리고 sigmoid 함수를 통해 비선형성을 적용하고 h1을 얻는다.

 

그 다음 두 번째 hidden layer인 h2를 얻기 위해

 

h1과 w2를 행렬곱을 한다.

 

그리고 비선형성을 적용시키고 w3와 행렬곱을 함으로써 최종 출력을 얻는다.

+ Recent posts