입력층과 출력층 사이에 은닉층(hidden layer)을
가지고 있는 퍼셉트론
MLP에서는 다양한 활성화 함수를 사용한다.
선형레이어는 많아도 쓸모가 없다.
계단 함수는 입력 신호의 총합이 0을 넘으면 1을 출력하고, 그렇지 않으면 0을 출력하는 함수이다.
S자와 같은 형태를 가지는 전통적인 활성화 함수
최근에 가장 인기 있는 활성화 함수이다.
입력이 0을 넘으면 그대로 출력하고, 입력이 0보다 적으면 출력은 0이 된다.
시그모이드 함수와 아주 비슷하지만 출력값이 -1에서 1까지이다.
순방향 패스란 입력 신호가 입력층 유닛에 가해지고, 이 입력 신호가 은닉층을 통하여 출력층으로 전파되는 과정을 의미한다.
위는 h_1의 값을 계산하는 예제이다.
입력층 x_1,x_2 및 가중치와 편향을 이용해 z_1을 구하고 그 값을 활성화 함수에 대입해 최종적인 값을 구한다.
import numpy as np
# 시그모이드 함수
def actf(x):
return 1/(1+np.exp(-x))
# 시그모이드 함수의 미분치
def actf_deriv(x):
return x*(1-x)
# 입력유닛의 개수, 은닉유닛의 개수, 출력유닛의 개수
inputs, hiddens, outputs = 2, 2, 1
learning_rate=0.2
# 훈련 샘플과 정답
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
T = np.array([[0], [1], [1], [0]])
W1 = np.array([[0.10, 0.20],
[0.30, 0.40]])
W2 = np.array([[0.50], [0.60]])
B1 = np.array([0.1, 0.2])
B2 = np.array([0.3])
# 순방향 전파 계산
def predict(x):
layer0 = x # 입력을 layer0에 대입한다.
Z1 = np.dot(layer0, W1)+B1 # 행렬의 곱을 계산한다.
layer1 = actf(Z1) # 활성화 함수를 적용한다.
Z2 = np.dot(layer1, W2)+B2 # 행렬의 곱을 계산한다.
layer2 = actf(Z2) # 활성화 함수를 적용한다.
return layer0, layer1, layer2
def test():
for x, y in zip(X, T):
x = np.reshape(x, (1, -1)) # x를 2차원 행렬로 만든다.
# 입력은 2차원이어야 한다.
layer0, layer1, layer2 = predict(x)
print(x, y, layer2)
test()
[[0 0]] [1] [[0.70938314]]
[[0 1]] [0] [[0.72844306]]
[[1 0]] [0] [[0.71791234]]
[[1 1]] [1] [[0.73598705]]
입력이 주어지면 순방향으로 계산하여 출력을 계산한 후에 실제 출력과 우리가 원하는 출력 간의 오차를 계산한다.
오차를 역방향으로 전파하면서 오차를 줄이는 방향으로 가중치를 변경한다.
체인룰
target = 목표값, out = 실제값
만약 바이어스를 구하는 문제라면, 마지막에 0 + 0 + b_3*1이 되는 것이다.
학습률은 0.2로 설정함.