※ 본 내용은 Coursera, Machine Learning - Andrew Ng 강의, 강의자료를 바탕으로 작성하였습니다.

 

<Support Vector Machine>

- Optimization, Cost Function 

logistic regression에서는 $ \theta^Tx $가 0 이상이면 1(hypothesis(x) >= 0.5 ), 그렇지 않으면 0으로 판단했었다.

 

SVM을 통해서는 y가 1일 때 , hypothesis의 값도 단순히 0.5를 기준으로 판단하는 것이 아니라 실제 1에 근접한 수가 되기를 목표로 하고, 반대로 y가 0이라면 hypothesis 또한 0에 근접한 수가 되기를 목표한다. 

 

그를 위해 기존 logistic regression에서의 cost를 조금 변형한다.

SVM의 cost 함수( cost function J가 아님)

y가 1이라면 z가 1 이상일 때는 0, 그 이하에는 직선이 되는 위 그림의 좌측 그래프와 같은 cost 를 정의하고, y=0인 경우는 오른쪽 그래프와 같이 z 가 -1 이하라면 그 값이 0이 되는 함수를 정의하는 것이다.

(각각 cost1, cost0)

 

위 cost를 도입하여 최정적으로 SVM의 cost function을 정의하면 다음과 같다.

SVM의 cost function

logistic regression에서의 cost function과 거의 유사하다.

우선 cost를 새로 도입하고, 기존 식에 포함되었던 1/m은 제거하였고(m을 곱해도 optimization 후 파라미터에 영향x), 같은 원리로 $ C = \frac{1}{\lambda } $를 곱해주면 된다.

 

SVM의 hypothesis 는 다음과 같다.

$ h_\theta(x) = 1 (\theta^Tx \geq  0) $

$ h_\theta(x) = 0 (\theta^Tx <  0) $

Logistic Regression의 hypothesis는 sigmoid function을 통해 확률을 계산했던 반면, SVM에서는 단순히 1, 0 만을 결과로 갖는다.

 

- Large Margin Classifier

SVM은 Large Margin Classifier라고 불리기도 한다.

Margin은 decision boundary와 가장 가까운 데이터 사이의 거리를 의미한다. 

Margin 시각화

즉, 위의 그림처럼 여러 decision boundary가 이용될 수 있지만, SVM을 통해서는 margin이 가장 큰 decision boundary가 가장 선택된다는 것이다. 

 

SVM의 cost function

앞서 살펴보았던 cost function에서 C를 큰 값으로 설정하면, optimization은 안의 값을 0으로 만드는 방향으로 이뤄질 것이다. $ \theta^Tx $가 1 이상이거나 (y = 1), -1 이하(y = 0)가 되도록 만들면 아예 0이 될 수 있도록 cost 함수를 정의했기 때문에 가능하다.

 

그렇게 된다면(C가 충분히 크다면) cost function은 다음과 같이 단순화될 수 있다.

C가 큰 경우 cost function, 밑의 추가 조건 주의

단, 기존 cost function에서 앞의 항을 0으로 만든다는 조건이 있었기 때문에

$ \Theta^Tx \geq 1 $ (if y = 1)

$ \Theta^Tx \leq -1 $ (if y = 0)

을 만족해야 한다.

 

왜 C가 충분히 커서 위와 같은 cost function으로 만드는 것이 Large Margin을 유도하는지에 대해서는 수학적으로 확인할 수 있다.

 

- Large Margin이 되는 이유 -> 수학적 관점

우선 inner product에 대해 정리하자면 다음과 같다.

2차원 vector 예시

u와 v의 inner product는 의미는 같다. 

v를 u에 정사영한 vector의 크기(음수 가능)와 u의 크기를 곱하는 것

이를 수식으로 계산하면 다음과 같다. 

$ u^Tv = p*\left \| u \right \| = u_1v_1 + u_2v_2 ( +...) $

위 식에서 p가 v를 u에 정사영하여 생긴 vector의 크기를 의미하고 정확히는 $ vcos(\theta) $로 계산된다.

 

이제 다시 SVM의 cost fucntion을 살펴보자.

SVM의 cost function과 inner product

위 inner product의 의미를 의식하여 보면,

