※ 본 내용은 Coursera, Machine Learning - Andrew Ng 강의, 강의자료를 바탕으로 작성하였습니다.
- Cost Function
Nueral Network에서의 cost function은 다음과 같다.
비교적 복잡해보일 수 있지만 크게 다른 내용은 없다.
좌측의 2개의 sum에서 i는 input에 대해, k는 class에 대해 대응된다. 즉, input 별로 실제값과 예측값의 차이를 합하는 식이다.
우측의 3개의 sum으로 구성된 식은 단순히 모든 계층의 theta 값의 합이다.(for regularization)
- Backpropagation Algorithm
Neural Network에서 output은 input으로 입력된 값부터 layer를 순서대로 거치며 forwardpropagation 과정을 통해 연쇄적으로 계산된다.
$ z^{(l)} = \Theta ^{(l-1)}a^{(l-1)}, a^{(l)} = g(z^{(l)}) $
반대의 순서로 이뤄지는 Backpropagation을 통해 다음의 값을 계산할 수 있다.
gradient discent 등의 최적화 알고리즘을 적용하기 위해 cost function과 각 파라미터에 대한 편미분 값이 필요한데, cost function의 식은 앞서 살펴보았고 편미분 값을 Backpropagation을 통해 찾을 수 있다.
자세한 과정은 다음과 같다.
- for one input
$ \delta {_{j}}^{l} $는 l번째 계층에서 j번째 unit의 error를 의미한다.
우선 L번째 layer(output layer, 여기서는 4번째)에서는 예측값-실제값을 계산하여 $ \delta$를 계산할 수 있다.
이 후의 layer에서는
$ \delta^{(l)} = (\Theta^{(l)})^{T}\delta ^{(l+1)}.*g'(z^{(l)}), $ $ g'(z^{(3)}) = a^{(l)}.*(1-a^{(l)}) $
의 식으로 계산한다. g'과 a(1-a)는 미분과정을 통해 증명이 가능하다고 한다.(생략)
이 전 layer(더 output 에 가까운) 의 델타값을 통해 연쇄적으로 계산되는 것을 알 수 있다.
참고로 (1)번째 layer는 input layer 이므로 계산할 오류가 없다.
또한 regularization을 무시한다면 다음과 같은 식 또한 성립한다.(증명 생략)
$ \frac{\partial }{\partial \Theta {_{ij}}^{l}}J(\Theta ) = a{_{j}}^{(l)}\delta {_{i}}^{(l+1)} $
이처럼 Backpropagtion을 통해 계산한 delta를 통해 파라미터의 편미분 값을 계산할 수 있다.
- 여러 개의 input
위는 하나의 input에 대해 계산 과정을 나타낸 것이고, 모든 input에 대해서는
\Delta {_{ij}}^{(l)}
를 이용하여 누적값을 계산한다. 위 식은 (l)번째 layer의 i행 j열 parameter에 대한 누적 값을 의미한다.
대문자 Delta 를 0으로 설정해놓고 input = 1~m까지에 대해 propagtion과 delta를 각각 계산한 후
$ a{_{j}}^{(l)}\delta {_{i}}^{(l+1)} $
위 값을 누적으로 더하는 방식으로 계산하면 된다.
마지막으로 m으로 나누고 regularization을 적용하여(람다*paramter의 값) D를 계산하면,
D가 cost function을 각 paramter로 나눈 편미분 값을 계산한 matrix가 된다.
* input 이 i = 1~m 으로 표현되어 있어 헷갈렸는데, 대문자 Delta와 D에서의 ij는 i행 j열을 의미한다.
- Unrolling parameter
fminunc와 같은 방법을 이용하여 최적 세타를 계산하려면 initial theta나 gradient값을 계산한 것이 vector 가 되어야 한다. 그러나 NN에서는 vector가 아니라 각 계층 별 matrix 형태인 문제가 있다.
따라서 위 코드에 적용하기 위해서는 unrolling을 해야하는데, 이론적으로 특별한 내용은 없고 그냥 다음과 같이 적용하면 된다.
unrolling하여 전달한 후, 다시 reshape하여 계산하고, 계산한 값을 다시 unrolling하여 vector로 반환하면 된다.
* Octave기준 unrolling은 'vector(:)' 문법을 통해, reshape는 reshape((start:end), row, column) 문법으로 구현한다.
- Gradient Checking
NN에서 backpropagation을 계산하는 과정에서 잘못된 설정, bug들이 포함되어도 언뜻 문제없이 계산되는 것처럼 보이는 경우들이 있다.
gradient checking을 계산이 의도한 대로 이뤄지고 있는지(편미분값이 정상적인지) 확인하는 하나의 방법이다.
반드시 적용해보는 것이 좋다.
방법은 그렇게 복잡하지 않다.
미분의 개념을 바탕으로 실제 미분값을 근사적으로 계산해본 후 backpropagation으로 계산한 값과 비교해보면 된다.
입실론은 작을 수록 좋지만, 프로그램 계산 상의 이유로 10^-4 정도로 설정한다.
편미분으로 확장하면, theta를 unroll 한다음 적용하면 된다.
단, 위 계산이 backpropagtion에 비해 훨씬 오래 걸리기 때문에 한번 검사를 마친 후에는 disable 해야한다.
ex) gradient discent를 적용할때마다 비교 -> very slow
- Random Initialization
앞서 logistic regression 등에서는 gradient discent 등을 적용하기 전 초기 파라미터를 0으로 설정했었지만,
NN에서는 초기 파라미터를 0으로 설정하거나 하나의 값 통일된 값으로 설정하면 안된다.
(* 기본적으로, NN에서 cost function은 convex하지 않다. -> 파라미터를 아무값이나 해도 global optimum을 찾지 않는다.)
0 또는 하나의 통일된 값으로 설정하면 안되는 이유는 다음과 같다.
1. 가장 처음 계산에서 모든 파라미터가 같다면 같은 layer에서 모든 unit의 output이 동일하게 된다.
마찬가지로 backpropagation에서도 같은 layer의 unit끼리 모두 같은 delta값을 갖게 되고,
2. 결과정으로 같은 layer의 편미분값이 동일하게 된다. 즉, 최적화 과정에서(gradient discent) 파라미터의 증가 또는 감소가 동일한 값으로 이뤄지고, 파라미터는 계속하여 같은 값이 유지된다.
3. 모든 layer에서의 output이 같다는 것은 사실상 layer마다 하나의 unit 밖에 없는 것과 동일하고, 이는 처음 설계했던 Network의 구조를 의미없게 만드는 것이다.
해결 : random initialization: Symmetry breaking
위와 같은 문제를 해결하는 것을 symmetry breaking이라고 하고, random initailization으로 해결한다.
-입실론 ~ 입실론 범위의 rand한 value로 초기화하는 방식을 선택하면 된다. 구현 코드는 위와 같다.
여기서의 입실론도 0에 가까운 작은 수를 택하면 된다.(gradient checking과는 다른 입실론)
- Neural Network 구조 설정
hidden layer는 1개 이상이며 각 hidden layer끼리는 unit수를 통일하는 것이 일반적이다.
자세한 내용은 이후의 강의에서 다룸.
- Non- Convex
앞서 잠깐 얘기했듯이 NN에서 cost function은 convex하지 않다.
그러나 실질적으로는 local minimum을 찾더라도 상당히 좋고, 큰 문제가 되지 않는다고 한다.
(local minimum과 global minimum의 차이가 미미한듯)
'머신러닝 > Machine Learning(Ng)' 카테고리의 다른 글
[6주차 - 2] prioritizing what to do, error matrix (0) | 2021.08.18 |
---|---|
[6주차 - 1] 모델 성능, Bias와 Variance (0) | 2021.08.16 |
[4주차] Neural Network (0) | 2021.08.11 |
[3주차-2] Regularization (0) | 2021.08.10 |
[3주차- 1] Classification, Logistic Regression (0) | 2021.08.10 |