퍼셉트론에서 신경망으로

앞 시간에 퍼셉트론에 대해 배웠는데, 이 퍼셉트론은 가중치를 설정하는 작업을 사람이 직접해야 됩니다. 이 수동으로 작업하는 과정을 해결하기 위해 신경망이라는 개념이 나오게 되었습니다.

신경망의 예

신경망을 그림으로 나타내면 위 그림과 같습니다. 가장 왼쪽 줄을 입력층, 오른쪽 줄을 출력층, 중간 줄을 은닉층이라고 부르는데, 은닉층의 뉴런은 사람 눈에는 보이지 않습니다. 그리고 신경망에는 층이라는 개념이 있는데, 왼쪽부터 0,1,2층이라고 부르고 위에서는 입력층이 0층, 은닉층이 1층, 출력층이 2층이 됩니다. (층을 부르는 개념은 사람마다, 문헌마다 다를 수 있습니다.)


퍼셉트론 복습

신경망의 신호 전달 방법을 보기 전에 퍼셉트론을 복습해보면 위에 사진과 같이 x1, x2라는 두 신호를 입력받아 y를 출력하게 됩니다. 그리고 이 퍼셉트론을 수식으로 나타내면 아래와 같습니다.

b는 편향을 나타내는 매개변수로 뉴런이 얼마나 쉽게 활성화되느냐를 제어하고, w1과 w2는 각 신호의 가중치를 나타내는 매개변수로 신호의 영향력을 제어합니다.

조건 분기의 동작(0을 넘으면 1 출력, 그렇지 않으면 0 출력)을 넣어, 식을 좀 더 간결한 형태로 작성하면 위 수식과 같습니다. 그리고 이 h라는 것이 활성화 함수(activation function)을 뜻하게 되는데, 이 개념에 대해서 더 자세히 알아보겠습니다.


활성화 함수의 등장

활성화 함수(activation function)는 먼저 '활성화'라는 이름 그대로, 입력 신호의 총합을 출력 신호로 변환하여 활성화를 일으키는지 정하는 함수를 뜻하게 됩니다.

 식을 활성화 함수의 개념을 적용해 다시 써보자면 위의 2단계로 처리됩니다. 가중치가 달린 입력 신호와 편향의 총합을 계산하는 것을 a라고 부르고, a를 함수 h( )에 넣어 y를 출력하는 흐름입니다.

수식을 그림으로 도식화하자면 위 사진처럼 가중치 신호를 조합한 결과가 a라는 노드가 되고, h( )를 통과하여 y라는 노드로 변환되는 과정입니다. (이 책에서는 뉴런노드를 동일시하여 부릅니다.)

 

 

계단 함수 구현하기

def step_function(x):
	if x > 0:
    	return 1
    else:
    	return 0

계단 함수는 임계값을 경계로 출력이 바뀐다고 했으니 코드로 구현하면 위와 같습니다. 0이라는 임계값을 설정하고 임계값을 넘으면 1, 넘지 못하면 0으로 출력합니다. 위 코드를 numpy를 사용해 좀 더 효율적인 코드로 짜보자면 아래와 같습니다.

def step_function(x):
	y = x > 0
    return y.astype(np.int)
   
 x = np.array([-1.0, 1.0, 2.0])
 y = x > 0
 >>> y # array([False, True, True])
 
 y = y.astype(np.int)
 >>> y # array([0, 1, 1])

넘파이 배열에 부동호 연산을 수행하면 각각 bool 배열이 생성되고, 0보다 크면 True, 0이하면 False로 변환한 새로운 배열 y가 생성됩니다. 그리고 이 bool형태를 astype( ) 메서드를 통해 int형태로 바꿔주면 위와 같이 False는 0, True는 1이 됩니다. 그리고 이러한 계단 함수는 아래와 같은 그래프를 띄게 됩니다.

 

 

시그모이드 함수