$ \theta^Tx $는 theta와 input data x의 inner product임을 알 수 있다.

즉, input data를 $ \theta $에 정사형한 벡터의 크기와 $ \theta $의 크기의 곱으로 계산된다.

 

이제 다음 2가지 사항만 고려하면 왜 large margin이 결정되는지 이해할 수 있다.

(1) $ \theta $는 decision boundary와 perpendicular하다. 

-> decision boundary는 z = 0인 점들을 이은 선이다(at logistic regression : h(x) = 0.5 ).

즉, decision boundary위의 임의의 점 x에 대해 $ \theta^Tx = 0 $를 만족하기 때문.

(더 정확히는 decision boundary 위의 두 점 a, b에 대해 $ \theta^Ta - \theta^Tb = \theta^T(a-b) = 0 $ 을 만족, perpendicular)

 

(2) cost function에서 알 수 있듯이 $ \theta$ 를 minimize하면서 $ p^{(i)}\cdot \left \| \theta \right \| $ 가 1 이상인 것을 만족하려면(y = 0 인 경우면 -1 이하) p, $ \theta$에 x를 정사영시킨 벡터의 크기가 커야한다.

 

이를 그림으로 표현하면 더욱 직관적으로 이해할 수 있다. 

decision boundary와 $\theta$가 수직인 점을 생각해보면, decision boundary로 빨간선을 선택했을 때와 파란선을 선택했을 때 \$theta\에 가장 가까운 데이터가 어떻게 정사영되는지 알 수 있다.

위의 (2)번 문항에서 p가 margin에 대응된다. 따라서 margin이 클수록 cost function을 최소화하는 $ \theta$가 선택되는 것이다.

 

 

<Kernel>

Kernel은 landmark과의 similarity를 기준으로 기존 feature를 바탕으로 새로운 feature를 생성해주는 함수이다.

Kernel을 적용하여 non-linear한 decision boundary를 만들 수 있다.

(Landmark는 similarity를 평가할 때 기준이 될 임의의 점이다.)

 

kernel을 통한 non-linear한 boundary

f1~f3는 각각 landmark1~3에 대한 similarity(gaussian kernel, 유클리안 거리로도 볼 수 있음)를 나타낸다.

파라미터가 위 이미지처럼 설정되어있다면 l1과 l2에 근접한 데이터만 1로 predict할 것이고, 최종적으로 2개의 원을 겹쳐놓은 것 같은 non-linear한 decision boundary를 만들 수 있다. 

 

* SVM의 cost function 때문에 가끔 $ \theta^Tx $가 1, -1을 기준으로 predict 해야되는 것이 아닌지 헷갈릴 수 있는데, 1, -1은 traing 시에 파라미터를 설정하기 위한 것이고 예측은 동일하게 0을 기준으로 한다.

 

여기서 similarity는 gaussian kernel을 통해 계산되었다. 대부분의 경우 사용되는 kernel이다.

kernel(gaussian kernels)

*시그마는 표준편차가 아니라 단순히 계산에 사용될 parameter 이다.

 

- Landmark 선택

그렇다면 Landmark는 어떻게 설정해야 할까. 

결론부터 얘기하자면 train data를 모두 landmark로 사용하면 된다.

landmark를 기준(+ $ \theta $)으로 data를 판단하게 되기 때문에, train data를 사용하는 것이 어떻게 보면 당연하다.

 

그렇기 때문에 kernel을 사용하면,

m개의 train data에 대해서 feature는 m개로 변하게 된다.

(각각의 feature는 landmark-(i)와의 similarity를 기준으로 결정되므로 m개의 featrue)

 

그렇기 때문에 cost function 또한 다음과 같이 변한다는 것에 주의해야 한다.

kernel을 이용한 cost function

 

※ 실제로 cost function을 계산하는 라이브러리 등에서는 우측의 parameter 제곱의 합을 matrix의 연산으로 계산하지만, 추가적으로 다른 matrix를 곱하여 계산한다고 한다.

-> 계산적인 측면에서 큰 차이를 보인다. 그러나 logistic regression에서는 이러한 개선이 어렵기 때문에 kernel은 SVM에서 소개하였다.

