일반 신경망의 모델화


단순 신경망 모델의 일반화

  • 입력이 2개였던 단순 신경망 모델을 아래 그림과 같이 입력의 개수를 $n$개로 확장해서 일반화를 시켜보자


  • 전기신호를 전달하는 뉴런의 수가 늘어나더라도 '받아들은 전기량의 임계값을 넘으면 발화한다'라는 뉴런의 특징은 변하지 않기 때문에 가설 모델  $H(\mathbb{x})$는 식 (3.1)과 같이 표현할 수 있다

\begin{eqnarray} H(\mathbb{x}) = \left\{ \begin{array}{ll} 1 & w_1x_1 + w_2x_2 + \cdots + w_nx_n \geqslant \theta \\ 0 & w_1x_1 + w_2x_2 + \cdots + w_nx_n < \theta\end{array}\right. \tag{3.1} \end{eqnarray}


  • 식 (3.2)와 같은 함수 $f(x)$가 있다고 가정하면

\begin{eqnarray} f(x) = \left\{ \begin{array}{ll} 1 & x \geqslant 0 \\ 0 & x < 0 \end{array}\right. \tag{3.2} \end{eqnarray}


  • 신경망의 출력 $H(\mathbb{x})$는 식 (3.3)과 같이 표현할 수 있으며, 이 때 함수 $f(x)$를 계단함수(step function)라고 한다

\begin{align} H(\mathbb{x}) &= f(w_1x_1+x_2x_2+\cdots+w_nx_n-\theta)\\ &= f\Big(\sum_{i=1}^nw_ix_i -\theta\Big)\tag{3.3}\end{align}


  • 계산의 편의를 위해서 $b=-\theta$로 바꾸고 가중치 $w_i$와 입력 $x_i$ $(i=1,2,\ldots, n)$를 벡터의 형태로 나타낼 수 있기 때문에 식 (3.4)와 식 (3.5)와 같이 나타낼 수 있다
    • 벡터를 사용하면 식이 간단해서 이해하기 쉬울 뿐만 아니라 프로그램 코드로 구현을 할 때에도 벡터를 배열로 대응시키면 직관적으로 구현이 가능

\begin{eqnarray} \mathbb{w} = (w_1, w_2, \ldots, w_n)\tag{3.4}\end{eqnarray}

\begin{eqnarray} \mathbb{x} = \left( \begin{array}{c} x_1\\ x_2\\ \vdots\\ x_n\end{array}\right) \tag{3.5}\end{eqnarray}


  • 식 (3.4)와 식 (3.5)를 사용하여 식 (3.3)을 변형하면 식 (3.6)과 같이 쓸 수 있는데, 뉴런의 출력을 식 (3.6)과 같이 표현한 신경망 모델을 퍼셉트론(perceptron)이라고 하며 단순 신경망 모델을 단순 퍼셉트론(simple perceptron)이라고 한다. 식 (3.6)에서 벡터 $\mathbb{w}$를 웨이트 벡터(weight vector)라고 하며, $b$를 편향 또는 바이어스(bias)라고 한다

\begin{eqnarray} H(\mathbb{x}) = f(\mathbb{wx}+b)\tag{3.6}\end{eqnarray}


  • 단순 퍼셉트론을 모델화할 때 매개변수 $(w_1, w_2, \theta)$의 값을 조절하는 오차정정학습법을 사용하였다면 퍼셉트론을 모델화할 때에는 웨이트 벡터 $\mathbb{w}$와 바이어스 $b$를 조절하면서 오차정정학습법을 사용해야 하기 때문에 오차정정을 위한 차는 단순 퍼셉트론의 경우처럼 식 (3.7)~식 (3.10)과 같이 정리할 수 있다

\begin{align} \Delta\mathbb{w} & = (y-H(\mathbb{x}))\mathbb{x} \tag{3.7}\\ \Delta b &=y-H(\mathbb{x})\tag{3.8}\\ \mathbb{w}^{k+1} &=\mathbb{w}^k + \Delta\mathbb{w}^k \tag{3.9} \\ b^{k+1} &= b^k + \Delta b^k\tag{3.10}\end{align}


퍼셉트론 구현

  • 두 종류의 정규분포를 따르는 데이터를 분류하는 퍼셉트론 모델을 만들어보자
    • 뉴런이 발화하지 않는 데이터의 평균값은 $0$이고, 뉴런이 발화하는 데이터의 평균값은 $5$이며 각각 10개의 데이터를 생성하는 코드는 다음과 같다
import numpy as np
import matplotlib.pyplot as plt

rng = np.random.RandomState(123)

d = 2       # 데이터의 차원
N = 10      # 데이터 수
mean = 5    # 뉴런이 발화하는 데이터의 평균값

x1 = rng.randn(N, d) + np.array([0, 0])
x2 = rng.randn(N, d) + np.array([mean, mean])

plt.scatter(x1[:, [0]], x1[:, [1]], color='r', marker='o', label='x1')
plt.scatter(x2[:, [0]], x2[:, [1]], color='b', marker='x', label='x2')
plt.axis(xmin=-1, xmax=7, ymin=-1, ymax=7)
plt.grid()
plt.legend()
plt.show()

X = np.concatenate((x1, x2), axis=0)     # x1과 x2의 데이터를 합쳐서 입력 데이터로 만든다


  • 퍼셉트론 모델에 필요한  매개변수 웨이트 벡터 $\mathbb{w}$와 바이어스 $b$를 초기화하고, 출력값은 $y=f(\mathbb{wx}+b)$를 코드로 정의한다
W = np.zeros(d)
b = 0

def H(X):  # 퍼셉트론 모델의 예측 출력값
    return step(np.dot(W, X) + b)

def step(X):    # 활성화 함수
    return 1 * (X > 0)

def y(i):       # i번째 학습의 결과의 실제의 값
    if i < N:
        return 0    # x1에 속하는 N-1개까지는 발화하지 않기 때문에 0
    else:
        return 1    # x2에 속하는 N개부터는 발화하기 때문에 1 


  • 오차정정학습법은 모든 데이터를 정확하게 분류할 때까지 학습을 반복하기 때문에 반복문을 다음과 같이 유사코드로 작성할 수 있다
while True:
    #
    # 매개변수 업데이트 처리
    #
    
    if '모든 데이터를 정확하게 분류했다면':
        break 


  • 매개변수 업데이트 부분에는 식 (3.7)~식 (3.10)을 구현해야할 뿐만 아니라 데이터 분류가 제대로 되었는지 판별할 수 있도록 구현한 코드는 다음과 같다
while True:
    classified = True:
    
    for i in range(N * 2):

        delta_W = (y(i) - H(X[i])) * X[i]     # 식 (3.7)
        delta_b = y(i) - H(X[i])              # 식 (3.8)
        
        W += delta_W                               # 식 (3.9)
        b += delta_b                               # 식 (3.10)
        
        classified *= all(delta_W == 0) * (delta_b == 0)
        
    if classified:
        break

print(f'w:\n{W}')
print(f'b:\n{b}') 


  • 12라인 코드는 20개의 데이터 중에서 하나라도 $\Delta\mathbb{w}\neq 0$이거나 $\Delta b\neq 0$이면 classified 변수는 $0$, 즉 False가 되기 때문에 다시 학습을 반복하게 된다
 classified *= all(delta_W == 0) * (delta_b == 0)


  • 최종적으로 업데이트된 매개변수의 값은 다음과 같기 떄문에 두 종류의 데이터를 구분하는 식은 $2.14037745x_1 + 1.27639271x_2 -9=0$이며 그림과 같이 구분되는 것을 알 수 있다
 w:
[ 2.14037745  1.2763927 ]
b:
-9


출처 : 정석으로 배우는 딥러닝

'신경망(Neural Network) 스터디' 카테고리의 다른 글

6. 다층 퍼셉트론 모델링  (0) 2017.12.28
5. 다중 클래스 로지스틱 회귀  (0) 2017.12.27
4. 로지스틱 회귀  (0) 2017.12.23
2. 논리 회로  (0) 2017.12.22
1. 신경망의 단순 모델  (0) 2017.12.21

+ Recent posts