딥러닝에서 인공신경망을 설계할때 레이어마다 항상
Activaiton Function(활성화 함수)를 파라미터로 넣게된다.
model.add(layers.Dense(units=512, activation='relu'))
relu , elu 등등 ...
이런 것들은 왜 필요한 것일까?
먼저 활성화 함수가 없는 상태를 알아보자.
가장 간단한 인공신경망에서 이렇게 행렬곱으로 연산을 하게 된다.
x1 * W1 + x2 * W2 + bias
이것을 한층 더 쌓아보자. 조금 복잡해지지만 행렬곱으로 표현할 수 있다.
하지만 아무리 Layer 를 많이 쌓더라도 결국 복잡한 선형회귀식이 될 뿐이다.
Y = ax1 + bx2 + cx3 ....... + b 결국 직선이다..
아무리 복잡한 식을 가져온들 직선으로는 곡선이 필요한 문제를 해결 할 수 없다.
직선으로는 만족하는 결정 경계를 만들 수 없다.
그래서 필요한 것이 활성화 함수이다.
선형 함수로 표현하지 못하는 것을 비선형 함수(Non-linear function)로 풀어보자
- 활성화 함수는 선형함수를 구부러트려 주는 함수라고도 볼 수 있다.
- 직선을 곡선으로 바꿔주는 것
비선형 함수의 종류
이 많은 비선형 함수 중 하나를 활성화 함수로 선택해서
인공신경망의 계산 결과값을 X로 넣어주면 g(X) 를 거쳐 직선이 였던 것이 구부러지게 되는 것이다.
g(x1 * W1 + x2 * W2 + bias)
이런 구부러트리는 작업들이 각각의 레이어마다 거치게 되면서 점점 구부러져
완벽한 결정 경계를 만들게 되고 밑의 처럼 원을 만드는 문제도 해결 할 수 있게 된다.
그래서 딥러닝에서 복잡한 문제를 해결 하기 위해 활성화 함수가 필요하다.
비선형 함수는 딥러닝 초기에 Sigmoid 를 사용했다.
Sigmoid 함수를 사용하면 선을 구부러 트리게 될 수 있어서 복잡한 문제를 풀 수 있게 되었다.
하지만 sigmoid 함수도 결정적인 문제가 있다..
위의 파란색 라인의 값을 미분하면 그 결과값은 빨간색 점선이 된다.
* 미분했을때 값이 너무 작다 , 쓰면 쓸 수록 작아진다...
즉, 만약 0~1 사이의 값들이 들어왔다고 하면
결과값이 0~0.25 사이의 값으로 바뀌게 된다.
그래서 역전파 알고리즘이 사용될 때 ( 에러값를 가지고 전 과정으로 돌아가는 과정 )
Gradient vanishing(기울기 소실)문제가 발생하게 되는 것이다.
그래서 0~1(sigmoid)값이 아닌 -1~1(tanh)의 값을 사용해서 조금이라도 값의 폭을 키워 완화해보고자 했으나
근본적인 원인(기울기 소실)을 해결하지 못했고 한동안 침체기를 겪다가.
Relu 함수가 등장하게 된다.
아니 이렇게 단순한 녀석이 어떻게 기울기 소실 문제를 해결하는지 처음엔 의문이 들었지만
자세히 들여다 보면 모든 조건을 만족한다.
활성화 함수 사용조건은
1. 미분값을 구할 수 있어야한다. ( 기울기가 있어야한다.)
2. 비선형을 표현할 수 있어야한다.
ReLU 함수는 0을 기준으로 오른쪽 부분에서 미분값을 구할 수 있다. ( 첫 번째 조건 만족 )
ReLU 함수는 비선형성을 표현할 수 있다.
얼핏보면 선형함수처럼 보이지만 꺾인 부분이 존재하기 때문에 비선형을 표현할 수 있다. ( 두 번째 만족 )
그리고 y=x (x>0) 의 함수이기 때문에 결과값이 줄어들지 않는다. ( 기울기 소실 x )
딥러닝에서 ReLU 함수는 이미 거의 '국룰' 활성화 함수로 자리잡았다.
모르면 그냥 ReLU 써~ ( 실제로 이정도로 많이쓰인다... )
하지만 ReLU 함수도 단점이 있는데
음수(-)값은 그냥 0으로 보내버리기 때문에 음수값의 네트워크는 끊키게 된다.
이 아쉬운 부분을 채워주는 방법이 Leaky ReLU 이다.
음수 값도 기울기를 살짝? 주어서 네트워크가 끊기는 것을 막아줄 수 있다.
이렇게 해서 도대체 왜 활성화 함수를 쓰는지 이해하게 되었다.
모르고 쓸 수도 있지만 알고나니 좀 더 머리속으로 그려지게 되는 것 같다.
끝.
'Machine learning > Deep Learning' 카테고리의 다른 글
[PyTorch] . Tensorflow(텐서플로) PyTorch(파이토치) 차이점 비교 (0) | 2021.09.15 |
---|---|
[Deep Learning] Tensorflow 자주 사용하는 Tensor 함수 정리 (0) | 2021.08.21 |
[Deep Learning] Weight Initialization(기울기 초기화), Xavier , He (0) | 2021.08.17 |
[Deep Learning] Activation Function ( 활성화 함수 ) - 2. 종류 (0) | 2021.01.31 |
[Deep Learning] loss function - Cross Entropy (0) | 2021.01.12 |