7 분 소요

본 글은 2021년 4월에 강의한 스탠포드 대학의 “Convolutional Neural Networks for Visual Recognition” 2021년 강의를 듣고 정리한 내용입니다. 개인 공부 목적으로 작성되었으며, 설명이 맞지 않거나 글 오타가 있으면 알려주시길 바랍니다.

  • 원본 링크 : cs231n.stanford.edu
  • 한글 번역 링크 : aikorea.org - cs231n
  • 강의 링크 : youtube - 2017 Spring (English)

  • 이 글에서 다루는 것
    • 손실 함수(Loss Function)의 개념과 Multiclass SVM 손실(Hinge loss)
    • 가중치 과적합을 억제하는 정규화(Regularization, L1/L2/Elastic Net)
    • 확률 분포 기반의 Softmax 분류기와 SVM과의 비교
    • 최적화(Optimization) 개념과 수치적/해석적 경사(Numerical vs Analytic Gradient)
    • 경사 하강법(Gradient Descent)과 확률적/미니배치 경사 하강법(SGD/MSGD)

Loss Function

  • 이전 내용에서 이미지의 픽셀 값에서 클래스 점수를 산출하는 함수를 정의했으며, 가중치 세트로 파라미터화했다.
  • 가중치를 제어하며 예측된 클래스 점수가 학습 데이터의 정답 레이블과 일치하도록 가중치를 설정해본다.
    • 스코어 차이를 정량화하는 손실 함수(loss function) 정의
  • 그 다음, 손실 함수를 최소화하는 매개변수(parameter)를 효율적으로 찾을 수 있는 방법을 생각한다.
    • 최적화(optimization) 정의
  • 손실 함수(loss function)는 현재 분류기(classifier)가 주어진 가중치 $W$에서 예측한 점수와 실제 정답 레이블 간의 불일치 정도를 정량화하는 지표다1.
    • 주어진 데이터셋의 샘플 : ${(x_i,y_i)}_{i=1}^N$
    • $x_i$ : 입력 이미지 픽셀 벡터
    • $y_i$ : 정답 레이블(정수 카테고리 인덱스)
  • 전체 데이터셋에 대한 손실은 각 $N$개 샘플의 손실 합을 평균한 값이다.
    • $L=\frac{1}{N}\sum_{i=1}^N L_i(f(x_i, W),y_i)$
    • $f(x_i, W)$ : 입력 이미지 $x_i$와 가중치 행렬 $W$를 받아 클래스 점수를 예측하는 스코어 함수
  • 지도 학습 알고리즘은 훈련 데이터셋 ${(x_i, y_i)}$에 대해 손실 $L$을 최소화하는 최적의 가중치 $W$를 탐색하는 과정이다.

Multiclass Support Vector Machine loss

  • SVM 손실은 서포트 벡터 머신이 각 이미지에 대해 정답 클래스의 점수가 오답 클래스의 점수보다 최소 안전 마진 $\Delta$ 이상 더 높은 값을 갖도록 유도한다.
    • 서포트 벡터 머신(SVM) : 결정 경계(Decision Boundary), 즉 분류를 위한 기준 초평면을 정의하는 모델2
    • 서포트 벡터(support vector) : 결정 경계에 가장 가까운 각 클래스의 데이터 포인트
    • 마진(Margin) : 결정 경계와 서포트 벡터 사이의 수직 거리를 의미

      p.s. Similarity is not a distance!

  • 모델의 예측 출력을 클래스 점수 벡터 $s$로 표현한다.
    • $s = f(x_i, W)$
    • $j$번째 클래스의 점수는 벡터의 $j$번째 원소다: $s_j = f(x_i, W)_j$
  • Multiclass SVM 손실(Hinge loss)은 다음과 같이 정의된다.
    • $L_i = \sum_{j \ne y_i} \max(0, s_j - s_{y_i} + 1)$
    • $s_j$ : 오답 클래스의 스코어
    • $s_{y_i}$ : 정답 클래스의 스코어
    • $1$ : 안전 마진(safety margin, $\Delta=1$)
    • 정답 클래스 점수 $s_{y_i}$가 오답 클래스 점수 $s_j + 1$보다 크면 해당 클래스에 대한 손실은 0이 된다.
    • 힌지 로스(Hinge loss)

  • 실제 계산 과정을 알아본다.

  • 고양이의 loss는 SVM loss 공식에 따라 계산이 된다.
  • max(0, 5.1-3.2+1) + max(0, -1.7-3.2+1)
  • = max(0, 2.9) + max(0, -3.9)
  • = 2.9

  • 차의 loss도 위처럼 똑같이 계산한다.
  • max(0, 1.3-4.9+1) + max(0, 2.0-4.9+1)
  • = max(0, -2.6) + max(0, -1.9)
  • = 0

  • 다음은 개구리 클래스이다.
  • max(0, 2.2-(-3.1)+1) + max(0, 2.5-(-3.1)+1)
  • = max(0, 6.3) + max(0, 6.6)
  • = 12.9

  • 각 loss 값을 구했으니 이를 평균낸다.
  • L = (2.9 + 0 + 12.9)/3 = 5.27