-> logstic regression에서 사용이 어려운 자세한 이유를 알아보려 했지만, 강의를 듣는 현 시점에서는 logistic regression에서도 kernel을 적용하는 경우도 있는 것 같았다. 

 

- SVM의 paramater(C , $ \sigma $) 선택

parameter를 어떻게 선택하는지에 따라 bais, variance 문제와 관련이 있다.

 

(1) C

C는 logistic regression에서 regularization parameter, 람다의 역수와 동일하게 볼 수 있다.

-> C가 크다면 regularization이 적게 이뤄지고, C가 작다면 regularization이 크게 이뤄진다.

 

즉, C가 크면 lower bias, high variance

C가 작으면 higer bias, low variance이다. 

 

(2) $\sigma^2$

※sklearn의 SVC 에서는 gamma parameter가 반비례 관계로 대응된다.

 

gaussian kernel을 이용하면 $ \sigma$도 설정해야 한다.

 

시그마의 설정에 따른 bias,variance

우측의 그래프가 sigma에 따른 gaussian kernel 의 차이를 보여준다. 

시그마 제곱이 크면 1에 근접한 범위가 넓다 -> similarity를 잘 인정해준다. -> bais가 크고, variance가 작다.

반대의 경우도 같은 원리로 생각할 수 있다.

 

 

- SVM의 사용

SVM을 사용할 때는 잘 정리된 패키지를 사용하는 것을 권장한다.

(cost function optimization의 구현에 행렬 연산 구현 등이 필요한듯, optimization function은 convex한 것은 동일하다)

 

(1) parameter 선택?

앞서 다룬 내용대로 bias, variance를 고려하여 알맞게 고르면 된다.

 

(2) Kernel의 선택?

kernel을 사용하지 않는 linear kernel 또는 Gaussian Kernel을 가장 일반적으로 사용한다. 

 

linear kernel의 경우 m은 크고 n은 작을 때 사용한다. (데이터의 수는 작고, feature의 수는 많음)

 

Gaussian Kernel의 경우 feature는 작고, m은 클 때 사용한다.

특히, Gaussian Kernel을 사용할때는 feature scaling이 필수이다. 

scaling을 하지 않아 혼자 scale이 큰 feature가 있다면, 그 feature가 similarity를 결정하게 될 것이다.

 

* 이 외에도 polynomial kernel 등 다양한 커널이 있다. 

 

(3) logistic regression vs SVM

logistic regression 모델과 SVM 모델은 유사한 점이 많은데, 그렇다면 어떨 때 사용해야 어떤 모델을 사용해야 할까?

logistic regression과 SVM 중 선택

● n이 m에 비해 큰 경우, 

logistic regression이나 SVM without kernel을 사용하면 좋다. 

-> 우선 feature는 충분하여 두 모델 모두 적용이 가능하지만, data가 적기때문에 매우 복잡한 non-linear function을 적용하기에는 적합하지 않다.

 

● n은 작고, m은 적당한 경우

Gaussian kernel SVM.

-> feature가 많지 않다면 logistic regression은 적합하지 않을 수 있고(high bias), 많은 데이터도 SVM을 통해 non-linear하게 설명가능. 또한 m이 적당하다면 gaussian kernel을 적용하는 것에 연산적 부담이 적음(50,000 이상부터는 부담될 수 있음)

 

● n이 작고, m이 매우 큰 경우

다시 logistic regression이나(create more feature는 필요) SVM with linear kernel을 사용하면 좋다.

-> 우선 앞서 말했듯이 m이 50,000 이상이라면 가우시안 커널을 적용하는 것은 무리가 있음.

그러나 n은 작기 때문에 logistic regression이나 SVM without kernel을 사용하되 추가적인 feature를 생성해야 함.

 

추가로, Neural Network는 모든 경우에 적용해볼 수도 있지만, 비교적으로 연산이 느릴 수 있다.

또한 실제로 문제가 되는 경우는 거의 없지만, local minimum이 존재한다는 차이도 있긴하다.


※ 본 내용은 Coursera, Machine Learning - Andrew Ng 강의, 강의자료를 바탕으로 작성하였습니다.

 

<프로젝트 진행 순서 정하기>

