앞서 살펴 보았던 logistic regression으로는 XOR 문제를 해결할 수 없었다. 그 이유가 무엇일가? 바로 XOR 연산이 선형으로 구분 불가능하기 때문이다. 이 문제를 해결하기위해 layer를 쌓으면 되는데, 이게 바로 neural network 인 셈이다.
Activation Function을 사용해야하는 이유가 무엇일까? 그 이유는 Activation Function을 사용하지 않고, linear한 layer를 여러 겹 쌓는 것은 아무리 쌓아도 linear한 layer 한 층과 똑같기 때문이다. 아래를 보자. layer를 두 번 쌓았지만, 이는 결국 layer 하나로도 표현이 가능하다. layer를 쌓는 것이 의미가 없어지는 것이다. Activation Function을 사용하므로써 이런 문제를 해결할 수 있다.
그럼 이제 주요 Activation Function 몇가지를 살펴 보자.
2nd lyaer는 이전에 살펴본 Logistic Regression과 같다.
1st layer는 2nd lyaer보다 깊다. 또한 tanh 함수의 미분을 이용한다!
먼저 데이터를 준비한다. noise를 살짝 섞어, 1000개의 데이터를 만들었다.
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x_seeds = np.array([(0,0), (1,0), (0,1), (1,1)])
y_seeds = np.array([0, 1, 1, 0])
N = 1000
idxs = np.random.randint(0, 4, N)
X = x_seeds[idxs]
Y = y_seeds[idxs]
X = X + np.random.normal(scale = 0.25, size=X.shape)
모델 부분이다. layer를 두개로 쌓고, tanh와 sigmoid 함수를 활성함수로 이용했다.
class shallow_neural_network():
def __init__(self, num_input_features, num_hiddens):
self.num_input_features = num_input_features
self.num_hiddens = num_hiddens
self.W1 = np.random.normal(size = (num_hiddens, num_input_features))
self.b1 = np.random.normal(size = num_hiddens)
self.W2 = np.random.normal(size = num_hiddens)
self.b2 = np.random.normal(size = 1)
def sigmoid(self, z):
return 1/(1+np.exp(-z))
def predict(self, x):
z1 = np.matmul(self.W1, x) + self.b1
a1 = np.tanh(z1)
z2 = np.matmul(self.W2, a1) + self.b2
a2 = self.sigmoid(z2)
return a2, (z1, a1, z2, a2)
model = shallow_neural_network(2, 3)
train 부분이다. forward, backward 과정으로 이루어진다.
def train(X, Y, model, lr=0.1):
dW1 = np.zeros_like(model.W1)
db1 = np.zeros_like(model.b1)
dW2 = np.zeros_like(model.W2)
db2 = np.zeros_like(model.b2)
m = len(X)
cost = 0.0
for x, y in zip(X, Y):
a2, (z1, a1, z2, _) = model.predict(x)
if y==1:
cost -= np.log(a2)
else:
cost -= np.log(1-a2)
diff = a2-y
db2 += diff
dW2 += a1*diff
tmp = (1-a1**2)*model.W2*diff
db1 += tmp
dW1 += np.outer(tmp,x)
cost/=m
model.W1 -= lr*(dW1/m)
model.b1 -= lr*(db1/m)
model.W2 -= lr*(dW2/m)
model.b2 -= lr*(db2/m)
return cost
준비한 데이터와 model을 이용하여 학습을 진행해보자.
for epoch in range(100):
cost = train(X, Y, model, 1.0)
if epoch%10==0:
print(epoch, cost)
model 학습이 잘 된 것을 아래 사진을 통해 확인할 수 있다!
저랑 같은 강의 들으시는데 필기 차이가 이렇게 많이 나다니,, 자극 받고 갑니다..