Question & Answer

  • 다음은 강의노트에 나온 질문의 답이다.
  1. What happens to loss if car scores change a bit?

    • 자동차의 점수를 4.9에서 3.9로 바꾸어도, loss는 0으로 변함이 없다.
    • 여기서 알 수 있는 점은, SVM 힌지 로스는 데이터에 민감하지 않다.
    • 단지, $s_{y_i}$가 $s_j$보다 높은가에만 관심이 있다.
  2. What is the min/max possible loss?

    • min : 손실의 최소는 0이다.
    • max : 손실의 최대는 무한대 값이다.
  3. At initialization W is small so all $s\approx0$. What is the loss?

    • 스코어가 0에 가까워지면 safety margin만 남게 되어 오답 클래스마다 손실이 1이 된다.
    • loss = nums of class - 1
    • 가중치 초기화 직후 손실 값이 클래스 수 - 1에 근접하는지 확인하는 디버깅 용도로 활용된다(= sanity check).
  4. What if the sum was over all classes? (including $j=y_i$)

    • 만약 정답 클래스 점수를 포함해서 계산하면 어떻게 될까?
    • loss 평균이 1이 증가하게 된다.
    • 우리가 찾고 싶은건 loss가 0이 되는 것이다.
  5. What if we used mean instead of sum?

    • 합 대신 평균을 낸다면 loss의 스케일만 작아질 뿐이다.
    • No difference!!
  6. What if we used $L_i=\sum_{i\ne j}max(0,s_j-s_{y_i}+1)^2$

    • 달라진다.
    • 이 때는 제곱을 하기 때문에 non-linear하게 된다.
    • 따라서 hinge loss 에서 직선이 아닌 곡선으로 올라가게 된다. (다른 그래프가 그려짐)
    • 하지만, 일반적으로 제곱을 사용하지 않는다.
  7. Supposed that we found a W such that L=0. Is this W unique?

    • 아니다. 가중치에 2배를 해도 loss는 0을 갖게 된다.
    • 즉, W는 여러 개가 될 수 있다.

Regularization

  • 학습된 가중치 w는 학습 데이터셋에 맞추어 진행되었다.
  • 학습 데이터셋에만 너무 많이 학습하게 되면 과적합(Overfitting)이 일어날 수 있다.
  • 즉, 테스트셋에도 알맞은 W를 찾아야 한다.
    • 규제(regularization)을 도입하는 이유이다.
  • Data loss : 모델 예측은 학습 데이터와 비교한다.
  • Regularization : 학습 데이터셋에만 과도하게 맞춰지는 것을 방지하기 위해 가중치 $W$의 복잡도에 페널티를 부여한다.
    • 오컴의 면도날(Occam’s Razor) : 동일한 설명력을 가진 가설 중 단순한 모델이 일반화에 더 적합하다.
    • $\lambda$ : 규제 강도 (hyper parameter)
  • 왜 규제를 해야 할까?
    1. 가중치에 대한 선호도 표현
    2. 모델을 단순하게 만들어 테스트 데이터에서 작동
    3. 곡면성(curvature)을 추가하여 최적화 향상
  • L1 규제 : $R(W)=\sum_k\sum_l\vert W_{k,l}\vert$
  • L2 규제 : $R(W)=\sum_k\sum_l W_{k,l}^2$
  • Elastic net (L1+L2)
    • $\sum_k\sum_l\beta W_{k,l}^2+\vert W_{k,l}\vert$
  • 그외 방법들이 있다.
    • 드롭아웃(Dropout)
    • 배치 정규화(Batch normalization)
    • Stochastic depth
    • Fractional pooling