위 사진은 시그모이드 함수(sigmoid function)를 나타낸 식입니다. exp(-x)는 지수함수 e의 -x승을 뜻합니다.

 

def sigmoid(x):
	return 1 / (1 + np.exp(-x))

시그모이드 함수를 python으로 구현하면 위 식과 같고, 그래프로 그리면 아래와 같습니다.

계단함수와 시그모이드 함수 비교

계단 함수(점선), 시그모이드 함수(곡선)

두 함수를 비교해서 직관적으로 느껴지는 차이는 바로 '매끄러움'입니다. 시그모이드 함수는 부드러운 곡선이며 입력에 따라 출력이 연속적으로 변화하고, 계단 함수는 0을 경계로 출력이 갑자기 바뀌어버립니다. 이런 시그모이드 함수의 매끈함과 연속성은 신경망 학습에서 아주 중요한 역할을 합니다.

두 함수의 공통점도 살펴보자면, 둘 다 입력이 작을 때의 출력은 0에 가깝고 커지면 1에 가까워지는 구조입니다. 즉 계단 함수와 시그모이드 함수는 입력이 중요하면 큰 값을 출력, 입력이 중요하지 않으면 작은 값을 출력하고 출력값이 0과 1사이라는 것이 공통점입니다.


비선형 함수

두 함수의 공통점은 모두 선형(직선)이 아닌 비선형 함수라는 것인데, 신경망에서 활성화 함수로 비선형 함수를 사용해야 합니다. 왜냐하면 h(x) = cx를 활성화 함수로 사용한 3층 네트워크를 예시로 들겠습니다. 3층 네트워크를 식으로 나타내면 y(x) = h(h(h(x)))가 되는데, 이 계산은 y(x) = c * c * c * x처럼 곱셉을 세 번 수행하지만, 실은 y(x) = ax와 똑같은 식입니다. a = c의 세제곱이라고만 하면 끝이기 때문에, 층을 쌓는 혜택을 얻고 싶다면 활성화 함수로 반드시 비선형 함수를 사용해야 합니다.

 

ReLU 함수

최근에는 ReLU함수를 주로 이용하는데, 이 ReLU함수는 입력이 0을 넘으면 그 입력을 그대로 출력, 0이하이면 0을 출력하는 함수입니다.

수식은 위와 같고 그래프는 아래와 같습니다.

 

 

3층 신경망의 구조

이제 신경망을 구현해보겠습니다. 입력층(0층)은 2개, 첫 번째 은닉층(1층)은 3개, 두 번째 은닉층(2층)은 2개, 출력층(3층)은 2개로 구성되고, 구조는 아래와 같습니다.

신경망의 표기법은 아래와 같습니다.


출력층 설계하기

신경망은 분류와 회귀 모두에 이용할 수 있습니다. 다만 둘 중 어떤 문제냐에 따라 출력층에서 사용하는 활성화 함수가 달라지는데, 일반적으로 회귀에는 항등 함수를, 분류에는 소프트맥스 함수를 사용합니다.

 

항등 함수

먼저 회귀에서 주로 쓰는 항등 함수는 입력과 출력이 항상 같다는 뜻의 항등을 쓰고, 입력 신호 그대로 출력 신호로 바뀌게 됩니다.

 

소프트맥스 함수

다음 분류에서 사용하는 소프트맥스 함수의 아래와 같이 출력은 모든 입력 신호로부터 화살표를 받습니다.

수식은 아래와 같습니다.

여기서 n은 출력층의 뉴런 수, k는 k번째 출력을 뜻하게 되고, 분자는 입력 신호의 지수 함수, 분모는 모든 입력 신호의 지수 함수의 합으로 구성됩니다. 소프트맥스 함수의 특징은 모든 입력 신호로부터 받다보니 출력의 총합이 1입니다. 출력의 총합이 1이기 때문에, 함수의 출력을 '확률'로 해석할 수 있습니다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기