-
[CS231n] 4강 Backpropagation and Neural NetworksStudy/CS231n 2020. 10. 31. 17:15
이번 강의에서는 기본적인 Nerual Network의 형태와 Backpropagation(오차역전파)에 대해 배운다.
앞에서 배운 것들을 그림으로 표현하면 다음과 같다. Computational graphs라고 한다. Backpropagation을 하는데 이런 식으로 접근하면 이해하기 쉽다.
강의에서 예시와 관련된 하나하나 설명으로 슬라이드가 많은데 나는 최종적인 슬라드를 가져왔다. gradient를 이용하여 가중치를 업데이트 시키는 과정에서 backpropagation을 사용하는데 예를 들어 설명하겠다.
말 그대로 거꾸로 접근하는 것이다. output인 f부터 생각하는 것이다.
그 전에 X가 output인 f에 미치는 영향, y가 f에 미치는 영향, z가 미치는 영향을 생각해보자.
각각 편미분으로 표현하면 df/dx, df/dy,df/dz로 표현 할 수 있다.
q = x+y 이고 f = qz 이다.
덧셈연산과 곱셈연산에 대해 미분을 해보자.
위 그림에서 알 수 있듯이 덧셈연산에서 미분 값은 1이고, 곱셈연산에서는 서로의 값을 가지게 된다.
이제 위의 그림의 값으로 예를 들어 설명해보자.
각 값이 최종값인 f에 영향을 미치는 정도를 파악하기위해 gradient 계산을 한다. F는 당연히 f에 영향을 미치는 값이 1이다.
z가 f에 영향을 미치는 정도를 보자. f = qz , 곱셈형태이다. 즉 값은 q 값, 3이다.
q가 f에 영향을 미치는 값을 보면 당연히 z 값인 -4가 된다.
이제 y와 x를 생각해보자.
여기서 문제가 있다. q와 z는 y와 직접적으로 연결되어 있지만 x,y는 그렇지 않다.
이 문제를 해결하기 위해 Chain rule를 사용한다.
x -> q -> f 순서이 므로 x가 q에 미치는 영향 * q가 f에 미치는 영향을 계산해주면 된다. x + y 의 미분은 1로 구했다. 이 값을 local gradient라고 부른다. y와 x 가 q 에 미치는 영향은 값이 1이다. 그래서 1*q의 값(-4)를 하면 -4 가 된다.
이렇게 해서 모든 값을 구할 수 있다.
qx나 x+y 같은 미리 구할 수 있는 미분 값을 local gradient 라고 한다. local 값과 넘어온 gradient 를 global gradient 라고 하는데 곱해서 gradient를 계산한다.
local gradient를 들어오는 입력에 대한 출력의 기울기라고 생각해도 된다. 각 노드는 local 입력을 받고 다음 노드로 출력값을 보낸다.
조금 더 심화된 내용의 시그모이드 함수이다. 밑에 값들은 local graidnet의 식이다. 4개가 된다.
맨 처음 grdient 는 1이다. 1.37값 기준으로 global gradient 는 1이다. 그리고 f(x) = 1/x 니까 local gradient는 -1/x^2가 된다. 여기서 x 값은 1.37이므로 -1/1.37^2 * 1 = local * global을 하면 원하는 gradient가 나온다. 값은 -0.53이다.
다음 0.37 기준으로 global gradient는 아까의 출력값인 -0.53이 되고 f(x) = c+x 의 df/dx =1 즉 local gradient는 1이므로 1*-0.53 = -0.53이라는 gradient가 나온다.
이런식으로 쭉 구해주면 다음과 같은 값을 구할 수 있다.
시그모이드 함수 미분이다.
시그모이드 함수 같은 경우 sigmoid gate라고 네모친 부분을 하나하나 구할 필요가 없고 위에 있는 미분 식을 이용해 한번에 표현 할 수 있다. 일반화 하면 (1-sigmoid) * (sigmoid) 로 표현 할 수 있다.
sigmoid gate 들어가기 전 값인 0.73으로 계산을 하면 (1-0.73) * 0.73 = 0.2로 바로 구할 수 있다.
gradient의 특성이다. add 는 local gradient가 1이다. 즉 입력값인 global gradient가 그대로 나오게 된다. 그래서 distributor라고 부른다고 한다.
max gate가 있다. 말 그대로 큰 값에게 gradient를 전하고 작은 값은 0으로 만들어서 보낸다. gradient router 라고 부른다.
mul 은 위에서 말했듯이 서로의 값을 가진다. 즉 스위칭이라는 표현을 써서 mul gate를 switcher라고 부른다.
x,y,z가 숫자가 아닌 vector를 가지고 있다고 생각하자. 차이는 gradient가 jacobian 행렬이 된다는 것이다. 각 요소의 미분을 포함하는 행렬이 된다.
간단하게 jacobian을 설명하자면 복잡하게 얽혀있는 식을 미분을 통해 linear approximation시킴으로써 간단한 근사 선형식으로 만들어 주는 것이다. 만약 이 변수가 다변수 형태이면 미분 값이 scalar 가아닌 행렬 형태로 나올 것이다.
행렬의 값들은 각 요소의 미분을 포함하는 값이다.
Wikipedia의 정의는 "The Jacobian matrix is the matrix of all first-order partial derivatives of a vector-valued function" 이다.
쉽게 생각하면 다 변수 함수일 때의 미분값이다.
jacobian matrix에 대해 정확히 몰라 자료를 찾아보고 정리해보았다.
jacobian matrix의 크기는 어떻게 될까? 4096*4096이다. 너무 크다. 만약 minibatch 를 추가하면 그 값은 더더욱 거대해진다. 실용적이지 못하다.
실제로는 계산하지 않고 출력에 대한 x의 영향과 이 값을 사용하고 계산 되어 나온 gradient를 채워 넣는 것이라고 생각하면 된다.
관련된 vectorized example를 보자.
global 은 1이고 local gradient 는 2q이다. 따라서 값은 0.44,0.52를 구할 수 있다.
dWi,j일 때 dqk를 구해보자. 즉 w가 q에 미치는 영향인 gradient를 구한다.
1k = ixj 라는 식이 나온다. 이거는 k가 I일때는 1이고 아닌것은 0으로 둔다. 이유는 행렬에서 값을 계산할 때
각 행을 계산시에 다른 행은 관여를 하지 않게 하기 위해서이다. i는 행 j 는 열이다.
밑에 식은 chain rule을 적용한 것이다. 복잡해 보이지만 다차원일 뿐 원리는 똑같다.
Always check라고 표시 되어 있는데 변수에 대해 gradient를 항상 체크하는 것이 중요하다고 한다. 변수와 같은 shape를 가지고 있다. gradient가 무엇인지 계산을 했으면 결과가 변수의 shape와 동일한지를 체크 해야 한다.
계산하면 다음과 같다.
코드화 하면 다음과 같다. backward 일때는 x일 때는 y값 y일대는 x 값을 구한다. 스칼라는 그냥 하고 벡터는 전치를 이용하는데 python 은 numpy의 T라는 연산을 사용하면 된다.
Neural Networks
우리는 처음에 f = wx 단순한 linear한 score 값을 구하는 식을 사용했다.
2-layer , 즉 중간에 hidden layer 가 추가 되었다고 생각하면 3072의 데이터가 w1와 곱해지고 h노드에 들어가고 다시 10개의 출력값을 나오게 한다. 우리는 과거에 하나의 분류기만 이용했다면 이제 hidden 노드에 따라 더 많은 분류기를 가질 수 있다.
layer가 하나 더 있다면?? 다음 그림과 같다.
2-layer 코드이다. 밑바닥부터 시작하는 딥러닝에서 이와 관련된 코드 구현을 해봤으므로 참고만 하고 넘어간다.
뉴런은 사실 신경망이다. 하나의 input이 들어오면 axon을 거쳐서 다른 뉴런으로 들어간다.
우리가 여태까지 생각한 layer와 같은 맥락으로 보면 된다.
input, activation function, 가중치인 W, cell body 등 우리가 배웠던 개념을 적용 할 수 있다.
다양한 Activation functions 이다. 뒤에 강의에서 자세히 설명한다.
앞에 봤던 2-lyaer와 3-layer가 fully 하게 connected 되어 있다고 해서 Fully-connected layer 라고 한다.
CNN이나 뒤에 많은 이미지 모델에서 나오는 개념이므로 중요하다고 생각한다.
다음 강의에서는 CNN에 대해서 자세히 배울 예정이다.
'Study > CS231n' 카테고리의 다른 글
[CS231n] 6강 Training Neural Networks I (0) 2020.11.14 [CS231n] 5강 Convolutional Neural Networks (0) 2020.11.14 [CS231n] 3강 Loss Functions and Optimization (0) 2020.10.24 [CS231n] 2강 Image Classification (0) 2020.10.17 [CS231n] 1강 Introduction to Convolutional Neural Networks for Visual Recognition (0) 2020.10.09