[DeepLearningBook] Chapter 6 : Deep Feedforward Networks

이 책 내용을 정리한 포스트입니다.

https://www.deeplearningbook.org/,

Ian Goodfellow and Yoshua Bengio and Aaron Courville, An MIT Press book

책 전체 목차

contents



Deep feedforward network, feedforward neural network, multilayer perceptrons(MLP)는 딥러닝의 본질적인 모델이다. supervised learning $\boldsymbol{y}=f(\boldsymbol{x};\boldsymbol{\theta})$ 을 예로 들면, 함수 $f$, 즉 parameter $\boldsymbol{\theta}$를 feedforward network로 정의한 것이다. $\boldsymbol{x}$로부터 함수를 거쳐 $\boldsymbol{y}$ 까지 일련의 정보의 흐름이 있기 때문에 feedforward라고 한다. 이러한 흐름은 여러 레이어를 겹쳐서 만들 수도 있는데, $f(\boldsymbol{x}) = f^{(3)}(f^{(2)}(f^{(1)}(\boldsymbol{x})))$ 이런 형태를 의미한다. 함수(레이어)의 갯수를 depth라고 하며, deep learning의 용어가 여기서 나온 것이다. 최종 아웃풋은 label과 일치하게끔 학습이 진행되거나 다른 task에 쓰이는데, 중간 레이어들의 아웃풋들은 직접적으로 쓰이지 않기 때문에 이 레이어들을 hidden layer이라고도 한다. 각 레이어를 이루는 벡터의 차원은 width라고 한다. 레이어를 나타내는 벡터의 요소 하나하나가 신경계의 뉴런과도 같다.

feedforward 네트워크를 이해하는 것은 linear model과 이의 한계를 어떻게 극복했는지에 대해 알아보는 것으로부터 시작할 수 있다. Linear regression이나 logistic regression 같은 linear model은 효율적으로 closed form이나 convex optimization을 최적화 할 수 있다. 그러나 linear function을 사용하기에 model capacity에서 한계가 있어, 입력변수 둘 이상의 상호작용을 이해하지 못한다.

따라서 linear function 대신 nonlinear function을 사용하여 nonlinear transformation $\phi(\boldsymbol{x})$ 를 사용한다. 마치 5장의 5.7.2절에서 설명했던 kernel trick과도 같다. 즉, $\phi$ 를 이용해서 feature $\boldsymbol{x}$ 를 새로운 representation으로 사용하는 것이다. 그럼 어떻게 $\phi$ 를 결정할 수 있을까?

  1. 첫번째 방법은 매우 일반적인 $\phi$ 를 사용하는 것이다. 예를 들면, RBF kernel 에 기반한 kernel machine에서 사용되는 infinite-dimensional $\phi$ 이다. 만약 $\phi(\boldsymbol{x})$가 충분히 높은 차원을 갖는다면 충분한 capacity를 사용할 수 있어 학습 데이터에 최적화(fitting)할 수 있다. 그러나 여전히 test error, 즉 generalization의 성능은 향상시키기 힘들다.
  2. 또 다른 방법은 직접 $\phi$를 손보는 것이다. 딥러닝의 도래에도 불구하고 여전희 주요한 접근 방법이다. 이는 십수년간 숙련된 도메인 전문가가 필요하며 도메인간 전이가 어렵다.
  3. 딥러닝의 방법은 $\phi$를 학습하는 것이다. 이러한 접근을 수식적으로 표현하면, $y = f(\boldsymbol{x};\boldsymbol{\theta},\boldsymbol{w}) = \phi(\boldsymbol{x};\boldsymbol{\theta})^\top\boldsymbol{w}$ 이다. 여기서 우리는 $\phi$를 결정하기위해 $\boldsymbol{\theta}$를 학습하며, $\phi(\boldsymbol{x})$ 를 원하는 아웃풋에 맵핑하기 위해 $\boldsymbol{w}$를 학습한다. 이것이 deep feedforward network다. 세개의 방법중 학습단계에서 convexity 를 포기한 유일한 방법이지만, 나머지 두개의 장점을 모두 취할 수 있다. broad $\phi(\boldsymbol{x;\theta})$를 사용하여 1번처럼 generic한 접근을 할 수도 있고, 2번처럼 designing $\phi(\boldsymbol{x;\theta})$를 사용할 수도 있다.

Example: Learning XOR

feedforward network를 설명하기 위해, 단순한 형태의 함수인 XOR 함수를 학습하는 것부터 설명한다. XOR (exclusive or) 함수는 두개의 이진 값 $x_1,x_2$ 을 받는다. $x_1,x_2$ 중에 하나의 값만 1이면 XOR함수는 1을 내뱉고, 나머지 경우엔 0을 내뱉는다. 아래 그림의 왼쪽에 $x_1,x_2$ 값에 따른 XOR 함수의 출력이 나타나 있다. XOR 함수 $y = f^\ast (\boldsymbol{x})$를 feedforward network로 학습해보자. 우리 모델은 $y=f(\boldsymbol{x;\theta})$ 로 나타낸다. 우리 학습 목적은 $f$가 $f^\ast$와 비슷하도록 만드는 $\boldsymbol{\theta}$를 찾는 것이다. 여기서 우리는 테스트 데이터를 따로 두지 않고, 그저 학습 데이터에 fitting하는 부분만 다룬다. 학습 데이터는 네 포인트 이다. 이 네가지 점을 학습시켜 XOR함수와 같은 출력을 내뱉는 feedforward network를 학습할 것이다.

