6.1 서론(Quick intro)

우선 Neural Networks를 뇌와 비교하지 않고 이야기 해보겠습니다. 앞서 선형 분류(linear classification) 섹션에서 우리는 주어진 이미지를 공식 \( s = W x \)을 이용하여 여러 시각적 카테고리에 대한 점수로 계산했습니다. 여기서 \(W\)는 행렬, \(x\)는 이미지의 모든 픽셀 데이터를 포함하는 입력 열 벡터입니다. CIFAR-10의 경우, \(x\)는 [3072x1] 열 벡터, \(W)는 [10x3072] 행렬이므로 출력 점수는 10클래스 점수의 벡터가 됩니다.

\(s = W_2\max(0, W_1 x) \)를 Neural network로 간주해봅시다. 여기서 \(W_1\)는 이미지를 100차원의 중간 벡터(intermediate vector)로 변환하는 [100x3072] 행렬입니다. \(max(0,-) \)는 요소적(elementwise)으로 적용되는 비선형 함수입니다. 선택할 수 있는 비선형(non-linearity) 함수가 몇 가지 있지만, 일반적으로 \(max(0,-) \)를 사용하며, 이는 임계값(threshold) 0 이하의 숫자를 모두 0으로 만듭니다. 행렬 \(W_2\)는 [10x100]의 크기를 가지며, 클래스 점수로 해석되는 10개의 숫자를 얻을 수 있습니다. 연산과정에 있어 비선형성은 매우 중요합니다 - 만약 이것이 없다면, 두 행렬이 하나의 행렬로 붕괴(collapsed)될 수 있으며, 결국 예측된 클래스 점수는 다시 입력에 대한 선형 함수가 되어버립니다. 즉, 비선형 함수을 통해 흔들림(wiggle)을 얻을 수 있습니다. 파라미터 \(W_2, W_1\)는 SGD로 학습되며, 그 그래디언트는 chain rule과 backpropagation을 통한 연산으로 유도됩니다.

\( s = W_3 \max(0, W_2 \max(0, W_1 x)) \)는 3개 층을 가진 Neural Network로 간주할 수 있습니다. 여기서 \(W_3, W_2, W_1\)는 모두 학습해야 할 파라미터들입니다. 중간 은닉(hidden) 벡터의 크기는 네트워크의 하이퍼파라미터이며, 이후에 이를 어떻게 설정하는지 알아볼 것입니다. 이제 이러한 연산을 뉴런/네트워크 관점에서 어떻게 해석하는지지 알아보겠습니다.

6.2 단일 뉴런 모델링(Modeling one neuron)

Neural Networks 분야는 원래 생물학적 신경계를 모델링한다는 목표에서 영감을 받았으나, 그 이후 분화하여 공학적인 문제로 발전하였고 현재 기계학습(Machine Learning) 과제에서 좋은 결과를 얻고 있습니다. 그러나 여전히 이 분야의 많은 부분이 생물체계에서 영감을 받았기 때문에, 이에 대한 설명을 간략하게 짚고 넘어가겠습니다.

6.2.1 생물학적 영감과 연결(Biological motivation and connections)

뇌의 기본 연산 단위는 뉴런(neuron)입니다. 인간의 신경계는 약 860억 개의 뉴런이 있으며, 약 10^14 - 10^15 시냅스(synapses)와 연결되어 있습니다. 아래의 그림은 생물학적 뉴런(왼쪽)과 일반적인 수학적 모델(오른쪽)을 비교하여 보여줍니다. 각 뉴런은 수상돌기(dendrites)로부터 입력신호를 받아, 그 (단일) 축삭돌기(axon)를 따라 출력신호를 생성합니다. 축삭돌기(axon)는 끝에서 분화하여 시냅스를 통해 다른 뉴런의 수상돌기(dendrites)에 연결됩니다. 수학적 모델에서, 축삭돌기(axons)를 따라 이동하는 신호, \(x_0\)는 시냅스 강도(synaptic strength), \(w_0\)에 기초하여 다른 뉴런의 수상돌기(dendrites)와 \(w_0 x_0\)와 같이 곱의 형태로(multiplicatively) 상호작용합니다. 이 아이디어는 시냅스 강도(weight \(w\))를 학습할 수 있고(learnable), 다른 뉴런에 미치는 영향력과 방향(흥분: 양의 weight, 억제: 음의 weight)을 제어할 수 있다는 것입니다. 기본적인 모델에서, 수상돌기(dendrites)는 이들이 합쳐지는 세포로 신호를 보냅니다. 최종 합계가 특정 임계값(threshold)을 넘으면 뉴런은 축삭돌기(axon)를 따라 신호를 발사(fire)할 수 있습니다. 수학적 모델에서 신호를 발사하는 정확한 타이밍은 중요하지 않고, 발사 주기에 따라 정보를 전달하는 것으로 간주합니다. 이를 바탕으로, 활성화 함수(activation function) \(f\)를 이용하여 뉴런의 발사 주기(firing rate)를 모델링합니다. 이는 축삭돌기(axon)를 따라 신호를 발사하는 빈도를 나타냅니다. 역사적으로 활성화함수로 시그모이드 함수(sigmoid function) \(\sigma\)를 주로 사용했습니다. 이는 입력(합계 후의 신호 강도)을 0과 1 사이의 범위로 줄이기(squashes) 때문입니다. 활성화함수에 대한 자세한 내용은 뒤에서 다루겠습니다.

