Image Classification
- 머신러닝에서 중요한 task 중 하나는 라벨(label) 집합이 주어졌다고 가정하는 것이다.
- 머신 입장에서 이미지는 [0,255] 범위의 정수로 이루어진 3차원의 배열이다.
- 이 숫자 배열이 의미 있는 개체의 해석이 가능하게 하는 것이 우리의 목적이다.
- 하지만 우리는 '고양이'나 '자동차'등을 인식하는 알고리즘을 코딩하는 것은 불가능하다.
- 그래서 우리는 데이터 기반의 방식인 머신러닝을 사용해 분류기를 학습시키는 것이다.
- 딥러닝 이전의 CV는 이미지에서 feature를 추출한 다음 분류 규칙을 적용했다.
- 하지만 이 방식은 뽑는 사람이 경험에 의존하고 일반화가 잘 되지 않는 한계가 있다.
1. Occlusion : 이미지 속 객체가 일부만 보이면 분류/이해가 어렵다.
2. Illumination, View Point Variation : 조명과 보는 각도가 다르면 인식하기 어렵다.
3. Context : 객체 주변의 문맥(context)가 인식에 영향을 준다.
4. Whole Scene Understanding : 단일 객체를 넘어서 전체 장면도 해석해야 한다.
Data-driven Approach
- 데이터 기반 방식은 다음과 같이 스스로 패턴을 학습한다.
1. 이미지와 라벨이 있는 데이터셋을 수집한다.
2. 머신러닝 알고리즘으로 분류기를 훈련시킨다.
3. 훈련된 분류기를 통해서 새로운 이미지를 예측한다.
- Nearest Neighbor는 비모수적 최근접 이웃 분류기로 거리(유사도를)를 계산해서 정답을 판단한다.
1. 테스트 이미지 (쿼리 이미지) 주어진다.
2. 훈련 데이터 중 가장 가까운 (k개) 이미지를 찾는다.
3. 해당 이미지들의 라벨을 이용해 예측한다.
- KNN은 모든 훈련 이미지와 라벨을 메모리에 저장하고,
- 테스트 이미지가 들어오면 가장 유사한 훈련 이미지의 라벨을 출력한다.
-> 즉, 학습을 하지 않고 그냥 외우기만 하는 구조이다.
- KNN은 가장 비슷한 이미지를 거리로 측정할 때 함수를 사용한다.
1. L1 거리 (맨해튼거리) : 픽셀의 차이를 전부 절댓값으로 계산해서 더한다.
2. L2 거리 (유클리디안 거리) : 두 점 사이의 직선 거리.
import numpy as np
class NearestNeighbor:
def __init__(self) :
pass
def train(self, images, labels): # 모든 훈련 데이터 기억 O(1)
self.images = images
self.labels = labels
def predict(self, test_image) : # 가장 가까운 훈련 이미지를 라벨 예측값으로 사용 O(n)
min_dist = sys.maxint
for i in range(self.images.shape[0]) :
dist = np.sum(np.abs(self.images[i,:] - test_image))
if dist < min_dist :
min_dist = dist
min_index = i
return self.labels[min_index]
- KNN은 훈련 샘플의 분포에 따라 비선형적인 결정 경계 (decision boundary)를 만든다.
- KNN은 k개의 최근접 이웃을 찾고 이 이웃들 라벨의 다수결을 사용해서 분류한다.
- KNN에서 k의 값과 거리 함수들은 모두 하이퍼파라미터이다.
- 훈련 전에 사람이 정해줘야 하고, 데이터로부터 학습하지 않고, 여러 번의 실험을 통해 최적의 파라미터를 찾아야 한다.
- KNN은 L1, L2 거리로 계산한 픽셀 간 유사도는 비효율적이고 테스트 시간이 느리기 때문에 실제로는 거의 사용되지 않는다.
- 고차원 데이터일 수록 가까운 이웃을 찾는 것이 힘들기 때문에 거리 개념 자체가 무의미해진다. 이것이 차원의 저주(Curse of dimensionality)이다.
1. 데이터의 feature들을 정규화한다. -> 평균 = 0 분산 = 1
2. 이미지 같은 고차원 input은 차원축소 (dimension reduction)을 고려한다.
3. training data를 train/validation sets로 나눠서 최적의 하이퍼파라미터를 선택한다.
4. 계산 속도를 높이기 위헤 approximate nearest neighbors 라이브러리를 사용한다.
Linear classifier
- 모델이 훈련 세트를 단순히 외우는 것이 아니라 입력과 출력 사이의 함수 f(x)를 학습한다.
-> f(x) = Wx + b
: 입력 픽셀의 가중합
- 우리의 목표는 올바른 클래스에 가장 높은 점수를 주는 W를 찾는 것이다.
- 파라미터 기반 모델을 사용하면 다음과 같은 장점이 있다.
1. 훈련이 끝나면 가중치 W만 저장한다. -> 메모리 효율성 ↑
2. 테스트할 때는 Wx 한 번만 계산한다. -> 속도 ↑
3. KNN처럼 수많은 훈련 데이터를 비교할 필요가 없다.
- 각 클래스에 대한 결정경계는 W의 한 행으로부터 유도된다.
- W가 바뀌면 경계가 회전하고, 바이어스 b가 바뀌면 경계가 위/아래로 이동한다.
- 학습된 가중치 W는 이미지의 어떤 부분이 중요한지 시각적으로 보여준다.
- 각 클래스별로 W를 reshape 해서 시각화 하면 그 클래스의 전형적인 패턴이 보인다.
-> 가중치 시각화
- 훈련 시: 학습 데이터에서 각 클래스의 템플릿을 학습한다.
- 테스트 시 : 입력 이미지와 학습된 템플릿 간 매칭을 수행한다.
- KNN과 같은 유사도 기반이지만, knn은 훈련 샘플과 비교하고 linear classifier는 가중치 시각화로 비교한다.
Softmax Classifier
- linear classifier는 점수의 의미가 불분명하고 경계가 없다.
-> 437.9 라는 점수는 도대체 얼마나 고양이와 유시한지 알기에 애매하다.
- 그래서 우리는 점수를 [0,1] 범위로 제한해서 확률처럼 해석한다.
- 이미지가 두 클래스 중 어디에 더 속할지 confidence를 수치로 표현하자면,
- s1 > s2 : 클래스가 1일 확률이 더 높다.
- s1 - s2 값이 크면 클래스가 1일 확률의 confidence가 높다.
-> s가 클수록 1에 가까운 출력, s가 작을수록 0에 가까운 출력, s가 0일 때는 0.5
-> 위 조건을 만족하는 함수가 바로 Sigmoid 함수이다.
1. 각 확률 값은 0 이상 1 이하이다.
2. 모든 클래스에 대한 확률의 합은 1이다.
-> 위 조건을 일반화하게 되면,
- Dog 클래스가 거의 100% confidence를 보인다.
- 각 logit을 exp() 처리한 후 모든 exp 값을 더해서 normalize하는 방식이다.
- 왼쪽 이미지가 이진 분류이고, 오른쪽 이미지가 다중 분류이다.
- 이진 분류는 시그모이드를 거쳐서 1개의 확률 값이 출력되고,
- 다중 분류는 소프트맥스를 거쳐서 여러 개의 클래스 확률이 출력된다.
- 그렇다면 가중치 W는 어떻게 정할까?
- Loss Function을 통해 예측이 얼마나 틀렸는지 측정하고, W를 조정해서 점점 더 정답에 가까워지도록 훈련한다.
- 손실 함수는 현재 모델이 얼마나 잘못 예측했는지 수치로 표현한다.
- y^=y -> 손실 = 0, y^≈y -> 작은 손실, y^와 y의 차이가 너무 크다면 큰 손실이다.
- 정답 : y = one-hot 벡터 ([0,0,1,0,0])
- 예측 : y^ = softmax 확률 벡터([0.01,0.02,0.94,0.01,0.02])
- 이진 분류 손실함수 :
- 다중 클래스 손실함수 :
Gradient Descent
- 벡터형으로 표현한 수식 :
- 스칼라형으로 표현한 수식 :
theta = rand(vector)
while true :
theta_grad = evaluate_gradient(J, data, theta)
theta = theta - alpha * theta_grad
if (norm(theta_grad) <= beta) break
- 하지만 경사하강법이 항상 잘 되는 것은 아니다.
- 비볼록 함수 (non-convex)일 경우, local minima와 안장점이 존재한다. 여기서 기울기는 0이지만 전역 최솟값은 아니다.
- 전체 데이터로 평균을 내기 때문에 한 번의 업데이트가 너무 오래 걸린다.
- 이러한 단점을 해결하기 위해 Mini-batch SGD를 사용한다.
- 전체 데이터를 보지 않고 무작위로 일부 샘플만 보는 방식이다.
- 1개 샘플 -> SGD(Stochastic GD)
- n개 묶음 -> Mini-batch SGD
'Major Study > 25-1 Deep Learning Application' 카테고리의 다른 글
[Deep Learning Application] Lecture 6 : Neural Network (0) | 2025.04.27 |
---|---|
[Deep Learning Application] Lecture 4. Logistic Regression (0) | 2025.04.06 |
[Deep Learning Application] Lecture 2: Learning from data (0) | 2025.04.05 |
[Deep Learning Application] Lecture 3. Linear regression (0) | 2025.03.29 |