6. Deep Feedforward Networks

심층 피드포워드 망 (피드포워드 신경망, 다층 퍼셉트론)은 심층 학습 모델의 정수이다. 이 모델은 피드포워드라고 불리는데 정보가 x로부터 계산되는 함수로부터 흘러 들어와 f를 정의하는 중간 계산값들을 통해 최종 출력 y로 흘러 나가기 때문이다. 함수 내 피드백 연결은 없다. 피드백이 있는 경우 재귀 신경망으로 불린다. 피드포워드 망은 기계 학습 초보자에 있어 매우 중요하다. 이는 이라고 불리는데 대개 서로 다른 많은 함수 f_{1}, f_{2}, \cdots들을 층층이 쌓아 조합함으로써 표현되기 때문이다. 이 때 f_{1}첫 층, f_{2}둘째 층 등으로 부른다. 전체 연쇄의 길이를 모델의 깊이라 한다. 마지막 층은 출력층이다. 중간 층은 은닉층이다. 각 층의 차원은 모델의 두께라 불린다. 또한 각 층은 병렬로 동작하는 단위들로 구성되어 있다고 볼 수 있다.

피드포워드 망을 이해하는 하나의 방법은 선형 모델로 시작해서 이들이 그 한계점을 어떻게 극복하는지를 보는 것이다. 선형 모델이 x에 대한 비선형 함수를 표현하도록 확장하려면 선형 모델을 x 자체에 적용하는 것이 아니라 x에 비선형 변환을 적용한 출력에 적용하는 것이다. 문제는 이 비선형 변환 Φ을 어떻게 선택할 것이냐이다.

  1. 굉장히 일반적인 Φ를 선택한다.
  2. 직접 Φ를 만든다.
  3. Φ를 학습한다.

특성을 학습해 모델을 발전시키는 것은 이 장에서 표현하는 피드포워드 망의 범위를 벗어난다. 피드포워드 망은 은닉 층의 개념을 소개하였는데 이는 활성 함수의 개념을 필요로 한다. 또한 경사를 계산할 때 역전파 알고리즘도 필요로 한다.

6.1. Example: Learning XOR

XOR 연산을 학습해 보자. 이 때 활성 함수로는 정류 선형 단위(ReLU)를 쓰는 것이다. 이를 이용해 학습한 가중치는 \mathbf{w} = (0, 1, 1, 0)로 정답을 학습하는 것을 알 수 있다.

6.2. Gradient-Based Learning

신경망을 설계하고 학습하는 것은 다른 기계학습 모델과 크게 다르지 않다. 신경망이 다른 모델에 비해 갖는 차이점은 이는 비선형 모델이므로 대다수의 손실 함수가 비볼록이 된다는 점이다. 그래서 경사 기반 학습을 해야 한다.

6.2.1. Cost Functions

심층 신경망의 흥미로운 관점은 비용함수의 선택이다. 대개는 최대가능도추정으로 유도되는 비용 함수에 정규화 항을 붙인다.

6.2.1.1 Learning Conditional Distributions with Maximum Likelihood

현대적인 신경망은 최대가능도추정을 통해 학습된다. 즉 손실 함수는 J(\mathbf{\theta}) = -\mathbb{E}_{\mathbf{x}, \mathbf{y} \sim \hat{p}_{data}} \log p_{model} (\mathbf{y} | \mathbf{x})와 같다. 이 방식의 장점은 각 모델에 대해 손실 함수를 따로따로 설계할 필요가 없다는 점이다. 이 때 경사의 값이 지나치게 작지 않도록 할 필요가 있다. 교차 엔트로피 비용 함수의 유념할 점은 많이 쓰이는 모델들에 대해 최소값을 갖지 않는다는 점이다.

6.2.1.2. Learning Conditional Statistics

전체 확률분포 p(\mathbf{y} ; \mathbf{x}, \mathbf{\theta})를 학습하는 대신 \mathbf{y}의 조건 통계량 하나만에 관심이 있을 수 있다. 이 관점에서는 비용 함수를 단순한 함수가 아니라 함수족으로 볼 수 있다. 함수에 대한 최적화 문제를 푸는 것은 변분법을 필요로 한다. 이로부터 유도되는 최적값 함수 중 하나로는 평균 절대 오차를 최소화하는 중위값이 있다.

6.2.2. Output Units

비용 함수의 선택은 출력 유닛의 선택과 밀접한 연관이 있다. 이 때 출력 유닛으로 쓰일 수 있는 신경망 유닛은 은닉 유닛으로도 쓰일 수 있다.

6.2.2.1. Linear Units for Gaussian Output Distributions

가우시안 출력 분포에 대해서는 선형 유닛이 쓰인다.

6.2.2.2. Sigmoid Units for Bernoulli Output Distributions

베르누이 출력 분포에 대해서는 시그모이드 유닛이 쓰인다. 이진 변수에 대해 이러한 분포를 정의하는 변수는 로짓이라 불린다.

6.2.2.3. Softmax Units for Multinoulli Output Distributions

