저번 포스팅에서 퍼셉트론에 대해서 설명했다. 퍼셉트론은 복잡한 함수를 표현을 할 수 있지만, 가중치를 결정할 때 여전히 사람이 수동으로 정한다. 이것을 해결 해주는 것이 신경망이다.
그러니 이번 장에서 신경망에 대해서 알아보자.
위의 보이는 사진은 신경망을 그림으로 나타낸 것이다.
앞에서 부터 0층으로 시작하면
0층 : 입력층
1층 : 은닉층
2층 : 출력층
이렇게 구성이된다.
이 함수는 입력 신호의 총합을 출력 신호로 변환하는 함수이다.
여기서 h를 활성화 함수라고 한다.
이런식으로 사용된다고 볼 수 있다.
퍼셉트론에서는 계단함수(step function)을 사용하지만 신경망에서는 주로 시그모이드함수(sigmoid function)을 사용한다.
def sigmoid(x)
return 1/ (1+np.exp(-x))
코드로 표현하면 이와 같다.
이 함수의 특징은 매끈함이다. 이것이 신경망 학습에서 아주 중요한 역할을 한다고 한다.
신경망에서는 활성화 함수로 비선형 함수를 사용하여야 한다. 이유는 선형 함수를 사용해버리면 층을 깊게 하는 의미가 없어지기 때문이다.
만약 h(x) = cx 라고 해버리면 h(h(h(x))) 는 결국, 곱셈을 3번한 함수가 되어버리기 때문에 은닉층이 없는 네트워크가 되버리기 때문이다. 이러한 이유로 신경망에서는 반드시 비선형 함수를 사용하여야 한다.
최근에는 Relu함수를 주로 사용한다고 한다.
이 함수의 특징은 입력이 0을 넣으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력하는 함수이다.
def relu(x):
return np.maximum(0,x)
신경망은 분류와 회귀 모두에 이용된다. 다만 둘 중 어떤 문제냐에 따라, 출력층에서 사용하는 활성화 함수가 달라진다. 일반적으로 회귀에는 항등 함수를, 분류에는 소프트맥스 함수를 사용한다.
분류(classification) : 데이터가 어느 클래스에 속하느냐의 문제(사진 속 인물의 성별을 분류하는 문제)
회귀(regression) : 입력 데이터에서 수치를 예측하는 문제
입력을 그대로 출력하는 함수를 말한다.
분류에서는 소프트맥스 함수를 주로 사용한다. 분모를 보면 모든 입력에 영향을 받는다는 것을 알 수 있고, 그림을 보아도 알 수 있다. 출력층의 각 뉴런이 모든 입력신호에 영향을 받는다는 뜻이다. 그러나 이것을 코드로 표현하면 문제가 생긴다. 분자와 분모가 너무 큰 값이면 표현을 할 수 없게 된다.
위 식을 코드로 표현하면 아래와 같다.
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c) #오버플로 대책
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
소프트맥스 함수의 출력은 0에서 1.0 사이의 실수이다. 또한, 소프트맥스 함수 출력의 총합은 1이 된다. 이 성질 덕분에 소프트맥스 함수의 출력을 '확률'로 해석할 수 있다. 소프트맥스 함수를 적용시켜도 각 원소의 대소 관계는 변하지 않는다. 결과적으로 신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략해도 된다. 이에 대해서는 4장에서 좀 더 알아가보자.
이 데이터셋은 기계학습분야에서 아주 유명한 데이터셋이고, 아주 다양한 분야에서 실험용 데이터로 자주 쓰인다.
배치는 하나로 묶은 입력데이터이다. 예를 들어 784(28x28)크기의 이미지가 데이터로 784개의 뉴런에 입력되면 출력에는 10개의 뉴런이 반응하고 이것이 100장 쌓이면 100x784의 입력 데이터 구조가 나온다. 여기서 100을 배치라고 한다.