인공지능

[모두의 딥러닝] lec 10-1. Neural Network: XSigmoid보다 ReLU가 더 좋아

여니두 2019. 5. 10.

NN for XOR

- 하나의 유닛으로는 잘 되지 않으니 여러 개의 유닛을 겹쳐서 XOR 문제를 풀 수 있음

- 각 유닛의 끝에는 Sigmoid 함수가 붙어 있음

 

* Activation function 

- sigmoid 함수 같은 것을 네트워크에서는 이렇게 지칭함

- 네트워크는 연결로 이루어져 있음.

- 하나의 값이 그 다음 값으로 전달될 때 어느 값 이상이면 activate, 아니면 deactivate

 

구현 시 소스코드

- 2단 네트워크

 

- 3단 네트워크: deep & wide

: 벡터들이 복잡해지기 때문에 벡터를 어떻게 할까 고민해야 한다.

: 처음에는 입력값이 2개니까 [2, 5]

: 맨 마지막 출력은 정해져 있음. [4, 1]

 

: bias = weight를 구성하는 두 번째 값에 똑같은 크기로 마련

 

* hidden layer

: 특별한 의미는 없음. input, output layer에서 안 보이기 때문에 이름 붙임

 

- 9 hidden layers

: 체인으로 계속 연결시키면 된다.

==> Deep network

--> 이것을 학습시키면 deep learning

 

--> TensorBoard를 이용하여 시각화

: tf.name_scope를 통해 각각 이름을 준다.

: 그 밑에 내가 원하는 layer들을 선언

: 장점)

복잡한 딥 네트워크를 설계할 때 코드만 보면 어려울 수 있는데 그림으로 보면 연결 상태, 각각의

W, b 등을 한 눈에 볼 수 있음

 

- 실행

: cost가 떨어지지 않고, accuracy도 0.5가 됨.

--> 1개 유닛한 것보다 나쁘게 나옴.

 

===> 문제점을 Tensorboard로도 보기

 

이런 문제점의 원인

* 86년도 Backpropagation 등장

- 문제: 2, 3단 네트워크는 잘 학습이 되지만, 9단계처럼 많으면 학습이 되지 않음

 

왜 이런 문제가 발생했는가?

: x가 최종 f에 미치는 영향을 알기 위하여 미분

--> 전체의 미분을 하기 어려우니 하나씩 미분하여 곱함

: 뒤에서 전달된 값과 local의 미분 값을 chain rule을 정하여 곱함.

: * gate의 경우

 

- x의 편미분(f에 대한) = g의 f에 대한 편미분 * y

: y가 다른 입력쪽에서 왔다고 가정했을 때, 

y의 값은 0~1 사이 (sigmoid 함수 참조)

ex) (sigmoid 전) y = -10 --> y = 0.01 (대략)

==> x의 f에 대한 편미분 = 0.01 * g의 f에 대한 편미분

 

결론) 이런 sigmoid 게이트를 항상 통과하기 때문에 단점= 항상 1보다 작은 값, 경우에 따라 0에 가까운

값이 계속 곱해질 것(chain rule 적용 때문)

--> 최종적인 입력(x)(미분값)에서 굉장히 작은 값이 될 것

==> 최종적인 입력(x 쪽)이 f에 영향을 별로 미치지 않는 것이 된다.

==>

Vanishing gradient (NN winter2: 1986-2006)

: 경사의 기울기가 사라지는 문제

- 최종 단쪽의 경사의 기울기는 존재하지만, 뒤로 갈수록 기울기가 사라짐

* 경사도가 사라진다 = 학습하기 어렵다 = x의 입력이 f에 별로 영향을 끼치지 않는다

= 예측이 안된다

 

==> 문제 해결: Geoffrey Hinton's summary of findings up to today

4. We used the wrong type of non-linearity

--> Sigmoid를 잘못 쓴 것 같다!

- sigmoid가 이러한 문제를 야기) 입력값이 주어지면 결과는 항상 1보다 작게 나온다.

0에 가까운 값을 chain rule을 통해 계속 곱해 나가기 때문에, 출력값은 항상 작은 값이 나옴.

 

Activation function: ReLU

- 0보다 작을 경우 꺼버리고, 0보다 클 경우 값에 비례해서 갈 때까지 간다.

ReLU: Rectified Linear Unit

- 앞에 sigmoid를 넣는 대신에 ReLU를 넣는 것

- NN에서 더이상 sigmoid 쓰면 좋지 않음.

- ReLU의 구현

: max(0, X) --> 0과 X 둘 중 하나의 값으로 나옴.

 

ReLU 적용

- 마지막 단은 sigmoid를 사용.

이유) 출력값이 0~1 사이어야 하기 때문이다.

 

- 결과) Accuracy = 1.0

 

- Cost function

ReLU를 사용하면 cost값이 빨리 떨어진다.

 

ReLU의 변형

1. Leaky ReLU

- 0 이하를 조금 살려줌: max(0.1x, x)

2. Maxout

3. ELU

- 0 이하를 0으로 fix하지 말고 값을 바꾸는 것.

4. tanh

- sigmoid의 단점을 보완

- sigmoid를 0의 중심으로 내림 (최소 -1, 최대 1)

 

Activation function 정확도

댓글