우선, mean squared error(MSE)을 loss function으로 사용하는 regression 문제로 정의한다. (6.2.2.2절에서 다루겠지만, MSE는 바이너리 데이터를 다루기에 적합한 cost function은 아니다.)

우리의 모델은 간단한 linear model로 정의한다. $\boldsymbol{\theta}$는 $\boldsymbol{w}$ 와 $b$ 로 이루어져있다.

$J(\theta)$ 를 $\boldsymbol{w}$ 와 $b$ 에 대해 normal equation을 이용하여 closed form 으로 각각 최적화 할 수 있다. normal equation을 풀고 나면 $\boldsymbol{w}=\boldsymbol{0}$ 과 $b= \frac{1}{2}$ 가 나온다. linear model의 출력값은 항상 $0.5$이다. 왜 이러한 현상이 발생했을까? 아래 그림의 왼쪽 을 보면 알수 있듯 원 데이터는 linear하게 구분되지 않기 때문에 (결과는 쓸모없지만) 그나마 cost 를 최소로 하는 값으로 최적화된 것이다. 이에 대한 해결책은 아래 그림의 오른쪽 그림처럼 representation space를 조정하여 linear model로도 구분할 수 있게 만드는 것이다. 두개의 노드를 가진 두 레이어의 feedforward network로 우리의 모델을 재구성해보자. 우선 입력값을 한번 거친 히든레이어는 $f^{(1)}(\boldsymbol{x})=\boldsymbol{h} = g(\boldsymbol{W}^\top\boldsymbol{x}+\boldsymbol{c})$ 이고, 두번째 레이어(최종 아웃풋)는 $f(\boldsymbol{h}) = \boldsymbol{h}^\top\boldsymbol{w}+b$ 이다. 이때 nonlinear function 을 쓰지 않는다면 레이어 두개를 쓰는 의미가 없어진다. 왜냐하면 linear function만 썼을 때는 최종 아웃풋이 $f(\boldsymbol{x})=\boldsymbol{x}^\top\boldsymbol{Ww}$로, 하나의 linear 레이어만 있는 모델과 같기 때문이다. 결국, 위에서와 같이 항상 0.5만 내뱉는 모델이 된다. 따라서 우리는 nonlinear function을 써야하는데, 흔히 사용되는 rectified lienear unit (ReLU)를 써보자. ReLU는 그림 6.3에 설명되어있는 함수다.

DLB-06-01 DLB-06-02

위 내용들을 정리해서 우리의 최종 모델을 정의하면 아래와 같다.

원래는 학습을 통해 결정되지만, 우선 아래와 같이 값을 지정해주어 된다는 것을 보자.

입력값으로 네가지 포인트 $\boldsymbol{x}$ 를 한꺼번에 (batch로) 넣어주고 모델의 feedforward 진행을 보면 아래와 같다. (히든 레이어까지만 보도록 하자.)

이제 위 그림 6.1에서 오른쪽과 같이 representation이 되는 것을 알 수 있다. 여기서는 $\boldsymbol{w},b$를 이용한 linear model로 분류할 수 있다.

Gradient-Based Learning

뉴럴 넷을 설계하고 학습시키는 것은 gradient descent 를 사용한 다른 머신러닝 모델과 크게 다르지 않다. 다른 점이 있다면 뉴럴넷에서 사용하는 nonlinear function들이 loss function을 nonconvex하게 만든다는 것이다. 이때문에 뉴럴넷을 학습할 때는 반복적으로 gradient를 이용하여 파라미터를 조금씩 개선하며 학습해나가야한다. Convex optimization에서는 어떠한 값으로 파라미터를 초기화 하던 최적값으로 수렴시킬 수 있지만, 뉴럴넷과 같은 nonconvex optimization에서는 모든 파라미터를 작은 랜덤값으로 초기화해야한다. bias는 0이거나 매우 작은 양수여야 한다. 이에 대해서는 (iterative gradient-based optimization algorithm에 대해서는) 8장에서 자세히 다룰 것이다.

Cost Functions

Cost function을 정하는 것은 딥러닝에서 매우 중요하다. 다행히도 linear model을 학습시킬때와 유사하다. 대부분의 경우에 우리 모델은 distribution $p(\boldsymbol{y}\mid \boldsymbol{x;\theta})$ 를 정의하고 MLE(Maximum Likelihood Estimation)를 사용한다. 즉, training data와 모델의 출력간의 cross-entropy를 cost function으로 사용한다는 것이다. total cost function은 이것에 regularization을 위한 항을 추가해서 사용한다. 간단한 regularization은 이전에 살펴본 weight decay이고, 더 발전된 방법은 7장에서 다룬다.

Learning Conditional Distributions with Maximum Likelihood

최근 뉴럴넷들은 MLE를 이용해 학습한다. cost function은 간단히 negative log-likelihood로 정의되고, trainig data와 model distribution의 cross-entropy와 같다. MLE로부터 cost function을 끌어내어 쓰는 것은 상당히 편리하다.

구체적인 형태는 $\log p_{model}$ 을 어떻게 정하느냐에 따라 (모델 $p(\boldsymbol{y}\mid\boldsymbol{x})$ 마다) 다르다. 모델이 saturate될 수 있는 function을 사용한다면 gradient가 flat해지기 때문에 gradient vanishing 문제가 발생할 수 있다. 많은 경우 $\exp$ 함수를 사용할 때 매우 낮은 값에서 saturate될 수 있다. 이를 $\log$ 함수를 취함으로써, negative log-likelihood는 saturation 문제를 해결할 수 있다.

