티스토리 뷰

Luanbot-factory/Stanford CNN

CNN Lecture 4.

Lunabot87 2019. 7. 2. 17:43

Lecture 4 review

이전 Lecture 3 에서는 Gradient desent를 푸는 방법으로 $Numerical$와 $Analytic$적인 방법이 있다고 했다.

$Numerical\ Gradient$ 방법은 수치계산적 방법이며 아래수식을 통해 값을 구한다.

 

 

이와 같은 방법은 느리고(Slow), 근사치(Approximate)를 나타내지만 쉽게 사용할수있다(Easy to Write)는 특징이 있다.

$Analytic\ Gradient$방법은 일반적은 우리가 손을 푸는 미분을 이용한 방식으로 $f = x^2 \rightarrow df/dt = 2x$ 로 변환하여 값을 구한다.
이는 빠르고(Fast), 정확한값(exact)을 가지만, 에러를 발생시킬수 있다(Error-Prone)는 특징을 가진다.

이전 시간까지 배운 $Score\ Function$과 $Loss\ Function$, $Regularizatioin$을 이미지화 시키면 다음과 같이 나타낼 수 있다.

 


이를 간락하게 설명하면, $x$는 $input$, $W$는 $Weight$을 나타내며 $f$함수를 통해 $s(Score)$값이 나오면 이를 비선형방적식인 $Hinge\ Loss$에 넣고 이값에 $R(W)$를 더하여 최종적으로 $Loss\ Score$를 출력하는 것을 나타낸다.

이러한 구조가 여러개 중첩되어 사용되는 것이 $CNN$의 기본 개념이다.
이를 이해하기위해 대표적인 $CNN$방식의 $AlexNet$의 구조를 보면 쉽게 이해할 수 있다.

 

하지만 이렇게 여러개의 $W(Weight)$값을 가지게 될 경우에 어떻게 이를 업데이트를 할 $Gradient$를 구할 수 있을까?
이전 시간과 이번 글 처음에서 $Analytic$한 방법을 주로 이용하여 $Gradent$를 구한다고 하였다. 하지만 이는 모든 수식을 알고 있어야 미분을 할수가 있는데 이를 코드로 변경하게 되면 모든 수식을 손으로 풀어서 값을 구하는 식을 넣어주어야 하므로 불편하기도하고 전체식을 알지 못하면 미분을 할수가 없다. 이러한 문제를 해결하기 위한 방법으로 Backpropagation이라고 하는 방법을 사용하면 쉽게 $Gradient$를 구할 수 가있다.

Backpropagation

이 방법은 간단히 말해 $Chain\ rule$를 이용하여 최종 $Gradient$를 구하는 방법으로 최종 $Loss Score$가 나오는 위치에서 부터 뒤로 이동하면서 구하는 방법이다.
위의 사진은 간단한 예시로써 이를 설명하자면, 끝지점 $f$에서의 $Gradient$는 1로 그 뒤에 있는 $z$지점에서의 $Gradient$를 구하기 위해서는 $df/dz$로 나타낼 수 있다. 이때 $f = qz$이므로 $df/dz= q$임을 알 수 있다. 이제 다음으로 $q$지점에서의 $Gradient$를 구하면 $df/dq = z$이므로 $q$에서의 $Gradient$는 -4가 된다. 이제 $x$와 $y$의 $Gradient$를 구하기 위해 $Chain\ rule$을 사용하게 되는데 $x$에서의 $Gradient$는 $df/dx$로 나타낸다. 이때 이를 $df/dq \times dq/dx$로 나타낼 수 있는데 이를 $Chain\ rule$이라고 하며 이를 통해 $x$의 $Gradient$가 -4임을 구할 수 있다.

이러한 방법을 통해 우리는 $W$를 업데이트 하기 위해 사용하는 $Gradient$값을 전체적인 수식을 알지 못하더라도 역순으로 $Chain rule$을 통해 구할 수 있게 되었다.(다음그림은 $Backpropagation$의 도식화된 모형이다.)

 

 

