NonLinear는 말그대로 비선형 동작을 하도록 파라미터들에 계산되어지는 값입니다. DeepLearning에서는 모델을 깊게 쌓는 것이 중요한데 이때 각각의 Layer가 non-Linear하지않으면, 반복적으로 쌓는다고 하더라도 한 번의 계산으로 이루어지게 됩니다. 각각의 Layer를 하나의 선형 계산이 이루어지지 않도록 Layer마다 Non-linear를 계산해주어 넘겨주면 각각의 Layer는 다른 결과를 낼 수 있는 파라미터를 가지게 되는 것으로 볼 수 있습니다.

해당 페이지에서는 Torch에 존재하는 Linear들의 그래프를 살펴보고 어떠한 곳에서 이점이 있는지 간략하게 살펴봅니다. 아래 GIF는 많은 Activation Function들의 흐름을 한 눈에 볼 수 있습니다.

https://mlfromscratch.com/activation-functions-explained/#/

https://mlfromscratch.com/activation-functions-explained/#/

1. ELU

그래프 :

Untitled

등장 이유 : ReLU가 엄청난 성능을 보이는 것은 사실이지만, ReLU는 0 이상의 값들만 출력을 계속해서 하기 때문에 뉴런이 0 이하인 값을 가지게 된다면 죽은 뉴런으로써 연산이 이루어지지 않는 문제가 생깁니다. 이러한 문제는 모델이 깊어질수록 죽은 뉴런들이 늘어나게 되어 Gradient Vanishing문제를 가속화하기 때문에 꽤 심각한 문제로 여겨지게 되었고, 이러한 문제를 해결하기위해 나오게 된 것이 ELU 입니다.

수식 :

Untitled

수식을 살펴보면 하이퍼 파라미터 알파를 통해서 - 값의 최대를 설정할 수 있다는 것을 알 수 있습니다.

사용법 :

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]]])

2. Hardshrink

그래프 :

Untitled

등장 이유 : 딱히 등장의 이유랄 것은 모르겠지만, 값의 특정범위만을 제외하고 훈련에 참여하고 싶을 때 사용할 수 있을 것 같습니다. 어떻게 보면 파라미터의 특정 부위를 cutting해서 학습하는 것으로 볼 수 있을거라고 생각됩니다.

수식 :

Untitled