티스토리 뷰

ML

ML 이론 강의 필기 - 4

khe0616 2018. 11. 12. 19:31


Lec 9-1. Neural Nets(NN) for XOR





하나의 logistic regression unit은 XOR을 separate 할 수 없다.









하지만, Multiple한 logistic regression unit은 XOR을 separate할 수 있다.









다음과 같은 Neural Network를 이용해서 XOR을 separate하는 문제를 해결하려 한다.








weight, bias가 위와 같이 설정된 Neural Network이다.

각 layer를 통과할때, sigmoid(xw+b) 연산이 수행될 것이다.








이 Neural Network을 Forward Propagation한 결과이다. 예측된 값은 y바 이다.

참 값과 비교했을때, 올바르게 예측된 것을 확인할 수 있다.








Forward Propagation하는데 사용된 Neural Network를 그림으로 보기 쉽게 그려봤다.











위 그림 처럼 보통 weight와 bias를 이용한 sigmoid(wx+b)연산은 Matrix연산을 통해 이루어진다.

빨간색으로 표시한 부분을 -> 파란색으로 표시한 부분과 같이 Matrix로 만들어서 연산한다.






이제, 가장 중요한 문제는 training data로 부터 어떻게 w1, w2, B1, b2를 학습시키는가? 이다.





Lec 9-2. BackPropagation


방금 전 설명한 w1, w2, B1, b2를 학습시키기 위해서는 Gradient Descent 알고리즘을 적용한다.






Neural Network의 경우 각 node(예 : x1)에서 y바에 끼치는 영향(미분값 -> dy바/dx)을 알아야 w1, w2, b1, b2값을 계산할 수 있다.

-> 그러나 계산량이 너무 많음



이를 해결하는 방법이 BackPropagation(역전파)이다.





BackPropagation -> 미분값을 매우 쉽게 구할 수 있다.

BackPropagation은 예측값과 실제값을 비교하여 그에서 나온 error(cost)를 뒤에서부터 앞으로 돌리며, 미분값뭘 조정해야 하는지를 계산한다.

아래에서 간단한 예제를 통해 BackPropagation을 설명한다.











BackPropagation을 적용할 식을 그래프로 나타낸 모습이다.
df/dw -> w의 변화가 f에 미치는 영향

df/dx -> x의 변화가 f에 미치는 영향

df/db -> b의 변화가 f에 미치는 영향








Back Propagation에서 미분 값 계산에 사용되는 chain rule이다.

x의 변화가 f에 미치는 영향 = (g의 변화가 f에 미치는 영향) x (x의 변화가 g에 미치는 영향)











먼저, 학습 데이터에서 빨간 부분과 같이 값을 받아온다.

그리고 ForwardPropagation을 하며 그래프에 값을 입력시킨다.











그 다음, BackPropagation을 하며 미분 값을 계산(chain rule이 적용됨)한다.

복잡한 형태의 수식을 쉽게 계산할 수 있다.










sigmoid 함수도 그래프형태로 나타내보면, BackPropagation이 적용될 수 있음(chain rule을 이용해서 각 단계의 미분값을 쉽게 구할 수 있음)을 알 수 있다.

dg/dz -> z가 g에 미치는 영향











Tensorflow는 모든 것이 그래프 구조로 구성되어 있다. -> 미분을 이용한 BackPropagation을 하기위함
따라서, TensorFlow를 이용하면 BackPropagation을 직접 구현할 필요가 없다.







Lec 10-1. ReLU

예전에는 딥러닝이 잘 안됬던 이유중 4번째 이유인

We used the wrong type of non-linearity.

를 해결해보자




Neural Network의 예이다. ( 3단 )







그런데 2, 3단의 Neural Network는 학습이 잘되는데(BackPropagation이 잘 되는데),

9, 10단은 학습이 잘 안되는 현상이 발생한다.



학습이 잘 안되는 원인은 Network에서 매 layer를 통과할때, sigmoid를 통과하기 때문이다. ( sigmoid를 통과하면 0~1 사이의 값이 출력으로 나옴)

따라서, BackPropagation에서 chain rule을 적용해서 미분 값을 구할때, 0보다 작은 값이 계속해서 곱해진다.

2, 3단까지는 그래도 괜찮겠지만, 뒤로 가면 갈수록(Input Layer쪽으로 가까워 질 수록) 곱해지는 값이 많아지기 때문에, 미분 값이 굉장히 0에 가까워진다. 이는 그곳의 입력이 f에 별로 영향을 미치지 못함을 의미한다.









