딥러닝 학습방법 이해하기


신경망을 수식으로 분해해보자
행벡터 $O_i$
는 데이터 $X_i$
와 가중치 행렬 $W$
사이의 행렬곱과 절편 $b$
벡터의 합으로 표현된다고 가정해보자.
- 행렬은 (1) 데이터를 모아 놓은 행렬(
$X$
)과 (2) 데이터를 다른 공간으로 보내주는 연산자($W$
) 역할이 있다.
이는 d개의 변수로 p개의 선형모델을 만들어 p개의 잠재변수를 설명하는 모델을 의미한다.
화살표로 해당하는 것이 가중치 행렬
$W_{ij}$
이다.화살표의 개수는 d*p개이다. 즉, 가중치 행렬의 원소가 화살표의 값을 의미한다.
주어진 데이터가 특정 클래스에 해당하는지 분류하는 문제를 풀 때는 특별한 연산자가 필요로 하다.
- 그 중 하나인 softmax 연산자는 특정 벡터가 어떤 클래스에 속할 확률인지를 계산할 수 있어 분류문제에 자주 활용한다.
softmax
함수를 코드로 구현하다 보면 overflow 현상이 나타날 수 있어np.max
를 먼저 계산해준 후 지수함수(np.exp
)를 적용해준다.
이렇게 선형모델의 결과물을 원하는 의도로 바꿔서 해석하고자 활성함수(activation function)을 이용한다.
활성함수는 선형모델이나 어떤 행렬법을 사용하지 않는 비선형 함수이다.
선형모델로 나오게 되는 출력물 각각의 원소에 활성함수를 적용한다.
선형모델에서 나온 출력물을 비선형 모델로 변환시킨 벡터를 **잠재벡터(latent vector) 혹은 히든 벡터(hidden vector)**로 부른다.
**이런 벡터들을 뉴런(neuron)**이라고도 부르는데, 뉴런으로 이루어진 모델을 **신경망(neural network)**이라고 부른다.
선형모델에서 나온 출력물에 활성함수를 한번 씌운 것이 **퍼셉트론(perceptron)**이다.
활성함수는 $\mathbb{R}$
위에 정의된 비선형(nonlinear) 함수로서 실수 값을 입력으로 받아 실수 값을 출력한다.
활성함수를 쓰지 않은 딥러닝은 선형모형과 차이가 없다.
시고모이드(
sigmoid
) 함수나tanh
함수는 전통적으로 많이 쓰이는 활성함수지만 딥러닝에서는ReLU
함수를 많이 쓰고 있다.
신경망은 선형모델과 활성함수를 합성한 함수이다.
다층(multi-layer) 퍼셉트론(MLP)는 신경망이 여러층 합성된 함수이다.
MLP의 파라미터는 L개의 가중치 행렬
$W^{1}, W^{2}, ... W^{L}$
로 이루어져 있다.$l=1, .., L$
까지 순차적인 신경망 계산을 순전파(forward propagation)이라 부른다.
딥러닝 학습원리: 역전파 알고리즘
이론적으로 신경망은 모든 연속함수를 근사(Universal Approximation Theroem)할 수 있다. 하지만, 층이 깊을수록 목적함수를 근사하는데 필요한 뉴런의 숫자가 훨씬 빨리 줄어들어 좀 더 효율적으로 학습이 가능하다.
- 층이 깊으면 좀 더 복잡한 함수를 근사할 수 있지만 최적화가 어려워진다.
딥러닝은 역전파(backpropagation) 알고리즘을 이용하여 각 층에 사용된 파라미터 $\{ W^{(l)}, b^{l}\}_{l=1}^L$
를 학습한다.
각 층에 존재하는 파라미터들의 미분을 계산(경사하강법)해서 업데이트를 진행한다.
이에, 손실함수를
$\mathcal{L}$
이라 했을 때 역전파는$\frac{\partial\mathcal{L}}{\partial W^{(l))}}$
정보를 계산할 때 사용된다.각 층 파라미터의 그레디언트 벡터는 윗층부터 역순으로 계산된다.
여기서, 연쇄법칙(chain-rule)은 합성함수 미분법의 성질을 의미한다.
합성함수를 미분할 때 꼬리에 꼬리를 물어 겉함수에서 속함수를 곱하는 과정을 거치는데 이를 chain으로 표현 것이다. (겉미분*속미분
)
$$f = (x+y)^2 \rightarrow f^\prime = 2(x+y) \cdot 1$$
$$ f = { (x+y)^3 + z }^2 \rightarrow f^\prime = 2{(x+y)^3+z } \cdot 3(x+y) \cdot 1$$
- 위 합성 함수의 미분 과정을 수식으로 표현하면 다음과 같다. 즉, z함수를 x에 대해 미분한 결과는 z함수를 y에 대해 미분한 결과와 y함수를 x에 대해 미분한 결과를 곱하여 구할 수 있다.
$$z = g(y), y=f(x)$$
$$ z = (g \circ f)(x) \rightarrow (g \circ f)^\prime(x) = g^\prime(y)f^\prime(x) $$
$$\rightarrow \frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx}$$
즉, 역전파 알고리즘은 합성함수 미분법인 연쇄법칙 기반 자동 미분(auto-differentitation) 을 사용한다.
예제: 2층 신경망의 역전파 알고리즘
첫번째 층에 해당하는 $W^{(1)}$ 행렬에 대한 그레디언트 벡터를 계산해라.
먼저, 다음과 같이 $W^{(1)}$
에 대한 손실 함수에 대한 미분 문제로 정의한다.
$$\nabla_{W^{1}}\mathcal{L} = (\nabla_{W^{1}}Z)(\nabla_{Z}h)(\nabla_{h}O)(\nabla_{O}\mathcal{L}) $$
$$\leftrightarrow \frac{\partial\mathcal{L}}{\partial W{ij}^1}=\sum{l, r, k}\frac{\partial\mathcal{L}}{\partial O_l}\frac{\partial O_l}{\partial h_r}\frac{\partial h_r}{\partial z_k}\frac{\partial zk}{\partial W{ij}^1}$$
이제 순서대로(위에서부터) 미분을 계산해보자. $W^{(1)}$
은 행렬임으로 각 성분에 대한 편미분을 계산해야 한다.
$$\frac{\partial O_l}{\partial h_r} = W_{rl}^{2}, \; \frac{\partial h_r}{\partial z_k} = \sigma^\prime(z_k)\delta_{rk}$$
$$\frac{\partial z_k}{\partial W_{ij}^1} = \frac{\partial}{\partial W_{ij}^1}\sum_{i}x_iW_{ik}^{1} = x_i\delta_{jk}$$
즉, $W^{(1)}$
에서 각 원소에 대한 그레디언트를 계산하는 식은 다음과 같다. $\delta_{rk}, \delta_{jk}$
때문에 r=k=j만 남는다.
$$\frac{\partial\mathcal{L}}{\partial W_{ij}^1} = \sum_{l, r, k} \frac{\partial\mathcal{L}}{\partial O_l} W_{jl}^{(2)} \sigma^\prime(z_j)x_i$$
참고자료
Subscribe to my newsletter
Read articles from Sunghoon Kim directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