생물학적 뉴런(왼쪽)과 수학적 모델(오른쪽)

단일 뉴런에서 신호를 앞으로 전달하는 과정(forward-propagating)을 코드로 표현한 것입니다:

class Neuron(object):
  # ... 
  def forward(self, inputs):
    """ assume inputs and weights are 1-D numpy arrays and bias is a number """
    cell_body_sum = np.sum(inputs * self.weights) + self.bias
    firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid activation function
    return firing_rate

즉, 각 뉴런은 입력과 weight에 대해 내적을 연산하고 bias를 더한 후 비선형성(또는 활성화 함수)을 적용합니다. 이 경우 sigmoid \(\sigma(x) = 1/(1+e^{-x})\)σ=1/(1+e-x)을 적용하였습니다. 이 장의 뒷 부분에서 다른 활성화 함수에 대해 더 자세히 살펴보겠습니다.

Coarse model 위에서 제시한 생물학적 뉴런은 매우 단순화(coarse)한 모델입니다: 가령, 각각 다른 특성을 가진 여러 뉴런들이 있습니다. 생물학적으로 뉴런의 수상돌기(dendrites)에서는 복잡한 비선형 계산을 수행합니다. 시냅스는 단순히 하나의 weight가 아니라, 그 자체로 복잡한 비선형 동적 시스템(non-linear dynamical system)입니다. 많은 시스템에서 출력 신호의 정확한 타이밍이 중요하기 때문에, 주기의 근사치가 유지되지 않을 수 있습니다. 이러한 것들을 모두 단순화한 Neural Networks과 실제 뇌 사이에는 사실 많은 차이점이 있습니다. 아래는 이에 대한 참고 자료입니다.

6.2.2 선형분류기로서의 단일 뉴런(Single neuron as a linear classifier)

뉴런의 forward 연산의 수학적 모델은 익숙할 수 있습니다. 선형 분류기(linear classifier)에서도 보았듯이, 뉴런은 입력 공간의 특정 선형 영역을 “like(1에 가까운 활성화)” 또는 “dislike(1에 가까운 활성화)”할 수 있습니다. 따라서, 뉴런의 출력에 적절한 loss function을 적용함으로써, 단일 뉴런을 선형 분류기로 바꿀 수 있습니다:

이항 소프트맥스 분류기(Binary Softmax classifier) 예를 들어, \(\sigma(\sum_iw_ix_i + b)\)를 한 클래스의 확률 \(P(y_i = 1 \mid x_i; w) \)로 해석할 수 있습니다. 확률의 합은 1이 되어야 하기 때문에, 다른 클래스의 확률은 \(P(y_i = 0 \mid x_i; w) = 1 - P(y_i = 1 \mid x_i; w) \)이 됩니다. 이런 식으로, cross-entropy loss를 공식화할 수 있으며, 이를 최적화하면 binary Softmax classifier(또는 logistic regression)가 됩니다. sigmoid는 0-1의 값을 가지기 때문에, 이 분류기의 예측은 뉴런의 출력이 0.5보다 큰지에 근거합니다.

이항 SVM 분류기(Binary SVM classifier) 뉴런의 출력에 max-margin hinge loss를 사용하여 binary Support Vector Machine이 되도록 학습시킬 수 있습니다.

Regularization 해석 생물학적 관점에서 SVM/Softmax의 regularization loss는 점진적 망각(gradual forgetting)으로 해석될 수 있습니다. 이는 매 파라미터 업데이트 이후 마다 모든 시냅스 weights, \(w\)는 0으로 향해 줄어들기 때문입니다.

단일 뉴런으로 binary classfier(binary Softmax 또는 binary SVM classifier)를 구현할 수 있습니다.

