본문 바로가기
CVLab/cs231n (2016)

cs231n - lecture03(손실함수, 경사하강법)

by print_soo 2024. 9. 23.

Loss function(손실함수)

:  손실 함수는 모델이 예측한 값과 실제 값 사이의 차이를 수치로 나타내는 함수이다. 쉽게 말해서, 모델이 얼마나 틀렸는지 측정하는 도구이다.

 

 

 

 

1. Multicalss SVM loss - Hinge loss

 

SVM loss를 Hinge loss라고 부르는 이유는 SVM의 손실 함수가 힌지(Hinge) 모양의 특성을 가지기 때문이다.

 

 

쉽게 설명하면:

  1. x축: S(j)는 예측값(모델이 예측한 점수)
    • S(yi) 는 정답 클래스의 스코어(점수)고, 이걸 기준으로 예측값 S(j)가 얼마나 맞았는지 판단한다.
  2. y축: 이 축은 손실(Loss)을 나타내. 손실 값은 예측이 잘못되었을 때 증가한다.

그래프의 해석:

  • 파란색 굵은 선이 바로 힌지 로스 곡선이다.
  • 그래프가 1에서 꺾이는 지점을 볼 수 있는데, 이 꺾이는 부분이 힌지(hinge, 경첩) 모양이라서 "힌지 로스"라고 불린다.

두 가지 상황:

  1. S(j) ≥ S(yi) + 1 일 때 (오른쪽 파란 선):
    • 예측이 정확하고, 정답과 충분히 차이가 나면 손실은 0이다.
    • 즉, 분류가 잘 되었다는 뜻으로, 손실을 줄 필요가 없다.
  2. S(j) < S(yi) + 1일 때 (왼쪽 파란 선):
    • 예측이 잘못되거나 정확하지 않을 경우, 손실 값이 선형적으로 증가한다.
    • 예측이 더 틀릴수록 손실이 커진다.

 


 

 

 

Multiclass SVM loss의 형태를 살펴보자. 아래는 데이터 셋이 1 ~ N까지 주어졌다고 가정했을 대의 공식이다.

 

 

 X(i): 이미지 / Y(i): 해당 이미지의 정답이다.

 

 

 

 

그리고 최종적으로 해당 이미지들을 가지고 총 loss(손실) 값을 구하는 방식은 아래와 같다.

 

 

각 클래스에 대한 손실 값(Losses)을 구하고 해당 값들의 총합을 클래스 개수만큼 나누면 해당 모델의 총 손실 값이 나오게 된다.

 


 

💡 그러면 각 클래스에 대한 손실 값은 어떻게 구할까? 

 

 

 

S(j): 오답인 레이블의 Score

S(yi): 정답인 레이블의 Score

+1: Safety margin -  데이터가 결정 경계에 너무 가까이 있지 않고, 충분히 떨어져 있게 해서 더 정확하게 분류되도록 만드는 안전 구역이다.

 

 

위의 식을 해석해보자면 어느 한 이미지의 클래스 스코어들에서 오답인 레이블의 점수 -  정답인 클래스의 점수 + 1한 값이 0보다 크면 해당 값을 사용하고 아니라면 0을 사용한다. (정답인 스코어 끼리는 연산 X)

 

 

따라서 해당 이미지의 모든 클래스 스코어와 연산을 해서 Loss(손실)값을 구한다.

 


 

 

이 값을 기준으로 손실값을 구해보자.

 

 

 

 

 

고양이 이미지인 경우 Cat의 Score는 3.2 / Car의 Score는 5.1 / Frog의 Score는 -1.7이다.

 

해당 값을 SVM에 따라서 연산을 해보면 아래와 같다.

max(0, 5.1 - 3.2 + 1) + max(0, -1.7 - 3.2 + 1)

= max(0, 2.9) + max(0, -3.9) = 2.9 + 0

= 2.9

 

 

 

자동차 이미지인 경우 Cat의 Score는 1.3 / Car의 Score는 4.9 / Frog의 Score는 2.0이다.

 

해당 값을 SVM에 따라서 연산을 해보면 아래와 같다.

max(0, 1.3 - 4.9 + 1) + max(0, 2.0 - 4.9 + 1)

= max(0, -2.6) + max(0, -1.9) = 0 + 0

= 0 (손실값 없음)

 

 

 

