티스토리 뷰

인공지능

[Machine Learning] Neural Networks:Learning

망나니개발자 2018. 1. 13. 22:35
반응형

본 내용은 Coursera에서 Andrew ng 의 Machine Learning(기계학습, 머신러닝)을 수강한 내용을 정리한 것입니다. 이번 장에서는 Cost Function of Neural Networks(신경망의 비용함수)와 Backpropagation(역전파)에 대해서 알아보도록 하겠습니다.


1. Cost Function


[ Neural Network (Classification) ]


우리는 이제 Training Set이 주어졌을 때 Neural Network(신경망)의 Cost Function과 그 Parameter $\theta$ 를 구해주어야 합니다. 예를 들어 위의 그림과 같은 Neural Network와  ${ (x^{(1)}, y^{(1)}), ..., (x^{(m)}, y^{(m)}) } $ 의 Training Set이 있다고 할 때, Cost Function을 정의하기 위해 다음과 같은 Notation을 정의하겠습니다.

  • $L =$ total num of layers in network

  • $s_l =$ num of units (not counting bias unit) in layer $l$

  • $k =$ num of units in output layerRecent resurgence: State-of-the-art technique for many applications

예를 들어 $s_1 = 3, s_2 = 5, s_3 = 5, s_4 = s_k = 4$ 와 같이 사용할 수 있습니다. Classification 문제는 Binary Classification 문제와 Multi-class Classification(K Classes) 문제로 나뉘어지는데, 이를 정리하면 아래와 같습니다.



Binary Classification은 1개의 Output Unit을 가지며 그 값이 실수이지만 Multi-class Classification은 K개의 분리된 클래스들에 대해 각각의 Output Unit을 가지므로 총 K개의 Output Units를 갖게되며 그것이 실수가 아닌 K차의 Output Vector $h_\theta(x)$ 이며, K는 바이너리가 아니므로 $k \geq 3$ 을 만족합니다.

[ Cost Function ]

Neural Networks에서 사용할 Cost Function은 Logistic Regression의 비용함수를 일반화시킨 함수입니다. 이전에는 1개의 Output Unit만을 가졌지만 우리는 k개의 Output을 가질 것이며 그 비용함수는 다음과 같습니다. $$ h_\theta(x) \in \mathbb{R}^k, \quad \left( h_\theta (x) \right)_i = i^{\mathrm{th}} \text{ output} $$ $$ J(\theta) = -\frac{1}{m} \left[ \sum_{i=1}^{m} \color{red}{ \sum_{k=1}^{K} } y_{\color{red}{k}}^{(i)} \log { {\left( h_\theta ( x^{(i)} ) \right)}_{\color{red}{k}} } + \left( 1-y_{\color{red}{k}}^{(i)} \right) \log \left( 1-h_\theta ( x^{(i)}) \right)_{\color{red}{k}} \right] + \frac{\lambda}{2m} \color{red}{\sum_{l=1}^{L} \sum_{i=1}^{s_l}} \sum_{j=1}^{n} \color{red}{(\Theta_{ji}^{(l)})^2} $$ 여기서 $ h_\theta (x) $ 는 k차원의 행렬이며 $h_\theta (x)_i $ 는 행렬의 i번째 요소입니다. 위의 Cost Function은 각각의 Output Unit $ h_\theta (x) $ 를 모두 더한 것입니다. 그리고 가중치값은 1~l-1번째 layer 까지 존재하는 모든 가중치를 일일이 더해준 것입니다.


2. BackPropagation Algorithm


[ Gradient Computation ]

$$ J(\theta) = -\frac{1}{m} \left[ \sum_{i=1}^{m} { \sum_{k=1}^{K} } y_{k}^{(i)} \log { {\left( h_\theta ( x^{(i)} ) \right)}_{k} } + \left( 1-y_{k}^{(i)} \right) \log \left( 1-h_\theta ( x^{(i)}) \right)_{k} \right] + \frac{\lambda}{2m} {\sum_{l=1}^{L} \sum_{i=1}^{s_l}} \sum_{j=1}^{n} {(\Theta_{ji}^{(l)})^2} $$이제 우리는 위와 같은 Cost Function을 최소화시키는 알고리즘인 BackPropagation(역전파) 에 대해서 알아보도록 하겠습니다. Gradient Descent 또는 다른 Optimization Algorithm을 사용하기 위해서는 $J(\theta)$ 와 $\frac{\partial}{\partial \theta} J(\theta)$ 을 계산해주어야 합니다. 예를 들어 하나의 Training Example (x, y)가 있는 경우에 우리는 먼저 Forward Propagation을 사용합니다. 그러면 아래의 그림과 같이 각 단계마다 $a^{(i)}$ 를 구할 수 있습니다.


