Neural Networks

‍이세현·2025년 4월 20일
0

Architectures

Linear Classifier의 한계

XOR 문제는 단순한 linear classifier로 풀이할 수 없다. 이외에도 선형 hyperplane으로 분류할 수 없는 복잡한 문제가 있다.

  • 1 if 1 <= L2 norm <= 2 else 0
  • 1 if odd else 0

Neural Networks의 구조

Neural Networks는 선형 레이어가 여러 층으로 쌓인 구조이다. 3-layer Nerual Net 또는 2-hidden-layer Nerual Net이라고 표현한다.

이때 모든 레이어는 모두 연결되어 있는 Fully-connected 관계이다.

선형 레이어를 여러 층 쌓은 것을 Deep Networks라고 한다. Deep Networks 분류기의 복잡도는 단순한 선형 분류기보다 훨씬 높지만, 그만큼 복잡한 문제를 풀기 위해 흔히 사용된다. 여러 층으로 쌓은 레이어를 사용하는 이유는 크게 두 가지가 있다.

  • 입력 Feature의 분포를 완전히 바꾸어서 분류할 수 없는 값을 분류가 가능하게 변형한다. 즉, 입력 데이터의 분포를 더 유의미한 공간으로 변환한다.
  • 비선형적이고 더 정교한 decision boundary를 만들 수 있다. 즉, 더 다양한 입력 패턴을 인식할 수 있고 고차원 문제에서 잘 작동할 수 있다.

Feedforward

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

3-layer Neural Network에서 Feedforward

# 활성화 함수 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

Activation

코드에서 f 함수로 확인할 수 있듯이 선형 연산 이후에는 비선형 연산이 진행된다. 비선형 연산이 없다면, W1, W2, W3을 곱한 하나의 다른 선형 연산이 될 뿐이다. 이러한 이유로 비선형, 활성화 함수가 있어야 한다. 흔히 사용하는 활성화 함수로는 다음과 같은 함수가 있다.

  • Sigmoid: σ(x)=1/(1+ex)\sigma(x)=1/(1+e^{-x})
  • Tanh: tanh(x)\tanh(x)
  • ReLU: max(0,x)\max(0,x)
  • LeakyReLU: max(0.1x,x)\max(0.1x, x)
  • ELU: {xif x>0α(exp(x)1)if x0\begin{cases}x & \text{if }x>0 \\ \alpha(\exp(x)-1) & \text{if }x\le0\end{cases}

Num of Layers

레이어의 개수가 늘어날수록 복잡도는 더 늘어나게 된다. 그만큼 과적합의 가능성도 높아진다. 하지만 과적합을 막기 위해 모델의 사이즈를 줄이는 것은 좋은 방법이 아니다. 차라리, 모델의 사이즈를 키우고 더 강력한 정규화 기법을 적용하면 classifier의 일반화 성능을 더 높일 수 있다.

Gradients

손실 함수 L(W)L(W)는 다음과 같다.

L(W)=1Ni=1NLi(xi,yi,W)+λR(W)L(W)=\frac{1}{N}\sum_{i=1}^{N}L_i(x_i,y_i,W)+\lambda R(W)

손실 함수의 기울기 WL(W)\nabla_WL(W)를 직접 구하는 것은 매우 복잡하다. 모델이 복잡해질수록 기울기 계산이 어렵다.

Backpropagation

Backpropagation은 chain rule을 이용해, 출력층의 기울기를 입력층까지 효율적으로 전달함으로써 이 문제를 해결하기 위해 등장했다.

Backpropagation은 출력층에서 계산된 손실의 기울기를 각 노드에서의 local gradient와 upstream gradient의 곱으로 전달하여, 최종적으로 모든 가중치의 기울기를 계산하는 과정이다.

각 노드는 자시에게 들어오는 upstrean gradient와 자신의 local gradient를 곱해 downstrean 노드로 전달하며, 이 연쇄 법칙을 따라 기울기가 역방향으로 흘러간다.

Patterns in Gradient Flow

  1. Add gate: gradient distributor
    • f = x+y
    • dfdx=dfdy=1\frac{df}{dx}=\frac{df}{dy}=1
  2. Mul gate: swap multiplier
    • f = x*y
    • dfdx=y,dfdy=x\frac{df}{dx}=y, \frac{df}{dy}=x
  3. Copy gate: gradient adder
    • 계산된 기울기 값 두 개가 더해져서 전달된다.
  4. Max gate: gradient router
    • f = max(x, y)
    • max는 기울기가 전달되고, max가 아닌 값은 기울기가 0이다.
profile
Hi, there 👋

0개의 댓글