activations_2

activation function

linear

static inline float linear_activate(float x){return x;}

static inline float linear_gradient(float x){return 1;}

Linear(x)=xLinear(x) = x

함수 이름: linear_activate, linear_gradient

입력:

  • x: float형 변수

동작:

  • linear_activate 함수는 입력 x를 그대로 출력하는 함수이다.

  • linear_gradient 함수는 입력 x에 대한 미분값을 계산하여 반환하는 함수이다. 선형 함수는 미분값이 항상 일정하므로 linear_gradient 함수는 상수 값을 반환한다.

설명:

  • 선형 함수는 입력 값에 대해 직선 형태로 출력 값을 계산하는 함수이다. 딥러닝에서는 입력 값을 변환하지 않고 그대로 출력하는 경우가 많은데, 이때 선형 함수를 활성화 함수로 사용할 수 있다.

  • linear_activate 함수는 입력 x를 그대로 출력하기 때문에, 입력 값을 변환하지 않고 그대로 사용하고자 할 때 활용된다.

  • linear_gradient 함수는 선형 함수의 미분값을 계산한다. 선형 함수는 기울기가 항상 일정하므로, 미분값은 항상 1이다. 따라서 linear_gradient 함수는 입력 값에 관계없이 1을 반환한다.

logistic

static inline float logistic_activate(float x){return 1./(1. + exp(-x));}

static inline float logistic_gradient(float x){return (1-x)*x;}

함수 이름: logistic_activate, logistic_gradient

입력:

  • x: 실수 값

동작:

  • logistic_activate: 로지스틱 함수의 활성화 값을 계산하여 반환한다.

  • logistic_gradient: 로지스틱 함수의 미분 값을 계산하여 반환한다.

설명:

  • logistic_activate: 로지스틱 함수는 S자 형태의 곡선으로, 입력 x가 클수록 1에 가까운 값을 출력하고, 작을수록 0에 가까운 값을 출력한다. logistic_activate 함수는 이러한 로지스틱 함수의 활성화 값을 계산하여 반환한다.

  • logistic_gradient: 로지스틱 함수의 미분 값을 계산하여 반환한다. 로지스틱 함수는 출력 값이 y일 때, y(1-y)의 미분 값을 가지는데, logistic_gradient 함수는 이 값을 계산하여 반환한다.

loggy

static inline float loggy_activate(float x){return 2./(1. + exp(-x)) - 1;}

static inline float loggy_gradient(float x)
{
    float y = (x+1.)/2.;
    return 2*(1-y)*y;
}

함수 이름: loggy_activate, loggy_gradient

입력:

  • loggy_activate: float형 변수 x

  • loggy_gradient: float형 변수 x

동작:

  • loggy_activate: 입력 x에 대해 로지스틱 함수를 변형한 함수를 계산하여 반환한다.

  • loggy_gradient: 로지스틱 함수를 변형한 함수의 미분 값을 계산하여 반환한다.

설명:

  • 로지스틱 함수를 변형한 함수로, x값이 0일 때 값이 0, x값이 큰 양수일 때 값이 1에 가까워지고, x값이 큰 음수일 때 값이 -1에 가까워지는 함수이다.

  • 로지스틱 함수를 변형한 함수의 미분 값은 입력 x가 0일 때 최대값 1/4을 가지며, x값이 커지거나 작아짐에 따라 감소한다.

relu

static inline float relu_activate(float x){return x*(x>0);}