6.3 자주 쓰이는 활성화 함수(Commonly used activation functions)

모든 활성화 함수(비선형성(non-linearity))는 하나의 숫자를 가지고 특정 수학적 연산을 수행합니다. 다음은 실전에서 보게 될 여러 활성화함수들 입니다:

왼쪽: Sigmoid 비선형성은 값을 [0,1] 사이의 범위로 뭉갭니다(sqaushes). 오른쪽: tanh 비선형성은 값을 [-1,1] 사이의 범위로 뭉갭니다(squashes).

Sigmoid sigmoid 비선형성은 \(\sigma(x) = 1 / (1 + e^{-x})\)의 형태를 가지며 위의 왼쪽 그림에 해당합니다. 앞서 언급했듯이, 이는 숫자를 0에서 1 사이의 범위로 “뭉갭니다(squashes)”. 또한 매우 큰 음수는 0이 되고, 매우 큰 양수는 1이 됩니다. sigmoid function은 뉴런의 발사 주기(firing rate)를 해석하기에 적합하기 때문에 역사적으로 자주 사용되어 왔습니다: 발사(fire)하지 않으면 0, 완전히 포화된(fully-saturated) 발사는 최대 주기 1로 가정합니다. 하지만 최근에는 실전에서 sigmoid 비선형성을 거의 사용하지 않습니다. 이는 크게 두 가지 단점을 지니고 있기 때문입니다:

  • sigmoid는 포화가 되면 그래디언트를 없앱니다(Sigmoids saturate and kill gradients) sigmoid 뉴런은 활성화가 0 또는 1의 어느 한쪽 끝에서 포화될 때, 이 영역의 그래디언트는 거의 0이 됩니다. 이는 매우 바람직하지 못한 특성입니다. backpropagation를 떠올려 봅시다. 이 (로컬) 그래디언트는 전체 objective에 대한 이 게이트 출력의 그래디언트에 곱해집니다. 따라서, 로컬 그래디언트가 매우 작다면, 이는 그래디언트를 “없앨(kill)”것이고, 거의 아무 신호도 (뉴런을 통해) weight나 데이터로 흐르지 못할 것입니다. 또한, sigmoid 뉴런의 weight를 초기화할 때 각별한 주의를 기울여야 포화(saturation)를 방지할 수 있습니다. 가령, 초기 weight가 너무 크면 대부분의 뉴런은 포화가 되고 네트워크는 거의 학습하지 못할 것입다.

  • sigmoid의 출력이 0을 중심으로 하지 않습니다(Sigmoid outputs are not zero-centered) 이 또한 바람직하지 않습니다. Neural Network의 뒤쪽 레이어 뉴런들이 0을 중심으로 하지 않는 데이터를 얻을 것이기 때문입니다. 이는 gradient descent의 역학(dynamics)에 영향을 미칩니다. 만약 뉴런으로 들어오는 데이터가 항상 양수인 경우(\(f = w^Tx + b\)에서 \(x > 0\): 모든 요소가 양수인 경우), backpropagation을 거치면서 weight \(w\)의 그래디언트는 ((\(f\)의 그래디언트에 따라) 전부 양수 혹은 음수가 됩니다. 이것은 weight에 대한 그래디언트 업데이트를 할 때 원치 않은 지그재그 역학(zig-zagging dynamics)을 가져올 수 있습니다. 그러나 이러한 그래디언트가 데이터 배치(batch of data)에 걸쳐 합해지면, 최종 업데이트를 통해 weight는 가변적인 부호(variable signs)를 가지기 때문에 이 문제를 다소 완화할 수 있습니다. 이는 불편하지만, 활성화 포화(activation saturation)로 인한 문제보다는 덜 치명적입니다.

Tanh tanh 비선형성은 위의 오른쪽 그림에 해당합니다. 이는 숫자를 [-1, 1] 범위로 뭉갭니다(squashes). sigmoid 뉴런처럼 활성화가 포화되지만, 그와는 달리 출력이 0을 중심(zero-centered)으로 합니다. 따라서 실전에서 tanh 비선형성은 항상 sigmoid 비선형성 보다 선호됩니다. tanh 뉴런은 단순히 sigmoid 뉴런에서 크기를 조정(scaled)했을 뿐입니다: \(\tanh(x) = 2\Sigma(2x) -1\)

왼쪽: Rectified Linear Unit (ReLU) 활성화 함수. x < 0 일 때, 0. x > 0 일 때, 1의 기울기를 가집니다. 오른쪽: Krizhevsky et al. (pdf)에서 인용한 그래프. 논문에서 tanh를 사용했을 때 보다 ReLU를 사용했을 때 수렴(convergence)에 있어 6배 개선되었다고 이야기합니다.

ReLU 지난 몇 년 동안 Rectified Linear Unit는 선호도가 매우 높아졌습니다. 이는 위의 왼쪽 그림에 해당하며 함수 \(f(x) = \max(0, x)\)를 계산합니다. 즉, 활성화는 단순히 0의 임계치를 가집니다(thresholded). ReLU에는 여러 장점과 단점이 있습니다:

  • (+) sigmoid/tanh에 비해 SGD를 상당히 빠르게 수렴(convergence)시킵니다. (Krizhevsky et al.에 따르면 6배) 이는 선형이고 포화하지 않는 형태이기 때문으로 알려져 있습니다.
  • (+) exponential과 같이 비싼 연산을 포함하는 tanh/sigmoid 뉴런에 비해, ReLU는 단순히 0에서 활성화 행렬이 임계치를 가지도록(thresholding) 구현할 수 있습니다.
  • (-) 아쉽게도, ReLU 유닛은 학습 중에 취약하며(fragile) “죽을수도(die)” 있습니다. 예를 들어, ReLU 뉴런을 타고 흐르는 커다란 그래디언트는 다시는 뉴런이 datapoint에 대해 활성화되지 못하게 weight를 업데이트 해버릴 수도 있습니다. 만약 그런다면, 그 유닛을 통과하는 그래디언트는 그 시점 부터 평생 0이 되어버립니다. 즉, ReLU 유닛은 data manifold에서 떨어져 학습중에 돌이킬 수도 없이(irreversibly) 죽어버릴 수도 있습니다. 학습속도(learning rate)를 너무 높게 설정할 경우, 많으면 40%의 네트워크가 “죽을수도(dead)”(전체 트레이닝 데이터셋에 걸쳐 다시는 활성화 되지 않는 뉴런) 있습니다. 학습속도를 적절히 설정하면 이는 덜 발생할 것입니다.

Leaky ReLU Leaky ReLU는 “dying ReLU” 문제를 해결하기 위해 등장했습니다. Leaky ReLU에서는 x < 0일 때, 0이 되지 않고 매우 작은 기울기를 가지는 음의 값이 됩니다(0.01 정도). 즉, 함수는 \(f(x) = \mathbb{1}(x < 0) (\alpha x) + \mathbb{1}(x>=0) (x) \)가 되고, 여기서 \(\alpha\)는 작은 상수입니다. 간혹 이 활성화 함수가 더 좋은 결과를 보일 때도 있지만, 일관된 결과를 보이지는 않습니다. 2015년, Kaiming He et al. Delving Deep into Rectifiers에서 등장하는 PReLU 뉴런에서는, 음의 영역에서의 기울기는 각 뉴런의 파라미터가 될 수 있습니다. 하지만, 아직까지 결과의 안정성이 불명확합니다.

Maxout 이제껏 제안되어온 다른 유형의 유닛들은 weight와 데이터 간의 내적에 비선형성이 적용되는 \(f^Tx + b)\)와 같은 형태를 가지지 않습니다. 최근에 제안된 방법으로 비교적 선호되는 선택지는 Maxout 뉴런입니다(Goodfellow et al.). 이는 ReLU와 Leaky ReLU의 일반화(generalizes)한 버젼입니다. Maxout 뉴런은 \(\max(w_1^Tx+b_1, w_2^Tx + b_2)\)를 수행합니다. ReLU와 Leaky ReLU 모두 이 형태의 특별한 경우입니다(예를 들어, ReLU는 \(w_1, b_1 = 0\)일 경우입니다). 따라서 Maxout 뉴런은 ReLU 유닛의 모든 이점을 누리지만(포화되지 않는 연산의 선형 영역) 단점(dying ReLU)이 없습니다. 그러나 ReLU 뉴런과는 달리, 이는 모든 뉴런에 대해 파라미터의 수를 두 배로 증가시켜, 파라미터의 수를 크게 증가시킵니다.