그리고 이제 Partial Derivative Term인 $\frac{\partial}{\partial \theta} J(\theta)$ 을 위한 BackPropagation을 해주어야 합니다.


[ Gradient Computation: Backpropagation Algorithm ]

Backpropagation을 위해 우리가 매 노드마다 계산해주어야 하는 값이 있는데 다음과 같다. $$ \delta^{(l)}_{j} = ``\text{error}" \text{ of node }j \text{ in layer }l $$ 여기서 a는 activation value로 가중치가 더해진 값이므로 $ \delta^{(l)}_{j}$ 는 실제 값과의 오차를 의미합니다. Input Layer에서부터 시작하여 Output을 구하는 Forward Propagation과 달리 Back Propagation은 Output Layer에서부터 $\delta$ 의 값을 구해나가는데 그때의 공식은 아래와 같습니다. 


여기서 .*은 element y's multiplication입니다. 그리고 수학적 증명에 따르면 $g'(z^{(3)}) = a^{(3)} .* (1- a^{(3)})$ 과 같습니다. 또한  $\delta^{1}$ 은 Input Layer이므로 $\delta^{2}$ 까지만 계산해주면 됩니다. 즉 BP는 Error($\delta$ )를 Output Layer에서 먼저 구하고 역순으로 Input Layer를 향해 $\delta^{i}$ 를 $\delta^{2}$ 까지 계산해주면 됩니다. 그리고 이렇게 점점 뒤로 진행된다는 점에서 BackPropagation이라는 이름이 붙게 되었습니다. 그리고 이러한 과정을 거쳐 나오게 된 것은 다음과 같습니다. $$\frac{\partial}{\partial \theta_{ij}^{l}} J(\theta) = a_j^{(l)} \delta_j^{((l+1)} \quad \quad \quad \text{ignoring } \lambda; \quad if) \lambda=0 $$

[ Backpropagation algorithm ]



${ (x^{(1)}, y^{(1)}), ..., (x^{(m)}, y^{(m)}) } $ 의 Training Set이 있다고 할 때, BP 알고리즘은 다음과 같습니다. 먼저 모든 $\Delta_{ij}^{(l)} = 0$ 으로 set 해줍니다. 여기서 $\Delta_{ij}^{(l)}$ 는 $J(\theta) $의 편미분항(Partial Derivative Term)을 계산하기 위해서 사용되는 요소이며 Accumulator(축적자)로 편미분 값을 계산하기 위한 값들을 저장해두는 저장소입니다. 우리는 1~m까지의 Training Set을 가지고 학습을 시켜야 하며 For루프를 돌아야합니다. $a^{(1)}$ 은 Input Unit 이므로  $a^{(1)} = x^{(i)}$ 로 설정을 해줍니다. 그리고 $a^{(l)}$ 에 대하여 l=2 부터 L까지 Forward Propagation을 수행합니다. 그 다음 실제값 $y^{(i)}$ 를 이용하여 Error에 해당하는 $\delta$ 를 계산해주어어야 하는데 먼저 $\delta^{(L)}$ 을 구하고 Backpropagation Algorithm을 사용하여 L~2 까지 역순으로 계산해줍니다. 그리고 우리는 각 요소마다 편미분 값을 계산하기 위한 $\Delta$ 를 저장해줍니다. 이러한 과정을 1부터 m까지 Training Set에 대해 수행한 후에 for문을 나와서 $\frac{\partial}{\partial \theta_{ij}} J(\theta)$ 에 해당하는 $\Delta_{ij}^{(l)}$ 을 구해주어야 하는데 j=0인 경우는 Bias Term이므로 가중치를 더해주지 않으며 그 외의 경우에는 가중치를 더해줍니다.


3. Backpropagation intuition


[ Forward Propagation ]