Softmax classifier

  • 소프트맥스(Softmax)는 다항 로지스틱 회귀(multinomial logistic regression)의 손실 함수로도 불린다.
  • 이전 multiclass SVM loss에서는 점수 차이가 safety margin을 넘어서는지만 판단했다.
  • Softmax 함수는 클래스 점수를 정규화하여 확률 분포 형태로 변환한다.
    • 각 클래스 스코어를 지수화한 뒤 합으로 나누어 확률값 산출
  • 소프트맥스 함수
    • $P(Y=k \mid X=x_i) = \frac{e^{s_k}}{\sum_j e^{s_j}}$
    • 여기서 $s = f(x_i; W)$
  • 정답 클래스에 대한 음의 로그 우도 손실(Cross-entropy loss)
    • $L_i = -\log P(Y=y_i \mid X=x_i)$
  • Softmax 최종 손실 수식
    • $L_i = -\log\left(\frac{e^{s_{y_i}}}{\sum_j e^{s_j}}\right)$
    • 다음은 $y=-\log x$의 그래프 (확률이 1일 때 손실 0, 0에 가까워질수록 손실 무한대 발산)

Softmax vs SVM


손실 함수와 정규화를 통해 현재 모델의 가중치가 얼마나 좋은지 평가하는 지표(Data loss + Regularization loss)를 구축했다면, 이제 이 손실 함수 값을 최소화하는 최적의 가중치 $W$를 실제로 찾아내는 최적화(Optimization) 과정이 필요하다.


Optimization

  • 우리는 어떻게 해야 실제 loss를 줄일 수 있는 w를 찾을 수 있을까?
  • 그림과 같이 골짜기의 밑바닥을 찾아야 한다.
    • 여기서 loss는 위치의 높이에 해당한다.
    • 높이는 w의 값에 따라 변한다.

1. Random Search (Bad idea)

  • 단순한 접근법으로 파라미터 공간을 무작위로 탐색(random search)하는 방식이 있다.
  • 임의로 샘플링한 여러 $W$들에 대해 loss를 계산하여 가장 낮은 손실을 주는 $W$를 선택한다.
  • 하지만 파라미터 차원이 커질수록 탐색 공간이 기하급수적으로 팽창하여 수렴 효율이 낮으므로 실제 모델 최적화에는 사용되지 않는다.

2. Follow the slope

  • 두 발로 땅의 경사를 느끼고, 어느 방향으로 내려가야 할지 판단한다.
  • 그 방향으로 한발자국 내딛고, 다시 두발로 느끼는 방향을 찾는다.
  • 구체적으로, 임의의 $W$에서 시작하고, 또 다른 임의의 방향 $\delta W$으로 살짝 움직여본다.
  • 만약 움직여간 자리($W+\delta W$)에서의 손실값(loss)가 더 낮으면, 거기로 움직이고 다시 탐색을 시작한다.
  • 이런 반복으로, 골짜기를 내려간다.

  • 경사(slope): 1차원 공간에서 어떤 함수에 대한 미분값(derivative)
    • $\frac{df(x)}{dx}=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$
    • 따라서 경사는 방향(direction) 정보를 가지고 있다.
  • x를 입력으로 받으면 출력은 곡선의 높이로 생각할 수 있다.
  • 곡선의 일부를 구하면 기울기를 계산할 수 있다.
  • 적어도 반지름이 0으로 수렴하는 아주 좁은 근방에서는 가장 가파르게 감소하는 최선의 방향을 구할 수 있고, 이 방향을 따라 가중치 벡터를 움직인다.
    • 발 밑 지형을 잘 더듬어보고 가장 가파르다는 느낌을 주는 방향으로 내려간다.
  • x가 벡터일 경우, 이 때 미분을 편미분(partial derivatives)이라 한다.
  • 그레이디언트(gradient) : 각 차원으로의 편미분들을 모아놓은 벡터 (집합)
    • 그레이디언트의 각 요소는 “임의의 방향으로 갈때 함수 f의 경사가 어떤지”의 정보를 알려준다.
  • 그레이디언트의 방향은 함수가 가장 가파르게 증가하는 방향이며, 그 반대 방향($-\nabla$)은 가장 가파르게 감소하는 방향이다.
  • 임의의 단위 방향 벡터에 대한 방향 도함수는 그레이디언트와의 내적으로 계산된다.
  • 아래 그림처럼, gradient의 각 요소는 해당 차원으로 아주 미세하게 이동했을 때 손실 값이 어떻게 변화하는지를 나타낸다.

  • 하지만 수치적 경사(Numerical gradient)는 파라미터 벡터의 각 차원마다 손실 함수를 반복 평가해야 하므로 차원 수 $D$에 비례하는 $O(D)$의 계산 비용이 발생한다. 수백만 개 이상의 파라미터를 갖는 신경망에서는 연산 시간이 비현실적으로 길어진다3.
  • 따라서 실제 모델 학습 시에는 미분 공식을 유도하여 한 번에 계산하는 해석적 경사(Analytic gradient)를 사용한다.
    • Numerical gradient : 근사치(approximate), 연산 속도 느림($O(D)$), 구현 용이(easy to write)
    • Analytic gradient : 정확한 값(exact), 연산 속도 빠름(fast), 수식 유도 및 구현 시 실수 가능(error-prone)
  • 그레이디언트를 나타내는 공식을 유도하고, 이를 구현하여 한 번에 기울기 $dW$를 계산한다.
  • 다만 해석적 미분 코드 구현 시 실수가 발생하기 쉬우므로, 수치적 경사로 계산한 결과와 비교 검증하는 절차를 거친다.
    • 이것을 기울기 검증(gradient check)이라 한다.

