728x90
반응형
Backpropagation and Neural Networks
Computational graph를 사용해서 함수를 표현하게 됨으로써 backpropagation이라고 부르는 기술을 사용할 수 있게 된다.
backpropagation은 gradient를 얻기위해 computational graph 내부의 모든 변수에 대해 chain rule을 재귀적으로 사용한다.
첫 번째는, 항상 Computational graph로 그리는 것.
x+y 덧셈 노드를 q라고 부르자
q,f의 gradient를 구한다 ( 각각 편미분 )
그리고 우리가 찾기 원하는 것은 x,y,z 각각에 대한 f의 gradient이다.
Chain rule에 의거해 뒤에서 부터 gradient 계산을 시작한다.
f에 대한 y의 gradient는 직접적으로 하나의 노드에 연결되어있지 않다. 그래서 chain rule을 이용해 계산한다. ( 1 * -4 )
초록색 숫자는 function을 통해 전해지는 숫자 ( 영향력 ) 이다.
Local gradient를 구할 수도 있다. ( 들어오는 입력에 대한 출력의 기울기 )
각 노드는 local 입력을 받고, 다음 노드로 출력값을 보낸다.
노드와 연결된 노드 이외의 다른 어떤 값에 대하여 신경쓰지 않아도 된다.
먼저 computational graph를 그림 ( 왼쪽부터 차근차근 )
유도식을 이용하여 계산하고 값을 입력해준다.
초록색 = local gradient
Upstream gradient 또한 계산에 활용된다. ( gradient = upstream gradient * local gradient )
덧셈 노드에서 각 입력에 대한 local gradient 는 1이었다.
w0의 gradient는 x0의 영향을 받아 -1.00 * -0.20 으로 -0.20이 되고
x0의 gradient는 w0의 영향을 받아 2.00 * 0.20 으로 0.40이 된다.
입력이 1 출력은 0.73을 갖는다. 시그모이드 함수에 연결하면 된다.
시그모이드 미분은 다음음 참고하면 된다.
위를 참고하면 쉽게 미분할 수 있다.
변수에 대한 gradient만을 찾았다. 그 다음 가중치 업데이트하기 위한 다음 스텝을 밟는다.
X,y,z가 숫자 대신에 vector를 가지고 있다고 하자. 차이라면 gradient는 Jacobian 행렬이 될 것 이다. 각 요소의 미분을 포함하는 행렬이 될 것 이다.
Jacobian 행렬의 각 행은 입력에 대한 출력의 편미분이 될 것이다.
4096의 제곱이 답이다. ( 실용적이지 못하다 )
Jacobian 행렬은 “대각 행렬”이다. 요소별이기 때문에, 입력의 각 요소 첫 번째는 오직 출력의 해당요소에만 영향을 주기 때문이다.
출력에 대한 x의 영향에 대해서 그리고 이 값을 사용하는 것에 대해서만 알면 된다.
그리고 우리가 계산한 gradient 값을 넣으면 된다.
마지막 출력에 대한 gradient는 1이다. 이건 항상 첫 단계이다.
그리고 L2 이전의 중간 변수인 q에 대한 gradient를 찾기를 원한다. q는 2차원 벡터이다.
궁극적으로 q의 각각의 요소가 f의 최종값에 어떤 영향을 미치는지가 궁금한 것이다.
f를 q에 대해 편미분함으로써 공식을 얻고, 대입하여 gradient를 구할 수 있다.
벡터의 gradient는 항상 원본 벡터의 사이즈와 같다!
그리고 gradient의 각 요소는 함수의 최종 출력에 얼마나 특별한 영향을 미치는지를 의미한다.
그리고 W의 gradient는 다음과 같이 구할 수 있다.
x초록의 0.2 *초록끼리 계산하면 W gradient의 1행이 나오고
x초록의 0.4 *초록끼리 계산하면 W gradient의 2행이 나온.
x의 gradient를 구하는 방법이다.
위는 모두 Jacobian을 계산한 것이다.
Forward pass에서는 노드의 출력을 계산하는 함수를 구현하고
Backward pass에서는 gradient를 계산한다.
Forward pass의 값(연산 결과)은 이후에 backward pass에서 자주 사용하기에 저장해야한다.
< Neural Network >
첫 번째로 W1과 x의 행렬곱이다. 그리고 이것의 중간값은 얻고, 가지고 있는 max(0,W)의 비선형 함수를 통해 선형 레이어 출력의 max를 얻는다.
기본적으로 광범위하게 말하면 신경망은 함수들의 집합(class)이다.
비선형의 복잡한 함수를 만들기 위해서 간단한 함수들을 계층적으로 여러개 쌓아올린 것이다.
( 계층적 계산으로 이루어져있음 )
W1은 입력과 직접적으로 연결되어 있어 나타나는 것이고, w2는 h의 스코어가 된다.
W1은 많은 다른 종류의 템플릿(빨간 차, 노란 차)이 될 수 있다. W2는 모든 템플릿의 가중치를 합한 것이다. 특정 클래스에 대한 최종 스코어를 얻기 위함이다. 여러 템플릿의 가중치를 합할 수 있게 해준다.
h(스코어 함수)는 W1에서 가지고 있는 템플릿에 대한 스코어 값이다. W1의 각 템플릿이 얼마나 많은지를 나타내주는 것이고 W2는 이들 모두에 가중치를 부여하고 모든 중간중간 점수를 더해 클래스에 대한 최종 점수를 얻는 것이다.
우리가 가지고 있는 벡터 행렬 형태의 출력은 비선형성을 가진다. 여기서 사용한 F는 Sigmoid 함수 이다. 데이터는 x로 받고 첫 번째 행렬 곱 w1은 가장 윗줄에 있다. 비선형성을 적용한 다음, 두 번째 히든 레이어 h2를 얻기 위한 두 번째 행렬곱을 한다. 그리고 최종 출력을 얻는다.
728x90
반응형