InformationSecurity-Study

[모두의 딥러닝] Sigmoid 보다 ReLU가 더 좋다 (ReLU가 뭐길래??) 본문

인공지능

[모두의 딥러닝] Sigmoid 보다 ReLU가 더 좋다 (ReLU가 뭐길래??)

-Shinwoo- 2019. 5. 4. 04:22

하나의 Unit으로 해결하기 어렵기 때문에 여러 개의 Layer에 걸쳐서 학습시킨 결과, 

XOR문제를 해결하였던 실습을 지난 Lec9의 Lab1에서 하였다.

 

 

NN for XOR

각각의 Layer 사이에는 Sigmoid연산이 있는 것을 볼 수 있는데, 이런 함수들을 이제 네트워크에서는

"Activation function"이라고 부른다. 하나의 값이 그 다음 값으로 전달될 때 어느 값 이상이면 Activate되고 어느 값 이하이면 Deactivate되기 때문이다. 

 

 

 

 

Let's go deep & wide!

3단 Layer는 어떻게 구성할까?? 벡타들이 복잡해지는데, 2 input X에 5 Output을 원한다면 Next Layer에서 5 Input X를 해주면 된다. 또 4 Output을 얻고자 한다면 그 다음 Input에 4를, 최종 Output에 1의 값을 설정해주면 된다. 

이렇게 쌓아주면 전혀 어려울 것이 없다. Bias도 2번째 값에 똑같은 크기로 설정하면 된다.

 

L2를 그 다음 Layer에 넣고 출력하면 된다. 5개를 받아서 4개를 나가고 4개를 받아서 1개의 값이 출력된다.

앞쪽을 Input layer라 하고 마지막을 Output Layer라 부르는데, 이 가운데 부분을 Hidden Layer라고 한다.

 

 

 

 

 

9 Hidden Layers!

입력이고 출력이니까 9개의 weight을 만든다. 처음의 input과 마지막의 output만 신경쓰면 된다. 

각각의 Layer들을 Chain의 형식으로 연쇄적으로 연결을 해주면 여러 단계의 Layer을 쉽게 형성 가능하다.

 

 

 

 

실행을 시키면 어떤 결과가 나올까?? 

Poor Results --> Accuracy: 0.5

9단까지 연결을 했는데 한 단계의 Layer로 한 것과 같은 결과가 나온다. 왜 이런 일이 일어날까??

이 문제가 바로 "Backpropagation"이라 한다. 이것을 조금조금 사용하다 보니 2,3단 정도의 네트워크는

잘 학습이 되는데 9, 10단이 넘어갈 경우 학습이 안되는 것이다. 

 

 

 

위의 소스코드를 Tensorboard로 확인한 결과 아래와 같다. 

Tensorboard Cost & Accuracy

 

Backpropagation (chain rule)

x가 f에 미치는 영향을 구하고 싶을 때, chain Rule을 적용해서 구했었다. 

y가 다른 쪽에서 왔다고 치자. y값의 범위는 무엇일가? 0~1사이가 될 것이다. 

 

 

 

Sigmoid!

이런 형태의 작은 Sigmoid 연산을 거치고 Chain Rule을 적용하기 때문에 

결과는 0.01 * 0.01 * 0.03 ==> 0.0000000000000? 곱해지는 항이 많아질수록 더 0에 가까운 값을 가지게 될 것이다.

이것이 문제이다. 앞의 입력이 결과에 영향을 미치지 못한다는 뜻이다.

 

 

 

 

Vanishing gradient

최종 단 경사는 조금 나타나겠지만, 앞 단계들은 경사도가 사라지기 때문에 학습이 안 된다.

---> non-linearity를 잘못 사용한 것 때문 (Sigmoid가 이러한 문제를 일으킨 것!)

---> 이에 대한 해결책이 ReLU Function을 사용하는 것이다. 0보다 작으면 꺼버린다. 0보다 클 때 값에 비례해서 커진다.

 

 

 

ReLU: Rectified Linear Unit

따라서 Sigmoid 대신에 ReLU 함수를 사용하는 것이다. 

 

ReLU

ReLU를 적용해서 9단의 Layer를 다시 학습시킬 때, 마지막 단의 출력은 0~1사이를 가져야 하기 때문에 Sigmoid를 한 번 써준다는 것을 기억하자. "Works very well" 결과를 가짐을 알 수 있다. 

 

 

ReLU를 응용해서 Leaky ReLU를 만들었는데, 0보다 작으면 0으로 만드는 것이 극단적이기에 0.1x 값을을 갖도록 설정하는 것이다. tanh는 Sigmoid가 0을 중심으로 있지 않기 때문에 y값을 조금 내린 것이다.

이외에도 조금씩 다른 형태의 Activate Function들이 많이 있으며 Sigmoid를 제외하고는 꽤 좋은 정확도를 보인다.