예를 들어, spam 메일을 분류하는 프로젝트를 진행한다고 하면 다음과 같이 수행할 수 있을 것이다.

프로젝트 예시

feature로 특정 단어(spam에 주로 있는 단어들)가 메일에 포함되어 있는지 여부를 선택하고 이러한 데이터를 통해 모델을 생성할 수 있을 것이다.

 

그런데 모델이 많은 오류를 보이면 어떻게 해야할까.

성능 개선 방법 예시

위와 같은 방법들이 있을 것이다. 하지만 어떠한 방법이 모델을 개선할 수 있을지 미리 알 수 없기 때문에 무엇부터 시작해야 될지 결정하는 것에 어려움이 있을 것이다. 이러한 문제들을 고려하여 강의에서 제안한 프로젝트의 진행 순서는 다음과 같다.

 

- 프로젝트 진행 순서 

1. 간단하게 모델을 완성해보고, validation set을 통해 성능을 확인해본다.

2. learning curve와 같은 방법을 통해 data나 feature가 더 필요한지 검사해본다.(bias or variance 검사)

3. Error Analysis : 모델이 예측에 실패한 데이터를 집중적으로 살펴본다. -> 모델의 취약점 파악

 

3. Error Analysis를 통해 취약점을 찾더라도 해당 부분을 보완하는 것이 모델의 성능을 크게 향상 시킬 것이라는 보장은 없다. 따라서 numerical evaluation을 통해 개선 효과를 확인하는 것이 필요하다.

 

numerical evaluation 예시

예를 들어, stemming 문제를(universe, university와 같이 뜻은 다르지만 앞 단어가 비슷한 경우) 구분하기 위한 알고리즘을 적용했을 때 이전 5%에서 3%로 에러가 줄었다고 하면 해당 알고리즘은 유지하면 된다.

반대로 대소문자 구분을 적용하기 전과 후의 에러차이가 유의미하지 않다면 해당 알고리즘은 적용하는 것이 의미가 없을 것이다. 

 

즉, 보완점을 찾고 개선하더라도 얼마나 효과가 날지 미리 알 수 없기 때문에, 확실한 수치를 통해 전후의 효과를 확인한 후 비교하는 것이 좋다.

 

 

<Error Matrix, skewed data>

암 여부를 판단하는 모델을 개발한다고 했을 때, 만약 암 환자의 비율이 0.5% 정도밖에 안된다면 어떻게 될까.(skewed)

무조건 암이 아니다고 판단하는 모델(h = 0)을 만들어도 오류는 0.5% 밖에 되지 않는다. 그러다 당연히 해당 모델을 바람직하지 않다.

 

이러한 경우에서 알 수 있듯이 모델의 성능을 평가할 때는 precision과 recall 두 개의 지표를 모두 평가해야 한다.

각각의 의미는 다음과 같다.

  actual
predicted   1 0
1 True Positive False Positive
0 False Negative True Negative

error matrix

precision = TP / (TP + FP),

recall = TP / (TP + FN)

 

precision은 '1'로 예측한 것 중 제대로 예측한 비율,

recall은 실제 '1'인 것 중 성공적으로 예측된 비율을 의미한다.

 

둘 중 하나만 고려했을 때 생기는 문제는 다음과 같다.

 

(1) precision만 고려 - confidence한 경우에만 '1'로 판단 ex) logistic regression에서 threshold = 0.9.

-> 1이지만 0으로 판단하는 비율이 늘어날 것이다.

즉, precision은 높아지지만 recall은 낮아진다.

 

(2) recall만 고려 - '1'을 '0'으로 잘못판단하면 risk가 크기 때문에, threshold를 낮춘 경우

-> 0이지만 '1'로 판단한 비율이 늘어날 것이다.

즉, recall은 높아지지만 precision은 낮아진다.

 

위의 예시에서 확인할 수 있듯이 둘은 trade off 관계이고, 두 평가 요소 모두 유의미하다.

F1-score

그러나 평가요소가 2개라면 위와 같이 서로 다른 알고리즘이 성능을 보일 때, 어떤 알고리즘이 우월한 알고리즘인지 판단하기 어렵다. 따라서 위 식과 같이 F1-score를 이용한다. 

