미시간대 강의_Space Warping

코드 설명


< 출처: 498_FA2019_lecture05>

import numpy as np
from numpy.random import randn

N, Din, H, Dout = 64, 1000, 100, 10
x, y = randn(N, Din), randn(N, Dout)
w1, w2 = randn(Din, H), randn(H, Dout)
for t in range(10000):
    h = 1.0 / (1.0 + np.exp(-x.dot(w1)))
    y_pred = h.dot(w2)
    loss = np.square(y_pred - y).sum()
    dy_pred = 2.0 * (y_pred - y)
    dw2 = h.T.dot(dy_pred)
    dh = dy_pred.dot(w2.T)
    dw1 = x.T.dot(dh * h * (1-h))
    w1 -= 1e-4 * dw1
    w2 -= 1e-4 * dw2

np.random.randn(m,n): 평균 0, 표준편차 1의 가우시안 표준정규분포 matrix array m, n을 생성한다. 예를 들어,

np.random.randn(4)
>>> array([-0.29923506,  0.0038789 , -1.15027252, -0.11291626])

np.random.randn(2,3)
>>> array([[ 1.84915399, -0.66010442, -2.37652021],
          [-0.0145478 , -0.21639606, -1.33351629]])

신경망 구조 아이디어는 어떻게 얻었을까?


그렇다면 신경망 아이디어를 어디서 착안한 것일까? 뇌의 뉴런과 시냅스로부터 아이디어를 얻었다. 하지만 정확히 어떤 원리로 이게 효과적인지는 밝혀진 바가 없다. 그냥 잘 작동하구나~이렇게만 넘기면 되는 부분이다. 교수님도 이 부분은 중요하지 않다고 강조했기에 짧게 넘어가겠다.


뇌의 시냅스에 비유를 할 때 주의해야 할 점들이다.

Space Warping

때로는 자료의 형태에 따라 선형분류기로 분류를 해주기 어렵다. 이 때 비선형 분류기를 사용할 수도 있겠지만 그 대신 자료의 형태를 다르게 분포시켜보는 것은 어떨까? 이때 Feature Transform(Linear transform)을 통해 좌표축을 재설정해주는 Space Warping을 사용한다.


하지만 좌표를 행렬곱을 통해 재설정해주더라도 선형적으로 분류가 되지 않을 수 있다.

여기서 layer 간에 Relu function을 사용하는 진정한 의미를 알 수 있다. 전에는 비선형성을 구현해준다고만 알고 있었는데 그 과정을 그래프를 통해 이해할 수 있다. 빨간색과 초록색 선을 새로운 좌표축으로 설정하였을 때 음수부분을 0으로 설정한다면 점들이 모두 1사분면에만 분포하게 된다. 한 사분면에만 data가 밀집해있다면 선형적으로 가르기 더 편해지는 경우가 있기 때문에 Relu를 사용하는 것이다.

Hidden layer의 개수가 많아지면 neural network가 더 복잡해지기 때문에 space를 folding해주더라도 복잡하게 나누게 된다.

이러한 복잡함음 overfitting을 의미하는데 그렇다면 hidden layer의 수를 제한해야 성능이 올라갈까? 그건 아니다.

앞서 배웠던 overfitting에 효과적이었던 regularization을 활용해보자. 람다를 높일수록 모든 점들을 완벽하게 나눌 순 없지만 나누는 영역이 선형에 근접해진다.

모든 그림 자료의 출처는 < 출처: 498_FA2019_lecture05>에 있습니다. Michigan University의 Justin Johnson 교수님의 Deep Learning for Computer Vision 강의의 자료입니다.

좋은 웹페이지 즐겨찾기