Gradient Descent

  • 경사 하강법(gradient descent) : 기울기를 반복적으로 평가한 다음 파라미터 업데이트를 수행하는 절차
    • Loss function 값을 최소화하는 값을 찾는 것으로 기울기의 반대 방향으로 일정 크기만큼 이동하는 것을 반복한다. 4
    • 경사 하강을 사용하여 함수의 local minimum을 찾으려면 현재 지점에서 함수의 그레이디언트의 음수에 비례하는 단계를 밟는다.
  • 다음은 경사하강법의 알고리즘이다.
# Vanilla Gradient Descent

while True:
    weights_grad = evaluate_gradient(loss_fun, data, weights)
    weights += - step_size * weights_grad # perform parameter update

  • $W_{i+1}=W_i-\gamma \nabla F(W_i)$
  • 먼저 w를 임의의 값으로 초기화한다.
  • loss와 gradient를 계산 후, 가중치를 -gradient로 업데이트 해준다.
  • 이 과정을 반복하면 국소 최솟값(local minimum) 방향으로 점진적으로 수렴한다.
  • step size : 음의 기울기 방향으로 1회 갱신 시 이동할 보폭(학습률, learning rate)을 나타낸다.

Stochastic Gradient Descent

image

이미지 출처: 5

  • 배치 경사 하강법(Batch Gradient Descent; BGD) : 손실 함수(loss function)을 계산할 때, 전체 학습 데이터셋을 사용하는 것
    • 즉, 전체 학습 데이터를 하나의 배치로 묶어 학습시킴 6
    • 배치(batch) : GPU가 한번에 처리하는 데이터의 묶음 6
    • 하나의 step을 위해 전체 데이터를 계산해야 하므로 계산량이 많다.
  • 확률적 경사 하강법(Stochastic Gradient Descent; SGD) : 손실 함수(loss function)을 계산할 때, 전체 데이터(batch) 대신 일부 데이터의 모음(mini-batch)를 사용하는 것 4
  • $L(W)=\frac{1}{N}\sum_{i=1}^NL_i(x_i,y_i,W)+\lambda R(W)$ (SGD)
    • 사실, 정확한 명칭은 미니 배치 확률적 경사 하강법(Mini-batch Stochastic Gradient Descent; MSGD)라고 한다.
      • SGD는 전체 학습 데이터 중 하나의 데이터(batch=1)를 이용하는 것.
    • 전체 데이터셋 손실의 기댓값에 대한 추정치이므로 기울기에 노이즈가 존재하지만, 단일 반복당 계산 복잡도가 $O(N)$에서 미니배치 크기 $B$에 비례하는 $O(B)$($B \ll N$)로 감소하여 동일 연산 자원 대비 더 빈번하게 가중치를 업데이트할 수 있다.
    • 즉, 미니배치에서 그레이디언트를 추정하여 더 자주 가중치를 업데이트함으로써 전체 학습 수렴을 가속한다.
    • 확률적(Stochastic) : 전체 학습 데이터 중 무작위(randomly)로 추출된 샘플 부분집합으로 기댓값을 근사한다는 의미다6.
    • mini-batch 크기는 하드웨어 메모리 정렬 및 GPU 병렬 처리를 고려하여 보통 32, 64, 128, 256 등 2의 거듭제곱을 사용한다.
  • $\nabla_W L(W) = \frac{1}{N}\sum_{i=1}^N\nabla_W L_i(x_i,y_i,W) + \lambda\nabla_W R(W)$ (Full Batch GD)
  • 작은 미니배치를 이용해서 loss의 전체 합의 추정치와 실제 그레이디언트의 추정치를 계산한다.
  • 다음은 SGD의 알고리즘이다.