다항 베르누이 출력 분포에 대해서는 소프트맥스 유닛이 쓰인다. 이는 승자독식적인 특성을 가진다고도 볼 수 있다.

6.2.2.4. Other Output Types

다른 분포에 대해서는 다른 유닛이 쓰인다. 예를 들어 혼합 밀도 망에 대해서는 경사 기반 최적화 법은 불안정하기 때문에 경사 깎기 기법을 써야 한다.

6.3. Hidden Units

은닉 층에 있는 유닛을 은닉 유닛이라 한다. 이를 알아보자.

6.3.1. Rectified Linear Units and Their Generalizations

정류 선형 유닛은 g(z) = \max(0, z)꼴의 함수이다. 이는 최적화하기 매우 쉽다. 이에 대해서도 여러 일반화가 가능한데, 절대값 정류, 누수 ReLU, 매개화 ReLU(PReLU), 맥스아웃 유닛 등이 있다. 맥스아웃은 활성 함수 자체를 학습하는 것으로도 볼 수 있다. 이 때 각 유닛이 복수의 필터로부터 유도되기 때문에, 맥스아웃 유닛은 최악의 망각이라고 불리는 현상에 내성이 있다.

6.3.2. Logistic Sigmoid and Hyperbolic Tangent

정류 선형 유닛 이전에는 은닉 유닛으로 로지스틱 시그모이드나 쌍곡선 탄젠트가 쓰였다. 이제는 잘 쓰이지 않는다.

6.3.3. Other Hidden Units

이외에는 방사 기저 함수, 소프트플러스, 하드 쌍곡선 탄젠트 등이 있다.

6.4. Architecture Design

신경망 설계의 핵심 고려 사항은 망의 전체 구조인 아키텍쳐를 설계하는 것이다. 즉, 얼마나 많은 유닛을 가지는지, 그 유닛들이 어떻게 연결되는지.

6.4.1. Universal Approximation Properties and Depth

보편적 근사 정리는 신경망은 신경망의 은닉 유닛 개수가 충분하기만 하면 임의의 가측함수를 원하는 정밀도로 근사할 수 있다는 정리이다. 그러나 단일 층으로는 필요한 유닛 수가 너무 많기 때문에 모델의 깊이를 잘 선택해야 한다.

6.4.2. Other Architectural Considerations

다른 모델 아키텍쳐 고려 사항은 층끼리 어떤 식으로 연결되어 있는지를 설정하는 것이다.

6.5. Back-Propagation and Other Differentiation Algorithms

피드포워드 신경망에서 입력으로부터 층을 하나씩 넘어가 출력에 도달하는 과정을 전방 전파라 한다. 경사를 계산할 때에는 역전파(backprop)를 사용하는데 이는 비용 함수로부터 층을 반대 방향으로 넘어가 경사를 계산한다.

6.5.1. Computational Graphs

역전파 알고리즘을 정확히 기술하려면 계산 그래프를 정의해야 한다. 이는 신경망을 구성하는 연산을 노드로 보고 이로부터 유도되는 그래프이다.

6.5.2. Chain Rule of Calculus

역전파의 핵심은 미적분학의 연쇄법칙인 \nabla_{\mathbf{x}} z = (\frac{\partial \mathbf{y}}{\partial \mathbf{x}})^{T} \nabla_{\mathbf{y}} z의 특성을 이용한다.

6.5.3. Recursively Applying the Chain Rule to Obtain Backprop

연쇄법칙으로부터 역전파 알고리즘은 자연스럽게 유도된다. 입력 u_{1}, \cdots, u_{n_{i}} 로부터 출력 u_{n}은 다음과 같이 얻는다.

for i = 1, ..., n_i do
    u_i = x_i
for i = n_i + 1, ..., n do
    A_i = {u_j | j ∈ Pa(u_i)}
    u_i = f_i(A_i)
return u_n

역전파 알고리즘에서 도함수는 다음과 같이 구한다.

Run forward propagation to obtain the activations of the network
Initialize grad_table, a data structure that will store the derivatives that have been computed
The entry grad_table[u_i] will store the computed value of ∂u_n/∂u_i
grad_table[u_n] = 1
for j = n - 1 downto 1
    The next line computes ∂u_n/∂u_j = ∑_{i : j ∈ Pa(u_i)} ∂u_n/∂u_i ∂u_i/∂u_j using stored values:
    grad_table[u_j] = ∑_{i : j ∈ Pa(u_i)} grad_table[u_i] ∂u_i/∂u_j
return {grad_table[u_i] | i = 1, ..., n_i}

6.5.4. Back-Propagation Computation in Fully Connected MLP

완전 연결 다층 퍼셉트론에서 역전파 계산은 다음과 같다. 먼저 전방 전파는 다음과 같다.

Require: Network depth, l
Require: W_i, i ∈ {1, ..., l}, the weight matrices of the model
Require: b_i, i ∈ {1, ..., l}, the bias parameters of the model
Require: x, the input to process
Require: y, the target output
h_0 = x
for k = 1, ..., l do
    a_k = b_k + W_k h_(k-1)
    h_k = f(a_k)