MLE를 하기 위해 사용되는 cross-entropy cost는 최솟값을 찾기 힘들다는 특성이 있다. discrete한 출력 변수들에 대해 대부분의 모델은 확률을 0 또는 1로 표현하기 어렵고 가깝게 근사한다. Logistic regression이 이러한 예다. 실수 값의 출력 변수들에 대해서는, 모델이 출력 distribution의 density를 조절할 수 있으면 (Gaussian distribution을 출력할 때 variance파라미터를 학습한다면) training data에 맞는 출력값에 극도로 밀집시킬 수 있다. 이 경우에 cross-entropy는 음의 무한대로 치솟게 된다. Regularization은 위와 같은 경우를 방지할 수 있다. 7장에서 여러가지 방법을 논의한다.

Learning Conditional Statistics

full probability distribution $p(\boldsymbol{y}\mid\boldsymbol{x;\theta})$ 를 학습하는 대신, $\boldsymbol{y}$ given $\boldsymbol{x}$의 조건부 통계를 구하고 싶을 때도 있다. 예를 들어, 모델 $f(\boldsymbol{x;\theta})$가 있을 때, $\boldsymbol{y}$ 의 평균값을 구하는 것이다. 만약 충분히 강력한 뉴럴 넷을 사용한다면, 어떠한 함수든 다 나타낼 수 있다. 또한 cost function을 하나의 function이 아닌 functional로 볼 수 있다.

  • functional : 범함수. 함수들의 집합을 정의역으로 갖는 함수다. 즉, 함수공간을 실수로 맵핑한다고도 볼 수 있다. 일반적인 함수는 실수에서 실수로 맵핑한다. 예를 들면, $f(x) = x^2-4x+5$ 라는 함수는 실수 $x=3$ 과 $f(x)=2$ 라는 함숫값을 맵핑한다. 그러나 범함수는 숫자 $x$ 대신 함수를 입력으로 받는다. 예를 들어 $J[y(x)] = \int_0^1 (y^2-4xy+5x^2) dx$ 로 정의하면, $y(x)$에 따라 $J$ 함숫값이 바뀌게 된다. 함수 $y(x)=2x$ 와 함숫값 $J[y(x)] = \int_0^1 (4x^2-8x^2+5x^2) dx = \frac{1}{3}$ 을 맵핑하는 것이다. 이처럼 함수와 실수를 맵핑하는 함수를 functional (범함수) 이라 한다.

모델을 학습하는 것을 함수를 고르는 과정이라고 생각한다면, cost functional이 우리가 원하는 함수(모델)에서 최솟값을 갖도록 만들 수 있다. 위에서 말했던 예시를 계속 들자면, given $\boldsymbol{x}$에서의 $\boldsymbol{y}$의 기댓값을 맵핑하는 함수에서 cost functional 이 최솟값을 갖도록 할 수 있다. 이에 대한 최적화는 calculus of variations라는 수학적인 툴을 필요로 한다. 이는 19장의 19.4.2절에서 다룰 것이다. 이 챕터에서는 그저 이런것이 쓰인다 정도만 알아도 된다.

calculus of variations를 사용하여 위 수식을 최적화 하면 아래와 같은 결과가 나온다.

만약 우리가 true data generating distribution으로부터 무한히 많은 샘플을 뽑아 학습한다면, 모델의 mean squared error를 최소화 하는 것은 각 $\boldsymbol{x}$ 마다의 $\boldsymbol{y}$의 평균을 예측해주는 함수를 얻는 것과 같다는 것이다.

다른 형태의 cost function은 평균 말고 다른 statistics을 제공해준다. 위와 같은 cost function은 mean absolute error라고 부르는데, 이를 최적화하면 $\boldsymbol{x}$ 마다의 $\boldsymbol{y}$의 중간값(median)을 예측해주는 함수를 얻는 것이다.

그러나 mean squared error과 mean absolute error은 종종 gradient 기반의 최적화 알고리즘에서 성능이 똥망일 때가 있는데, gradient가 saturation 되는 경우가 있기 때문이다. 이 이유때문에 cross-entropy cost function이 더 흔히 쓰이는 것이기도 하다.

Output Units

Cost function을 고르는 것은 output unit을 선택하는 것과 매우 밀접한 연관이 있다. 대부분 그냥 cross-entropy 를 사용하는데, output을 어떻게 낼 것이냐에 따라서 corss-entropy function의 형태가 달라진다. 뉴럴넷의 노드는 output으로 쓰일 수도 있고, hidden unit으로 쓰일 수도 있다. hidden unit에 대해서는 6.3절에서 다시 다룰 것이다. 이 섹션에서는 $\boldsymbol{h}=f(\boldsymbol{x;\theta})$ 로 정의되는 hidden feature를 가진 feedforward network를 다룬다. Output layer의 역할은 feature를 원하는 task에 맞게 변형하는 것이다.

Linear Units for Gaussian Output Distributions

간단한 형태의 output은 nonliearity 없이 affine transformation만 사용하는 것이다. 즉 hidden layer 로부터 features $\boldsymbol{h}$를 받아 output layer는 $\hat{\boldsymbol{y}} = \boldsymbol{W}^\top\boldsymbol{h}+b$ 를 출력한다. 이와같은 linear output layer는 주로 conditional Gaussian distribution의 평균을 뽑아낼때 사용한다.