자동차 이미지인 경우 Cat의 Score는 2.2 / Car의 Score는 2.5 / Frog의 Score는 -3.1이다.

 

해당 값을 SVM에 따라서 연산을 해보면 아래와 같다.

max(0, 2.2 - (-3.1) + 1) + max(0, 2.5 - (-3.1) + 1)

= max(0, 6.3) + max(0, 6.6) = 5.3 + 5.6

= 10.9 

 

 


 

 

따라서 위에서 구해진 Loss들을 더해서 N값으로 다누면 최종 Loss 값이 구해진다. 

 

(2.9 + 0 + 12.9) / 3 = 5.3

 

즉, 최종 Loss 값은 5.3이 나온다.

 

 

 

 

 

Q) 만약 'j  != y(i)' 조건이 없다면 어떤 결과가 나올까?

실제 Loss 값에서 1씩 커져서, 최종 Loss 값이 N/N 즉, 1만큼 거지게 된다.

 

 

Q) 만약 max(0, S(j) - S(yi) + 1)^2을 하면 어떤 결과가 나올까?

이렇게 되면 더 이상, 단숙한 직선(즉, 선형 함수)처럼 동작하지 않고 더 복잡한 형태로 데이터를 처리하게 된다. 

 

 

Q) SVM 공식 max(0, S(j) - S(yi) + 1)에서 가장 최소 값과 최대 값은 무엇일까?

최소 값은 0이다. 왜냐하면 max는 둘중 가장 큰 값을 가져오기 때문에, 0보다 작은 경우 0이 출력되고 0보다 큰 경우 그 큰수가 출력되기 때문이다.

최대 값은 무한대이다. 왜냐하면 스코어가 무한대가 될 가능성도 있어서 무한대이다.

 

Q) SVM 초기화 단계에서 가중치 W가 작은 값으로 설정되어 모든 스코어 S값이 거의 0에 가까울 때, Loss는 어떻게 될까?

우리는 3개의 클래스를 기준으로 보고 있기 때문에 고양이 이미지의 경우 Cat 클래스를 제외한 모든 max가 max(0, 0 - 0 + 1) -> 1이된다. 즉 Loss가 2가된다. 나머지 클래스도 마찬가지로 loss가 2가되어 최종 Loss 값은 2가 된다.

 

따라서, 일반화 시켜보면 SVM 초기화 단계에서 가중치 W가 작은 값으로 설정되어 모든 스코어 S값이 거의 0에 가까울 때 Loss는 N - 1이다.

 

 

 

 

SVM을 파이썬 코드로 나타낸 것

 

 

 

 

 


 

 

 

 

 

2. Regularization loss

: 모델이 너무 복잡해지는 걸 막기 위해 추가하는 손실이다.

쉽게 말해서, 모델이 데이터를 너무 잘 외우면(과적합), 새로운 데이터에 잘 맞지 않게 될 수 있다. 그래서 가중치(모델이 학습한 값들)에 패널티를 줘서 모델을 덜 복잡하게 만들고, 더 일반적으로 작동하게 도와주는 역할이다.

 

 

 SVM에는 버그가 존재한다. loss를 0으로 만든느 W가 유니크하지 않다는 것이다. 이 말을 이해하기 위해서 아래에 사진을 살펴보자.

 

 

 

왼쪽 사진을 보면 W일 떄 Car 이미지에서 총 loss 값은 0이 나온다. 

그렇다면 W의 제곱에서는 Car 이미지의 loss값이 뭐가 나올까? 0이다. 

 

 

 

 

 

💡 Loss 값을 0을 만드는 w가 유니크하지 않을 때 생기는 일은 뭘까?

 

 

  1. 다중해(Multiple Solutions):
    여러 개의 서로 다른 w가 모두 loss를 0으로 만들 수 있다는 건, 모델이 여러 가지 방법으로 같은 결과를 낼 수 있다는 뜻이다. 그러면 어떤 w를 써야 할지 헷갈릴 수 있고, 모델이 일관성 없이 동작할 가능성이 있다.
  2. 과적합(Overfitting):
    loss가 0이라는 건, 모델이 학습 데이터에 너무 딱 맞춰져서 새로운 데이터를 잘 처리하지 못할 수 있다. 즉, 모델이 학습할 때 데이터에 지나치게 맞춘 나머지, 실제로는 쓸모없는 복잡한 규칙을 학습했을 수 있다..

