머신 러닝

[머신러닝 코세라 강의] (5주차) "뉴럴 네트워크" Machine Learning (by Andrew Ng)

마빈 Marvin 2022. 6. 14. 07:30

 

이번 주차에서는 파라미터 추정을 위한 구체적인 방법론을 배웁니다. Backpropagation 알고리즘과 forward propagation 알고리즘을 직관적으로 이해하고, 이를 통해 파라미터를 추정하는 스텝을 배웁니다. 

 

 

Cost Function and Backpropagation

Cost Function

Cost Function in Logistic regression (Regularized version):

$$J(\theta) = -\frac{1}{m} \sum_{i=1}^m [ y^{(i)} \times \log ( h_\theta (x^{(i)})) + (1-y^{(i)}) \times \log(1-h_\theta (x^{(i)}))] + \frac{\lambda}{2m} \sum_{i=1}^n \theta^2_j $$ 

 

뉴럴 네트워크에서의 Cost Function: 

$$J(\Theta) = -\frac{1}{m} \sum_{i=1}^m \sum_{k=1}^K \Big[ y_k^{(i)} \times \log((h_\Theta (x^{(i)} ))_k ) + (1-y_k^{(i)} ) \times \log ( 1 - ( h_\Theta ( x^{(i)} ) )_k )  \Big]$$ $$+ \frac{\lambda}{2m} \sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} ( \Theta_{j,i}^{(l)}  )^2$$

 

뉴럴 네트워크의 cost function 은 로짓 함수에서의 cost function 과 유사하나 레이어 만큼 파라미터들이 더 많습니다. 

 

Forward Propagation 은 다음과 같습니다

$$a^{(1)}=x \text{ : input} $$

$$a^{(2)} = g( z^{(2)} ) = g( \Theta^{(1)} a^{(1)} )$$

$$a^{(3)} = g( z^{(3)} ) = g( \Theta^{(2)} a^{(2)} )$$

$$a^{(4)} = h_\Theta (x) = g( z^{(4)} ) = g( \Theta^{(3)} a^{(3)} )$$

 

Backpropagation Algorithm

cost function 을 최소화하기 위한 알고리즘입니다. 

$$\min_\Theta J (\Theta) $$

파라미터를 구하기 위해서는 $J(\Theta)$ 의 편미분한 값을 구해야 합니다. 

$$\frac{\partial}{\partial \Theta^{(l)}_{i,j} } J(\Theta)$$

이 값을 구하기 위해서 backpropagation 알고리즘을 사용합니다. 

 

$\delta^{(l)}_j = $ "error" of node $j$ in layer $l$.

$\delta^{(4)} = a_j^{(4)} - y_j$

$\delta^{(3)} = ( \Theta^{(3)} )^T \delta^{(4)} .* g' (z^{(3)})$

$\delta^{(2)} = ( \Theta^{(2)} )^T \delta^{(3)} .* g' (z^{(2)}) $

 

$$\frac{\partial}{\partial \Theta_{ij}^{(l)}} J( \Theta ) = D_{ij}^{(l)} $$

 

Training set $\{ ( x^{(1)}, y^{(1)} ), ... , ( x^{(m)}, y^{(m)} )  \}$ 가 있다고 하자. 

$\Delta_{i,j}^{(l)} := 0$ for all $(l,i,j)$. (추후에 이 부분을 randomization 한다)

 

1. Set $a^{(1)} := x^{(t)}$

2. For $l = 2,3,...,L$ 에 대하여, $a^{(l)}$ 을 forward propoagation  을 이용해서 구한다. 

3. $y^{(t)}$ 를 이용해서 $\delta^{(L)} = a^{(L)} - y^{(t)}$ 를 구한다. 이 때, $a^{(L)}$ 을 레이어의 마지막 값이므로, output 이다. 

4. $\delta^{(L-1)}, ..., \delta^{(2)}$ 를 $\delta^{(l)}=\Big( ( \Theta^{(l)} )^T \delta^{(l+1)} .* a^{(l)} .* (1 - a^{(l)} ) \Big)$ 를 이용해서 구한다. 

 

$\Delta^{(l)} :=  \Delta^{(l)} + \delta^{(l+1)} (a^{(l)} )^T$

그런 후, 

$D_{ij}^{(l)} := \frac{1}{m} \Big( \Delta_{i,j}^{(l)} + \lambda \Theta_{i,j}^{(l)}  \Big) $ if $j \ne 0$ and

