티스토리 뷰

Luanbot-factory/Stanford CNN

CNN Lecture 4.

Lunabot87 2019. 7. 2. 17:43

Lecture 4 review

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

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

 

 

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

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

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

 


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

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

 

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

Backpropagation

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

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

 

 

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

 

 


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

또한 몇몇개의 BackwardFlow들은 패턴을 가지는데 대표적으로 다음 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시키면 각 FlowGradientJacobian 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



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

 

대표적인 비선형 함수



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

 

2-layer Neural Network example code



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/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