y' = h_l
J = L(y', y) + λΩ(θ)

역전파는 다음과 같다.

After the forward computation, compute the gradient on the output layer:
g = ∇_y' J = ∇_y' L(y, y')
for k = l, l - 1, ..., 1 do
    Convert the gradient on the layer's output into a gradient into the pre-nonlinearity activation:
    g = ∇_(a_k) J = g * f'(a_k)
    Compute gradients on weights and biases:
    ∇_(b_k) J = g + λ∇_(b_k)Ω(θ)
    Propagate the gradients w.r.t. the next lower-level hidden layer's activations:
    g = ∇_(h_(k-1)) J = (W_k)^T g

6.5.5. Symbol-to-Symbol Derivatives

계산 그래프에서의 대수적 표현식은 값이 정해지지 않는 변수, 즉 심볼에 대해 이루어진다. 이러한 표현은 상징적 표현식이라 한다. 이러한 상징적 입력은 산술적 값이 대입되어 대체된다.

역전파의 하나의 접근법은 계산 그래프와 그래프의 입력에 할당되는 산술적 값들을 받아 그 입력값에 대한 경사를 나타내는 산술적 값을 리턴한다. 이를 상징-숫자 미분이라 한다. 다른 방법은 계산 그래프를 받아 구하고자 하는 미분값에 대한 상징적 표현식을 제공하는 노드를 추가하는 방법이 있다. 후자의 방법이 주로 쓰인다.

6.5.6. General Back-Propagation

일반적인 역전파 알고리즘의 구현을 알아보자. 전체적인 알고리즘은 다음과 같다.

Require: T, the target set of variables whose gradients must be computed
Require: G, the computational graph
Require: z, the variable to be differentiated
Let G' be G pruned to contain only nodes that are ancestors of z and descendants of nodes in T.
Initialize grad_table, a data structure associating tensors to their tensors
grad_table[z] = 1
for V in T do
    build_grad(V, G, G', grad_table)
Return grad_table restricted to T
Require: V, the variable whose gradient should be added to G and grad_table
Require: G, the graph to modify
Require: G', the restriction of G to nodes that participate in the gradient
Require: grad_table, a data structure mapping nodes to their gradients
if V is in grad_table then
    Return grad_table[V]
i = 1
for C in get_consumers(V, G') do
    op = get_operation(C)
    D = build_grad(C, G, G', grad_table)
    G_i = op.bprop(get_inputs(C, G'), V, D)
    i = i + 1
G = ∑_i G_i
grad_table[V] = G
Insert G and the operations creating it into G
Return G

노드 n개인 그래프의 경사를 계산하는 것은 최대 O(n^{2}) 번의 연산을 수행하거나, O(n^{2})번의 연산 결과를 저장한다. 계산 그래프는 방향 비순환 그래프이므로 O(n^{2}) 개의 간선을 가지는데, 대부분의 신경망 비용 함수는 사슬 구조를 가지고 있으므로 실제 계산 복잡도는 O(n)이다. 이는 나이브한 계산에서 같은 노드를 끊임없이 재계산하는 것을 막는 동적 계획법과 비슷한 아이디어라고도 볼 수 있다.

6.5.7. Example: Back-Propagation for MLP Training

다층 퍼셉트론 학습에 대한 역전파를 예제로 알아보자. 이 때 계산 복잡도는 가중치의 수가 w일 때 전방 전파/후방 전파는 모두 O(w) 곱셈-덧셈, 메모리 비용은 미니 배치 수 내의 표본수가 m이고 n_{h}가 은닉 유닛의 수일 때 O(mn_{h})가 된다/

6.5.8. Complications

이외에도 여러 가지 고려 사항이 있다. 연산이 복수의 텐서를 반환해야 한다든가, 메모리 소모를 쪼개야 한다든가, 여러 텐서 자료형을 지원해야 한다든가, 경사가 정의되지 않은 연산을 다뤄야 한다든가.

6.5.9. Differentiation outside the Deep Learning Community

일반적으로 자동 미분은 도함수를 어떻게 알고리즘적으로 구하는지에 대해 고려된다. 사실 역전파는 역방식 누적의 예라고 볼 수 있다. 그래프의 출력 수가 입력 수보다 클 때에는 전방식 누적이 더 나을 수 있다. 이는 행렬곱을 반대 순서로 수행하는 것을 말한다.

6.5.10. Higher-Order Derivatives

고차원 도함수가 필요할 수도 있다. 대개 헤시안을 구할 때에는 직접 헤시안을 구하는 것이 아니라 헤시안을 벡터에 곱하는 함수를 만드는 크릴로프 방법을 쓴다.

6.6. Historical Notes

피드포워드 신경망의 발전에 대해서는 역사적 이정표들이 있다. 연쇄법칙, 병렬 분산 처리, 교차 엔트로피 손실 함수의 차용, 구간적 선형 은닉 유닛의 사용, 정류 선형 유닛의 사용 (희박 활성 함수의 아이디어) 등. 이외에도 계속해서 발전해나갈 것이다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중