[딥러닝] Activation Function 활성함수 한번에 이해하기(Sigmoid, Softmax, Relu)
[딥러닝] Activation Function 활성화함수
딥러닝의 장점은 선형함수를 깊게 쌓을 수 잇는 것이 장점이다.
하지만 선형함수를 깊게 쌓아봤자 선형함수가 되어
복잡한 모델링을 하기가 어렵다.
이 문제를 해결하기 위해서
모델 레이어를 쌓을 때
선형 함수 사이사이에 선형함수가 아닌 것을
번갈아 넣어줌으로써
복잡한 문제를 풀 수 있다.
이 비선형 함수를 활성 함수(activation funtion)라고 하고,
relu, sigmoid, softmax 등이 있다.
위 설명대로 activation을 넣어서 모델링을 해보면
model = Sequential([
tf.keras.layers.Flatten(input_shape = (28,28)),
tf.kearas.layers.Dense(512)
tf.kearas.layers.ReLU(),
tf.kearas.layers.Dense(256)
tf.kearas.layers.ReLU(),
tf.kearas.layers.Dense(64)
tf.kearas.layers.ReLU(),
tf.kearas.layers.Dense(32)
tf.kearas.layers.ReLU(),
tf.kearas.layers.Dense(10)
tf.kearas.layers.Softmax(),
])
이렇게 길게 쌓아야한다.
하지만 레이어가 너무 길어지고 보기에도 힘들기 때문에
model = Sequential([
tf.keras.layers.Flatten(input_shape = (28,28)),
tf.kearas.layers.Dense(512, activation = 'relu'),
tf.kearas.layers.Dense(512, activation = 'relu'),
tf.kearas.layers.Dense(512, activation = 'relu'),
tf.kearas.layers.Dense(512, activation = 'relu'),
tf.kearas.layers.Dense(512, activation = 'relu'),
tf.kearas.layers.Dense(10, activation = 'softmax'),
])
이렇게 2줄을 1줄로 합쳐서 적어줄 수 있다.
보통
중간층에서는 activation funtion을 relu를 쓰고
마지막 층에는 softmax를 쓰면 좋은 성능을 낼 수 있다고한다.
마지막 출력층의 activation funtion에 따라서
모델 컴파일 할 때 loss의 값이 다르다.
1. 이진분류
이진분류에서는
sigmoid 함수를 사용한다.
이때
loss값은 binary_crossentropy를 사용.
2. 다중분류
다중분류에서는 softmax 함수를 사용하고
loss값은
onehot_encording이 되어있다면
categorical_crossentropy
onehot_encording이 되어있지 않다면
sparse_categorical_crossentropy
모델링을 하고 모델 컴파일을 할 때에
매우매우 중요한 부분이다.
Sigmoid함수
y = 1, y = 0
x = 무한대부터 무한대
x에 어떤 값이 들어가든, y는 무조건 0~1사이이다.
예를들어
뉴런이 하나가 sigmoid를 거치면 0~1 사이가 나온다.
뉴런의 확률이 0.3이 나왔다라고 치면
y의 중간값 0.5보다 작으니 classA이다.
뉴런의 확률이 0.7이 나왔다라고 치면
0.5보다 크니 classB이다
이런식으로 결정을 하는 것.
Softmax
softmax에 input 뉴런을 넣으면
그 값들이 모두 0,1 사이로 정규화가 된다.
따라서
모든 뉴런의 확률값의 합은 1.0이 나와야하고
가장 높은 확률을 가진 뉴런이 class가 된다.