티스토리 뷰

1. 신경망


신경망을 그림으로 나타내면 [그림 1] 처럼 됩니다. 여기에서 가장 왼쪽 줄을 입력층, 맨 오른쪽 줄을 출력층, 중간 줄을 은닉층이라고 합니다.

은닉층의 뉴런은 (입력층이나 출력층과 달리) 사람 눈에는 보이지 않습니다. 그래서 '은닉'인 것입니다.

[그림 1]


2. 활성화 함수


입력 신호의 총합을 출력 신호로 변환하는 함수를 일반적으로 활성화 함수(activation funcion)라 합니다. '활성화'라는 이름이 말해주듯 활성화 함수는 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 합니다.


[식 1]는 가중치가 곱해진 입력 신호의 총합을 계산하고, 그 합을 활성화 함수에 입력해 결과를 내는 2단계로 처리됩니다.


[식 1]


그래서 다음과 같은 2개의 식으로 나눌 수 있습니다.


[식 2]


[식 3]


[식 2]는 가중치가 달린 입력 신호와 편향의 총합을 계산하고, 이를 a라 합니다.

그리고 [식 3]은 a를 함수 h()에 넣어 y를 출력하는 흐름입니다.


지금까지와 같이 뉴런을 큰 원으로 그려보면 [식 2]와 [식 3]은 아래 [그림 2] 처럼 나타낼 수 있습니다.

보시다시피 [그림 2]에는 기존 뉴런의 원을 키우고, 그 안에 활성화 함수의 처리 과정을 명시적으로 그려놓습니다.


즉, 가중치 신호를 조합한 겨로가가 a라는 노드가 되고, 활성화 함수 h()를 통과하여 y라는 노드로 변환되는 과정입니다.


[그림 2]



3. 시그모이드 함수


다음은 신경망에서 자주 이용되는 활성화 함수인 시그모이드 함수(sigmoid function)를 나타낸 식입니다.



exp(-x)는  를 뜻하며, e는 자연상수로 2.7182...의 값을 갖는 실수입니다.

함수는 입력을 주면 출력을 돌려주는 변환기입니다. 예를 들어 시그모이드 함수에 1.0과 2.0을 입력하면 h(1.0) = 0.731... , h(2.0) = 0.880... 


신경망에서 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고, 그 변환된 신호를 다음 뉴런에 전달합니다.


4. 계단 함수 구현하기


import numpy as np

import matplotlib.pylab as plt


def step_function(x):

    return np.array(x > 0, dtype = np.int)


x = np.arange(-5.0, 5.0, 0.1)

y = step_function(x)


plt.plot(x, y)

plt.ylim(-0.1, 1.1)

plt.show()




np.arange(-0.5, 5.0, 0.1)은 -5.0에서 5.0 전까지 0.1 간격의 넘파이 배열을 생성합니다.

즉, [-5.0, -4.9, .... 4.9]를 생성하고 각각 인수로 계단 함수를 실행해, 그 결과를 다시 배열로 만들어 돌려주는 프로그램인데요.

계단 함수는 그림을 보듯이 0을 경계로 출력이 0에서 1(또는 1에서 0)로 바뀝니다.


5. 시그모이드 함수 구현하기

def sigmoid(x):

    return 1 / (1 + np.exp(-x))


x = np.arange(-5.0, 5.0, 0.1)

y = sigmoid(x)


plt.plot(x, y)

plt.ylim(-0.1, 1.1)

plt.show()


함수만 다를 분 앞의 계단함수와 거의 같습니다.


중요한것은 계단함수와 시그모이드 함수의 차이점은 '매끄러움'의 차이입니다.

시그모이드 함수는 부드러운 곡선이며 입력에 따라 출력이 연속적으로 변합니다. 한편, 계단 함수는 0을 경계로 출력이 갑자기 바뀌어버립니다.

시그모이드 함수의 이 매끈함이 신경망 학습에서 아주 중요한 역할을 하게 됩니다.


다시 말해 퍼셉트론에서는 뉴런 사이에 0혹은 1이 흘렀다면, 신경망에서는 연속적인 실수가 흐릅니다.

계단함수와 시그모이드 함수의 공통점은 입력이 아무리 작거나 커도 출력은 0에서 1사이라는 것이 공통점이라고 할수 있겠네요.


또한 계단함수와 시그모이드 함수의 공통점은 그 밖에도 있습니다.

둘 모두는 비선형 함수입니다. 시그모이드 함수는 곡선, 계단 함수는 계단처럼 구부러진 직선으로 나타나며, 동시에 비선형 함수로 분류 됩니다.


신경망에서는 활성화 함수로 비선형 함수를 사용해야 합니다. 달리 말하면 선형 함수를 사용해서는 안 됩니다.

그 이유는 바로 선형 함수를 이용하면 신경망의 층을 깊게 하는 의미가 없어지기 때문입니다.


선형 함수의 문제는 층을 아무리 깊게 해도 '은닉층이 없는 네트워크'로도 똑같은 기능을 할 수 있다는 데 있습니다.


선형 함수인 h(x) = cx를 활성화 함수로 사용한 3층 네트워크를 떠올려보면, 이를 식으로 나타내면 y(x) = h(h(h(x))) 가 됩니다.

이 계산은 y(x) = c * c * c * x 처럼 곱셈을 세 번 수행하지만, 실은 y(x) = ax와 똑같습니다.

a = c^3이라고 하면 끝이죠. 즉, 은닉층이 없는 네트워크로 표현할 수 있습니다.




다음 포스팅에서는 numpy를 활용한 간단한 행렬의 곱 및 3층 신경망을 구현해 보겠습니다.




댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31