# Vanilla Minibatch Gradient Descent

while True:
    data_batch = sample_training_data(data, 256)
    weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
    weights += - step_size * weights_grad # perform parameter update

Recap

  • 배운 내용을 정리해본다.
  • 데이터셋 및 스코어 함수: 입력 $x$로부터 클래스 점수 벡터 $s=f(x;W)=Wx$를 계산한다.
  • 손실 함수(Loss Function): 모델의 예측 점수가 정답과 얼마나 일치하지 않는지 정량화한다.
    • SVM (Hinge loss): $L_i=\sum_{i\ne j}\max(0, s_j - s_{y_i} + 1)$로 safety margin을 넘어선 오류만 고려한다.
    • Softmax loss: $L_i=-\log\left(\frac{e^{s_{y_i}}}{\sum_j e^{s_j}}\right)$로 점수를 정규화된 확률로 해석하여 정답 클래스의 음의 로그 우도를 최소화한다.
  • 정규화(Regularization): 훈련 데이터에 대한 과적합을 방지하고 일반화 성능을 높이기 위해 모델 복잡도 페널티 $R(W)$(L1, L2, Elastic Net 등)를 손실에 더한다.
    • Full loss: $L = \frac{1}{N}\sum_{i=1}^N L_i + \lambda R(W)$

  • 최적화(Optimization): 고차원 손실 곡면에서 손실을 최소화하는 최적의 가중치 $W$를 찾기 위해 경사(Gradient) 방향을 따라 반복적으로 파라미터를 업데이트한다.
  • 해석적 경사와 수치적 경사: 수치적 미분은 직관적이나 계산량이 크므로, 실제 학습 시에는 빠르고 정확한 해석적 미분(Analytic Gradient)을 사용하고 수치적 미분은 검증용(Gradient Check)으로 활용한다.
  • 확률적 경사 하강법(SGD / Mini-batch GD): 전체 데이터셋 대신 미니배치를 샘플링하여 빠르게 기울기 추정치를 구하고 자주 업데이트함으로써 효율적인 수렴을 달성한다.

한계 및 트레이드오프

  • 손실 함수 특성에 따른 최적화 신호 한계: Multiclass SVM(Hinge loss)은 정답 클래스 점수가 안전 마진($\Delta=1$) 이상으로 높아지면 오답 점수가 변동하거나 정답 점수가 더 높아져도 손실이 0으로 유지되어 추가적인 최적화 신호를 제공하지 않는다. 반면 Softmax(Cross-Entropy) loss는 모든 점수의 상대적 차이를 반영하여 정답 확률을 1에 가깝게 만들기 위해 가중치를 지속적으로 증가시키려는 경향이 있으므로 가중치 감쇠(L2 정규화)와의 균형이 필수적이다.
  • 미니배치 경사 추정의 노이즈와 학습률 민감도: Mini-batch SGD는 계산 복잡도를 $O(N)$에서 $O(B)$로 낮추는 대신 기울기 추정치에 분산(노이즈)이 발생한다. 이로 인해 손실 최솟값 근방에서 파라미터가 진동할 수 있으며, 학습률이 과도하게 크면 손실이 발산하고 너무 작으면 국소 해 근처에서 수렴이 정체되므로 정밀한 학습률 스케줄링이 요구된다.
  • 비볼록(Non-convex) 손실 곡면과 병목 지형 한계: 심층 신경망 구조에서는 손실 함수가 비볼록 형태로 변화하여 다수의 국소 최솟값(Local Minima)과 안장점(Saddle Point), 그리고 곡률이 불균일한 병목 계곡(Ill-conditioned Curvature)이 존재한다. 모멘텀이나 적응적 학습률 기법이 없는 기본 경사하강법(Vanilla GD/SGD)만으로는 이러한 지형에서 학습 속도가 급격히 저하되거나 정체되기 쉽다.

References

댓글남기기