봐도 봐도 헷갈리는 뉴럴네트워크
식의 index가 매번 헷갈린다
sigmoid function을 사용하는 neural networks의 objective function (loss function)을 정의하고 derivative를 구해보려고 한다
먼저 sigmoid function의 정의는 다음과 같다
$$ \sigma (t) = {1 \over {1+exp(-t)}} $$
$ \sigma(t) $의 값이 1/2 이상이라면 class 1, 아니라면 class 0으로 구분한다
여기에 우리는 $ x \in \mathbb{R}^D $로 주어지는 input을 사용해야하니까 t 대신 $ w^Tx - b $를 넣어서 사용하자
b는 bias term인데 이 bias term을 없애고 homogenous equation으로 바꾸는 것이 아래와 가능하다
$$ w' = \begin{bmatrix}
w \\
-b
\end{bmatrix} $$
$$ x' = \begin{bmatrix}
x \\
1
\end{bmatrix} $$
$ {w'}^Tx' = w^Tx - b $ 이므로 non homogenous equation을 homogenous equation으로 바꿀 수 있다
식 정의는 더 일반적인 non homogenous equation을 사용하여 해보려고 한다
$ \sigma(w^Tx - b) > {1 \over 2} $인 경우는 class 1, $ \sigma(w^Tx - b) < {1 \over 2} $인 경우는 class 0!
$ w^Tx = \sum_{i=1}^Dw_ix_i $
간단한 예시를 들기 위해 layer는 하나만 사용하였고 그 한개의 layer는 G개의 노드를 갖도록 하였다
$$ g_i(x) = \sigma (\sum_{j=1}^Dw_{ij}x_j-b_i) $$
$$ g(x) = \sigma(\sum_{i=1}^Gw_ig_i(x) -b) $$
이제 우리가 해야할 것은 x값을 넣었을 때 결과가 잘 나오도록 w 값들을 학습시키는 것이다
$ L(w_1, ... w_n, w_{11}, ... ,w_{GD}) = {1 \over 2}\sum_{i=1}^n||g(x_i)-y_i||^2 $라고 L(w)를 만들었을 때 sqaure error가 가장 작도록 하는 w를 찾기 위해 gradient descent를 적용시키려면? 미분값이 필요하다!
w값 업데이트를 위해 필요한 $ {\operatorname{d}\!L\over\operatorname{d}\!w_k}, {\operatorname{d}\!L\over\operatorname{d}\!w_{kl}} $ 를 구해보자
$$ \begin{matrix}
{\operatorname{d}\!L\over\operatorname{d}\!w_k} &=& \sum_{i=1}^n(g(x_i)-y_i){\operatorname{d}\!g\over\operatorname{d}\!w_k}\\
&=& \sum_{i=1}^n(g(x_i)-y_i)g(x_i)(1-g(x_i))g_k(x_i)
\end{matrix} $$
이 과정에서 sigmoid 함수의 미분을 외우고 있으면 좋다
$$ \sigma (t) = {1 \over {1+exp(-t)}}\\
\sigma(t)^\prime = \sigma(t) (1-\sigma(t)) $$
sigmoid 함수의 미분에 chian rule을 적용하여 최종적인 $ {\operatorname{d}\!L\over\operatorname{d}\!w_k} $값을 알아냈다
이제 $ {\operatorname{d}\!L\over\operatorname{d}\!w_{kl}} $ 값을 구해보면 다음과 같다
$$ \begin{matrix}
{\operatorname{d}\!L\over\operatorname{d}\!w_{kl}} &=& \sum_{i=1}^n(g(x_i)-y_i){\operatorname{d}\!g\over\operatorname{d}\!w_{kl}}\\
&=& \sum_{i=1}^n(g(x_i)-y_i){\operatorname{d}\!g\over\operatorname{d}\!g_k}{\operatorname{d}\!g_k\over\operatorname{d}\!w_{kl}}\\
&=& \sum_{i=1}^n(g(x_i)-y_i)g(x_i)(1-g(x_i))w_kg_k(x_i)(1-g_k(x_i))x_l
\end{matrix} $$
이 결과를 구하는데에는 $ {\operatorname{d}\!g\over\operatorname{d}\!g_k},{\operatorname{d}\!g_k\over\operatorname{d}\!w_{kl}} $의 계산이 필요했다
sigmoid 함수의 미분과 chain rule을 적절히 사용하여 위와 같은 결과를 얻었다
이제 모든 w위치의 미분값을 알아냈으므로 gradient descent를 이용해 optimal solution w*을 알아낼 수 있다
이제 figure 1과 같은 특정 경우에 한정된 풀이 말고 확장시켜서 이해해보자
먼저 layer를 여러개 만드는 이유에 대해서 작성해보았다
figure 1에서 G=3라고 하고 boundary를 그려본다면 이렇게 생각할 수 있다
모든 경우를 나타내지는 않지만 간략하게 나누어본다면 $ g_1,g_2,g_3 $값에 따라 어느 공간에 위치하게 되는 지 알 수 있다
이 때 $ g_1,g_2,g_3 $값은 $ x_1, ... ,x_D, w_{11},... w_{3D} $ 값들에 의해 결정되었을 것이다
그렇다면 이제 최종 결과인 g(x)값을 구하기 위해 필요한 값들은 $ w_1,w_2,w_3 $과 b값이다
g(x)가 1/2 보다 큰지 작은지에 따라 class가 결정된다
만약 $ w_1,w_2,w_3 $를 모두 1이라고 하고 b를 0.5라고 하자
그렇다면 위의 예시는 다음과 같은 g(x)와 boundary를 갖게 될 것이다
여기서 $ w_1,w_2 = 1, w_3 = 0.5 , b = 7 $ 이라고 값을 바꾼다면 g(x)와 boundary는 다음과 같이 바뀔 것이다
이렇게 w와 b값에 의해 boundary가 바뀜을 알 수 있다
또한 neural network를 사용하면 복잡한 boundary 모양을 만들 수 있다는 것도 알 수 있다
기존의 $w^Tx $ 만 사용하던 방법은 직선 하나로만 클래스들을 구분했는데 이렇게 layer를 쌓는다면 더 복잡한 boundary를 사용할 수 있다
layer가 복잡한 경우를 생각해보면 아래 그림과 같이 생각해 볼 수 있다
L개의 hidden layer가 존재하고 각 layer는 $ G_i $개의 노드를 가졌다
노드를 자세히 살펴보면 $ g_{l-1,j} $ 번째 노드에 $ w_{l-1,k,j} $의 weight이 곱해져서 $ g_{l.k} $ 에 더해지는 것을 알 수가 있다
L(w)는 아까와 같이 $ {1 \over 2}\sum_{i=1}^n||g(x_i)-y_i||^2 $ 이니까 g에 관련된 식들만 정리해보면 된다
g에 관련된 식들은 크게 세가지로 분류해보았다
최종 결과인 $g(x)$ , hidden layer인 $g_{l,k}(x) $, x값을 바로 받는 첫번째 layer인 $ g_{1,k}(x) $로 분류할 수 있다
먼저 최종 결과를 나타내는 $ g(x) $는 다음과 같이 나타낼 수 있다
$$ g(x_i) = \sigma (\sum_{j=1}^{G_L}w_{L,j}g_{L,j}(x_i)-b) $$
다음으로 중간 layer들은 이렇게 나타내보았다
$$ g_{l,k}(x_i) = \sigma (\sum_{j=1}^{G_{l-1}}w_{l-1,k,j}g_{l-1,j}(x_i)-b_{l,k}) $$
이 식은 figure 6을 보면서 만들면 쉽게 만들어 볼 수 있다
마지막으로 $ g_{1,k}(x) $은 이렇게 나타내었다
$$ g_{1,k}(x_i) = \sigma (\sum_{j=1}^{D}w_{0,k,j}x_j-b_{1,k}) $$
이제 이 식들의 derivative만 구한다면 모든 상황에서 neural networks를 gradient descent를 사용하여 업데이트 할 수 있다
$ {\operatorname{d}\!L\over\operatorname{d}\!w_{kl}} $ 는 위에서 구해봤으니까 아까 구해보지 않았던
$ {\operatorname{d}\!L\over\operatorname{d}\!w_{l,k,j}} $을 구해보려고 한다
이 weight은 l번째 layer에서 j번째 node를 l+1번째 layer의 k번째 node로 더해줄 때 곱해주는 weight인데 단순히 chain rule을 이용해서 이를 찾으려 아래와 같이 계산하면 문제가 있다
$$ {\operatorname{d}\!L\over\operatorname{d}\!w_{l,k,j}} = {\operatorname{d}\!L\over\operatorname{d}\!g} {\operatorname{d}\!g\over\operatorname{d}\!g_L} {\operatorname{d}\!g_L\over\operatorname{d}\!g_{L-1}} ... {\operatorname{d}\!g_{l+1}\over\operatorname{d}\!w_{l,k,j}} $$
문제점은 $g_L$은 이후로 나오는 것들이 벡터라는 점이다
$w_{0,2,2} $의 업데이트를 위해 위의 색깔로 표시된 weight들이 영향을 주는데 단순히 개수로만 봐도 하나가 아닌걸 그림을 통해서도 알 수 있다
따라서 $ {\operatorname{d}\!L\over\operatorname{d}\!w_{l,k,j}} $는 아래와 같이 구해주어야 한다
$${\operatorname{d}\!L\over\operatorname{d}\!w_{l,k,j}} = \sum_{t=1}^{G_{l+2}}...\sum_{p=1}^{G_{L-1}}\sum_{i=1}^{G_L}{\operatorname{d}\!L\over\operatorname{d}\!g} {\operatorname{d}\!g\over\operatorname{d}\!g_{L,i}} {\operatorname{d}\!g_{L,i}\over\operatorname{d}\!g_{L-1,p}} ... {\operatorname{d}\!g_{l+3,m}\over\operatorname{d}\!g_{l+2,t}}{\operatorname{d}\!g_{l+2,t}\over\operatorname{d}\!g_{l+1,k}}{\operatorname{d}\!g_{l+1,k}\over\operatorname{d}\!w_{l,k,j}} $$
쓰면서도 너무 헷갈리는 index들...
아무튼 이제 저 결과를 위해 미리 계산해두면 좋을 식 두개가 있다
$ {\operatorname{d}\!g_{l,k}\over\operatorname{d}\!g_{l-1,p}} ,{\operatorname{d}\!g_{l+1,k}\over\operatorname{d}\!w_{l,k,p}} $이 두 식이 각각 l,k,p에 대해 어떤 식이 되는지 알아두면 sum을 하기 쉽다
$$ {\operatorname{d}\!g_{l,k}\over\operatorname{d}\!g_{l-1,p}}=g_{l,k}(x)(1-g_{l,k}(x))w_{l-1,k,p} $$
$$ {\operatorname{d}\!g_{l+1,k}\over\operatorname{d}\!w_{l,k,p}} = g_{l+1,k}(x)(1-g_{l+1,k}(x))g_{l,p}(x) $$
위에 정의해놓았던 식들을 chain rule과 sigmoid 함수의 미분으로 이렇게 만들 수 있다
너무 복잡하니까 recursive relationship을 $ \delta $를 사용하여 표현해보자
$$ \delta_{l,i} = \sum_{m=1}^{G_{l+1}} \delta_{l+1,m} {\operatorname{d}\!g_{l+1,m}\over\operatorname{d}\!g_{l,i}} $$
이렇게 $ \delta $를 정의해주었다
이 정의를 이용해서 식 정리를 해주면
$$ {\operatorname{d}\!L\over\operatorname{d}\!w_{l,k,j}} = \delta_{l+1,k} {\operatorname{d}\!g_{l+1,k}\over\operatorname{d}\!w_{l,k,j}} $$
이렇게 derivative를 나타낼 수 있다
recursive한 $\delta$ 값들을 구하면서 weight 업데이트를 할 수 있고 이를 backpropagation이라고 한다
이렇게 delta rule을 사용한 backpropagation은 vanishing gradient라는 문제가 생길 수 있다
sigmoid function에서 원점과 멀어지면 미분값이 0에 가까워진다
여러 layer를 사용하게 되면 0이 중간에 생기게 되고 layer가 낮은 곳의 gradient 값은 0에 가까워 업데이트가 힘들다
output layer와 가까운 곳보다 input layer와 가까울 weight이 업데이트가 되어야 효율적인데 backpropagation은 output layer쪽의 업데이트만 많이 생기고 input layer 쪽은 업데이트가 잘 되지 않는 점을 vanishing gradient라고 한다
ReLU 함수를 activiation으로 사용하면 극복된다고 한다
CSE 4007 : Artifical Intelligence ( Hanyang University )
'AI' 카테고리의 다른 글
Logistic Regression (0) | 2021.04.07 |
---|---|
[Kaggle] Titanic Competition 타이타닉 생존자 예측하기 (0) | 2021.01.03 |
Fisher Discriminant Analysis (0) | 2020.10.02 |
Online learning - Perceptron Algorithm (0) | 2020.10.01 |
[Kaggle] Melbourne 집값 예측하기 - 4 Pipelines (0) | 2020.06.15 |