log-likelihood를 최대화 하는 것은 MSE를 최소화 하는 것과 같다. MLE는 Gaussian의 covariance를 학습하는데도 사용된다. 그러나 covariance는 모든 input에 대해 positive definite matrix여야 하기 때문에 이러한 constraint를 만족시키기 위해 다른 종류의 output unit을 쓴다. 6.2.2.4 절에서 다룬다.

Linear unit은 saturation 되지 않기 때문에, gradient를 이용한 최적화 알고리즘은 물론이고 다양한 최적화 알고리즘에서 사용된다.

Sigmoid Units for Bernoulli Output Distributions

어떤 테스크에서는 binary variable $y$를 예측하는 것이 필요할 수도 있다. 두개의 클래스를 구분하는 문제가 이런 task다. 이때 MLE의 접근방식은 $\boldsymbol{x}$에 따른 $\boldsymbol{y}$의 Bernoulli distribution을 정의한다. Bernoulli distribution은 하나의 숫자(확률값) $P(y=1\mid\boldsymbol{x})$ 로 정의된다. 확률이기 때문에 0에서 1사이의 값을 가져야 한다. 위에서 봤던 linear unit에 조금 손을 봐서 유효한 확률값의 범위를 뽑도록 정의할 수도 있다.

그러나 이러한 접근은 linear unit의 값이 음수로 나와 확률이 0으로 잘리거나 1보다 큰 값이 나와 1로 잘렸을 때, 결과값은 유효한 확률값의 범위지만 학습을 위한 gradient는 0이 되어버린다. 즉, 이때는 학습이 되지 않는 것이다.

따라서 좀더 다른 접근을 하자면, linear unit에다가 sigmoid function을 씌우는 것이다.

여기서 $\sigma$는 logistic sigmoid function을 의미한다. 이렇게 하면 gradient가 잘려나가지 않으면서 (여전히 sigmoid 끝단에서의 gradient vanishing 문제가 있긴 하지만…) 0에서 1값으로 맵핑할 수 있다. 두개의 클래스를 classification 한다고 했으니 각 클래스의 확률 값들의 합이 1이 되도록 probability distribution을 만들어주기위해 아래와 같이 normalization해주어 전개한다.

이처럼 exponentiation과 normalization을 통해 확률분포를 나타내는 것은 통계적 모델링에서는 흔하게 사용된다. binary variable에서의 distribution을 정의하는 변수 $z$를 logit이라고 부른다. 이러한 log space에서의 확률분포는 maximum likelihood learning에 사용되기에도 좋다. maximum likelihood의 cost function으로 $-\log P(y\mid\boldsymbol{x})$를 사용할 때, log를 취하는 것이 exp와 sigmoid의 영향을 상쇄시켜주기 때문이다. 그렇지 않으면 sigmoid는 saturation되어 gradient 를 이용한 최적화에 적합하지 않다.

softplus function으로 다시 정리하고 나면 $(1-2y)z$ 가 매우 작은 음수일 때만 saturation되는 것을 확인할 수 있다. Saturation은 정답일때만 발생한다. $y=1$ 이면서 $z$가 매우 큰 양수일때, $y=0$이면서 $z$가 매우 작은 음수일때 saturate 된다.

그러나 mean squared error같은 것을 사용하면, $\sigma(z)$ 가 saturation 될때면 언제든 saturation될 수 있다. sigmoid 함수는 $z$가 매우 작을때는 0으로, 매우 클때는 1로 saturation되기 때문이다.

Softmax Units for Multinoulli Output Distributions

$n$개의 클래스에 대해 확률분포를 나타내고 싶을 때는 softmax 함수를 사용한다. 우선 unnormalized log probability를 위해 linear 연산을 하면 아래와 같다.

이제 지수함수를 씌워서 normalize한다.

아까와 같은 이유로 log를 씌우면,

우변의 첫번째 항은 cost function의 값과 직결되며, saturation 되지 않는다. log-likelihood를 최대화 할때 첫번째 항 $z_i$ 값은 커지고, 나머지 항은 작아진다. 두번째 항 $\log\sum_j\exp(z_j)$ 은 $\max_j z_j$로 근사되고, 이로인해 가장 크게 틀리는 부분에 가장 큰 패널티를 준다고 볼 수 있다. 만약 정답으로 가장 큰 값이 softmax의 입력으로 들어오게 되면 두 항이 상쇄된다. 따라서 맞는 값에는 cost를 주지 않고, 틀린 값에 cost를 주어 학습할 수 있게 해준다.

log-likelihood와는 달리, 다른 objective function들은 softmax와 잘 맞지 않는다. 특히 log를 사용하지 않는 objective function은 softmax의 exp를 상쇄시키지 못해서 gradient vanishing문제가 발생한다.

softmax는 아래와 같은 수식이 성립한다. 이를 이용해 overflow를 방지한다.

$\text{softmax}(\boldsymbol{z})_i$ 는 $z_i=\underset{i}{\max}z_i$ 이고 다른 값보다 월등히 차이날 때 1로 saturation 된다. 또는 $z_i \neq\underset{i}{\max}z_i$ 이고 max값이 $z_i$와 월등히 차이날 때 0으로 saturation된다. 이때문에 sigmoid 와 마찬가지로, loss function을 정할때 saturation을 상쇄시킬만한 function으로 정해야 한다.