static inline float relu_gradient(float x){return (x>0);}
RELU(x)={xifx>00ifx0RELU(x) = \left\{\begin{matrix} x && if \quad x > 0\\ 0 && if \quad x \leq 0 \end{matrix}\right.

함수 이름: relu_activate, relu_gradient 입력:

  • relu_activate: float 타입의 x (활성화 함수를 적용할 입력 값)

  • relu_gradient: float 타입의 x (활성화 함수를 미분할 입력 값)

동작:

  • relu_activate: x가 0보다 크면 x를 반환하고, 그렇지 않으면 0을 반환하여 입력 값을 비선형적으로 변환한다.

  • relu_gradient: x가 0보다 크면 1을 반환하고, 그렇지 않으면 0을 반환하여 입력 값에 대한 미분 값을 계산한다.

설명:

  • relu(Rectified Linear Unit) 함수는 인공신경망에서 가장 많이 사용되는 활성화 함수 중 하나이다.

  • relu_activate 함수는 입력 값 x가 0보다 크면 x를 반환하고, 0보다 작거나 같으면 0을 반환하여 입력 값을 비선형적으로 변환한다.

  • relu_gradient 함수는 입력 값 x가 0보다 크면 1을 반환하고, 0보다 작거나 같으면 0을 반환하여 입력 값에 대한 미분 값을 계산한다.

  • relu 함수는 입력 값이 양수인 경우 미분 값이 1이므로 역전파 과정에서 기울기 소실 문제(vanishing gradient problem)가 발생하지 않아 인공신경망에서 많이 사용된다.

elu

static inline float elu_activate(float x){return (x >= 0)*x + (x < 0)*(exp(x)-1);}

static inline float elu_gradient(float x){return (x >= 0) + (x < 0)*(x + 1);}
ELU(x)={xifx0α(ex1)ifx<0ELU(x) = \left\{\begin{matrix} x && if \quad x \geq 0\\ \alpha (e^x - 1) && if \quad x < 0 \end{matrix}\right.

함수 이름: elu_activate, elu_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • elu_activate: Exponential Linear Unit(ELU) 활성화 함수로, 입력 값 x가 0보다 크거나 같으면 x를 그대로 출력하고, 0보다 작으면 exp(x)-1을 출력한다.

  • elu_gradient: ELU 활성화 함수의 도함수로, 입력 값 x가 0보다 크거나 같으면 1을 출력하고, 0보다 작으면 x+1을 출력한다.

설명:

  • ELU 활성화 함수는 ReLU 함수의 단점을 보완한 함수로, 입력 값이 음수인 경우에도 출력 값을 생성할 수 있다.

  • 도함수에서 x+1을 사용한 이유는, x가 0보다 작을 때 exp(x)-1의 값이 음수가 될 수 있기 때문에, 값을 조정하여 미분이 가능하도록 한다.

selu

static inline float selu_activate(float x){return (x >= 0)*1.0507*x + (x < 0)*1.0507*1.6732*(exp(x)-1);}

static inline float selu_gradient(float x){return (x >= 0)*1.0507 + (x < 0)*(x + 1.0507*1.6732);}
SELU(x)=λ{xifx0α(ex1)ifx<0SELU(x) = \lambda \left\{\begin{matrix} x && if \quad x \geq 0\\ \alpha(e^x - 1) && if \quad x < 0 \end{matrix}\right.
  • α\alpha : 1.6732, λ\lambda : 1.0507

함수 이름: selu_activate, selu_gradient

입력:

  • activate 함수는 float형 x값 하나를 입력

  • gradient 함수는 float형 x값 하나를 입력

동작:

  • selu_activate 함수는 입력값 x에 대해 SELU(Scaled Exponential Linear Units) 함수를 적용하여 결과값을 반환한다.

  • selu_gradient 함수는 입력값 x에 대해 SELU 함수의 도함수를 계산하여 결과값을 반환한다.

설명:

  • SELU 함수는 deep neural network 학습 시 activation function으로 사용되는 함수 중 하나이다. 입력값 x가 0보다 작을 경우, 지수함수를 적용하여 출력값이 음수영역에서 부드럽게 변하도록 한다. 따라서 입력값의 분포가 평균 0, 분산 1로 정규화되는 효과를 갖게 된다. 이는 vanishing gradient 문제를 해결하는 데 도움이 된다.

  • selu_activate 함수는 입력값 x가 0보다 작을 경우, 지수함수를 적용하는 과정에서 컴퓨터에서 표현 가능한 범위를 벗어나게 되므로 1.0507과 1.6732라는 상수값을 사용하여 계산한다.

  • selu_gradient 함수는 입력값 x가 0보다 작을 경우, 입력값 x에 대한 도함수 계산 시 상수값 1.0507과 1.6732를 사용한다.

lecun normal

W N(0,Var(W))W ~ N(0, Var(W))
Var(W)=1ninVar(W) = \sqrt{\frac{1}{n_{in}}}

relie

static inline float relie_activate(float x){return (x>0) ? x : .01*x;}

static inline float relie_gradient(float x){return (x>0) ? 1 : .01;}
RELIE(x)={xifx>0αxifx0RELIE(x) = \left\{\begin{matrix} x && if \quad x > 0\\ \alpha x && if \quad x \leq 0 \end{matrix}\right.
  • α=0.01\alpha = 0.01

함수 이름: relie_activate, relie_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • relie_activate: x가 0보다 크면 x를 반환하고, 0보다 작거나 같으면 0.01*x를 반환한다. 이 함수는 ReLU(Rectified Linear Unit) 함수의 변형으로, 입력값이 0 이하일 때 약간의 값을 가지게 되어 죽은 뉴런(dead neuron) 문제를 해결하는 데 도움이 된다.

  • relie_gradient: x가 0보다 크면 1을 반환하고, 0보다 작거나 같으면 0.01을 반환한다. ReLU 함수와 마찬가지로 x가 0 이하이면 기울기가 0이 되어 역전파(Backpropagation) 과정에서 뉴런이 학습되지 않는 문제를 해결하기 위해 사용된다.

설명:

  • relie_activate 함수는 입력값 x를 받아서 ReLU 함수의 변형된 형태로 반환한다.

  • 입력값이 0보다 작을 경우, x값에 0.01을 곱한 값을 반환하므로, ReLU 함수와 달리 0 이하의 값을 가질 수 있다.

  • relie_gradient 함수는 입력값 x를 받아서 ReLU 함수의 변형된 형태의 미분값을 반환한다. 입력값이 0보다 작거나 같으면 0.01을, 0보다 크면 1을 반환하므로, ReLU 함수와 달리 0 이하의 값에서도 뉴런이 학습될 수 있도록 도와준다.

ramp

static inline float ramp_activate(float x){return x*(x>0)+.1*x;}

static inline float ramp_gradient(float x){return (x>0)+.1;}
RAMP(x)={x+0.1xifx>00.1xifx0RAMP(x) = \left\{\begin{matrix} x + 0.1*x && if \quad x > 0\\ 0.1*x && if \quad x \leq 0 \end{matrix}\right.

함수 이름: ramp_activate, ramp_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • ramp_activate 함수는 입력값 x가 0보다 크면 x를 반환하고, 0 이하이면 0.1x를 반환합니다.

  • ramp_gradient 함수는 입력값 x가 0보다 크면 1을 반환하고, 0 이하이면 0.1을 반환합니다.

설명:

  • ramp_activate 함수는 Rectified Linear Unit (ReLU) 함수와 유사하지만, 입력값이 0 이하일 때 0.1x를 반환하므로 기울기가 0이 되는 부분이 부드럽게 연결됩니다.

  • ramp_gradient 함수는 ramp_activate 함수의 미분값을 계산하여 반환합니다.

leaky relu

static inline float leaky_activate(float x){return (x>0) ? x : .1*x;}

static inline float leaky_gradient(float x){return (x>0) ? 1 : .1;}
LRELU(x)={xifx>0αxifx0LRELU(x) = \left\{\begin{matrix} x && if \quad x > 0\\ \alpha x && if \quad x \leq 0 \end{matrix}\right.
  • α=0.1\alpha = 0.1

함수 이름: leaky_activate, leaky_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • leaky_relu 함수의 활성화 값을 계산하거나 그래디언트 값을 계산하는 함수입니다.

  • leaky_relu 활성화 함수는 ReLU 함수의 변형 버전입니다.

  • x가 양수인 경우 x를 반환하고, 음수인 경우 0.1*x를 반환합니다.

  • 이 함수는 음수 영역에서도 작은 기울기를 가지기 때문에, ReLU 함수와는 달리 0이 아닌 값을 가지는 입력에 대해서도 그래디언트를 계산할 수 있습니다.

설명:

  • leaky_activate 함수는 주어진 x 값에 대해 leaky_relu 활성화 값을 계산하고, leaky_gradient 함수는 주어진 x 값에 대해 leaky_relu 활성화 함수의 그래디언트 값을 계산합니다.

  • leaky_relu는 입력값 x가 양수인 경우, x를 그대로 반환하고 음수인 경우 0.1x를 반환하는 함수입니다.

  • 따라서 leaky_activate 함수는 x가 양수인 경우 x를 반환하고, 음수인 경우 0.1x를 반환합니다.

  • leaky_gradient 함수는 입력 값 x가 양수인 경우 1을 반환하고, 음수인 경우 0.1을 반환합니다.

  • 이 함수는 x가 양수일 때는 ReLU 함수의 그래디언트와 같고, x가 음수일 때는 0.1의 고정 그래디언트 값을 갖습니다.

tanh

static inline float tanh_activate(float x){return (exp(2*x)-1)/(exp(2*x)+1);}

static inline float tanh_gradient(float x){return 1-x*x;}
TANH(x)=e2x1e2x+1TANH(x) = \frac{e^{2x} - 1}{e^{2x} + 1}

함수 이름: tanh_activate, tanh_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • tanh_activate 함수는 입력된 x값에 대해 hyperbolic tangent 값을 계산하여 반환함

  • tanh_gradient 함수는 입력된 x값에 대해 hyperbolic tangent 함수의 도함수 값을 계산하여 반환함

설명:

  • tanh 함수는 입력된 값을 -1과 1 사이의 값으로 변환해주는 함수로, 기울기 소실 문제를 완화하기 위해 사용될 수 있음

  • tanh_activate 함수는 입력된 x값에 대해 tanh 함수를 적용한 값을 반환함

  • tanh_gradient 함수는 입력된 x값에 대해 tanh 함수의 도함수인 1 - tanh^2(x)를 계산하여 반환함. 이 값은 입력값 x가 0에 가까울수록 1에 가까워지고, 입력값 x가 먼 경우 0에 가까워지는 특징을 가짐.

plse

static inline float plse_activate(float x)
{
    if(x < -4) return .01 * (x + 4);
    if(x > 4)  return .01 * (x - 4) + 1;
    return .125*x + .5;
}

static inline float plse_gradient(float x){return (x < 0 || x > 1) ? .01 : .125;}
PLSE(x)={0.01(x+4)ifx<40.01(x4)+1ifx>4PLSE(x) = \left\{\begin{matrix} 0.01 * (x + 4) && if \quad x < -4\\ 0.01 * (x - 4) + 1 && if \quad x > 4 \end{matrix}\right.

함수 이름: plse_activate, plse_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • plse_activate 함수: 입력 값 x에 대해, x가 -4 이하인 경우 0.01*(x+4) 값을, x가 4 이상인 경우 0.01*(x-4)+1 값을, 그 외의 경우 0.125*x+0.5 값을 반환한다.

  • plse_gradient 함수: 입력 값 x에 대해, x가 0보다 작거나 1보다 큰 경우 0.01 값을, 그 외의 경우 0.125 값을 반환한다.

설명:

  • plse_activate 함수는 "piecewise linear squashing function"의 약자로, 입력 값을 -4와 4를 기준으로 piecewise linear하게 변환하여 반환하는 함수이다. 이 함수는 비선형 함수 중 하나로, sigmoid 함수와 유사한 형태를 가지며 입력 값이 크거나 작을수록 평평한 기울기를 가진다.

  • plse_gradient 함수는 plse_activate 함수의 미분 값을 반환하는 함수이다. 입력 값 x가 0보다 작거나 1보다 크면 0.01 값을, 그 외의 경우 0.125 값을 반환하는데, 이는 plse_activate 함수의 기울기를 나타내는 값으로 사용된다.

stair

static inline float stair_activate(float x)
{
    int n = floor(x);
    if (n%2 == 0) return floor(x/2.);
    else return (x - n) + floor(x/2.);
}

static inline float stair_gradient(float x)
{
    if (floor(x) == x) return 0;
    return 1;
}
STAIR(x)={floor(x2)ifn%2==0(xn)floor(x2)elseSTAIR(x) = \left\{\begin{matrix} floor(\frac{x}{2}) && if \quad n \% 2 == 0\\ (x - n) floor(\frac{x}{2}) && else \end{matrix}\right.
  • n:floor(x)n : floor(x)

함수 이름: stair_activate, stair_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • stair_activate 함수: 입력된 x 값이 양의 정수일 때, x/2 값을 반환하고, 음의 정수일 때, (x - n) + floor(x/2.) 값을 반환합니다. 여기서 n은 x의 바닥값(floor)입니다.

  • stair_gradient 함수 동작: 입력된 x 값이 정수일 때, 0을 반환하고, 아니면 1을 반환합니다.

설명:

  • stair_activate 함수는 계단 함수(stair function)를 구현한 것입니다.

  • 계단 함수는 입력값에 따라 출력값이 이산적으로 변화하는 함수로, 입력값이 정수일 때만 0 또는 1을 반환합니다.

  • stair_activate 함수는 이러한 계단 함수를 활성화 함수로 사용할 수 있습니다.

  • stair_gradient 함수는 입력값이 정수일 때는 0을 반환하고, 정수가 아니면 1을 반환하여, 역전파(backpropagation)에서 계단 함수의 미분값을 계산합니다.

hardtan

static inline float hardtan_activate(float x)
{
    if (x < -1) return -1;
    if (x > 1) return 1;
    return x;
}

static inline float hardtan_gradient(float x)
{
    if (x > -1 && x < 1) return 1;
    return 0;
}
HARDTAN(x)={1ifx>11ifx<1xif1x1HARDTAN(x) = \left\{\begin{matrix} 1 && if \quad x > 1\\ -1 && if \quad x < -1 \\ x && if \quad -1 \leq x \leq 1 \end{matrix}\right.

함수 이름: hardtan_activate, hardtan_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • hardtan_activate: x가 -1보다 작으면 -1, 1보다 크면 1을 반환하고, 그 외의 경우는 x를 반환한다.

  • hardtan_gradient: x가 -1과 1 사이에 있으면 1을 반환하고, 그 외의 경우는 0을 반환한다.

설명:

  • hard tanh 함수는 tanh 함수를 간단하게 변형한 함수로, x가 -1과 1 사이일 때는 입력값 그대로 반환하고, 그 외의 경우에는 -1 또는 1을 반환하는 함수이다.

  • hardtan_activate 함수에서는 x가 -1보다 작으면 -1, 1보다 크면 1을 반환하고, 그 외의 경우는 x를 반환한다.

  • hardtan_gradient 함수에서는 x가 -1과 1 사이에 있으면 1을 반환하고, 그 외의 경우는 0을 반환한다. 이는 x가 -1과 1 사이에 있을 때는 미분값이 1이 되므로 역전파 과정에서 기울기가 전달되도록 하기 위해서이다.

lhtan

static inline float lhtan_activate(float x)
{
    if(x < 0) return .001*x;
    if(x > 1) return .001*(x-1) + 1;
    return x;
}

static inline float lhtan_gradient(float x)
{
    if(x > 0 && x < 1) return 1;
    return .001;
}
LHTAN(x)={0.001(x1)+1ifx>10.001xifx<0xif0x1LHTAN(x) = \left\{\begin{matrix} 0.001 * (x - 1) + 1 && if \quad x > 1\\ 0.001 * x && if \quad x < 0 \\ x && if \quad 0 \leq x \leq 1 \end{matrix}\right.

함수 이름: lhtan_activate, lhtan_gradient

입력:

  • x (활성화 함수의 입력 값)

동작:

  • lhtan_activate: 입력값 x에 대해 다음 조건에 따라 출력값을 계산한다.

    • x가 0보다 작으면 0.001*x를 출력한다.

    • x가 1보다 크면 0.001*(x-1) + 1을 출력한다.

    • 그 외의 경우에는 x를 출력한다.

  • lhtan_gradient: 입력값 x에 대해 다음 조건에 따라 출력값을 계산한다.

    • 0 < x < 1이면 1을 출력한다.

    • 그 외의 경우에는 0.001을 출력한다.

설명:

  • lhtan_activate 함수는 "linearly hard-tanh activation" 함수이며, 입력값 x가 0보다 작거나 1보다 큰 경우에는 그 값을 일정 비율로 줄이거나 늘리고, 그 외의 경우에는 x값을 그대로 출력하는 함수이다.

  • lhtan_gradient 함수는 lhtan_activate 함수의 미분값을 계산하는 함수로, x가 0과 1 사이인 경우에는 미분값이 1이 되고, 그 외의 경우에는 0.001이 된다.

Reference

Last updated