이렇게 w가 여러 개일 때는 모델이 불안정하거나 과도하게 학습된 상태일 가능성이 있다.

 

 

따라서 우리는 W가 유니크한 값을 가지도록 해야한다. 이떄 필요한 것이 Regularization이다.

 

 

 

 

위 사진에서 대해서 살펴보자.

  • Data loss: 모델이 예측한 값과 실제 값의 차이를 계산한 값이다. 즉, 모델이 예측을 잘했는지 못했는지를 보여주는 지표!
  • Regularization loss: 이 부분은 W(가중치)를 너무 크게 만들지 않게 조절하는 역할이다. 가중치가 너무 커지면 모델이 복잡해지고, 과적합이 일어날 수 있다. 따라서 해당 부분을 추가해서 제어하는 것이다.
    • R(W)는 가중치가 너무 커지지 않도록 제어하는 것
    • λ는 이 규제 손실이 얼마나 영향을 미칠지 조정하는 값

 

 

Regularization의 종류

 

 

결과적으로 Regularization이 들어간다면 Trainig 데이터에 대한 정확도는 떨어지지만 Test set에 대한 성능은 더 좋아지게된다. 

 

 

💡 그렇다면, Regularization의 경우 자신이 원하는 모델에 대해서 어떻게 파악할 수 있을까?

 

 

위의 사진처럼 x와 w들이 주어졌을 때 xw1 = 1 = xw2이다. 결과로는 같지만 L1 Regularization과 L2 Regularization이 원하는 W의 값은 다르다.

 

1. L1 Regularization

  • 중요하지 않은 특성을 제거
  • 많은 가중치가 0이 되는 W를 선호
  • 따라서, W1을 선호한다.

2. L2 Regularization

  • 모든 가중치가 작고 균등하게 분포된 W를 선호
  • 따라서, W2를 선호한다.

 

 

 


 

 

 

 

3. Multinomial logistic regression(softmax) - Cross entropy loss

softmax에서 Score는 클래스를 Log화 한 일반화하지 않은  확률이다.

 

 

오른쪽에 있는 수식이 softmax 함수이다.

Softmax 함수는 주어진 입력 값을 정규화하여 확률 분포로 변환하는 함수이다.

 

 

즉, 오른쪽의 수식은 입력 값 S(k)를 지수 함수로 변환한 후, 다른 모든 S(j)들의 지수 값들의 합으로 나누는 방식으로 각 클래스에 대한 확률을 계산하는 것이다.

 

i에 대한 Loss 값 공식을 보면 아래와 같다.

 

 

 

 

:  이는 i번째 데이터 포인트(이미지)에 대한 손실 값을 나타낸다.

   즉, 이 수식은 데이터 포인트(이미지) X(i)에 대한 모델의 손실을 계산하는데 사용한다.

 

 

: 이 부분은 모델이 데이터 X(i)를 주었을 때, 실제 정답 레이블 Y(i)로 예측할 확률을 의미합니다.  이 확률은 모델이 계산한 확률 값이다.

 

 

: 확률에 로그를 취하고 음수를 붙인다. 이 로그는 확률이 높을수록 값이 작아지고, 확률이 낮을수록 값이 커지게 만드는 역할을 합니다. 따라서 모델이 예측한 확률이 실제 레이블과 가까울수록 손실 값이 작아집니다.

 

 

작동 방식:

  • 예측이 정확할수록: P(Y=yi∣X=xi) 값이 1에 가까워지며, 그때의 로그 값은 0에 가까워진다. 따라서 손실 값 Li는 작아진다.
  • 예측이 틀릴수록: P(Y=yi∣X=xi) 값이 0에 가까워지며, 로그 값은 크게 증가하게 된다. 이 경우 손실 값 Li는 커진다.
  • (아래 그래프 참고)

그래프

 

 


 

이제 작동원리를 공식을 기반으로 실제 계산을 해보자.

 

 

위의 고양이 사진에 대한 Score가 나와있다. 

 

이 스코어를 e^Score를 해준다면 3.2는 e^3.2 = 24.5 / e^5.1 = 164.0 / e^-1.7 = 0.18이 나오게 된다.

 

그리고 이 값을 모두 더하면 총 188.68이 나오게된다. 

 