BackPropagation을 더 잘 이해하기 위해서 Forward Propagation을 다시 짚고 넘어가도록 하겠습니다. 위의 그림과 같이 2개의 Input Unit과 2개의 Hidden Unit, HiddenLayer 그리고 1개의 Output Unit을 갖는 Neural Network가 있다고 할 때, 먼저 $x_1, x_2$ 의 Input Unit에 Training Example 들을 Set 해줍니다. 그리고 $\theta$ 요소와 함께 $z_i^{(l)}$ 를 구하여주고 Sigmoid Function을 통하여 $a_i^{(l)}$ 까지 Layer 순서대로 차근차근 구하여줍니다. 예를 들어 $z_1^{(3)} -> a_1^{(3)}$ 을 구하는 과정인 $z_1^{(3)} = \theta_{10}^{(2)} x1 + \theta_{11}^{(2)} x a_1^{(2)} + \theta_{12}^{(2)} x a_2^{(2)} $ 은 FP의 한 과정이며, BP 역시도 Flow가 역순이라는 점을 제외하면 상당히 비슷합니다.


[ What is backpropagation doing? ]




1개의 Input Unit $x^{(i)}, y^{(i)}$ 와 1개의 Output 을 가지며 정규화를 무시하는 $(\lambda=0)$ 인 문제에서의 $J(\theta)$ 는 Input Unit에 대한 Cost입니다. $ cost(i) = y^{(i)}\log h_{\theta}(x^{(i)}) + (1-y^{(i)})\log (1-h_{\theta}(x^{(i)}))  $ 이지만 보다 직관적으로 이해하기 위해서 $ cost(i) \approx (h_\theta(x^{(i)}) - y^{(i)})^{(2)}$ 로 생각하도록 하겠습니다. Back Propagation이 하는 역할은 Partial Derivative Term(편미분항)을 위한 l번째 layer의 j번째 Unit의 Error에 해당하는 $ \delta^{(l)}_{j}$ 를 구하는 것으로 FP와 달리 Output Layer에서 Input Layer를 향해 역순으로 진행됩니다. 그리고 다음이 성립합니다. $$ \text{Formally, } \delta^{(l)}_j = \frac{\partial}{\partial z_{j}^{(l)}} cost(i) \quad \text{(for j} \geq 0) \text{  where } cost(i) = y^{(i)}\log h_{\theta}(x^{(i)}) + (1-y^{(i)})\log (1-h_{\theta}(x^{(i)})) $$ 결국 BP가 하는 것은 우리가 Neural Network의 Weight를 얼마나 바꾸어야하는지 오차를 구하는 것으로 Output Layer에서 $\delta_1^{(4)} = y^{(i)} - a_1^{(4)} $ 을 구한 후에 $\delta_2^{(2)} = \theta_{12}^{(2)} \delta_1^{(3)} + \theta_{22}^{(2)} \delta_2^{(3)} $ 그리고 $\delta_2^{(3)} = \theta_{12}^{(3)} \delta_1^{(4)} $ 을 차근차근 구하여 $\delta^{(2)}$ 까지 계산을 하면 됩니다. 여기서 $\delta_0^{l}$ 인 경우는 Bias Unit인 경우이므로 신경쓰지 않아도 됩니다.


4. Gradient Checking


Numerical estimation of gradients ]

BackPropagation을 적용하면서 많은 버그가 발생할 수 있는데, 이를 Gradient Descent나 다른 최적화 알고리즘에 적용하면 Cost Function이 잘 감소하며 아무 문제가 없는 것처럼 보일 수 있습니다. 하지만 성능을 저하시키는 Bug가 있어서 이를 발견하지 못할 수 있는데, 이런 문제들을 해결하기 위해 필요한 것이 Gradient Checking으로 Model들에 항상 적용하여 검사하는 것이 필요합니다.