softmax의 인자인 $\boldsymbol{z}$를 구하는 방법에는 두가지 (overparametrized version, restricted version)가 있다. 일반적인 접근 overparametrized version은 이전 레이어의 아웃풋에 선형변환 $\boldsymbol{z} = \boldsymbol{W}^\top\boldsymbol{h}+b$ 을 하는 것이다. 그러나 이 방법은 모든 확률의 합은 1.0 이다. 라는 제약조건에 의해, $n$개의 아웃풋을 모두 구할 필요 없이, 1.0 에서 $n-1$개의 아웃풋을 빼면 되니까 $n-1$개의 아웃풋만 구하면 된다. 불필요하게 하나의 값을 더 구하기 때문에 overparametrized version인 것이다. restricted version은 $z_0=0$으로 고정해두고 애초에 $n-1$개의 아웃풋만 구하는 것이다. 둘 사이에는 결과적으로 큰 차이는 없지만 overparametrized version이 구현하기 더 쉽기 때문에 overparametrized version을 주로 사용한다.

softmax는 하나의 결과값이 커지면 다른 값은 낮아지는 구조다. 왜냐하면 모든 확률의 합은 1.0 이기 때문이다. 이는 신경과학에서 다른 신경을 경쟁적으로 억제하는 lateral inhibition과도 유사하다. 하나의 값이 극도로 커진다면 1에 근접하고 나머지 값들은 0에 근접한 winner-take-all의 형태로 갈 수도 있다.

DLB-06-03 Lateral inhibition

Other Output Types

위에서 output type으로 liner, sigmoid, softmax를 살펴보았다. 뉴럴넷은 어떠한 형태의 output layer도 최적화할 수 있다. maximum likelihood의 원리는 우리가 output type에 따라 어떤 cost function을 써야 하는지 알려준다. 일반적으로 cosditional distribution $p(\boldsymbol{y}\mid\boldsymbol{x;\theta})$ 을 정의한다면 maximum likelihood의 원리에 따라 cost function을 $-\log p(\boldsymbol{y}\mid\boldsymbol{x;\theta})$ 로 정하는 것이 좋다.

뉴럴넷을 하나의 함수 $f(\boldsymbol{x;\theta})$라고 봤을 때 $\boldsymbol{y}$를 직접 예측하는 것이 아니라, $f(\boldsymbol{x;\theta}) = \boldsymbol{\omega}$ 로 $\boldsymbol{y}$의 분포에 대한 어떤 파라미터를 예측한다면, loss function은 $-\log p(\boldsymbol{y}\mid\boldsymbol{x;}\boldsymbol{\omega}(\boldsymbol{x}))$ 이다. $\boldsymbol{y}$의 conditional Gaussian distribution의 variance를 학습하는 경우를 예를 들어보자. 간단한 경우에, variance $\sigma^2$가 상수일때는 maximum likelihood estimator의 기댓값과 실제 $\boldsymbol{y}$의 차이$^2$ 의 평균을 통해서 구하는 closed form이 존재한다. 좀더 복잡한 경우에는, $\boldsymbol{\omega} = f(\boldsymbol{x;\theta})$ 를 $\boldsymbol{y}$의 분포에 대한 속성으로 넣어서 학습시키는 것이다. Negative log-likelihood $-\log p(\boldsymbol{y}\mid\boldsymbol{x;}\boldsymbol{\omega}(\boldsymbol{x}))$ 을 사용한다. variance가 input과 무관한 단순한 경우에는 뉴럴넷에서 바로 variance $\boldsymbol{\omega}=\sigma$ (또는 $\sigma^2$나 $\beta=\frac{1}{\sigma^2}$)를 뽑아낼 수 있다. 그렇지 않고 input $\boldsymbol{x}$에 따라 달라지는 $\boldsymbol{y}$의 variance를 구할수도 있는데, 이런 모델을 heteroscedastic model 이라 한다. 이럴땐 variance를 $f(\boldsymbol{x;\theta})$의 출력값중 하나로 두고 학습한다. 이걸 하기 위해 사용하는 전형적인 방법은 Gaussian distribution의 variance 보다는 precision(variance의 역수)을 사용하는 것으로, 3장의 3.22 수식에 나와있다. 다변수의 경우엔 diagonal precision matrix $diag(\boldsymbol{\beta})$ 를 사용하는 것이 일반적이다. 그 이유는 variance를 학습하면 역수를 취하기 위해 나눗셈을 해야하는데, 0 부근에서 gradient가 급격히 치솟기 때문에 불안정하여 gradient를 기반으로 학습을 진행하기 어렵기 때문이다. standard deviation를 학습하게되면 역수에 제곱까지 해야하는데, 제곱은 gradient가 0에 가까운 경우에는 이를 더 작게 만들어 학습에 좋지 않다. 따라서 precision을 학습하는 것이 가장 좋다. precision matrix의 역행렬은 covariance matrix의 역행렬이다. 이는 precision matrix 가 positive definite라는 말과 동치다. 만약 diagonal matrix를 사용하게 되면 모델의 output값들이 양수이기만 하면 조건을 만족한다. 따라서 모델 output $\boldsymbol{a}$에 softplus function을 씌워 $\boldsymbol{\beta} = \zeta(\boldsymbol{a})$ 로 사용하면 방금 말한 조건들을 모두 만족하게 되는 셈이다.

