CS231n | 4강 - Introduction to Neural Networks
[CS231n] Lecture-4-Introduction-to-Neural-Networks
4강 Video 바로가기
- Contents
- Backpropagation
- Multi-layer Perceptrons
- The neural viewpoint
Review
지난 시간에 우리는 Loss function으로 ‘우리가 만든 스코어가 얼마나 잘 만들어졌는지’ 정량화하는 것에 대해 배웠다. 우리는 간단한 모델을 선호하기 때문에 더 나은 모델의 일반화를 위해 Regularization을 추가한다.
그리고 우리는 이 Loss를 낮추기 위해 가장 가파른 내리막 방향으로 내려가는데 이것을 gradient descent method라고 한다. w의 gradient를 찾아서 Loss 풍경의 가장 낮은 지점으로 단계적으로 내려간다.
또한 이 gradient를 계산하는 방법에 대해 배웠다. 오늘은 Computational Graphs를 사용해서 Loss fucntion의 gradient를 계산하는 방법에 대해 배울 것이다.
Backpropagation
이 Computational Graphs는 반복적으로 chain rule을 사용해서 gradient를 구하는 Backpropagation 방법에 유용한데, 특히 아주 복잡한 함수에 적용하는데에 매우 유용하다. 예를들어 아주 많은 레이어를 거치는 Convolutional Network에 적용하는데에 유용하다.
chain rule을 사용해서 gradient를 구하는데 기본적으로 [local gradient] X [upstream gradient] 의 방법으로 gradient를 구한다.
가장 마지막 graph node부터 구하는데, gradient를 구하는 예시를 들겠다. 마지막 gradient는 당연히 1이다. \(f(x)=\frac{1}{x}\) 일때 \(\frac{df(x)}{dx} = - \frac{1}{x^2}\) 이므로 \(\frac{df(x)}{dx} \frac{dx}{dx} = [LocalGradient][UpstreamGradient] \\ = (\frac{-1}{1.37^2})(1)=-0.53\) 이다.
그 다음 node의 gradient를 구하면 \(g(x)=x+1\)
\[\frac {dg(x)}{dx} = 1\]이므로 chain rule을 이용하면 \(\frac {df(g(x))}{dx} = \frac{dg(x)}{dx} \frac {df(x)}{dg(x)} \\ = [LocalGradient][UpstreamGradient] \\ = (1)(-0.53) \\ = -0.53\) 이다.
이러한 방법으로 가장 끝에 있는 node(w)에 관한 gradient를 구할 수 있다.
하나하나 다 쪼개서 가장 간단하게 그래프를 나타내고 gradient를 구할 수도 있지만 표현할 수 있다면 묶어서 하나의 node로 나타내도 된다. 예를들어 sigmoid 함수는 특별히 아래처럼 미분이 되기 때문에 한번에 sigmoid gate로 표현해서 구할 수 있다.
\(\frac {d \sigma(x)} {dx} = (1 - \sigma(x)) \sigma(x)\) 이를 이용해서
\[\sigma(x)=0.73\]의 값을 넣고 구하면 \((1-0.73) * (0.73) = 0.2\) 으로 gradient를 구할 수 있다.
덧셈, 최대값, 곱셈 연산이 가지는 패턴은 위와 같다.
\(\frac {df} {dx} = \sum_{i} \frac {df} {dq_{i}} \frac {dq_{i}} {dx}\) 특히 덧셈 연산은 x의 각각의 local gradient를 더한 값으로 표현할 수 있다. 이렇게 함수에서 각 변수에 대해서 gradient를 계산하는 방법인 backpropagation에 대해 살펴보았다.
Backpropagation - vectorized gradients
이번에는 vector의 gradient를 살펴볼 것이다. 이때의 유일한 차이점은 gradient가 Jacobian matrix라는 것이다.
먼저 computational graph를 그리고 시작한다
먼저 마지막 gradient는 당연히 1이다. 그리고 \(f(q)=q_1^2+q_2^2\) 이므로 \(\frac{df}{dq_{i}} = 2q_{i}\) 의 벡터이다. 이를 이용해서 W의 gradient를 구하면
\(\frac{dq}{dw}=x \\ \frac{df}{dw}=\frac{df}{dq}*\frac{dq}{dw}=2q_{i}*x_{j}\)
예를들어 많은 딥 러닝 프레임워크를 보면 그 안에 backpropagation을 구현해놨다. Caffe의 코드를 보면 레이어가 computational node로 되어있고 안에는 하나씩 forward backward 연산을 해서 쌓는것이다. 시그모이드 레이어를 보면 gradient를 구하는 부분이 위처럼 생겼다
정리하면 위와 같다. 그 중 핵심은 backpropagation을 적용한 forward, backwar API를 사용해서 레이어의 gradient를 구한다!
Multi-layer Perceptrons
신경망은 사실 오래된 기술이다. 1980~1990년대에 연구되었다. 그런데 현대에 여러가지 문제를 해결하기 위해 쓰이는 CNN, LSTM 등의 기법들을 위해하기 위해서는 이 신경망을 먼저 이해해야한다.
1번째 linear function에 또 linear function을 쌓아서 non linear하게 만든다. 이러한 계층적 다중 레이어 아키텍쳐의 기본이다. DNN(Deep Neural Network)의 뜻은 이러한 Neural network를 깊게 쌓았다는 원초적 의미이다.
The neural viewpoint
인체의 뉴런과 비슷하다. x0이라는 데이터가 들어와서 가중치w0과 시냅스 반응이 나고 이것을 cell body에서 선형 합연산을해서 activation function에 의해 비선형으로 내보낸다. 그리고 이를 다음 뉴런으로 전달해준다.
그러나 인공신경망이 인체의 뉴런과 아예 동일하다고 볼 수 없으므로 주의해야한다.
activation function이 여러개 존재한다. 전통적으로 0~1사이로 리턴해주는 sigmoid가 가장 많이 사용됐으며, 2012년에 등장한 ReLU가 최근에 가장 많이 쓰인다. Leaky ReLU나 ELU등 좀 더 수정된 function도 있다.
fully-connected layer는 벡터로 표현이 가능하고 행렬의 곱인 W*x로 계산이 효율적이다. 따라서 fully-connected layer로 많이 쓰고 있다.
또한 fully-connected layer로 쓰면 hidden layer 하나를 한줄로 간단하게 f() function을 통해 표현이 가능하다는 장점이 있다.
여기까지가 Neural Network에 대한 기본 개괄이었다. 다음 시간에는 드디어 Convolutional Neural Network에 대해서 배울 것이다.