XOR 문제는 단순한 linear classifier로 풀이할 수 없다. 이외에도 선형 hyperplane으로 분류할 수 없는 복잡한 문제가 있다.
1 if 1 <= L2 norm <= 2 else 01 if odd else 0Neural Networks는 선형 레이어가 여러 층으로 쌓인 구조이다. 3-layer Nerual Net 또는 2-hidden-layer Nerual Net이라고 표현한다.
이때 모든 레이어는 모두 연결되어 있는 Fully-connected 관계이다.
선형 레이어를 여러 층 쌓은 것을 Deep Networks라고 한다. Deep Networks 분류기의 복잡도는 단순한 선형 분류기보다 훨씬 높지만, 그만큼 복잡한 문제를 풀기 위해 흔히 사용된다. 여러 층으로 쌓은 레이어를 사용하는 이유는 크게 두 가지가 있다.
class Neuron:
def neuron_tick(inputs):
# 입력과 가중치는 1차원 np 배열이고 bias는 숫자이다
cell_body_sum = np.sum(inputs * self.weights) + self.bias
# Sigmoid activation function
firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum))
return firing_rate
# 활성화 함수 f 정의
f = lambda x : 1.0(1.0 + np.exp(-x))
# 임의의 입력값 x
x = np.random.randn(3, 1)
h1 = f(np.dot(W1, x) + b1) # First layer
h2 = f(np.dot(W2, h1) + b2) # Second layer
out = f(np.dot(W3, h2) + b3) # Third layer
코드에서 f 함수로 확인할 수 있듯이 선형 연산 이후에는 비선형 연산이 진행된다. 비선형 연산이 없다면, W1, W2, W3을 곱한 하나의 다른 선형 연산이 될 뿐이다. 이러한 이유로 비선형, 활성화 함수가 있어야 한다. 흔히 사용하는 활성화 함수로는 다음과 같은 함수가 있다.
레이어의 개수가 늘어날수록 복잡도는 더 늘어나게 된다. 그만큼 과적합의 가능성도 높아진다. 하지만 과적합을 막기 위해 모델의 사이즈를 줄이는 것은 좋은 방법이 아니다. 차라리, 모델의 사이즈를 키우고 더 강력한 정규화 기법을 적용하면 classifier의 일반화 성능을 더 높일 수 있다.
손실 함수 는 다음과 같다.
손실 함수의 기울기 를 직접 구하는 것은 매우 복잡하다. 모델이 복잡해질수록 기울기 계산이 어렵다.
Backpropagation은 chain rule을 이용해, 출력층의 기울기를 입력층까지 효율적으로 전달함으로써 이 문제를 해결하기 위해 등장했다.
Backpropagation은 출력층에서 계산된 손실의 기울기를 각 노드에서의 local gradient와 upstream gradient의 곱으로 전달하여, 최종적으로 모든 가중치의 기울기를 계산하는 과정이다.
각 노드는 자시에게 들어오는 upstrean gradient와 자신의 local gradient를 곱해 downstrean 노드로 전달하며, 이 연쇄 법칙을 따라 기울기가 역방향으로 흘러간다.
f = x+yf = x*yf = max(x, y)max는 기울기가 전달되고, max가 아닌 값은 기울기가 0이다.