NonLinear는 말그대로 비선형 동작을 하도록 파라미터들에 계산되어지는 값입니다. DeepLearning에서는 모델을 깊게 쌓는 것이 중요한데 이때 각각의 Layer가 non-Linear하지않으면, 반복적으로 쌓는다고 하더라도 한 번의 계산으로 이루어지게 됩니다. 각각의 Layer를 하나의 선형 계산이 이루어지지 않도록 Layer마다 Non-linear를 계산해주어 넘겨주면 각각의 Layer는 다른 결과를 낼 수 있는 파라미터를 가지게 되는 것으로 볼 수 있습니다.
해당 페이지에서는 Torch에 존재하는 Linear들의 그래프를 살펴보고 어떠한 곳에서 이점이 있는지 간략하게 살펴봅니다. 아래 GIF는 많은 Activation Function들의 흐름을 한 눈에 볼 수 있습니다.
https://mlfromscratch.com/activation-functions-explained/#/
그래프 :
등장 이유 : ReLU가 엄청난 성능을 보이는 것은 사실이지만, ReLU는 0 이상의 값들만 출력을 계속해서 하기 때문에 뉴런이 0 이하인 값을 가지게 된다면 죽은 뉴런으로써 연산이 이루어지지 않는 문제가 생깁니다. 이러한 문제는 모델이 깊어질수록 죽은 뉴런들이 늘어나게 되어 Gradient Vanishing문제를 가속화하기 때문에 꽤 심각한 문제로 여겨지게 되었고, 이러한 문제를 해결하기위해 나오게 된 것이 ELU 입니다.
수식 :
수식을 살펴보면 하이퍼 파라미터 알파를 통해서 - 값의 최대를 설정할 수 있다는 것을 알 수 있습니다.
사용법 :
import torch
temp = torch.randn((3, 5, 5))
print(temp)
a = torch.nn.ELU()(temp)
print(a)
-----------------------------------
tensor([[[ 0.2593, 0.0802, 1.4331],
[-0.4082, -1.4679, -0.9772],
[ 0.2565, 0.0028, 0.1959]],
[[-0.6238, -0.5003, 0.9648],
[-1.8868, 1.7545, -0.0349],
[-1.3756, 0.4615, -0.0222]]]
tensor([[[ 0.2593, 0.0802, 1.4331],
[-0.3352, -0.7696, -0.6236],
[ 0.2565, 0.0028, 0.1959]],
[[-0.4641, -0.3936, 0.9648],
[-0.8484, 1.7545, -0.0343],
[-0.7473, 0.4615, -0.0219]]])
그래프 :
등장 이유 : 딱히 등장의 이유랄 것은 모르겠지만, 값의 특정범위만을 제외하고 훈련에 참여하고 싶을 때 사용할 수 있을 것 같습니다. 어떻게 보면 파라미터의 특정 부위를 cutting해서 학습하는 것으로 볼 수 있을거라고 생각됩니다.
수식 :