728x90
반응형

이전 Deep Learning 포스팅

[Deep Learning] 1. 단층 퍼셉트론과 다층 퍼셉트론
[Deep Learning] 2. 신경망 (Sigmoid, ReLU)

 

 

 

 

기계학습 문제는 분류(Classification)와 회귀(Regression)로 나눌 수 있다. 분류는 데이터가 어느 클래스에 속하느냐의 문제이고, 회귀는 입력 데이터에서 연속적인 수치를 예측하는 문제이다. 이렇듯, 신경망의 출력층에서는 항등함수와 소프트맥스 함수를 이용하여 출력 값을 얻을 수 있다. 이는 분류와 회귀에 있어서 중요한 역할을 수행하게 된다.

 

또한, 기계학습의 문제풀이는 학습과 추론(Inference)의 두 단계를 거쳐 이뤄진다. 학습단계에서 모델을 학습하고, 추론 단계에서 앞서 학습 된 모델로 미지의 데이터에 대해서 추론(분류)을 수행한다. 추론단계에서는 출력층의 소프트맥스 함수를 생략하는 것이 일반적이다. 추론과정을 신경망의 순전파(Forward Propagation) 이라고도 한다. 한편, 신경망을 학습시킬 때는 출력층에서 소프트맥스 함수를 사용한다.

 

 

 

1. 항등함수 (Identity Function)

 

항등함수는 입력을 그대로 출력한다. 입력과 출력이 항상 같다는 뜻의 항등이다. 그래서 출력층에서 항등 함수를 사용하면 입력 신호가 그대로 출력신호가 된다. 항등 함수의 처리는 신경망 그림으로는 다음과 같다.

 

(그림 1) 항등함수

 

 

2. 소프트맥스 함수(Softmax Function)

 

한편, 분류에서 사용하는 소프트맥스 함수는 다음식과 같다.

 

(수식 1) 소프트맥수 함수 식

 

exp(x)는  지수함수(Exponential Function) 이다. (e는 자연상수) n은 출력층의 뉴런 수, yk는 그 중 k번째 출력을 뜻한다. 위 식과 같이 소프트 맥스 함수의 분자는 입력신호 ak의 지수함수, 분모는 모든 입력 신호의 지수함수의 합으로 구성된다.

 

이 소프트맥수 함수를 그림으로 나타내면 다음과 같다. 그림과 같이 소프트맥스의 출력은 모든 입력 신호로부터 화살표를 받4는다. 출력층의 각 뉴런이 모든 입력 신호에서 영향을 받기 때문이다.

 

 

(그림 2) 소프트맥스 함수

 

즉, 소프트맥스는 클래스 분류 문제를 풀 때 점수 벡터를 클래스 별 확률로 변환하기 위해 흔히 사용하는 함수이다. 각 점수 벡터에 지수를 취한 후, 정규화 상수로 나누어 총 합이 1이 되도록 계산한다.

 

소프트 맥스 함수를 구현 할 때 오버플로 문제가 발생 할 수 있다. 소프트맥스 함수는 지수 함수를 사용하는데, 지수 함수는 입력값에 따라 아주 큰 값을 내뱉는데 이러한 큰 값 끼리 나눗셈을 하면 수치가 불안정해진다.

 

그래서 다음과 같이 소프트맥스 함수 구현 시 수식을 개선하게 된다.

 

(수식 2) 소프트맥스 함수를 개선한 수식

 

C라는 임의의 정수를 분자와 분모 양쪽에 곱해준 뒤, 그 다음으로 C를 지수함수로 옮겨 log를 취한 뒤, C'라는 새로운 기호로 바꾼다. 이는 소프트맥스의 지수 함수를 계산할 때 어떤 정수를 더해도 결과는 바뀌지 않는다. 여기서 C'에 어떤 값을 대입해도 상관없지만, 오버플로를 막을 목적으로는 입력 신호 중 최댓값을 이용하는 것이 일반적이다.

 