마지막으로 각 카테고리의 e^Score /  e^Score의 총합를 해주면

각각 24.5 / 188.68 = 0.13      164.0  / 188.68 = 0.87       0.18 / 188.68 = 0.00이 나오게 된다.

 

따라서 이 값을 -log에 넣어주면 우리가 원하는 L(i)가 나오게 된다. (ex - -log(0.13) = 0.89)

 

 


 

L(i)의 최대값과 최소값은 무엇인가?

 

 

 

이 그래프를 보면 알 수 있듯이 0 < a < 1 인 상황에서 최대값은 무한대, 최소값은 0인 것을 알 수 있다.

 

 

 

 

 

 

 

 

초기 W값이 작아서 Score가 0과 근접하다면 어떤 결과가 나오는가?

 

직접해보면 아래와 같다. 

 

위 고양이 사진으로 cat, car, frog 카테고리에서 손실 값을 찾아보자.

  score e^score e^score / e^score 합 -log()
cat 0 e^0 = 1 1 / 1+1+1 = 1 / 3 1.0986
car 0 e^0 = 1 1 / 1+1+1 = 1 / 3 1.0986
frog 0 e^0 = 1 1 / 1+1+1 = 1 / 3 1.0986

 

 

 

이렇게 하면 좋은 점은 Sanity check를 할 수 있다. 

 

Sanity check이란 모델이 정상적으로 작동하는지 확인하기 위해 간단하게 테스트를 하는 과정이다. Softmax에서 score를 모두 0으로 만드는 것도 일종의 Sanity check으로 모델이 너무 이상하게 학습된 것은 아닌지 확인하는 방법 중 하나이다. 

 

 

모든 score를 0으로 만들고 Softmax를 적용하면, 각 클래스에 동일한 확률(균등한 확률)이 나와야 해. 예를 들어, 클래스가 3개라면 각 클래스의 확률이 1/3씩 나와야 한다. 만약 이 과정에서 모델이 제대로 동작하지 않으면 뭔가 잘못된 거라고 볼 수 있다.

 

*균등한 확률: 모든 클래스가 같은 확률을 가지는 상태이다. 만약 균등하지 않다면 모델이 한 클래스에만 높은 확률을 주고 나머지는 거의 무시하게 되는 경우가 발생할 수 있다. 즉, 균등한 확률이란 모든 클래스에 대해서 편향 없이 같은 확률을 주는 상태이다.

 

그래서 score를 0으로 만들어서 한번 테스트해보고, 다시 학습을 진행하면 모델이 정상적으로 학습되고 있는지 확인할 수 있다.

 


 

[SVM vs Softmax]

 

해당 부분은 내가 쉽게 이해한 방식대로 작성해보겠다.

 

svm

정답 카테고리를 제외한 나머지 카테고리에 대한 계산만 하기 때문에 정답 카테고리를 제외한 오답들에 신경을 많이 쓰는 방식이다. 

즉, 오답을 최대한 적게 만들려는 방식이다. 따라서 오답확률은 줄어들지만, 정답에 대한 확률도 크게 강조되지 않아서 정답에 둔감하게 작동할 수 있다.

 

 

 

 

Softmax

Softmax는 정답을 포함한 모든 카테고리를 고려하기 때문에, 정답과 오답을 모두 신경쓰면서 각 클래스에 대한 확률 분포를 계산하는 방식이다. 즉, 오답과 정답을 모두 신경쓰는 방식이다. 따라서 정답 스코어도 강조되고, 정답에 더 민감하게 반응할 수 있다. 하지만 이러한 점 떄문에 오답에 잘못된 높은 확률을 줄수 있다느 단점이 있다.

 

 


 

 

최적화(Optimization)

: 모델의 성능을 높이기 위해 손실(loss)를 최소화하는 값을 찾는 과정이다.

이를 위해 모델의 파라미터(가중치, 편향 등)를 조정해 오류를 최대한 줄이는 방향으로 학습을 진행한다.

 

 

1. Gradient (경사)

: 주어진 함수가 어떤 방향으로 변하는지 알려주고, 특정 지점에서 가장 빠르게 변화하는 방향을 나타낸다. 

 

💡 왜 경사가 중요한가?

 