F1-score는 둘 중 하나라도 0에 가까운 값을 갖는 경우 0에 가까워진다. 

* precision과 recall의 평균을 사용하는 경우 algorithm3 가 좋게 평가되지만, recall은 모두 '1'로 평가하는 알고리즘의 경우가 algorithm3 같은 경우이므로 바람직하지 않다.

 

<Data for Machine Learning>

앞서 bais, variance 문제를 다루면서 데이터를 무작정 늘리는 것이 성능 향상을 보장하지 못한다고 했지만, 그렇게 하는 것이 성능 향상에 도움이 되는 경우도 당연히 존재한다.

 

다음 그림은 데이터의 크기 변화에 따라 알고리즘을 평가한 유명한 실험이라고 한다. 

x축은 data size, y축은 accuracy

 

앞서 bias, variance 문제에서도 다뤘지만, 데이터를 추가하는 것이 도움이 될지 안될지 판단하는 또 다른 직관적이고 유용한 사고로는 '사람(전문가)이라면 그 문제를 해결할 수 있는가' 에 대해 생각해보는 것이다.

useful test

예를 들어, 부동산 전문가라도 주택의 가격을 크기만으로 결정할 수는 없을 것이다. 위치, 방의 수, 상태 등을 모두 고려해야 그때서야 부동산 전문가도 가격을 예측할 수 있을 것이다.

 

결론부터 정리하면,

feature가 충분할 때 데이터가 많아질수록 좋은 효과를 볼 수 있다.

앞서 variance 문제일때 데이터를 늘리는 것이 도움이 된다고 한 것과 같은 이유이다.

 

feature가 충분하지 않다면 모델은 당연히 데이터가 많더라도 높은 bias를 갖을 것이고,(설명 불가)

데이터가 충분하지 않다면 과적합문제가 발생할 것이다.

ex) 100차항 까지 있는데 데이터가 100개라면 모두 fitting할 수 있음(overfittiing)

따라서 데이터를 늘리는 것이 과적합 문제를 막는 것에 도움이 된다고 할 수 있다. 

 

 

 

 

※ 본 내용은 Coursera, Machine Learning - Andrew Ng 강의, 강의자료를 바탕으로 작성하였습니다.

 

<성능과 diagnostic>

만약 학습시킨 모델이 새로운 데이터에 대해서 좋지 못한 성능을 보인다면 어떻게 해야할까?

성능 개선을 위해 시도해볼만한 것들

위의 리스트와 같은 것들을 시도해볼 수 있을 것이다.

 

그러나 위 방법이 모든 경우에 성능을 향상 시키는 것은 아니고, 따라서 무작위하게 여러 방법들을 시도해보는 것은 비효율적이고 시간을 무의미하게 낭비할 가능성을 높인다.

 

 

따라서 적절한 diagnostic 을 이용해야한다.

한국말로 처방이란 뜻을 가진 단어답게, 현재 모델이 어떤 문제를 갖고 있고 어떠한 개선이 필요할지 확인하는 테스트이다.

 

<성능 평가와 Model Selection>

모델의 성능을 평가할 때는 training 데이터에 사용된 데이터로 계산된 cost function이 낮은 것만이 중요한게 아니라, 모델이 보지 못했던 데이터에 대한 예측력도 중요하다.

 

특정 데이터를 기준으로만 성능을 높이는 것을 over fitting을 유발하고, generalized 성능을 낮추기 때문이다.

 

따라서 주어진 데이터를 트레이닝에 사용될 데이터와 test에 사용될 데이터로 나누는 것이 일반적이다.(보통 7:3비율)

 

그러나 단순히 train/test set으로 나누게 되면 다시 test set으로 사용된 데이터를 기준으로 적합된 모델을 만들게 될 가능성이 크다.

 

그러한 문제를 막기 위해 train/cross validation/test 데이터셋으로 나누는 것이 좋다.(보통 6:2:2)

모델은 training data set을 이용해 학습시키고, cross validation data set을 이용하여 모델의 성능을 확인한 후, 마지막으로 test 데이터셋을 통해 최종적인 일반화 성능을 확인할 수 있다.

 

model selection 예시

