퍼셉트론과 신경망의 차이는 매개변수(가중치, 편향)에 있다. 퍼셉트론은 사람이 직접 매개변수를 설정해야 하지만 신경망은 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 있다. 근데 이 능력은 다음장에서 배운다.
활성화 함수
- 입력 신호의 총합을 출력 신호로 변환하는 함수
이를 수식으로 나타내면 다음과 같다.
여기서 $h()$가 활성화 함수를 의미한다.
활성화 함수의 종류를 알아보자
Step function (계단 함수)
입력이 0을 넘으면 1을 출력하고, 그 외에는 0을 출력하는 함수이다. 신경망에서 step function을 활성화 함수로 사용하지는 않고 Sigmoid와 비교하기 위해 알아본다.
def step_function(x):
return np.array(x > 0, dtype=np.int32)
x = np.arange(-1, 2, 0.5)
print(x)
print(x > 0)
[-1. -0.5 0. 0.5 1. 1.5]
[False False False True True True]
x = np.array(x > 0, dtype=np.int32)
print(x)
[0 0 0 1 1 1]
넘파이 배열에 부등호 연산을 수행하면 배열의 원소 각각에 부등호 연산을 수행한 bool 배열이 생성된다. 이는 나중에 masking 등을 구현할 때 자주 사용하는 방법이다.
bool에서 int로 dtype을 변경해주면 True -> 1, False -> 0으로 바꿔준다.
계단 함수의 그래프는 다음과 같다.
계단처럼 생겨서 계단 함수라고 부른다.
Sigmoid
시그모이드 함수의 수식은 다음과 같다.
def sigmoid(x):
return 1 / (1 + np.exp(-x))
시그모이드 함수의 그래프는 다음과 같다.
시그모이드 함수의 특징은 입력 신호를 (0, 1) 범위로 바꿔준다. 그래서 주로 binary classification 문제에서 final layer의 activation 함수로 사용하여 출력을 예측 확률처럼 이용하기 위해 사용하는 편이다.
step과 sigmoid의 주요한 차이점은 sigmoid는 입력에 따른 출력이 연속적으로 변화한다. 이 연속성이 신경망 학습에서 중요한 역할을 한다.
둘의 공통점은 비선형 함수이다. 신경망에서는 활성화 함수로 비선형 함수만 사용해야한다. 왜 그럴까?
예를 들어 선형 함수 $h(x) = cx$를 활성화 함수로 사용한 3층 네트워크를 생각해보자. 이를 식으로 나타내면 $y(x) = h(h(h(x)))$가 되고, 이 계산은 $y(x) = {c^3}x$가 된다. 이것은 $y(x) = ax$와 똑같은 식으로써 여러 층을 쌓은 의미가 사라지게 만든다. 즉, 은닉층이 없는 네트워크이다.
ReLU
입력이 0을 넘으면 그대로 출력하고, 0 이하이면 0을 출력하는 함수이다. 신경망에서 자주 사용하는 활성화 함수이다.
def relu(x):
return np.maximum(0, x) # 두 입력 중 큰 값을 선택해 반환
Softmax
수식은 다음과 같다.
소프트맥스를 구현할 때는 위의 식을 그대로 사용하면 안되고 개선된 수식을 사용해야 한다.
왜냐면 오버플로 때문이다.
보통 $C'$ 값에 입력 신호 중 최대 값을 이용하는 것이 일반적이다. 즉, 모든 요소에 입력 신호 중 최대 값을 빼는 것이다.
def softmax(x):
if x.ndim == 2:
x = x.T
x = x - np.max(x, axis=0)
y = np.exp(x) / np.sum(np.exp(x), axis=0)
return y.T
x = x - np.max(x) # 오버플로 대책
return np.exp(x) / np.sum(np.exp(x))
입력이 2차원인 경우 따로 계산하는 이유는 브로드캐스트 때문이다. 예를 들어보자
x = np.array([[0, 1, 2], [10, 11, 12]])
max_axis1 = np.max(x, axis=1)
print(max_axis1)
[ 2 12]
print(x - max_axis1)
ValueError: operands could not be broadcast together with shapes (2,3) (2,)
각 행의 최대값을 빼주기 위해서는 axis=1로 지정하고 max값을 구해야 한다. 그리고 이걸 바로 빼버리면 broadcast에 실패한다고 에러가 뜬다.
사실 max_axis1의 shape을 (2, 1)로 바꿔주고 계산하면 아무런 문제가 없긴하다. 근데 책에서 저렇게 구현을 했으니 reshape 해주는 것보다 전치해서 계산하는 것이 속도 측면에서 더 빠른가보다.
소프트 맥스의 출력은 0에서 1.0 사이의 실수이고 모든 출력의 합은 1이다. 이 성질 덕분에 소프트맥스 함수의 출력을 확률로 해석할 수 있다. 그래서 주로 multi class classification에서 final layer의 activation 함수로 사용한다. (attention value를 구할 때 weighted sum하기 위해서 사용하기도 함)
신경망 구현 부분은 생략한다. 어차피 뒷 장에서 많이 할거라
'책 > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
5장 오차역전파법 (2) (0) | 2023.09.19 |
---|---|
5장 오차역전파법 (1) (0) | 2023.09.19 |
4장 신경망 학습 (2) (0) | 2023.09.14 |
4장 신경망 학습 (1) (0) | 2023.09.13 |
2장 퍼셉트론 (0) | 2023.09.13 |