모델을 학습할 때 손실 함수를 최소화하는 것이 목표이다. 이 손실 함수를 촤소화하기 위해서 경사하강법같은 알고리즘을 사용해 최적의 가중치를 찾아간다. 경사는 이 과정에서 함수가 감소하는 방향을 알려줘서, 모델이 손실을 줄일 수 있도록 가중치를 수정하는데 도움을 준다.

 

 

💡 기울기에는 음수, 0, 양수가 있을텐데 각각의 값이 경사값으로 나온다면 어떤 의미를 가지는가?

 

  • 음수
    • 손실함수가 감소하고 있다는 의미(좋은 의미)
    • 그러나 손실함수가 감소하고는 있지만 최적값이 아니기 때문에 손실함수를 더 감소 시키기 위해서 가중치를 증가시킨다.
    • "가중치 증가 == 손실 함수 감소" -> 경사를 찾을 때는 가중치 값을 변화시키면서 찾는다. 따라서 가중치의 값을 변화시키고 손실 함수가 감소하고 있다고 파악되면 '지금 가중치에서 더 증가시켜주세요! 그래야 손실함수가 줄어들어요!'라고 경사가 알려줘서 가중치를 증가 시키고 결과적으로 손실 함수가 감소하게된다.
  • 양수
    • 손실함수가 증가하고 있다는 의미(좋지 않은 의미)
    • "가중치 감소 ==  손실 함수 감소"  -> 가중치를 변화시키면서 경사를 찾는다. 그러던 도중 경사를 찾았는데 양수가 나왔다면 '지금 가중치가 너무 커요! 줄여주세요!'라고 경사가 말하는 것과 같다. 
    • 따라서, 경사가 양수라면 가중치를 감소시켜 손실을 줄여야한다.
  • 0
    • 경사가 0이라는 것은 최소점 또는 최대점에 이미 도달했다는 의미이다.
    • 즉, 손실함수가 더 이상 변화하지 않는 지점이므로, 더 이상 가중치를 수정할  필요가 없다.

 

최신화된 수정

음수 양수인지는 중요하지 않고 0으로 가기 위한 과정에서 기울기가 음수가 되었다가 양수가 되었다가 하는 것이고 최종적으로 0으로 가는 것이 목표이다.

 


 

 

경사를 구하는 방법에는 Numerical gradient와 analytic gradient가 있다.

 

Numerical gradient

  • 수치적으로 경사(기울기)에 근사하는 방식이다.
  • 아주 작은 변화(0.0001같은 것)를 주고, 그 전후의 함수 값을 비교해 미세한 차이로 경사를 계산한다.
  • 장점: 함수의 구체적인 수식을 몰라도 경사를 계산할 수 있다.
  • 단점: 계산이 느리고, 정확하지 않을 수 있다.

Numerical gradient

 

여기서 ϵ은 매우 작은 값으로, 미세한 차이를 통해 경사를 근사함.

 

 

 

analytic gradient

  • 함수의 수학적 식을 사용해 정확한 경사(기울기)를 계산하는 방식이다.
  • 미분 공식을 사용해서 경사를 구한다.
  • 장점: 정확하고 빠르게 경사를 계산할 수 있다.
  • 단점: 함수의 수직을 알고 있어야 하고, 복잡한 함수일 경우 미분하기 어려울 수 있다.

 

주어진 함수 f(x)에 대해 미분하여 경사를 정확하게 계산함.

 

 

 

 

 

실제로는 analytic gradient를 사용하면된다. 다만 계산이 제대로 이루어지는지 확인하기 위해서 numerical gradient를 사용하면된다.


2. Gradient Descent (경사하강법) - full_batch gradient descent

: 손실 함수의 경사를 계산해서, 가장 빠르게 손실을 줄일 수 있는 방향(경사가 가장 급력하게 감소하는 방향)으로 가중치를 업데이트한다.

 