예를 들어, 위와 같은 경우에서 몇차항까지 feature로 사용해야 좋은 모델을 만들 수 있을지 결정하기 위한 과정은 다음과 같다.

 

1. 우선 training 데이터를 기준으로만 성능을 평가한다면 과적합을 방지할 수 없기때문에, train/validation/test data set으로 구분한다.

2. training data set을 이용하여 각 모델별로 파라미터를 학습시킨다.

3. 그렇게 학습된 모델별로 validation set에 대한 성능을 평가하고, 가장 좋은 성능을 보이는 모델을 선택한다.

4. 마지막으로 test data set을 통해 generalization error를 평가할 수 있다.

 

* 일반적으로 데이터가 충분하고 random하게 잘 구분지었다면, validation set에 대한 성능이 좋은 모델이 test set에 대한 성능도 좋게 된다.

* 성능 평가를 위해 사용하는 cost function에서는 regularization에 대해서는 고려하지 않는다. (즉 h와 y만 이용)

 

<Bias와 Variance 평가>

- Bias와 Variance

bias와 variance 예시

우선 Bias와 Variance의 의미는 다음과 같다.

High Bias : underfitting

High Variance : overfitting

(물론 별도의 수식이 있다.)

 

training set 성능과 cv set에 대한 성능의 시각화

위의 그래프에서 빨간선은 training 데이터 셋에 대한 cost J 이고, 초록색은 CV data set에 대한 cost J이다.

(cost가 낮을 수록 좋은 예측 성능을 의미)

 

다항식의 차수를 추가할 수록, training set에 대한 설명력은 좋아지기 때문에(overfitting) 그에 대한 cost는 낮아진다.

반면 cv에 대한 cost는 차수가 낮을 때는 training과 동일하게 높다가(underfitting), 어느 정도 낮아진 후 과적합이 될수록 다시 향상되는 것을 확인할 수 있다.

 

다시 말해,

high bais인 경우, underfitting인 경우는 training data set과 cv data set 모두에 대해 예측 성능이 좋지 못하고,

high variance인 경우, overftting인 경우에는 training data set에 대한 성능은 좋지만 cv data set에 대한 성능은 좋지 못하다.

 

 

<Regularization과 bias/variance>

앞서 regularization 자체가 overfitting을 막기 위해 고려했던 작업인만큼 bias, variance 문제에서 중요하다.

 

regularization과 bais, variance

위 그림과 같이 하나의 모델에서도 regularization parameter 람다를 크게하냐 작게하냐에 따라 overfitting과 underfitting 문제가 발생할 수 있다. 반대로 적당하게 조정하여 문제를 해결할 수도 있다.

 

- regularization parameter 선택

그렇다면 어떻게 적당한 크기의 람다를 선택해야될까? 단순히 앞에 정리했던 내용을 바탕으로 선택하면 된다.

 

여러 값의 람다에 대해 트레이닝시킨 모델들을 만들고, cv data set을 통해 성능을 확인해보고 가장 좋은 모델을 선택하면 된다. 이 후 test data set을 통해 일반화 성능도 확인할 수 있다.

 람다를 x축, cost를 y축으로 놓고 그래프를 그리면 일반적으로 위와 같이 그려질 것이다. 

 

<Learning Curves>

bias와 variance가 높은 경우 각각 traning에 데이터가 많아질수록 모델의 정확도가 변화하는 양상이 다르다.

 

- bias가 높은 경우

bias가 높은 경우

(1) training 데이터가 많아질수록 train error는 커진다. 

(2) cv 셋에서 대한 error는 데이터가 많을 수록 작아진다.

(3) 그러나 둘 다 점진적으로 plat한 형태가 되고 결국 매우 비슷하게 된다. 이때의 error는 큰 값으로 볼 수 있다.(underfit 되어 있기 때문에)

 

- high variance 인 경우

high variance 인 경우

(1) m이 커질 수록 train에 대한 오류가 커지긴 하지만 크지 않다.(overfitting)

(2) cv data set에 대한 오류는 m이 커질수록 작아지지만, train에 대한 오류에 비하면 큰 gap을 갖는다.

(3) m이 커질수록 그 gap은 작아진다. 

 

 

