Group Study (2024-2025)/Machine Learning 심화

[ML심화] 2주차 스터디 - Loss Function, Optimization, Back Propagation, Neural Network

ㅁㄱㅅ 2024. 10. 8. 22:38

- Stanford University 의 Convolutional Neural Networks for Visual Recognition 강의를 바탕으로 작성하였습니다.

Lecture 3 | Loss Functions and Optimization

손실함수 (Loss Function)

생성한 W가 좋은지 나쁜지를 정량화 할 방법 필요.

W를 입력으로 받아 각 스코어를 확인하고 이 W가 현재 얼마나 나쁜지를 정량적으로 말해주는 것

우리가 원하는 것 = 행렬 W가 될 수 있는 모든 경우의 수 중 가장 “괜찮은” W를 찾는 것.

→ 최적화 과정 (Optimization)

  • x 는 알고리즘의 입력, y는 예측하고자 하는 값 (레이블, 타겟값)
  • f 는 예측함수

→ 손실함수(L_i)는 예측함수(f)와 정답값(y)을 받아 데이터들을 얼마나 안좋게 예측하는지 정량화 함.

→ 최종 L은 각 L_i의 평균이 됨 (일반적인 공식)

결론 : W의 공간을 탐색하면서 트레이닝 데이터의 Loss 를 최소화하는 어떤 W를 찾는 것.

Multi-class SVM Loss

  • 다중 분류에서 L_i를 구하기 위해서는 “올바른(True) 카테고리”를 제외한 “나머지 카테고리(False) Y”의 합을 구해야 함
  • 올바른 카테고리 점수 와 올바르지 않은 카테고리의 점수를 비교
    • 올바른 카테고리 점수 ≥ 올바르지 않은 카테고리 점수 + 일정 마진(safety margin)
    • → Loss = 0 (잘 분류했다는 뜻)
    • 그렇지 않으면,
    • → Loss = 올바른 카테고리 점수 - 올바르지 않은 카테고리 점수 + 1

S = 분류기의 출력으로 나온 예측된 스코어

Y_i = 이미지의 실제 정답 카테고리 (정수값)

→ S_Y_i 는 트레이닝 셋의 i 번째 이미지의 정답 클래스 스코어

  • 일정 마진 값(Safety margin)이 중요한가?
    • 손실함수의 점수가 “정확히” 몇인지는 중요하지 않음 (상대적인 차이가 중요하기 때문)
    • 행렬 W 자체를 전체적으로 스케일링한다면, 스코어 또한 바뀜

Cat, Car, Frog 3개의 클래스가 존재.

Q1. Car 스코어가 조금 변한다면, Loss에는 어떤 변화가 생길까?

→ 조금 변하더라도, Loss 는 변하지 않음

Q2. SVM Loss가 가질 수 있는 최대/최솟값은 몇일까?

→ 최솟값은 0, 최대값은 무한대 (hinge loss 함수를 상기)

Q3. 만약 모든 스코어가 0에 가깝고, 값이 서로 비슷하다면, Multiclass SVM에서 Loss는 어떻게 될까?

→ (클래스 수 - 1)

  • Loss 를 계산할 때 정답이 아닌 클래스를 순회하기 때문에 (클래스 수 - 1)만큼을 순회
  • 훈련 초기 Loss값이 클래스 - 1 이 아니라면 버그가 있는 것으로 판단해야할 것 (디버깅)

Q4. SVM의 Loss는 정답인 클래스를 빼고 모두 더하는데, 이 때 정답 클래스도 같이 더하면 어떻게 될까?

→ Loss + 1

  • 이때 1은 safety margin
  • 정답 클래스를 빼고 계산하는 이유는 일반적으로 Loss가 0이어야 손실이 없다고 해석하기 쉬우므로

Q5. Loss에서 전체 합이 아닌 평균을 쓰면 어떻게 될까?

→ 영향을 미치지 않음

  • 평균을 취한다는 건 그저 손실함수를 rescale하는 것. 스케일만 변함

Q6. 손실함수를 제곱하여 사용한다면 결과는 어떻게 될까?

→ 결과가 좋지 않은 것들에 대해 곱절로 안좋아짐을 확인할 수 있음

즉, 심하게 잘못 분류되는 것을 정말 원하지 않게 됨.

Q. Loss 가 0이 되는 W를 찾았을 때, 이 W는 유일하게 존재하는 것일까?

→ 그렇지 않음. 다른 W도 존재할 수 있음.

이전에 언급했듯이, W의 스케일은 변하기 때문

  • W와 2W가 있을 대 이는 마진의 차이가 두 배인 것.
  • 모든 마진이 이미 1보다 크면, 우리가 두 배를 해도 여전히 1보다 크며, Loss 는 0이됨

하지만 기계학습의 목적은 훈련 데이터에 꼭 맞는 (Loss 값이 0이 되도록 하는) W를 찾아 분류기를 완성하는 것이 아닌 시험 데이터에서 좋은 성능을 내어야 함.

정규화 (Regularization)

  • 파란 선은 훈련 데이터에 과하게 맞춰진 선
  • 초록색은 시험 데이터에서의 성능을 고려한 것 → Regularization