diagonal을 사용하지 않고 full matrix를 학습할 수도 있지만, $\boldsymbol{\Sigma}(\boldsymbol{x}) = \boldsymbol{B}(\boldsymbol{x})^\top\boldsymbol{B}(\boldsymbol{x})$ 와 같은 수식을 사용해야 하는데 $\boldsymbol{\Sigma}(\boldsymbol{x})$의 determinant와 inverse를 구하는데 연산 복잡도가 $O(d^3)$이기 때문에 실제로는 잘 사용되지 않는다. ($\boldsymbol{B}(\boldsymbol{x})$의 eigendecomposition도 마찬가지다.)

만약 conditional distribution $p(\boldsymbol{y}\mid\boldsymbol{x})$가 하나의 $\boldsymbol{x}$에 대해 $\boldsymbol{y}$ 공간에서 여러 분포를 갖는다면? 즉, 여러개의 peak가 찍힌다면? 이런 경우는 뉴럴 넷의 output을 Gaussian mixture로 뽑는다. 그리고 이러한 모델을 mixture density network라고 한다. $n$개의 컴포넌트를 갖는 Gaussian mixture output은 아래와 같이 정의된다.

뉴럴 넷은 세개의 output을 뽑아내야 한다. $p(c=i\mid\boldsymbol{x})$ 벡터, $\boldsymbol{\mu}^{(i)}$ 행렬, $\Sigma^{(i)}(\boldsymbol{x})$ 텐서다. 각각의 output들은 반드시 아래의 조건을 만족해야 한다.

  1. $p(c=i\mid\boldsymbol{x})$ 벡터 : $n$개의 component(distribution) 에 대한 확률값으로, 보통 softmax를 통해서 얻으며, 확률값이기 때문에 모두 합하면 1이어야 한다.
  2. $\boldsymbol{\mu}^{(i)}$ 행렬 : $n$개의 component 중 $i$번째의 평균이다. 주로 output에 nonlinearity를 가하지 않은, unconstrained 값이다. 만약 $\boldsymbol{\text{y}}$가 $d$차원 vector라면, 이에 대한 output은 $n\times d$ matrix다. 이러한 mean matrix를 maximum likelihood 로 학습하는것은 하나일때 보다 다소 까다롭다. 어떤 component(distribution)에서 관측 데이터가 튀어나왔는지 모르기 때문이다. negative log-likelihood는 자연스럽게 각 component에 대한 확률값을 기반으로 weight를 줘서 학습시킨다.
  3. $\Sigma^{(i)}(\boldsymbol{x})$ 텐서 : 각 component에 대한 covariance를 나타낸다. 위에서 말했던대로 determinant의 연산복잡도 때문에 주로 diagonal matrix를 사용한다. mean matrix처럼 각각의 component에 대한 가중치를 주어 학습하기 때문에 maximum likelihood가 좀 복잡해진다.

Gaussian mixture를 학습할때 gradient-based로 최적화를 하게 되면 위에서 언급한 것처럼 (variance의 역수에 의한 불안정함, gradient 치솟음) unreliable하기 때문에 clip gradients를 쓰거나, gradient를 스케일링해준다.

Gaussian mixture output은 음성이나 물리적 물체의 움직임 등을 생성하는데 사용된다. mixture density는 하나의 값을 내뱉는 것보다 더 복잡한 차원의 값들을 모델링 할 수 있기 때문에 실생활의 데이터 분포를 잘 나타낼 수 있다.

Hidden Units

hidden layer의 설계는 활발하게 연구되고있는 내용이긴 하지만, 아직까지는 절대적인 이론적 가이드라인이 있지는 않다. Rectified linear unit (ReLU)가 일단 기본적으로 hidden unit으로 많이 쓰인다. 물론 다른 종류의 hidden unit들도 있지만, 어떤 것을 어떤 기준으로 정할지는 애매한 경우가 많다. 따라서 현재는 validation set을 사용하거나 시행착오를 통해 결정하는 경우가 대부분이다. 여기서는 직관적인 부분을 위주로 다룬다.

여기서 다루는 몇몇 hidden unit은 미분 불가능한 점을 포함하는 경우가 있다. 예를 들면, rectified linear function 에서 미분 불가능하다. 그러나 이러한 포인트는 몇 없으며, 뉴럴넷을 학습시키는 소프트웨어에서는 특정 값을 배정하여 수치연산 오류를 방지한다.

Rectified Linear Units and Their Generalizations

Rectified Linear Units은 을 activation function으로 사용한다. 이건 linear unit과 유사하여 최적화 하기 용이하다. 차이점이라 하면 절반은 결과값이 0으로 죽어버린다는 것이다. 미분값은 active unit에서는 상수로 일정하고, 이차미분값은 모두 0이다.

위 수식처럼 보통 activation function은 affine matrix후에 적용된다. 이때 $\boldsymbol{b}$는 0.1처럼 작은 양수로 초기값을 설정한다.

몇몇 ReLU 보다 더 성능이 좋은 버젼이 있다. $h_i = g(\boldsymbol{z,\alpha})_i = \max (0,z_i) + \alpha_i\min (0,z_i)$ 에서 변형한 세가지 버젼이 있는데, $z_i<0$ 에서의 기울기 $\alpha_i$ 에 따라 구분된다. $\alpha_i = -1$이면 절댓값을 내놓는 Absolute value rectification $g(z) = \vert z \vert$ 이고, $\alpha_i$ 가 0.01처럼 작은 값으로 고정하면 leaky ReLU이고, $\alpha_i$ 가 학습 가능한 파라미터면 parametric ReLU, PReLU이다.