추가적으로 $Backpropagation$을 이용할때 하나의 수식으로 묶을수 있는 것은 묶는것이 좋다고 한다. 이는 수식전체를 간략화 시키기도 하며 때로는 계산의 양을 줄여주기도 하여 긍정적인 효과를 이끌어 내지만, 반드시 필수적인 부분은 아니다.

 

 


위 그림은 대표적인 비선형 함수인 $Sigmoid\ function$으로 수식을 묶어 계산을 간략화 시킨 예이다.

또한 몇몇개의 $Backward Flow$들은 패턴을 가지는데 대표적으로 다음 3개를 예시로 들 수 있다.
Add gate : Gradient distrubutor(Local Gradent 분배)
Max gate: Gradient router(업데이트 될 Flow 크기에 따라 0과 Local Gradient로 분배)
Mul(Multiply) gate : Gradient switcher(Local Gradient를 반대의 Flow의 곱의 값을 가짐)

$Backpropagation$에서도 두개의 $Flow$들이 하나로 합쳐지는 형태가 생기는데 이는 아래의 사진과 같은 형태이다.

 

 

이제 이를 이미지에 접목시키기 위해 모든 /W/값과 $x$값 등을 $Vectorized$시키면 각 $Flow$의 $Gradient$는 $Jacobian\ Matrix$의 형태를 가지게 된다.

 

 

이를 이해하기 위해 예시를 살펴보면 다음과 같다.

 

 

위 그림은 4096개의 데이터가 들어가 $f(x) = max(0,x)$의 연산을 지나 4096개의 데이터를 출력한다. 이를 보면 $f(x)$의 $Jacobian\ Matrix$의 크기는 4096x4096임을 할 수 있다. 이러한 구조는 $minibatch$를 100개를 사용 했을대 연산의 양이 409,600x409,600번을 해야한다는 것을 알 수 있으며, $Max\ Function$의 특성상 $Diagonal\ matrix$형태임을 유추할 수 있다.

마지막으로 $Vectorized\ example$과 구현된 간략한 코드를 보고 $Backpropagation$을 마무리 하겠다.

 

 

 

 

사실 $Backward$방식의 $Gradient$를 구하는 함수들은 이미 Caffe layers나 tensorflow 등에 구현이 되어있어 직접 수식을 계산하는 코드를 작성하지 않고도 라이브러리를 활용하여 그 값들을 구할 수 있다.

Neural Networks

지금 까지 우리는 $Neural\ Networks$를 배우기 위한 기초 단계를 공부하였다. 이전까지 배운 $Function$들은 $Linear\ score\ function$으로 선형적인 값을 이끌어 내지만 $Neural\ Networks$에서는 비선형 수식이 더해져 적층 구조의 형태를 가지게 된다.

 

 

Neural Network : Architectures



위의 사진을 보면 간단하게 표현이 되어있는데, 이때 $x$가 $Input\ Date$라고 하면 $W1$을 곱하여 Hidden layer인 $h$를 생성한다. 이때 $h$의 경우 그 크기$(node)$가 정해져 있지 않고 사용자가 정하기에 따라서 달라지는 $Hyperparameter$이다. 예시로 들자면 이전 시간 마지막에 나온 이미지를 색상 히스토그램으로 나타내는 과정을 말한다고 생각하면 된다. 이렇게 나온 $h$에 비선형 함수$(Nonlinear\ function)$적용한 뒤 최종적으로 $W2$를 통해서 $Score$값을 나타내게 된다. 결과적으로는 $Input$과 $Output$만 정해둔 크기로 일치시키기만 하면 내부의 $h(Hidden\ layer)$의 크기$(node)$는 중요치 않다. 여기서는 비선형성을 예시로 들기위해 $Max\ function$을 예시로 들었지만 다른 비선형 함수를 이용하여도 된다.

 

대표적인 비선형 함수



비선형 함수$(Nonlinear\ function)$을 사용하는 이유는 만약 이를 사용하지 않을 경우 $Neural\ Network$는 $f = W2\cdot W1\cdot x$의 구조를 가지므로 결국 새로운 방향의 값을 가지지 못하게 되므로 $Nonlinear\ function$을 적용하는 것이다.

 

2-layer Neural Network example code



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30