[모두의 딥러닝] lec 10-1. Neural Network: XSigmoid보다 ReLU가 더 좋아
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)
'인공지능' 카테고리의 다른 글
[모두의 딥러닝] lec 10-3. NN dropout and model ensemble (0) | 2019.05.27 |
---|---|
[모두의 딥러닝] lec 10-2. Initialize weights 잘 해보자 (0) | 2019.05.13 |
[모두의 딥러닝] lab 09-2. Tensorboard (Neural Net for XOR) (0) | 2019.05.07 |
[모두의 딥러닝] lab 09-1. Neural Net for XOR (0) | 2019.05.07 |
[모두의 딥러닝] lec 09-2. Neural Network: 딥네트웍 학습시키기 (backpropagation) (0) | 2019.05.07 |
댓글