Deep Learning: Shallow Neural Network

danbibibi·2022년 3월 30일
0

Shallow Neural Network

앞서 살펴 보았던 logistic regression으로는 XOR 문제를 해결할 수 없었다. 그 이유가 무엇일가? 바로 XOR 연산이 선형으로 구분 불가능하기 때문이다. 이 문제를 해결하기위해 layer를 쌓으면 되는데, 이게 바로 neural network 인 셈이다.

Activation Function

Activation Function을 사용해야하는 이유가 무엇일까? 그 이유는 Activation Function을 사용하지 않고, linear한 layer를 여러 겹 쌓는 것은 아무리 쌓아도 linear한 layer 한 층과 똑같기 때문이다. 아래를 보자. layer를 두 번 쌓았지만, 이는 결국 layer 하나로도 표현이 가능하다. layer를 쌓는 것이 의미가 없어지는 것이다. Activation Function을 사용하므로써 이런 문제를 해결할 수 있다.

그럼 이제 주요 Activation Function 몇가지를 살펴 보자.

Sigmoid

Hyperbolic tangent

ReLU

Leaky ReLU

Gradient Descent

2nd lyaer는 이전에 살펴본 Logistic Regression과 같다.

1st layer는 2nd lyaer보다 깊다. 또한 tanh 함수의 미분을 이용한다!

Implement

먼저 데이터를 준비한다. 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 학습이 잘 된 것을 아래 사진을 통해 확인할 수 있다!

profile
블로그 이전) https://danbibibi.tistory.com

1개의 댓글

comment-user-thumbnail
2022년 4월 7일

저랑 같은 강의 들으시는데 필기 차이가 이렇게 많이 나다니,, 자극 받고 갑니다..

답글 달기