예를 들어 위와 같은 $J(\theta)$ 가 있으며 파란색 실수의 $\theta$ 에서 Partial Derivative Term을 구한다고 합시다. 그래프 상에서 Partial Derivative Term은 $\theta$ 에서의 접선의 기울기와 같습니다. 그리고 우리는 이 편미분항이 올바른지를 근사값을 이용하여 검사를 하는데  $\theta$ 보다 조금 크고 작은 $\theta - \epsilon$ 와 $\theta + \epsilon$ 을 잡아서 두 점 사이의 기울기를 구하여 Partial Derivative Term과 유사한지 검사를 해보면 됩니다. 이를 수식으로 적으면 다음과 같습니다. $$ \frac{\partial}{\partial \theta} J(\theta) \approx \frac{ J(\theta + \epsilon) - J(\theta - \epsilon)} {2\epsilon}$$ $\epsilon = 10^{-4}$ 정도의 작은 값을 가져야 하지만 너무 작은값을 가지면 Numerical Problem이 발생할 수 있습니다. 위와 같은 방식을 two-side difference라고 하며 $\theta$ 를 기준으로 한쪽으로만 기울기를 측정하는 것을 one-side difference라고 하며 그 식은 다음과 같습니다. $$ \frac{\partial}{\partial \theta} J(\theta) \approx \frac{ J(\theta + \epsilon) - J(\theta)} {\epsilon}$$ 하지만 two-side difference estimate가 $\theta$ 를 기준으로 대칭을 이루므로 보다 정확하며, 이것을 추천하며 선호합니다.


[ Parameter Vector $\theta$ ]

$\theta$ 가 위와 같은 실수가 아니라 Vector인 경우는 어떻게 할까요? 그런 경우에는 아래와 같이 $\theta_0, \theta_1, .... \theta_n $ 인 경우에 대해서 각각의 Gradient Checking을 해주어야 하며 이것은 비용이 상당히 큰 작업입니다. 실제로 BackPropagation보다 Cost가 크며 Expensive 하기 때문에 Gradient Descent가 올바르게 작동하는 것이 검증이 되면 학습 알고리즘을 진행할 때 Gradient Checking의 작동을 꺼주면 됩니다. 그렇지 않으면 우리의 학습 알고리즘은 매우 느리게 동작할 것입니다.




4. Random Initialization


Initial Value of $\theta$ ]

우리는 이제 Neural Network를 학습시키기 위한 많은 것들을 배웠습니다. 이제 Optimization Algorithm을 위한 초기의 $\theta$ 값을 정해주기만 하면 됩니다. 그리고 초기의 값을 0으로 잡는 방법과 Random으로 잡는 방법에 대해서 알아보도록 하겠습니다. 물론 Initial Theta를 0으로 잡으면 Logistic Regression에서만 잘 작동할 뿐 Neural Network에서는 올바르게 작동하지 않습니다.


Zero Initialization ]

위와 같은 Neural Network에서 만약 우리가 모든 i, j, L에 대하여 $\theta_{ij}^{(l)} = 0$ 으로 초기화했다고 가정합시다. 그리고 알고리즘을 따라서 진행을 해보면 다음과 같은 결과를 얻게 됩니다. 

  • $\theta_{01}^{1} = \theta_{02}^{1}$ 
  • $a_1^{(2)} = a_2^{(2)}$
  • $\delta_1^{(2)} = \delta_2^{(2)}$
  • $\frac{\partial}{\partial \theta_{01}^{1}} J(\theta) = \frac{\partial}{\partial \theta_{02}^{1}} J(\theta)$

그리고 이것이 의미하는 것은 같은 색의 선들끼리는 같은 Partial Derivative Term, $\delta$ , $a_j^{(l)}$ 이 유지될 것이고 매번의 업데이트가 끝난후에 Parameter $\theta$ 는 같아지고, Layer의 Feature도 같은 값을 갖게 될 것입니다. 결국 이런 상황이 지속되면서 Hidden Unit이 많은 경우라 하더라도 모든 Hidden Unit이 같은 Feature를 가지며 결국 하나의 Feature를 갖는 Neural Network가 될 것이며 이를 Symmetry Problem이라고 합니다.


Random initialization: Symmetry breaking ]

위와 같은 이유로 우리는 Random Initialization을 사용하여 Symmetry Breaking을 수행합니다. 물론 아래에서 사용되는 $\epsilon$ 은 Gradient Checking의 것과 무관한 값입니다. $$ \text{Initialize each } \Theta^{(l)}_{ij} \text{ to a random value in } [-\epsilon, \epsilon] $$ 


6. Putting it Together


Training a neural network ]