경사하강법의 작동 방식

 

  1. 경사 계산: 현재 가중치에서 손실함수의 기울기(경사)를 계산한다.
  2. 가중치 업데이트: 경사 부호에 따라서 가중치를 조절한다.
    • 경사가 양수라면 손실 값이 크다 -> 가중치를 감소시켜 손실을 줄인다. (가중치가 높아서 손실이 커요!) 
    • 경사가 음수라면 손실 값이 크다 -> 가중치를 증가시켜 손실을 줄인다. (가중치가 낮아서 손실이 커요!)
  3. 학습률(Learning Rate): 가중치를 업데이트할 때, 가중치를 얼마나 크게 변경할지를 결정하는 값이다. 
    • 학습률이 크면
      • 가중치가 너무 큰폭으로 업데이트되어, 최솟값을 지나칠 수 있다. 즉, 최적 가중치는 2인데 가중치가 5로 업데이트 되어 2를 지나칠 수 있다.
      • 즉, 한번에 너무 큰 이동을 하기 떄문에, 손실 함수의 최소값에 도달하지 못하고 진동하거나 발산할 수 있다.
    • 학습률이 너무 작으면
      • 가중치가 아주 조금씩 업데이트되기 때문에, 손실 함수의 최소값에 도달하는 속도가 매우 느려진다.
      • 최종적으로는, 최적화가 가능하지만 시간이 굉장히 오래걸릴 수 있다.
    • 적절한 학습률
      • 적절한 학습률을 설정하면, 가중치를 적절한 크기로 업데이트하며 손실함수 최솟값으로 빠르게 수렴할 수 있다.

 

3. mini_batch gradient descent 

: 모든 데이터셋을 한번에 처리하지 않고, 작은 그룹(배치)으로 나눠서 각 그룹(배치)에 대한 경사를 계산하고 가중치를 업데이트하는 방식이다. 배치 사이즈는 일반적으로 32, 64, 128처럼 작은 데이터 샘플 단위로 설정한다. 샘플 단위는 본인의 환경에 따라서 설정하면 된다.

 

 

 

 

특징

  • 전체 데이터 셋을 사용하는 대신, 작은 배치로 나누어 경사를 계산하기 때문에, 계산 비용과 메모리 사용량 모두에서 효율적이다.
  • 배치 크기에 따라 속도와 안정성을 조절할 수 있다.

 

장점

  1. 균형성 잡힌 효율성
    • 미니 배치를 사용하여 계산 속도와 경사의 안정성을 모두 확보할 수 있다.
  2. 덜 불안한 경로
    • 배치 단위로 계산하므로 보다 안정적으로 학습이 가능하다.
  3. 대규모 데이터에 적합
    • 배치 크기를 적절히 조절하면 큰 데이터 셋에서도 메모리 효율적으로 작동한다.

 

단점

  1. 배치 크기 설정이 중요
    • 배치 크기가 너무 작으면 확률적 경사하강법과 비슷하게 불안정해질 수 있고, 반대로 너무 크면 full-batch 경사하강법처럼 느려질 수 있다.
  2. 계산의 복잡성 증가
    • 배치 크기만큼 데이터를 처리해야하므로, 경사를 계산하는 데 시간이 더 걸릴 수 있다.

 

 

 

 

 

 

 

4. Stochastic gradient descent (확률적 경사하강법)

: 미니 배치 경사하강법과는 다르게 한번에 하나의 데이터 샘플만 사용해서 경사를 계산하고 그에 따라 즉시 가중치를 업데이트한다. 매번 데이터를 무작위로 선택하고, 그 데이터 포인트에 대해 경사를 계싼한 후 가중치를 업데이트 한다.

 

위 과정은 데이터를 모두 사용할 때까지 반복된다.

 

 

 

 

 

특징

  • 각 데이터에 대해 가중치를 즉시 업데이트한다.
  • 무작위성 떄문에 가중치 업데이트 경로(가중치가 최적값에 도달할 때까지 경사를 따라 이동하는 과정)가 불안정할 수 있지만, 빠른 업데이트가 가능하다.
  • 대용량 데이터셋에서 효율적이다.

 

장점

  1. 계산 속도가 빠름
    • 매번 하나의 데이터만 사용하므로, 전체 데이터를 사용할 필요 없이 빠르게 학습할 수 있다.
  2. 메모리 효율성
    • 메모리 사용량이 적어, 큰 데이터 셋에도 적합하다.
  3. 빠른 초기 수렴
    • 초반에는 손실함수가 빠르게 감소하는 경향이 있다.

 

단점

  1. 진동
    • 경사를 자주 계산하면서 가중치를 업데이트하기 때문에, 경로가 불안정하고 최솟갑에 도달하는 대신 진동할 수 있다.
  2. 최적화의 정확성 낮음
    • 최종적으로는 풀 배치 경사하강법에 비해서 정확도가 떨어질 수 있다.

 

 


 