소프트맥스 함수의 출력은 0에서 1.0 사이의 실수이다. 또한 소프트맥스 함수의 출력의 총합은 1이다. 출력 총합이 1이된다는 점은 소프트맥스 함수의 중요한 성질이다. 이러한 성질 때문에 함수의 출력을 "확률"로 해석하여 "분류(Classification)"를 할 수 있는 것이다.

 

예시를 들자면, exam[0]의 확률은 1.8%, exam[1]의 확률은 24.5%, exam[2]의 확률은 73.7%이라면 이 확률들로부터 2번째(exam[2]) 원소의 확률이 가장 높으니, 답은 2번째 클래스다 라고 답을 지을 수 있다.

 

또한, 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않는다. 이는 지수함수 y = exp(x)가 단조 증가 함수(정의역 원소 a, b가 a<=b 일 때, f(a) <= f(b) 가 성립하는 함수) 이기 때문이다.

 

신경망을 이용한 분류에서는 일반적으로 가장 큰 출력을 내는 뉴런에 해당하는 클래스로만 인식한다. 그리고 소프트맥스 함수를 적용해도 출력이 가장 큰 뉴런의 위치는 달라지지 않는다. 결과적으로 신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략해도 된다.

 

 

 

 

 

 

3. 출력층의 뉴런 수 정하기

 

출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 정해야 한다. 분류에서는 분류하고 싶은 클래스 수로 설정하는 것이 일반적이다. 예를 들어 입력 이미지를 숫자 0부터 9 중 하나로 분류하는 문제라면 다음 그림처럼 출력층의 뉴런을 10개로 설정해야한다.

 

(그림 3) 출력층의 뉴런은 각 숫자에 대응한다

 

위 그림에서 출력층의 뉴런은 위에서부터 차례로 숫자 0, 1, 2, ..., 9에 대응하며, 학습 시 이 선경망이 선택한 클래스는 7인 값을 출력한다. 이는 입력 이미지를 숫자 '7'로 판단했음을 의미한다.

 

 

 

 

 

 

 

 

4. 손글씨 숫자 인식

 

이러한 손글씨로 쓰여진 숫자를 분류하는 예제가 있다. 이는 MNIST라는 손글씨 숫자 이미지 집합 데이터를 사용하여 실험한다.

 

이 데이터 셋은 0부터 9까지의 숫자 이미지들로 구성되고, 훈련 이미지가 60,000장, 시험 이미지가 10,000장 준비되어있다. 일반적으로 이들 훈련 이미지를 사용하여 모델을 학습하고, 학습한 모델로 시험 이미지들을 얼마나 정확하게 분류하는지를 평가하게 된다.

 

이 이미지 데이터는 28x28 크기의 1채널 이미지이며, 각 픽셀은 0에서 255까지의 값을 취한다. 각 이미지에는 또한 '7', '2', '1' 과 같이 그 이미지가 실제 의미하는 숫자가 레이블로 붙어있다.

 

이러한 데이터를 사용하여 간단한 실험을 할 수 있다.

 

(그림 4) MNIST 데이터 셋

 

 

 

정리

 

- 신경망에서는 활성화 함수로 시그모이드 함수와 ReLU 함수 같은 매끄럽게 변화하는 함수를 이용한다.

- 기계학습 문제는 크게 회귀와 분류로 나눌 수 있다.

- 출력층의 활성화 함수로는 회귀에서는 주로 항등 함수를, 분류에서는 주로 소프트맥스 함수를 이용한다.

- 분류에서는 출력층의 뉴런 수로 분류하려는 클래스 수와 같게 설정한다.

- 입력 데이터를 묶은 것을 배치라 하며, 추론 처리를 이 배치 단위로 진행하면 결과를 훨씬 빠르게 얻을 수 있다.

 

 

 

 

참고자료 1 : 밑바닥부터 시작하는 딥러닝 (책)

728x90
반응형