Broccoli's House

#2-(2) 신경망 : 활성화 함수 본문

공부/딥러닝

#2-(2) 신경망 : 활성화 함수

김콜리 2018. 1. 24. 15:16

※ 이 글의 내용은 O'REILLY의 <밑바닥부터 시작하는 딥러닝> 책을 기반으로 한다.




활성화 함수




  • 활성화 함수
 - 활성화 함수(Activation Function) : 퍼셉트론 알고리즘에서, 입력 신호에 가중치를 곱한 값을 임계치와 비교하여 그보다 크면 1을, 작으면 0을 반환한다. 이 때 임계치와 비교하여 0또는 1을 출력하는 함수를 활성화 함수라한다. 즉, 활성화 함수란 입력 신호의 총합을 출력 신호로 변환하는 함수이다. 입력 신호의 총합이 활성화를 일으키는지 정하는 역할을 한다. 다음은 입력 신호의 총합 a를 출력 신호 y로 변환하는 활성화 함수 h이다.



<활성화 함수 개형도>




  • 계단 함수

 - 계단 함수(Step Function) : 임계치를 경계로 출력이 바뀌는 함수이다. 즉, 0을 경계로 출력이 0에서 1, 또는 1에서 0으로 바뀌는 함수이다. 퍼셉트론 알고리즘에서는 활성화 함수로 계단함수를 이용한다.


def step_function(x) :
y = x > 0
return y.astype(np.int)
# 부등호 연산 수행 후에 bool 타입의 배열을 int 타입으로 변경해준다.

x = np.arange(-5.0, 5.0, 0.1) # -5에서 5까지 0.1 간격의 원소를 갖는 배열을 생성한다.
y = step_function(x)
plt.plot(x,y) # x와 y에 대한 그래프를 그려준다.
plt.ylim(-0.1, 1.1) # y축의 범위를 지정한다.
plt.show() 



<계단 함수 그래프>




 
  • 시그모이드 함수

 - 시그모이드 함수(Sigmoid Function) : 시그모이드 함수는 'Sigmoid'라는 말 그대로 그래프의 개형이 S자처럼 생긴 함수를 말한다. 값이 커질수록 1에, 값이 작아질수록 0에 수렴하는 함수이다. 신경망에서는 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고, 변환된 신호를 다음 노드에 전달한다. 퍼셉트론와 신경망의 주된 차이는 계단함수와 시그모이드 함수의 활성화 함수 차이 뿐이며, 그 외 알고리즘의 기본적인 구조나 신호를 전달하는 방법에서 퍼셉트론과 신경망은 동일하다.


def sigmoid_function(x) :
return 1 / (1 + np.exp(-x))
# 시그모이드 함수 출력 값 반환

x = np.arange(-5.0, 5.0, 0.1) # -5에서 5까지 0.1 간격의 원소를 갖는 배열을 생성한다.
y = sigmoid_function(x)
plt.plot(x,y) # x와 y에 대한 그래프를 그려준다.
plt.ylim(-0.1, 1.1) # y축의 범위를 지정한다.
plt.show() 



<시그모이드 함수 그래프>


 

 - 시그모이드 함수와 계단 함수는 그래프 형태에서 차이를 보이지만, 큰 관점에서 보면 둘 다 입력이 작을 때의 출력은 0에 가깝고 입력이 커지면 출력이 1에 가까워지는 구조를 띄고있다. 즉, 계단 함수와 시그모이드 함수는 입력이 중요하면 큰 값을 출력하고 입력이 중요하지 않으면 작은 값을 출력한다. 또한 입력이 아무리 작거나 크더라도 출력은 0과 1사이에서 존재한다.


 - 계단함수와 시그모이드 함수는 모두 비선형 함수이다. 신경망에서는 활성화 함수로 선형 함수를 사용해서는 안된다. 선형 함수의 경우 층을 아무리 깊게 하더라도 다른 하나의 선형 함수로 표현할 수 있고, 이렇게 되면 은닉층(Hidden Layer)이 없는 네트워크와 동일하기 때문에 신경망의 층을 깊게하는 의미가 없기 때문이다.




  • 렐루 함수
 - 렐루 함수(ReLU Function) : 렐루(ReLU, Rectified Linear Unit) 함수는 정류된 선형 함수를 말한다. 즉, 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하일 때는 0을 출력하는 함수이다. 시그모이드 함수를 신경망 분야에서 오래전부터 이용해왔으나, 최근에는 렐루 함수를 주로 이용한다. 

 - 각각의 입력이 출력에 끼치는 영향을 알고, 가중치를 조절하기 위해 오차역전파(Backpropagation) 알고리즘을 사용한다. 그런데 이 알고리즘을 사용하여 층이 10개 이상으로 많아지고 출력부터 입력까지 미분 값을 연쇄법칙으로 계산해오면, 시그모이드 함수를 이용한 경우 0에서 1까지의 소숫점 값이 계속 곱해지다보니 입력이 출력에 끼치는 영향이 거의 0에 가까운 것을 발견하였다. 이렇게 되면 학습이 잘 이루어지지 않아서, 최근에는 시그모이드 함수를 잘 이용하지 않고 렐루를 많이 사용하는 것이다.



def relu_function(x) :
return np.maximum(0,x)
# 0과 입력 값 중에서 큰 값을 반환한다.

x = np.arange(-5.0, 5.0, 0.1) # -5에서 5까지 0.1 간격의 원소를 갖는 배열을 생성한다.
y = relu_function(x)
plt.plot(x,y) # x와 y에 대한 그래프를 그려준다.
plt.show()



<렐루 함수 그래프>


'공부 > 딥러닝' 카테고리의 다른 글

#2-(4) 신경망 : 출력층 설계  (0) 2018.01.26
#2-(3) 신경망 : 3층 신경망 구현  (1) 2018.01.25
#2-(1) 신경망 : 소개  (0) 2018.01.24
#1-(3) 퍼셉트론 : XOR 게이트  (1) 2018.01.23
#1-(2) 퍼셉트론 : 단순 논리 회로  (0) 2018.01.23
Comments