#!/usr/bin/env python3


Activation  Function


activation function는 신경망의 필수 요소이기 때문에 신경망을 사용할 때는 활성화 함수를 자주 접하게 됩니다.

activation function의 목표는 가중치와 편향치를 조절하는 것이며 텐서플로에서 activation function는 텐서에 적용되는 비선형 연산입니다.


신경망에 비선형성을 도입하는 가장 일반적인 방법은 ReLU 함수가 있습니다.

import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt


def printf(tfclass):

    init = tf.global_variables_initializer()

    with tf.Session() as sess:

        init.run()

        print(tfclass.eval())


line = tf.linspace(-10., 10., num=100)

def plot_act_func(model):

    init = tf.global_variables_initializer()

    with tf.Session() as sess:

        init.run()

        x = line.eval()

        y = model.eval()

    plt.plot(x, y)

    plt.show()


relu_rlt = tf.nn.relu([-3., 3., 10.])

printf(relu_rlt)

# [ 0.  3. 10.]


relu = tf.nn.relu(line)

plot_act_func(relu)

ReLU Function



ReLU activation function의 선형 증가량에 상한을 설정하고 싶을 때가 있습니다.

max(0, x) 함수를 min()함수로 감싸서 구현할 수 있습니다. 텐서플로에는 ReLU6가 구현되어 있고

Relu6 = min(max(0, x), 6)으로 정의되어 있습니다.


ReLU6 이 함수는 매끄럽지 않은 각진 모양의 sigmoid 함수로 생각할 수 있습니다.

relu6_rlt = tf.nn.relu6([-3., 3., 10.])

printf(relu6_rlt)

# [0. 3. 6.]


relu6 = tf.nn.relu6(line)

plot_act_func(relu6)

relu6 function



sigmoid 함수는 연속이고 매끄러운 가장 일반적인 activation function입니다. 로지스틱 함수라고도 하며, 수식으로는

1 / (1+exp(-x))로 표현합니다. sigmoid 함수는 학습 과정에서 역전파 항을 0으로 만들어 버리는 경향이 있기 때문에 자주 사용하지는 않습니다.


sig_result = tf.nn.sigmoid([-1., 0., 1.])

printf(sig_result)

# [0.26894143 0.5        0.7310586 ]


sigmoid = tf.nn.sigmoid(line)

plot_act_func(sigmoid)

sigmoid function



또 다른 activation function하이퍼볼릭 탄젠트 함수가 있습니다. 하이퍼볼릭 탄젠트 함수는 sigmoid 함수와 아주 비슷하지만, 함수 값의 범위가 -1에서 1입니다.

tanh_rlt = tf.nn.tanh([-1.0, 0., 1.])

printf(tanh_rlt)

# [-0.7615942  0.         0.7615942]


tanh = tf.nn.tanh(line)

plot_act_func(tanh)

tanh function



softsign 함수도 activation function로 사용할 수 있습니다.

x / (abs(x) + 1)로 표현할 수 있으며 부호sign 함수를 연속 함수로 근사한 것입니다.

sosign = tf.nn.softsign([-1., 0., -1.])

printf(sosign)

# [-0.5  0.  -0.5]


softsign = tf.nn.softsign(line)

plot_act_func(softsign)

softsign function



softplus 함수는 매끄럽게 만든 ReLU 함수라고 할 수 있다. 이 함수의 식은 log(exp(x) + 1)

softplus_rlt = tf.nn.softplus([-1., 0., -1.])

printf(softplus_rlt)

# [0.31326166 0.6931472  0.31326166]


softplus = tf.nn.softplus(line)

plot_act_func(softplus)

softplus function

입력값이 커지면 softplus 함수값은 무한대로 가고, softsign 함수 값은 1에 수렴합니다.

반대로 입력 값이 작아지면 softplus 함수 값은 0에 수렴하고, softsign함수값은 -1에 수렴합니다.



지수 선형 유닛(ELU, Exponential Linear Unit) 함수는 softplus 함수와 비슷하지만 하부 점근선이 -1입니다.

x<0일 때는 exp(x)+1이고, 그외에는 x입니다.

elu_rlt = tf.nn.elu([-1.0, 0., -1.])

printf(elu_rlt)

# [-0.63212055  0.         -0.63212055]


elu = tf.nn.elu(line)

plot_act_func(elu)

elu function




참고 자료: 

[1]TensorFlow Machine Learning Cookbook, Nick McClure

'Tensorflow > Introduction' 카테고리의 다른 글

placeholder, marix, operation  (0) 2018.04.25
Getting Start Tensorflow  (0) 2018.04.25

+ Recent posts