방금 설명한 문제점을 "Vanishing Gradient"라고 한다.


빨간 부분(Output Layer에 가까운 layer)은 경사, 기울기가 어느정도 나타난다. -> 이 정도 layer 까지는 output에 영향을 미칠 수 있음

파란 부분(Input Layer에 가까운 layer)은 경사, 기울기가 사라진다.(vanish) -> 이들 layer에서는 output에 영향을 거의 못 미침(예측<학습>이 안됨)







결국, sigmoid함수의 결과 값이 항상 1보다 작다는게 vanishing gradient가 발생하는 원인이다.






따라서, 이 문제를 해결하기 위해 Sigmoid대신 ReLU(Rectified Linear Unit) 함수를 사용한다.

-> Neural Network가 매우 잘 동작하게 됨


ReLU의 구현은 간단하다. -> max(0, X)







이제, Neural Network에서는 sigmoid를 쓰지 않고 ReLU를 써야한다. -> tf.nn.relu()

단순히, sigmoid자리를 ReLU로 대체시켜주면 된다.


그러나, 주의할 점이 있는데, 최종적인 결과는 0~1 사이의 값이 되어야 하므로, 마지막 Layer만큼은 ReLU가 아닌 sigmoid를 써줘야 한다.









 Activation Function 

Network에서 하나의 값이 이 함수를 통해 그 다음으로 전달될 때, 

어느 값 이상이면 -> active(1)

어느 값 이상이 아니면 -> active 안됨(0)

인 함수이다.




Activation function들에는 sigmoid, tanh, ReLU,  Leaky ReLU, Maxout, ELU 등이 있는데,

sigmoid는 cost 함수가 안내려가기 때문에 거의 안쓰인다. (ReLU 사용)







Lec 10-2. Initialize weight in a smart way


예전에는 딥러닝이 잘 안됬던 이유중 3번째 이유인

We initialized the weights in a stupid way.

를 해결해보자





Vanishing gradient의 해결방법

1. ReLU

2. weight값 초기화 잘하기










만약, 모든 weight를 0으로 초기화 시킬 경우, chain rule에 의해 앞쪽(Input layer쪽)의 기울기(gradient)가 다 0이되어 사라져 버리는 문제가 발생한다.




따라서, 초기 weight값을 신중하게 결정해야 한다.

1. 모든 초기값 0주면 절대 안됨

2. Deep Belief Nets 알고리즘 사용 <- RBM(Restricted Boatman Machine 알고리즘)을 사용해서 초기화시킨 Network


2번의 경우, 지금은 많이 사용하진 않지만 많이 나오는 용어이므로 한번쯤 볼 필요가 있다고 한다.








RBM 알고리즘 이해하기



위와 같은 구조가 RBM의 구조이다.

 같은 layer의 노드끼리 연결되지 않고 앞 뒤로만 연결되기 때문에 Restriction이라고 부른다.







Encoder 과정이다.

입력 x1, x2, x3가 있다고 하자. weight와 b를 이용하여 계산한다.(값을 구한다.)








이제, Decoder과정이다.

Encoder에서 했던 작업을 반대로 수행한다. ( weight 그대로 사용)







입력값, 즉 x1, x2, x3와

Encoder와 Decoder후 생성된 값(x1바, x2바, x3바) 를 비교한다.


이 둘의 차이가 최저가 되도록 weight를 조절하게 된다.








RBM알고리즘을 사용하는 과정이다.

인접한 두개의 layer 사이에서 pre-training step으로써 RBM 알고리즘을 적용한다.

-> 이 과정을 통해, weight 값이 초기화 된다.








RBM등을 이용해서, weight값을 초기화 한 뒤, 학습시키는 것을 Fine Tunning이라고 한다.

weight값이 잘 초기화 되어 있기에, 학습시 data를 많이쓰지 않아도 빨리 학습이 되기 때문이다. 








RBM알고리즘은 복잡하다는 단점이 있지만. 이 복잡한 알고리즘을 쓸 필요가 없다. -> simple method들로도 가능

1. Xavier initialization

2. He's initialization (2번이 좀 더 성능 좋음, 1번을 개선함)







Xavier initialization, He's initialization

 몇개의 입력(fan_in)이고, 몇개의 출력(fan_out)인가에 맞게 (비례해서) 초기값을 세팅하는 방법이다.








weight값 초기화는 아직도 연구중인 분야라고 한다. -> We don't know how to initialize perfect weight value.