Maxout unit은 ReLU를 좀더 변형한 것이다. 수식으로는 아래와 같이 정의된다.

즉, affine 변환을 한 레이어에서 maxpooling을 거친 것과 같다. 아래 그림을 보면 좀더 잘 알 수 있다. (출처 : http://www.simon-hohberg.de/blog/2015-07-19-maxout)

DLB-06-04

$d$ 차원의 input feature에서 $m$차원의 output을 낼 때, $k$개의 affine transform 결과중 가장 큰 값을 하나 뽑아내는 것이다. 간단한 예시를 위해 2차원 input feature에서 1차원 output을 낼때, 3개의 affine transform 중 가장 큰 값을 하나 뽑아내는 maxout unit을 보면 아래 그림과 같다.

DLB-06-05

이를 이용해서 $f(x) = x^2$를 근사한다면 아래 그림과 같다.

DLB-06-06

구간에 따라 파란색, 초록색, 빨간색 값중 큰 값을 선택한다. $k$의 수가 더 커질수록 세분화되어 원래 함수에 근사할 수 있다. 빨간색 값을 선택한 경우에도 초록색, 파란색의 feature 정보는 잃지 않는다는 장점이 있다. Maxout은 성능이 좋지만, 다만 트레이닝 셋이 크지 않거나 unit당 pieces 수가 많은 경우에는 ReLU 보다 regularization이 필요하다.

Logistic Sigmoid and Hyperbolic Tangent

ReLU 이전에는 대부분 sigmoid activation function $g(z) = \sigma(z)$ 이나 hyperbolic tangent activation function $g(z) = \tanh(z)$를 사용했다. 두 함수는 서로 유사한데, $\tanh(z) = 2\sigma(2z)-1$ 이다. 이 함수들은 saturation 때문에 hidden unit 으로는 잘 사용되지 않는다. 다만 saturation을 상쇄해줄 cost function 을 사용할 때 output의 함수로 종종 사용되는 것을 제외하면 말이다.

sigmoid를 사용해야 할때라면, hyperbolic tangent를 사용하는것이 보통 더 낫다. $\sigma (0) = \frac{1}{2}$인 반면 $\tanh(0) = 0$ 이어서 0 부근에서는 identity function과 유사하기 때문이다. sigmoid function은 recurrent network나 probabilistic model, autoencoder 등에서는 satureation이라는 단점에도 불구하고 사용되기도 한다.

Other Hidden Units

다른 hidden unit도 있긴 하지만 잘 쓰이진 않는다. 예를 들면, cosine function을 이용했을 때 MNIST 벤치마크 데이터셋에서 테스트 성능이 1퍼센트 향상되었다. Softmax는 output으로 흔히 쓰이지만 hidden unit으로는 잘 안쓰이는데, discrete value의 확률분포를 통해 memory의 스위치로 사용할때 종종 쓰이기도 한다. 이는 10장 10.12절에서 다룬다. 다른 hidden unit의 종류는 아래와 같다.

  • Radial basis function(RBF) : 으로 정의되고, $\boldsymbol{x}$가 template $\boldsymbol{W}_{:,i}$에 가까워질수록 큰 값을 갖는다. 대부분의 $\boldsymbol{x}$에 대해 0으로 saturation되기 때문에 최적화 하기 어렵다.
  • Softplus : $g(a) = \zeta(a) = \log(1+e^a)$로 정의되며 rectifier의 smooth version이다. 모든 구간에서 미분가능하고 덜 saturation되기 때문에 성능이 잘 나올 것 같지만 실험적으로는 잘 안된다.
  • Hard tanh : $g(a) = \max(-1,\min(1,a))$ 으로 정의되며 tanh와 rectifier와 비슷하다.

hidden unit을 설계하는 것은 아직도 활발히 연구중이며, 앞으로도 더 많은 종류의 hidden unit이 발견될 것이다.

Architecture Design

Architecture란 뉴럴 넷의 구조를 의미한다. 뉴럴 넷은 레이어 단위로 이루어져 있는데, 이를 어떤 너비로 얼만큼의 깊이만큼 쌓을지 결정하면 된다. 각 레이어들은 이전 레이어의 출력이 다음 레이어의 입력으로 들어가는 chain-based architecture를 이룬다.

Universal Approximation Properties and Depth

feature과 output을 행렬곱으로 맵핑하는 linear model은 convex optimization 을 사용하여 해결할 수 있지만, 우리가 학습하려는 대상은 nonlinear한 함수다. Hidden layer가 있는 feedforward network는 어떠한 함수든 근사할 수 있다는 universal approximation theorem에서 설명하듯, nonlinear 한 함수도 잘 학습할 수 있다. MLP가 함수를 표현할 수 있다고 해도 학습이 실패할 수 있는데, 두가지 이유가 있다. 첫번째로는 최적화 알고리즘이 학습해야할 함수에 적합하지 않은 경우다. 두번째로는 학습 알고리즘이 overfitting 되어 엉뚱한 함수를 학습하는 것이다. 공짜 점심은 없다 이론에서 언급했듯이, 모든 것을 다 만족시키는 만능 AI란 없다. 만능 근사원리란 주어진 함수를 MLP를 이용해 표현 가능하다는 것이지, 학습한 함수가 test set에 대해서도 만능으로 잘 작동한다는 뜻은 아니다. 따라서 파라미터 수를 줄여가며 원하는 함수를 representation 해야 한다. 아래 그림은 레이어를 깊게 쌓아감에 따라 decision boundary가 어떻게 변하는지 보여준다. activation function은 절댓값을 사용하였기 때문에 레이어 하나를 지날 때마다 반절씩 접는 것으로 표현하였다. affine transformation은 반절 접는 위치를 정해준다. 레이어를 지날수록 근사해야하는 함수가 단순해지고, 그렇기 때문에 generalization error가 줄어든다고 볼 수 있다.

DLB-06-07

Other Architectural Considerations

지금까지는 뉴럴넷을 단순히 레이어들의 연결로만 보고, 레이어의 깊이와 너비(유닛 수)에 대해서 논했지만, 사실 뉴럴넷은 더 다양하다. 목적에 따라 다양한 구조를 갖는데, 9장에서 살펴볼 convolution network도 그중 하나다. 또는 sequence 데이터를 처리하기 위해서 고안된 recurrent network도 있다.

뉴럴 넷은 기본적으로 메인 체인을 설계하는 것이지만, 이 외에도 skip connection이나 attention, convolutional filter등의 설계가 중요하다. skip connection은 $i$ 번째 레이어에서 $i+1$ 이 아닌 $i+2$ 레이어로 바로 넘겨서 gradient flow를 용이하게 만드는 기법이고, attention은 representation 의 일부만 선택적으로 넘겨서 효율을 향상시키는 방법이다. convolutional network도 도메인 내에서 filter를 공유함으로써 적은 파라미터로도 복잡한 패턴을 효율적으로 잡아낼 수 있게 설계된 방법이다.

Back-Propagation and Other Differentiation Algorithms

input $\boldsymbol{x}$로부터 예측값 $\boldsymbol{\hat{y}}$ 를 만들어 내는 것을 forward propagation이라고 한다. 학습을 위해 cost function $J(\boldsymbol{\theta})$ 를 이용하여 cost에 영향을 끼친 만큼(미분값을 이용해) 레이어로 다시 넘겨주는 것을 back-propagation, backprop이라고 한다. back-propagation은 흔히 뉴럴넷을 위한 학습 알고리즘 전체를 의미한다거나 하는 등으로 잘못 이해되는 경우가 있지만, 그저 gradient 를 계산하여 학습한다는 뜻에 불과하다. 이를 이용하여 stochastic gradient descent 같은 학습 알고리즘이 만들어지는 것이다. 여기서는 임의의 함수 $f$에 대해 gradient $\nabla_{\boldsymbol{x}}f(\boldsymbol{x,y})$를 어떻게 계산하는지 다룬다. 이때 $\boldsymbol{x}$는 미분을 하고자 하는 대상이고, $\boldsymbol{y}$는 미분하지 않는 대상이다.

학습 알고리즘에서는 주로 cost function을 파라미터에 대해 미분한다. 즉, $\nabla_\boldsymbol{x}J(\boldsymbol{\theta})$를 구하는 것이 주로 요구된다. 많은 머신러닝 테스크들이 학습을 위해서 뿐만 아니라 학습된 모델을 분석하기 위해서 미분값을 이용한다. Jacobian 처럼 여러개의 output에 대해 미분을 구하는 것도 있지만, 여기서는 하나의 output을 갖는 함수 $f$에 대해서만 다룬다.

Computational Graphs

back-propagation으로 이루어진 학습 알고리즘을 설명하기 위해 computational graph라는 개념을 사용한다. Computational graph의 node는 각각 변수를 의미한다. 변수는 스칼라, 벡터, 행렬, 텐서 등등 어떠한 타입이든 될 수 있다. 그리고 각각 변수들에 적용 가능한 operation이 있다. operation은 하나 이상의 변수에 적용될 수 있고, 하나 이상의 operation이 모여서 함수를 이룬다.

만약 변수 $y$가 변수 $x$에 적용되는 operation에 의해 산출된다면, $x$에서 $y$로 가는 방향의 edge를 그린다. 이때 operation의 이름을 명시해주지만, 생략해도 명확한 경우엔 생략기도 한다. 그림 6.8에 computational graph에 대한 예시가 있다.

DLB-06-08

Chain Rule of Calculus

chain rule of calculus (chain rule of probability 아님) 는 어떠한 함수의 미분을 구할때 이미 알고 있는 다른 함수에 대한 미분을 이용하여 구할때 사용된다. Back-propagation 또한 chain rule을 이용한 알고리즘이다. 실수인 $x$와 실수에서 실수로 맵핑하는 두 함수 $f, g$ 를 예시로 다뤄보자. $y = g(x)$이고 $z = f(g(x)) = f(y)$라고 가정하면, chain rule은 아래와 같다.

이를 벡터 영역으로 확장해서 보자. $\boldsymbol{x} \in \mathbb{R}^{m}, \boldsymbol{y} \in \mathbb{R}^{n}$ 이고, 함수 $g$가 $\mathbb{R}^m$에서 $\mathbb{R}^n$으로 맵핑하는 함수이고, 함수 $f$ 는 $\mathbb{R}^n$에서 $\mathbb{R}$으로 맵핑하는 함수일 때, $\boldsymbol{y} = g(\boldsymbol{x}), z = f(\boldsymbol{y})$라면 아래와 같다. (우측은 벡터 표기다. $\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{x}}$는 $g$의 $n \times m$ Jacobian matrix다. 텐서의 경우는 벡터의 경우와 크게 다를 바가 없다.)