여기까지 가장 보편적으로 사용되는 뉴런과 그 활성화 함수를 알아보았습니다. 마지막으로, 하나의 네트워크 안에서 서로 다른 종류의 뉴런을 혼합하고 일치(mix and match)시키는 것은 근본적으로 문제가 되진 않지만 흔히 있는 일은 아닙니다.

TLDR어떤 뉴런을 사용해야 되느냐?“고 묻는다면 ReLU를 사용하라고 답하겠습니다. 다만 학습속도(learning rate)와 네트워크 안에서 “죽는(dead)” 유닛의 비율을 잘 모니터하도록 합니다. 이게 신경 쓰인다면, Leaky ReLU나 Maxout을 시도해보는것도 괜찮습니다. 하지만 절대 sigmoid는 사용하지 않도록 합니다. tanh는 사용해봐도 되지만 ReLU/Maxout에 비해 좋은 결과를 얻긴 힘들겁니다.

6.4 신경망 구조(Neural Network architectures)

6.4.1 레이어 단위의 구성(Layer-wise organization)

그래프를 이루는 뉴런으로써의 신경망(Neural Networks as neurons in graphs) Neural Networks는 비순환 그래프(acyclic graph)에 연결된 뉴런의 집합체로 모델링할 수 있습니다. 즉, 어떤 뉴런의 출력은 다른 뉴런의 입력이 될 수 있다는 것입니다. 사이클(Cycles)은 네트워크의 forward pass에서 무한 루프를 야기하기 때문에 이는 존재할 수 없습니다. Neural Networks 모델은 뉴런들이 정형화되지 않은 형태(amorphous blobs)로 있는 것이 아니고 레이어의 형태로 연결됩니다. 일반적인 neural networks의 경우, 가장 보편적인 레이어의 유형은 전연결층(fully-connected layer)으로, 두 인접한 레이어 사이의 뉴런들이 전부 쌍으로 연결(fully pairwise connected)되지만, 단일 레이어 내의 뉴런들은 연결을 공유하지 않습니다. 아래는 여러 층의 fully-connected layer를 이용하여 두 가지 형태의 Neural Network 위상(topologies)을 보여줍니다:

왼쪽: 3개의 입력을 가지는 2 레이어 Neural Network (4개의 뉴런(유닛)을 가지는 hidden layer와 2개의 뉴런을 가지는 output layer). 오른쪽: 3개의 입력을 가지는 3 레이어 neural network, 4개의 뉴런을 가지는 2개의 hidden layers와 output layer. 양쪽 모두 레이어 너머의 뉴런들은 연결(시냅스)되지만, 레이어 내에서는 연결되어 있지 않습니다.

명명 규칙(Naming conventions) N-layer neural network라고 할 때, 입력 레이어(input layer)는 포함하지 않습니다. 따라서, 단일 레이어(single-layer) neural network는 hidden layers가 없는(입력이 출력과 직접 연결되어있는) 네트워크를 가리킵니다. 이런 측면에서, logistic regression 또는 SVMs은 단순히 단일 레이어 Neural Networks의 특별한 형태라고 생각할수도 있습니다. 이러한 네트워크는 “Artificial Neural Networks” (ANN) 또는 “Multi-Layer Perceptrons” (MLP)라고도 부르기도 합니다. Neural Networks를 실제 뇌에 비유하는 것은 그다지 선호되지 않으며 뉴런을 유닛(units)이라고 부르는 편입니다.

출력 레이어(Output layer) Neural Network의 다른 모든 레이어와는 다르게, output layer 뉴런들은 일반적으로 activation function이 없습니다. 또는 활성화 함수로써 선형의 항등함수(linear identity activation function)를 가지는 것으로도 해석할 수 있습니다. (분류의 경우) 마지막 출력 레이어는 클래스 점수를 표현하기 위해 사용되며, 이는 임의의 실수이거나 (회귀의 경우에는) 실수 값을 가지는 목표이기 때문입니다.

Neural Networks의 크기 Neural Networks의 크기를 측정하는데 일반적으로 사용하는 두 가지 측정기준(metrics)는 뉴런의 수 또는 파라미터의 수입니다. 상단의 그림에서 두 가지 네트워크 예시를 살펴봅시다:

  • 왼쪽 네트워크는 4 + 2 = 6 뉴런이 있고(입력을 제외), [3 x 4] + [4 x 2] = 20 weights 와 4 + 2 = 6 biases, 총 26개의 학습 가능한(learnable) 파라미터가 있습니다.
  • 오른쪽 네트워크는 4 + 4 + 1 = 9 뉴런이 있고, [3 x 4] + [4 x 4] + [4 x 1] = 12 + 16 + 4 = 32 weights 와 4 + 4 + 1 = 9 biases, 총 41개의 학습 가능한 파라미터가 있습니다.