Lec 10-3. Dropout과 Ensemble


위와 같이, 너무 training data에만 맞게 학습 모델을 만드는 것을 overfitting이라고 한다.







overfitting이 발생할 경우,

training dataset(파랑)에 대해서는  높은 accuracy를 보여주지만

test dataset(빨강)에 대해서는 poor한 accuracy를 보여준다.



즉,

training data(파랑)의 error는 Layer(또는 weight)개수가 많아질 수록 감소하고

testing data(빨강)의 error는 Layer(또는 weight)개수가 많아지면 어느정도 감소하다가 증가한다. -> 증가가 시작되는 지점부터 overfitting 발생





결과적으로, Layer(또는 weight)가 많아질수록(깊게 Neural Network를 만들수록) Hypothesis가 굉장히 곡선이 되기 때문에, overfitting 발생 가능성이 증가함을 알 수 있다.





이에 대한 해결방법

    1. More training data

    2. Regularization -> 곡선을 펴자








Regularization 

다음과 같이 cost식에 더하여, weight값이 큰 값을 갖지 않도록 한다.

빨간 밑줄친 람다는, Regularization Strength로

람다가 0일 경우 -> Regularization이 중요하지 않음

람다가 0.01일 경우 -> Regularization이 좀더 중요

람다가 0.1일 경우 -> Regularization이 매우 중요

함을 의미한다.






Dropout -> Overfitting 방지하는 방법


모델을 만들고 학습할 때, (a)에서 neuron들을 몇개 끊어버리는(몇개의 노드를 죽이는) 방법이다.

-> random하게 선택된 neurone들을 0으로 한다.(kill)



중요한 것은, 학습할때만 dropout을 한다는 것이다.

dropout을 적용해서 학습시킨 뒤에는, 모든 neuron(노드)들을 다 살려서 test(예측)을 해야한다. -> 잘됨


tensorflow에서 dropout을 이용할때,

dropout_rate == 0.5 -> 50%만 살림 (학습시 이용, dropout적용)

dropout_rate == 0.7 -> 70%만 살림 (학습시 이용, dropout적용)

dropout_rate == 1 -> 100% 다살림 (test할때 반드시 1로 해야함, dropout 미적용)

이다.






dropout에 대한 예시이다.

고양이에 대해서 학습 시킬때, 몇가지 정보들을 제외하고 학습시킨 뒤,

예측할때는 제외했던 정보들을 포함한 모든 정보들을 이용해서 예측하는 것이다.







Ensemble(앙상블) -> 2~4% 정도 성능 향상




각각 독립적인 Learning Model(Neural Network)를 학습시킨 뒤, 각각의 결과를 합치는 방법이다.


1. #1~#k의 Training Set은 서로 같아도 되고, 달라도 된다.

2. #1~#k의 Learning Model은 각각 독립적인 같은 형태의 Neural Network(예를 들면 10개의 Layer)이다.

    -> 여러명의 전문가에게 물어보는 과정임(초기값이 각자 다르므로, 결과도 조금씩 다르게 나옴)

3. Combiner가 각각 모델의 결과들을 합치고,

4. 이렇게 합친 예측 결과를 Ensemble Prediction이라고 한다.



한명의 전문가보다 독립된 여러명의 전문가에게 물어보면 좀 더 정확한 결과를 얻을 수 있는 것과 마찬가지다. -> 잘 적용된다고 함






Lec 10-4. NN Lego Play

여러 NN 모델들을 레고처럼 조립해서 원하는 모델을 만든다는 의미이다.

여러 NN 모델들을 소개해 보려고한다.






Feedforward neural network

레고와 같이 단순히 쌓기만 하는것










Fastforward neural network

어떤 Layer의 출력이 몇개 Layer를 뛰어넘어서 더해진다.

2015년에 에러 3%미만의 Image Net 인식률을 만들었던 네트워크 구조라고 한다.










Split & Merge

Convolutional Neural Network(CNN)과 유사하다.












Recurrent Neural Network(RNN)

앞으로(파란 방향)갈 뿐만 아니라, 옆으로(빨간 방향)도 간다.




'ML' 카테고리의 다른 글

ML 이론 강의 필기 - 5  (0) 2018.11.16
ML 이론 강의 필기 - 3  (0) 2018.10.27
ML 이론 강의 필기 - 2  (0) 2018.10.17
ML 이론 강의 필기 - 1  (0) 2018.10.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
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
글 보관함