Neural Network를 학습시키기 위해 가장 먼저 해야하는 것은 뉴런들이 연결되어있는 구조 즉, Architecture를 먼저 고르는 것입니다. Neural Network의 Architecture는 Input Unit과 Output Unit의 개수, Hidden Layer와 각 Hidden Unit의 개수에 따라 달라집니다.

  • $L =$ total num of layers in network num of input units: Feature들의 개수( $x^{(i)}$ 의 차수)

  • Num of output units: Class들의 개수

  • Hidden Layer: Default = 1 but if (hidden layer >1)  have same num of hidden units in every layer is better

Input Unit는 Feature들의 개수로, Output Unit의 개수는 Class들의 개수로 이미 정해져있으며 만약 클래스가 $ y \in {1, 2, 3, 4, ... 10} $ 이라고 하더라도 Neural Network의 Output은 5라는 정수가 아니라 1x10의 [0 0 0 0 1 0 0 0 0 0 ] 인 벡터(이것을 세로로 뒤집은 것)입니다. 또한 Hidden Unit의 수는 많으면 많을수록 좋으며, 모든 Hidden Layer가 같은 수의 Hidden Unit의 개수를 지닌다면 성능이 좋습니다. 그리고 Hidden Unit의 개수는 Input Unit과 Output Unit등을 고려하여 상대적으로 산정합니다.


  1. Randomly initialize weights

  2. Implement forward propagation to get $h_\theta(x^{(i)})$ for any $x^{(i)}$

  3. Implement code to compute cost function $J(\theta)$

  4. Implement backpropagation to compute partial derivatives $\frac{\partial }{\partial \theta_{jk}^{(l)} } J(\theta)$

  5. Use gradient checking to compare $\frac{\partial}{\partial \theta}J(\theta)$ computed using backprop vs using numerical estimate of gradient of $J(\theta)$. Then disable gradient checking code

  6. Use Gradient Descent or advanced optimization method with backprop to try to minimize $J(\theta)$ as a function of parameters $\theta$

먼저 $\theta$ 를 0에 근사한 작은 값으로 초기화 합니다. 그리고 임의의 x에 대한 $h_\theta(x^{(i)})$ 를 구하는 Forward Propagation와 $J(\theta)$ 를 구하는 코드, 그리고 Partial derivatives를 구하기 위한 BackPropagation 코드를 구현합니다. 그래서 모든 Training Example (for i=1:m) 에 대하여 학습을 해주어야 하는데 그 안에서 FP와 BP가 수행되며 $a^{(l)}, \delta^{(l)}, \Delta^{(l)}$ 이 구해집니다. 그리고 BP가 올바르게 작동하는지 Gradient Checking을 해준 후 에 정상작동이 확인되면 이를 꺼주면 됩니다. 그리고 최적화 알고리즘을 사용하여 최소의 $J(\theta)$ 를 구해주면 됩니다. 물론 $J(\theta)$ 가 Non-Convex라서 Local Optima로 수렴할 수 있지만 그 값은 Global Optima에 근접한 상당히 성능 좋은 값입니다.


[ Gradient Descent for neural network ]



2개의 Paramter값을 갖는 Neural Network에 대한 Gradient Descent 알고리즘이 수행된다고 할 때, 이 알고리즘이 하는 것은 Random 위치에서 시작하여 내리막길을 따라가며 Optima를 찾는 것입니다. 여기에서 BP가 하는 역할은 Gradient Descent가 내려가는 방향을 체크하는 것입니다. 빨간색 동그리마의 경우는 $y^{(i)} \approx h_\theta^{(i)}$ 로 매우 근사한 것을 알 수 있으며 파란색 동그라미의 경우는 Neural Network의 output과 $y^{(i)}$ 가 매우 다른 상황임을 알 수 있습니다.










관련 포스팅

  1. 기계학습이란? (1/11)
  2. 지도 학습과 비지도 학습 (2/11)
  3. Model and Cost Function (3/11)
  4. Gradient Descent (4/11)
  5. Multivariate Linear Regression (5/11)
  6. Logistic Regression (6/11)
  7. Regularization (7/11)
  8. Neural Networks: Representation (8/11)
  9. Neural Networks: Learning (9/11)
  10. Advice for Applying Machine Learning (10/11)
  11. Machine Learning System Design (11/11)


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/03   »
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
31
글 보관함