대강 감을 잡기 위해서, 현대의 Convolutional Networks는 약 1억 개의 파라미터와 10-20개의 깊은(deep) 레이어로 구성됩니다. 그래서 딥러닝(deep learning)이라고 부릅니다. 하지만 사실 실제적으로(effective) 연결된 수는 파라미터 공유(parameter sharing)때문에 더 많습니다. 더 자세한 사항은 Convolutional Neural Networks를 다루면서 알아보겠습니다.

6.4.2 feed-forward 연산의 예(Example feed-forward computation)

반복적인 행렬 곱셈과 뒤섞인 활성화함수(Repeated matrix multiplications interwoven with activation function) Neural Networks를 레이어로 구성하는 큰 이유중 하나는 이 구조가 행렬 벡터 연산을 이용하여 Neural Networks를 매우 간단하고 효율적으로 만들기 때문입니다. 위의 그림에 제시된 3 레이어 neural network를 보면 입력은 [3x1] 벡터입니다. 레이어의 모든 연결 강도(connection strengths)는 하나의 행렬에 저장될 수 있습니다. 가령, 첫 번째 hidden layer의 weight W1는 [4x3] 크기를 가지며, 모든 유닛에 대한 bias는 [4x1]의 벡터 b1에 저장할 수 있습니다. 모든 뉴런들은 W1의 행에 각각의 weight를 저장합니다. 따라서 행렬 벡터 곱 np.dot(W1,x)은 그 레이어의 모든 뉴런에 대한 활성화(activations)를 계산합니다. 이와 유사하게, W2는 두 번째 hidden layer의 연결을 저장하는 [4x4] 행렬이며, [1x4] 크기의 W3 행렬에 마지막(출력) 레이어가 저장됩니다. 따라서 이 3 레이어 neural netwrok의 전체 forward pass는 단순히 3개의 행렬 곱을 활성화함수의 적용과 뒤섞는(interwoven)것이 됩니다:

# forward-pass of a 3-layer neural network:
f = lambda x: 1.0/(1.0 + np.exp(-x)) # activation function (use sigmoid)
x = np.random.randn(3, 1) # random input vector of three numbers (3x1)
h1 = f(np.dot(W1, x) + b1) # calculate first hidden layer activations (4x1)
h2 = f(np.dot(W2, h1) + b2) # calculate second hidden layer activations (4x1)
out = np.dot(W3, h2) + b3 # output neuron (1x1)

상단의 코드에서, W1,W2,W3,b1,b2,b3 는 네트워크에서 학습 가능한 파라미터입니다. 변수 x는 하나의 열 벡터가 아닌 트레이닝 데이터의 전체 배치를 의미하며(각각의 입력은 x의 열이 됩니다), 모든 데이터는 병렬적으로(parallel) 구해집니다. 또한 마지막 Neural Network 레이어에서는 일반적으로 활성화 함수를 가지지 않습니다. 이는 분류에서 (실수의) 클래스 점수를 의미합니다.

fully-connected layer의 forward pass는 행렬곱에서 부터 bias offset과 활성화 함수의 적용까지 해당합니다.

6.4.3 네트워크의 표현력(Representational power)

fully-connected layer들로 이루어진 Neural Networks는 weight를 통해 파라미터화된 함수들을 정의한다고 볼 수 있습니다. 이 때 다음과 같은 질문을 할 수 있습니다: 특정 함수들(family of functions)을 얼마나 잘 표현할 수 있나요? 특히, Neural Network로 모델링할 수 없는 함수가 있나요?

적어도 하나의 hidden layer를 가진 Neural Networks는 일반적인 근사치(universial approximators)를 표현할 수 있습니다. 즉, 어떤 연속함수 \(f(x)\)가 주어지더라도, \( \forall x, \mid f(x) - g(x) \mid < \epsilon \)와 같이 하나의 hidden layer를 가진(sigmoid와 같은 적절한 비선형성을 포함하는) Neural Network \(g(x)\)가 존재합니다. 다시 말해, Neural Netwrok는 어떤 연속함수(continuous function)라도 근사적으로 표현할 수 있습니다. 아래는 이에 대한 참고 자료입니다:

만약 하나의 hidden layer만으로도 함수를 근사하는데 충분하다면, 왜 더 많고 깊은 레이어를 쌓으려고 할까요? 이에 대한 답은 2 레이어 Neural Network가 수학적으로는 일반적인 근사치(universal approximator)를 만족하지만 실전에서는 비교적 부정확하고 활용하기 어렵기 때문입니다. 1차원에서, \(a,b,c\)가 파라미터 벡터일 때 “sum of indicator bumps” 함수 \(g(x) = \sum_i c_i \mathbb{1}(a_i < x < b_i)\)또한 일반적인 근사치(universal approximator)를 만족합니다. 하지만 기계학습에서 이 함수를 사용하는 경우는 없을것입니다. Neural Network는 실제 데이터의 통계적 특성에 잘 맞는 부드러운 함수를 간결하게 표현하며, 최적화 알고리즘(gradient descent)을 이용하여 쉽게 학습할 수 있기 때문에 실제로도 좋은 성능을 보입니다. 이와 유사하게, (여러 hidden layer)를 가진 더 깊은 네트워크는 단일 레이어 네트워크와 표현력(representational power)이 동일하다는 사실에도 불구하고, 더 잘 동작한다는 사실은 실증적인(empirical) 관측입니다.

한편, 실전에서 3 레이어 Neural Network가 2 레이어 Net을 능가하는 경우가 많지만, 더 깊은 레이어(4,5,6)가 더 좋은 성능을 발휘하는 경우는 드뭅니다. 이는 좋은 인식 시스템을 위해서는 깊이((가령, 학습 가능한 10개의 레이어)가 매우 중요한 요소인 Convolutional Networks와는 극명한 대조를 이루는 점입니다. 이 관찰에 대한 한 가지 주장은 이미지가 계층(hierarchical) 구조를 포함한다는 것입니다(얼굴은 눈으로 구성되고, 엣지(edge)로 구성되는 등). 따라서 이미지와 같은 데이터 도메인에서는 여러 개의 레이어를 처리하는 것이 직관적으로 타당합니다.

물론 더 자세한 내용이 훨씬 더 많이 있으며 최근의 연구 주제로 다뤄지고 있습니다. 이 주제에 관심이 있다면, 아래의 내용을 참고하기를 바랍니다:

6.4.4 레이어의 개수와 크기(Setting number of layers and their sizes)

실제 문제를 맞닥뜨릴 때 어떤 아키텍쳐를 사용해야할까요? hidden layer는 사용하지 않아도 되나요? 사용한다면 몇 개를 사용해야 하나요? 각 레이어는 얼마나 커야하나요? 첫번째로, Neural Network에서 레이어의 크기와 개수를 늘릴 때, 네트워크의 용량(capacity)는 증가합니다. 즉, 뉴런들이 다양한 함수를 표현하기 위해 협동(collaborate)하기 때문에 표현 가능한 함수의 공간(space)이 커집니다. 예를 들어, 2차원에서 이진 분류 문제를 푼다고 가정합니다. 특정 크기의 hidden layer 한 개로 이루어진 3 종류의 neural networks를 학습시키면 다음과 같은 분류기를 얻을 수 있습니다:

Neural Networks가 클수록 더 복잡한 함수를 표현할 수 있습니다. 데이터는 클래스의 색깔의 점으로 표시되며, 학습된 neural network에 의해 생긴 결정 영역(decision regions)도 그 뒤에 같이 표시됩니다. 이 예제는 ConvNetsJS demo에서 조절해볼 수 있습니다.

위의 그림에서 보다시피, 뉴런이 더 많을 수록 Neural Networks는 더 복잡한 함수를 표현할 수 있습니다. 그러나, 이는 (더 복잡한 데이터를 분류할 수 있기 때문에) 축복임과 동시에 (트레이닝 데이터에 쉽게 과적합(overfit) 되기 때문에) 저주이기도 합니다. 과적합(Overfitting)은 모델이 용량(capacity)이 너무 높아 (예상되는) 일반적인 관계를 넘어 데이터의 노이즈까지 맞춰버릴 때(fit) 발생합니다. 예를 들어, 20개의 hidden 뉴런을 가지는 모델은 트레이닝 데이터에는 모두 적합하지만(fit), 빨간색과 초록색 결정 영역(decision regions)을 분리하면서 공간을 여러 개로 해체해버립니다(disjoint). 3개의 hidden 뉴런을 가지는 모델은 광범위하게 데이터를 분류할 수 있는 표현력(representational power)을 가집니다. 이는 데이터를 두 개의 덩어리로 모델링하고 초록색 클러스터 안에 있는 몇몇 개의 빨간색 점은 극단치(outlier)(노이즈) 로 해석합니다. 실전에서, 이것이 테스트셋에 대한 더 좋은 일반화(generalization)를 이끌어 냅니다.

위에서 이야기 했듯이, 데이터가 복잡하지 않은 경우에는 오버피팅을 방지하기 위해 더 작은 neural networks를 선호한다고 생각할 수도 있습니다. 하지만, 이는 완전히 정확한 이야기는 아닙니다 - Neural Networks에서 오버피팅을 방지하기 위해 사용될 수 있는 더 좋은 방법이 있습니다(L2 regularization, dropout, input noise). 실전에서는, 오버피팅을 제어하기 위해 뉴런의 수를 조절하는 것보다 이 방법을 사용하는 것이 모든 경우에서 더 좋습니다.

사소하지만 이유이지만 작은 네트워크일수록 gradient descent와 같은 로컬한 방법(local methods)으로는 학습시키기 어렵기 때문이기도 합니다: 작은 네트워크의 loss function은 극솟값들(local minima)이 비교적 적고, 이러한 여러 극솟값(minima)들 중 하나로 수렴하기 쉽습니다. 이는 loss가 최솟값(global minimum)에 수렴하지 못하고 큰값을 가지기 때문에 좋지 않습니다. 반면, 큰 네트워크는 훨씬 더 많은 극솟값들(local minima)들을 가지지만, 실제 loss의 측면에서 더 좋은(낮은) minima를 보여줍니다. Neural Networks는 non-convex하기 때문에, 수학적으로 이러한 특성들을 연구하는 것은 어렵지만, 이러한 objective function을 이해하려는 시도는 이루어 지고 있습니다. 가령, 최근의 한 논문 The Loss Surfaces of Multilayer Networks에서는 이러한 내용을 다루었습니다. 실전에서 작은 네트워크를 학습시킬 때 최종 loss는 상당히 큰 분산(variance)을 보입니다 - 운이 좋은 경우에는 좋은 위치에 수렴하지만, 어떤 경우에는 극솟값에 갇히는 좋지 않은 경우가 있을 수 있습니다. 반면, 큰 네트워크를 학습시킬 때 다양한 해(solution)로 수렴하겠지만, 최종 loss의 분산(variance)은 훨씬 작을 것입니다. 다시 말해, 모든 해(solution)가 비슷한 정도로 양호하며, 무작위 초기화(random initialization)의 운에 따른 변동이 심하지 않을겁니다.

다시 말하지만, regularization strength는 뉴럴 네트워크의 오버피팅을 제어하는데 선호되는 방법입니다. 아래에서는 3가지 다른 설정을 주었을 때 각각의 결과를 볼 수 있습니다:

regularization strength의 효과: 각 neural network는 동일하게 20개의 hidden neurons이 있지만, regularization strength이 높을수록 결정 영역(decision region)이 더 부드럽게 만들어 집니다. 이 예제를 다음 링크에서 직접 시도해볼 수 있습니다. ConvNetsJS demo.

오버피팅이 두려워서 작은 네트워크를 사용하는 것은 바람직하지 않습니다. 연산량(computational budget)이 감당할 수 있는 만큼 최대한 큰 neural network를 사용하고, 오버피팅을 제어하기 위해서는 다른 regularization 기법들을 사용합니다.

6.5 요약(Summary)

요약하자면,

  • 생물학적 뉴런(neuron)을 매우 단순화(coarse)한 모델을 소개하였습니다.
  • 실전에서 사용되는 여러 종류의 활성화 함수(activation functions)를 알아보았고, 그 중 ReLU가 가장 보편적으로 사용됨을 알았습니다.
  • 뉴런들이 전연결층(Fully-Connected layers)로 연결되는 Neural Networks를 알아보았습니다. 여기서 인접한 레이어의 뉴런들은 전부 짝지어져서 연결되며, 한 레이어 내의 뉴런들끼리는 연결되지 않습니다.
  • 레이어 구조는 행렬 곱셈과 활성화 함수(activation function)의 적용을 섞음(interwoven)으로써 매우 효율적인 Neural Network 연산을 가능하게 합니다.
  • Neural Networks는 함수를 일반적으로 근사(universal function approximators)할 수 있습니다. 그러나 이 특성은 어디에나(ubiquitous) 적용 가능하지는 않습니다. 실전에서 등장하는 함수의 함수적 형태에 대한 확실히 “맞는” 가정을 내리기 때문에 사용됩니다.
  • 큰 네트워크 모든 경우에서 작은 네트워크 보다 더 좋은 성능을 보입니다. 그러나 더 큰 네트워크는 더 큰 모델 용량(capacity)을 가지며, 이는 더 강력한 regularization(더 높은 weight decay)을 통해 해결해야 합니다. 그렇지 않으면 이는 오버피팅이 될 것입니다. 이후에 여러가지 regularization 방법(특히 dropout)에 대해 알아보겠습니다.

6.5.1 참고(Additional References)