본문 바로가기

PROJECT

[딥러닝 + TensorFlow] ReLU와 RBM

 

▶ReLU

참고 동영상 : https://youtu.be/cKtg_fpw88c

 

 

먼저 ReLU를 들어가기 전에 전에 포스팅 해두었던 Neural Net for XOR이 뭔지 알아야한다. 

관련 포스팅 : https://call203.tistory.com/38

 

그럼 저번 포스팅에 이어서 좀 더 설명해보겠다.

2개의 입력과 1개의 출력을 가지고 있는 네트워크를 보자.

 

 

만약 두개의 weight와 bias를 가질때는 아래와 같은 그림으로 나타낼 수 있다. 

 

그렇다면 layer가 3개일 때는 어떨까? weight와 bias를 늘려주고 hypothesis를 아래와 같이 조정해주면 된다. 아래의 hypothesis가 이렇게 되는 이유는 이미 전에 포스팅이 되어있다. 단, 여기서 중요한 것은 weight의 tf.random_uniform이다. 만약 아래봐 같이 W1이 2개를 입력으로 주고 5개를 출력하고 싶다면 다음 W2는 입력을 5개를 주어야한다.

그렇다면 9개 였을때는 어떨까? 이것도 마찬가지이다. 처음 W1에 입력이 2개 된다는 점과 과 W11에서 1개출력된다는 것 만 신경써주면 된다.

하지만  Acuracy가 0.5가 나온것을 보면 별로 결과는 좋지 않다는 것을 알 수 있다.

이유는 원래 backpropagation이라는 것이 Vanishing gradient라고 경사의 기울기가 사라져버리기 때문이라고 한다.

 

 

 

 

 

▶ReLU란?

 

 

sigmoid가 원래는 입력값이 주어지면 항상 1보다 작은 값이 나온다. 그래서 1보다 작은 값을 계속 곱하게 되면 아주 작은 값이 나오기 때문에 문제가 발생하는 것이었다. 이 문제를 해결하기 위해서 나온 것이 ReLU이다. 0가 작으면 꺼버리고 아닐때는 그 값을 그대로 반환하는것이 원리이다.

 

 

이제는 sigmoid대신에 relu라는 함수를 사용하면 된다. 

그렇다면 ReLU로 바뀐 코드예제도 같이 보자.

 

여기서 마지막 단은 relu()함수가 아닌 sigmoid라는 것을 볼 수 있다. 그이유는 결과 값이 0~1사이어야 하기 때문이다.

그런다음에 실행시켜보면 Accuracy가 1로 결과는 성공적으로 나온다는 것을 볼 수 있다.

 

 

 

참고 동영상 : https://youtu.be/4rC0sWrp3Uw

 

▶weight 초기화

우리는 이전에 초기화를 할때면 랜덤을 사용하였다. 하지만 만약 우리가 초기값을 0으로 주었다 생각해보자. 하지만 0은 미분했을 때 0이 되어서 기울기가 사라져버린다. 이를 방지하기 위해서 weight의 초기화를 잘 주는 것이 중요하다.

 

 

 

▶RBM

바로 위에와 같은 문제를 해결하기 위해서 RBM을 이용해서 초기화를 잘 줘보자. 아래와 같은 그림이 RBM의 구조이다.

 

여기서 x1,x2,x3의 입력을 주었을 때, weight와 bias를 이용해서 어떤 값을 만들어내는 것이 forward이다. [인코더]

그렇다면 backward에서는 아까 forward에서 만들어진 값과 weight(그대로 사용)값을 사용해서 화살표 방향으로 꺼꾸로  x의 값을 생성한다.  [디코더]

 

결국, forward의 x와 backward의 x가 똑같이 되도록 만들어 주는 것이 관건이다.

 

layer가 많을때 두개의 layer만 보고 인코더와 디코더의 반복을 통해 weigth를 찾아낸다. 그래고 그다음 두개로 가서 똑같은 과정을 반복하고 이 과정은 마지막 layer까지 진행한다.

 

 

▶Xavier initialization

그런데 이 복잡한 알고리즘을 구지 구현을 안해도 된다는 노문이 나오게 된다. 그것이 바로 Xavier initialization이다. 

하나의 노드에 몇개의 입력과 몇개의 출력이 있는가를 잘 보고 초기화를 그것에 맞추면 된다는 알고리즘이다.

 

weight을 랜덤하게 주는데 출력과 입력의 수에 맞춰 위에 식처럼 주니깐 RBM과 같은 결과를 낼 수 있다고 한다. 또 다른 주장은 #He~어쩌구 써져있는 식에 /2를 추가하면 더 잘 된다는 이야기도 나왔다는 것이다.

 

위에 와 같은 식을 그대로 가져다가 쓰면된다.