위 두 내용을 통해 알 수 있는 점은 다음과 같다.

high bias 문제라면 데이터를 늘리는 것이 도움이 되지 않을 가능성이 크고,

high variance 문제라면 데이터를 늘리는 것이 도움될 가능성이 크다.

 

이러한 점을 알면 가장 처음에 말한 무의미한 시도를 줄일 수 있다.

 

<정리>

그렇다면 초반에 말한 해결책들이 어떤 경우에 쓰일 수 있는지 다시 보자.

해결책과 적합한 경우

어렵지 않게 이해할 수 있다.

 

< Neural Network의 경우? >

뉴럴 네트워크에서의 underfitting과 overfitting

이번 강의에서 다룬 내용과, 뉴럴 네트워크에서 hidden layer가 새로운 변수를 만드는 것과 유사하다는 점을 고려하면 아래 내용 또한 자연스럽게 이해할 수 있다.

 

우선 NN 자체가 너무 작다면 underfitting에 취약하다. 직관적으로도 이해할 수 있고, parameter가 적으니 underfitting 될 가능성이 큰게 당연하다.

 

반대로 NN의 netwrok가 크다면 overfitting에 취약하다. 같은 원리로 이해할 수 있다.

 

따라서 Neural Netwrok에서는 다음과 같은 조치를 취할 수 있다.

(1) 다항식의 차수를 변화시켜가며 model selection을 했던 것을 hidden layer의 계층의 수를 변화시켜가며 동일하게 적용해볼 수 있다.

(2) regularization parameter를 조정하여 overfitting을 해결한다. 

'머신러닝 > Machine Learning(Ng)' 카테고리의 다른 글

[7주차] Support Vector Machine  (0) 2021.08.19
[6주차 - 2] prioritizing what to do, error matrix  (0) 2021.08.18
[5주차] Neural Network - 2  (0) 2021.08.14
[4주차] Neural Network  (0) 2021.08.11
[3주차-2] Regularization  (0) 2021.08.10

※ 본 내용은 Coursera, Machine Learning - Andrew Ng 강의, 강의자료를 바탕으로 작성하였습니다.

- Cost Function

Nueral Network에서의 cost function은 다음과 같다.

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

Backpropagtion의 연산

$ \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에 대한 누적 값을 의미한다.

Backpropagation 계산

대문자 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

advanced optimization function

fminunc와 같은 방법을 이용하여 최적 세타를 계산하려면 initial theta나 gradient값을 계산한 것이 vector 가 되어야 한다. 그러나 NN에서는 vector가 아니라 각 계층 별 matrix 형태인 문제가 있다.

 

따라서 위 코드에 적용하기 위해서는 unrolling을 해야하는데, 이론적으로 특별한 내용은 없고 그냥 다음과 같이 적용하면 된다. 

unrolling paramer로 다루는 법

unrolling하여 전달한 후, 다시 reshape하여 계산하고, 계산한 값을 다시 unrolling하여 vector로 반환하면 된다.

 

* Octave기준 unrolling은 'vector(:)' 문법을 통해, reshape는 reshape((start:end), row, column) 문법으로 구현한다.

 

- Gradient Checking

NN에서 backpropagation을 계산하는 과정에서 잘못된 설정, bug들이 포함되어도 언뜻 문제없이 계산되는 것처럼 보이는 경우들이 있다. 

gradient checking을 계산이 의도한 대로 이뤄지고 있는지(편미분값이 정상적인지) 확인하는 하나의 방법이다.

반드시 적용해보는 것이 좋다.

 

방법은 그렇게 복잡하지 않다.

미분의 개념을 바탕으로 실제 미분값을 근사적으로 계산해본 후 backpropagation으로 계산한 값과 비교해보면 된다.

Numerical 계산

입실론은 작을 수록 좋지만, 프로그램 계산 상의 이유로 10^-4 정도로 설정한다. 

 

unrolled 계산

편미분으로 확장하면, 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 또는 하나의 통일된 값으로 설정하면 안되는 이유는 다음과 같다.

zero initialization을 하는 경우

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으로 해결한다.

Octave random intialization code

-입실론 ~ 입실론 범위의 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의 차이가 미미한듯) 

+ Recent posts