$D_{ij}^{(l)} := \frac{1}{m} \Delta_{i,j}^{(l)} $ if $j = 0$.

 

Backpropagation Intuition

[ ] 강의 다시 듣기 $cost(i) \approx (h_\Theta (x^{(i)} ) - y^{(i)} )^2$ 이 부분과 $\delta_j^{(l)} = \frac{\partial}{\partial z_j^{(l)}} cost(i)$ 이 두 부분이 이해가 되지 않는다. 

[ ] Forward Propagation 의 예시 그림

     - Flow from left to the right

Cost function

$cost (t) = y^{(t)} \log ( h_\Theta ( x^{(t)} ) ) + (1 - y^{(t)} ) \log ( 1 - h_\Theta ( x^{(t)} ) ) $ 일 때, 

$\delta_j^{(l)} = \frac{\partial}{\partial z_j^{(l)}} cost(t)$  

     - 기울기와 에러가 연관되어 있다고 하는데, 조금 더 이해가 필요하다. 

 

 

Backpropagation in Practice

Implementation Note: Unrolling Parameters

Backpropagation 을 코드로 실현합니다. 매트릭스와 벡터 표현에 대해 다룹니다. 

optTheta = fminunc(@constFunction, ... )

fminunc() 를 사용하기 위해서는 Theta1, Theta2, Theta3 를 벡터화한 후에 thetaVector 로 하나로 묶어서 함수에 집어넣을 수 있다. 

Gradient Checking

numerical approximation of gradients.

gradApprox = $\frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2 \varepsilon}$

각 $\theta_i$ 에 대해서 이러한 작업을 한다. $\frac{\partial}{\partial \theta_j} J (\theta) \approx \frac{ J( \Theta_1, ... , \Theta_j + \varepsilon, ... , \Theta_n) - J( \Theta_1, ... , \Theta_j - \varepsilon , ... , \Theta_n ) }{2\varepsilon}$

그리고난 후에 gradApprox 와 DVec (backprop 을 한 결과)를 비교한다. 

Random Initialization

파라미터 값들을 처음 전부 0으로 두는 방법은 neural network 에서 적용하기 어렵다.

$a_1^{(2)} = a_2^{(2)}$ 값들이 동일해지고, $\delta_1^{(2)}=\delta_2^{(2)}$ 값들도 동일해진다. 그리고, deravative 도 동일해진다. 이러한 이유로 인해 파라미터를 $[-\varepsilon, \varepsilon]$ 에서 랜덤하게 뽑는다. 

종합하며 (요약)

(1) 뉴럴 네트워크의 구조를 정한다. (예: 3 x 5 x 4, 3 x 5 x 5 x 4)

     - 인풋의 개수: $x^{i}$ 의 개수에 의해서 정해진다. 

     - 아웃풋의 개수: 가능한 선택지에 의해서 정해진다. (예: 0, 1, ... , 9 의 숫자를 인식한다면, y 는 10가지 클라스이다)

     - 히든 레이어의 개수: 최소 한 개의 히든 레이어. 그 이상의 히든 레이어를 사용한다면, 동일한 개수의 히든 유닛을 각 히든 레이어에 둔다. 

(2) 뉴럴 네트워크를 훈련하기 위해 해야하는 스텝들

     (2-1) 파라미터를 랜덤으로 정한다. 

     (2-2) Forward propagation 을 이용해서 $h_{...}$ 를 개선한다. 

     (2-3) Cost 함수를 계산하는 코드를 만든다. 

     (2-4) 편미분 $\frac{\partial}{\partial \Theta_{jk}^{(l)}} J ( \Theta )$ 을 계산하는 backprop 을 실행한다. 

for i = 1:m 에 대해서, forward prop, backprop  을 하여 activation ($a^{(l)}$) 과 delta $\delta^{(l)}$ 값들을 구한다. 그리고, $\Delta^{l}$ 과 편미분 값들을 구한다. 

     (2-5) Gradient checking 을 수행한다. 체크가 완료되면, gradient checking 코드를 끈다. 

     (2-6)Gradient descent 나 더 복잡한 최적화 방법론을 활용하여 cost 함수를 최소화함으로써 파라미터들을 구한다. 

 

노트: $J (\Theta)$ 는 non-convex 하기 때문에, global optima 가 아닌 local optima 값을 구할 수 있다.