Data Loss Term - 분류기가 훈련 데이터에 적합하도록 만듦

Regularization Term - 모델이 좀 더 단순한 W를 택하도록 함

→ 더 일반적인(단순한) 것이 미래에 일어날 현상을 잘 설명할 가능성이 크기 때문

이를 위해 기계학습에서는 Regularization penalty를 만듦

L2 Regularization (Weight decay)

가중치 행렬 W에 대한 Euclidean Norm (Squared Norm)

L1 Regularization

가중치 행렬 W에 패널티를 부과, 행렬 W가 희소행렬이 되도록 함 (Manhattan Norm)

Elastic net Regularization

L1과 L2를 섞어 놓은 것

구체적인 예)

x = [1 1 1 1]

w1 = [1 0 0 0]

w2 = [0.25 0.25 0.25 0.25]

Linear classification을 할 때 (Wx)

Linear classification 관점에서 w1과 w2는 같음 둘 다(1)

그렇다면 L2 regression은 어떤 w를 더 선호할까?

→ w2, L2 regression은 상대적으로 값이 매끄러운 것을 선호

→ x의 모든 요소가 골고루 영향을 줬으면 함

그렇다면 L1 regression은 어떤 w를 더 선호할까?

→ w1, 0의 개수에 따라 모델의 복잡도를 다룸.

→ L1에 대한 일반적인 직관은 L1은 희소한 solution을 선호

0이 아닌 요소의 개수가 많아 복잡하다고 측정 (w2의 경우 전체적으로 퍼져있으므로, 덜 복잡하다.)

Multiclass SVM의 경우, 점수값 자체에 대해 크게 신경쓰지 않음

(오로지 정답 클래스가 오답 클래스보다 높은 점수를 내기만을 원함)

점수 자체에 추가적인 의미를 부여하는 손실함수 → Softmax

Softmax 함수

점수를 모두 활용하며, 점수에 지수를 취해 양수가 되도록 함

softmax 함수를 거치면 확률 분포를 얻을 수 있고, 이는 해당 클래스일 확률이 됨

즉, 우리가 하고자 하는 것은 정답 클래스에 해당하는 클래스의 확률을 1로 나타내도록 하는 것.

Q. Softmax의 최댓값과 최솟값은 얼마일까?

→ 최솟값 0, 최댓값 무한대

고양이를 완벽하게 분류했다면 소프트맥스 함숫값 1, Loss = log 1 = 0

그렇다면 이를 위한 실제 점수는 어떤 값이어야 할까?

정답 점수는 극단적으로 높고(+무한대), 나머지 점수는 극단적으로 작아야할 것(-무한대)

하지만 컴퓨터는 무한대 계산을 잘 못하므로, 0은 이론적인 최소 Loss

Q. 만약 점수가 모두 0 근처에 있는 작은 수일 때 Loss는 어떻게 될까?

→ -log(1/c) = logC


SVM 와 Softmax 의 차이

SVM Loss는 일정 선(margin)을 넘으면 더 이상 성능 개선에 힘쓰지 않음

Softmax는 최대한 정답 클래스에 확률을 몰아 넣고자 함


최적화(Optimization)

실제 Loss를 줄이는 W를 어떻게 찾을 수 있을까?

→ iterative한 방법 사용

임의 탐색(Random Search)

임의로 샘플링한 W를 많이 모아, Loss를 계산해서 어떤 W가 좋은지 살펴 보는 방법

  • 구린 알고리즘 이지만, 한 번 쯤 상상해볼 법 함.

경사 따라가기

곡선의 일부를 구하면 기울기를 계산할 수 있음

어떤 점(x)에서의 경사, 즉 도함수를 계산하면 이 함수의 경사가 됨

→ 다변수함수에서도 확장할 수 있음

실제로 x는 스칼라가 아닌 벡터, gradient의 모양은 x와 같음.

gradient가 알려주는 것은 “우리가 움직일 때 함수 f의 경사가 어떤지”

그렇다면, 우리가 특정 방향에서 얼마나 가파른지 알고 싶다면?

원하는 방향의 유닛 벡터와 gradient 벡터를 내적

W의 모든 원소를 순회하는 것이 아닌 gradient를 나타내는 식이 무엇인지 먼저 찾고, 수식을 이용해 한 번에 gradient dW를 계산

경사하강법(Gradient Descent)

Gradient Descent에서는

W를 임의의 값으로 초기화

Loss와 gradient를 계산한 뒤 가중치를 gradient의 반대 방향으로 업데이트

(gradient가 함수에서 증가하는 방향이기 때문에 -를 붙이는 것)

→ 영원히 반복하다보면 결국 수렴…

  • Step-size 하이퍼파라미터를 사용하면 -gradient 방향으로 얼마나 나아가야하는 지 정해줄 수 있음
  • Learning rate라고도 불림

SGD 경사하강법 (Stochastic Gradient Descent)