이미지 처리에서의 Feature Extraction(특징 추출)

 

이미지 특징의 필요성 (Image Features: Motivation)

이미지를 픽셀 데이터만으로 정확하게 분석하기 어려운 경우가 많다. 이는 원본 이미지가 비선형적이기 때문이다.

이러한 비선형적 데이터를 선형적으로 변환하기 위해서 특징 추출을 사용한다. 

 

예를 들어 비선형적 데이터가 있다고 가정했을 때 특정 특징 변환(비선형적인 데이터를 선형적으로 변환)을 통해 선형적으로 분리할 수 있는 형태로 변환할 수 있다.

 

 

왼: 비선형 / 오른: 선형

 

 

 

 

 

 

 

1. 컬러 히스토그램 (Color Histogram)

컬러 히스토그램은 이미지 색상 분포를 잡는 방법이다. 이미지를 구성하는 각 픽셀의 색상을 분석하고, 그 색상 값이 어떤 비율로 존재하는지를 히스토그램으로 표현한다.

 

 

위 처럼 개구리는 초록색이 많이 포함되어있는 이미지이다. 따라서, 초록색 구간에서 히스토그램 값이 높게 나타난다. 이 방법은 이미지가 가진 색의 특성을 쉽게 파악할 수 있어 이미지 분류나 검색등에 유용하게 사용된다.

 

 

 

 

 

 

 

 

2. 방향성 기울기 히스토그램 (Histogram of Oriented Gradients, HoG)

 

 

HoG는 이미지의 엣지(경계) 정보를 바탕으로 특징을 추출하는 기법이다. 이미지 각 부분에서 엣지(경계)가 어느 방향으로 나타나는지를 분석해서, 이를 숫자로 표현하는 방식이다.

 

[방식]

1. 이미지를 8x8 픽셀로 나누어 작은 지역으로 분할한다.

2. 각 지역 내에서 엣지 방향(gradient direction)을 분석한다. 방향은 9개의 bin으로 양자화(무한히 많은 값을 가질 수 있는 데이터를 몇 가지 고정된 값으로 변환하는 것)되어, 각 방향에 해당하는 기울기 값을 계산한다.

3. 이렇게 320x240 크기의 이미지를 분석하면 40x30개의 작은 영역이 나오고, 각 영역마다 9개의 값을 가지므로 최종적으로 10,800개의 특징 벡터가 만들어진다.

 

 

 

 

 

 

 


3. Bag of Words 모델 (BoW, Bag of Visual Words)

Bag of Words는 주로 텍스트 분석에서 사용되던 기법을 이미지 분석에 적용한 방식이다. 이 방법은 이미지를 작은 패치(patch)로 나누어 각 패치를 시각적 단어(visual words)로 변환한 후, 이를 클러스터링(주어진 데이터를 유사한 특성을 가진 그룹으로 묶는 작업)하여 특징 벡터를 구성한다.

 

 

 

 

 

1. 이미지를 여러 개의 패치로 나누어 작은 부분을 추출한다.

2. 각 패치에서 공통적인 패턴을 찾아내고, 이를 클러스터링하여 시각적 단어(visual words)로 정의한다. 이를 통해 코드북(codebook)이라는 단어 목록을 만들게 된다.

3. 새로운 이미지를 입력하면, 해당 이미지가 가지고 있는 시각적 단어들의 빈도를 계산하여 벡터로 변환한다

 

 

 

 

 

 

 


4. ConvNets와의 비교 (Feature Extraction vs ConvNets)

 

  • 기존의 특징 추출 방법(예: HoG, Color Histogram, Bag of Words)은 사람이 직접 특징을 설계하는 방식이다. 즉, 이미지를 구성하는 정보에서 중요한 부분을 사람이 미리 결정하고, 그 부분만을 추출하여 분류 모델에 전달하는 방식이다.
  • 반면, ConvNets(Convolutional Neural Networks) 딥러닝 기법으로, 자동으로 이미지의 중요한 특징을 학습하는 방법이다. ConvNets는 이미지를 통째로 입력받아, 특징을 자동으로 추출하고 이를 바탕으로 분류 작업을 수행한다. 사람이 직접 특징을 설계하지 않아도 되며, 다양한 문제에서 높은 성능을 발휘할 수 있다.