나타나게 된 배경

  • 데이터의 수(N)가 많을 수록 전체 Loss 를 계산하는 데에는 오랜 시간이 걸림
  • gradient는 선형 연산자이므로, Loss는 그저 각 데이터 Loss Gradient의 합임→ 오랜 시간 소요
  • → 작은 트레이닝 샘플의 집합으로 나눠서 학습하자.
  • → gradient 한 번 더 계산하려면 전체 N개의 데이터를 다 돌면서 계산하는 것

Mini-batch (작은 트레이닝 샘플의 집합) 로 나눠서 학습을 진행

  • 주로 2이 제곱 수로 정함 (32, 64, 128…)
  • 미니배치를 이용하여 Loss 전체 합의 추정치와 실제 gradient의 추정치를 계산

Multiclass SVM optimization demo


이미지의 특징

Raw image의 픽셀을 입력으로 받는 방식은 좋지 않음

→ 여러가지 특징 표현을 계산하여, 특징 벡터를 입력으로 넣기

  • 이미지의 Hue 만뽑아 모든 픽셀을 양동이에 넣고, 픽셀의 개수를 세는것
    • 이미지가 전체적으로 어떤 색인지 알 수 있음

  • 픽셀 지역 내에서, 가장 지배적인 edge의 방향을 계산하여 양동이에 넣기
    • edge의 방향과 관련한 히스토그램을 계산하는 것
    • 전반적으로 어떤 edge 정보를 가지는지 확인

  • 사각 단어(visual words)를 이용
    • 이미지를 임의로 조각 낸 후 조각을 k-means 같은 알고리즘으로 군집화
    • 사각 단어들의 발생 빈도를 통해 이미지를 인코딩


Lecture 4 | Introduction to Neural Networks

역전파(Backpropagation)

기울기를 얻기 위해 computational graph 내부의 모든 변수에 대해 연쇄 법칙을 재귀적으로 사용

→ 이는 매우 복잡한 함수를 이용하여 작업할 때 유용하게 사용됨 ex) CNN

역전파는 어떻게 동작할까?

  • 우리는 f의 출력에 대한 어떤 변수의 기울기(gradient)를 가지길 원함

  1. computational graph로 나타냄
  2. x와 y에 대한 계산 결과 (q 노드)
  3. f = q*z
  4. x, y, z 각각의 f의 gradient를 구함 (chian rule 이용)

→ 역전파에서 computational graph의 모든 노드를 포함하고 있음을 알 수 있고, 각 노드는 오직 주변에 대해서만 알고 있음

→ 역전파는 연쇄법칙을 사용해 각 가중치에 대한 손실의 미분값을 계산하는데, 이 때 이미 구해진 값을 재활용하기 때문에 복잡한 연산을 추가로 더 하지 않아도 됨

→ 노드와 연결된 노드 이외의 다른 어떤 값에 대하여 신경쓰지 않아도 됨

  • 복잡한 예제
    • 아래에 있는 함수들을 이용해서 gradient를 뒤에서부터 차례로 구해옴

  • 아래 그림은 시그모이드 함수에 대한 미분을 알고 있기 때문에 그룹으로 묶어 더 빠르게 gradient를 계산하는 모습

  • Max gate
    • 기울기를 전달하는 라우터라고 생각하면 됨
    • 최대값만을 취해 그대로 전달(통과)
    • 아래 예의 경우 2가 z에 전체 전달, 다른 하나에는 0이 전달됨
  • Mul gate
    • Gradient scaler


벡터에 대한 예제

변수 x, y, z가 벡터를 가지고 있을 때,

gradient는 Jacobian 행렬이 됨 → 각 요소의 미분을 포함하는 행렬이 될 것

입력이 4096차원의 벡터일 때, 출력 또한 4096차원의 벡터

이 때, Jacobian 행렬의 사이즈는?

→ 4096 x 4096

100개의 input을 동시에 입력으로 받는 배치를 작업한다면 100배씩 더 늘어나게 됨.

→ 너무 거대해서 실용적이지 않음

→ 우리는 이 Jacobian을 계산할 필요가 없음

→ 입력의 각 요소는 출력의 해당 요소에만 영향을 준다.

→ Jacobian 행렬은 대각 행렬이 될 것.

  • 순방향에서는 노드의 출력을 계산하는 함수를 구현
  • 역방향에서는 기울기를 계산
  • backward() 함수는 연쇄법칙을 이용해 계산됨

  • 순방향에서의 결과값은 반드시 저장해두어야 함
  • → 역방향에서 더 많이 사용하기 때문

신경망(Neural Network)

더 간단한 기능이 서로 쌓여있는 기능 클래스 (계층적 방식으로 쌓임)

비선형 함수를 사용하여 이들 중 여러 개를 서로 사이에 쌓기

  • W1 이전과 동일한 템플릿만 찾아 점수를 전달
  • 중간 h에 템플릿 하나에 대한 모든 점수가 있고 이를 함께 결합하는 또 다른 레이어를 맨 위에 가질 수 있음
  • → 모든 자동차에 가중치를 부여하는 W2 행렬을 가졌기 때문

  • 여러 개의 은닉층을 쌓으며 서로 연결되고, 이는 여러 겹의 신경망을 구성함
  • 하나의 행렬 곱을 이용해 50-100개의 뉴런으로 구성된 레이어의 출력값을 얻음