본 강의는 유튜브에 올라와 있는 "시각적 이해를 위한 머신러닝"이라는 서울대 데이터 사이언스 대학원(GSDS) 강의를 보고 정리한 글입니다. 대학원을 다니지 않고도 이렇게 좋은 강의를 들을 수 있어서 강의를 공유해주신 이준석 교수님께도 너무 감사합니다... 1강은 사실 강의 소개 및 개요들을 주로 다루다 보니까 내용이 별로 없어서 2강까지 합쳐서 정리했고 기본적으로 이전에 공부한 내용들이라 간략하게 메모용으로만 정리했습니다.
1강. Course Introduction & Introduction to Computer Vision
Visual Understanding이란?
픽셀 단위 -> 사람이 이해할 수 있는 지식, 정보 형태로 변환하는 것 + 단순히 시각적으로 보이는 것을 넘어서 보는 사람/만든 사람의 의도는 Infer(추론)하는 것. (high-level understanding)
Computer vision의 유형(수업에서 다룰 주제)
- Object Recognition(Image Classification)
- Action Recognition(Video Classification)
- Spatial & Temporal Localization ( 비디오의 특정 시간이나 공간을 찾아내는 작업)
- Segmentation
- Tracking
- Cell Tracking
- Hurricane Tracking
- Multimodal Learning
- Audio-Visual
- Visual Q&A
- Style Transfer
2강 : First Approaches for Image Classification
컴퓨터는 이미지를 "픽셀 & RGB" 형태로 인지하고 있다. 기본적인 분류에서 해결하려는 문제는 아래와 같이 정리해 볼 수 있다.
- Scale variation
- Viewpoint variation
- Background clutter(배경과 유사한 물체)
- illumination(같은 장소더라도 낮과 밤에 찍은 사진)
- Occlusion(숨겨져있는 일부만 보이는 형체)
- 아직도 풀기 어려워하는 문제
- Deformation(여러 변형)
- Intraclass variation(자동차 같은 클래스에서 내부적으로 세부 차종마다 다양한 색깔, 유형을 가지는 형태)
기본적인 Image Classifier의 형태
def classify_image(image):
#some magic here?
return image_label
인간이 직접 이미지를 분류하기 위한 전략을 세워서 배경을 지우거나 여러 룰베이스 방식들을 시도해봤지만, 결론적으로 Data-driven approach로 귀결되었다.
def train(image, labels):
#some machine learning
return model
def predict(model, image):
#use the model
return predicted_label
간단한 Data-driven approach 케이스
1. kNN
인근의 데이터를 보고 새로운 데이터의 라벨을 판단하는 방식 -> 가깝다는 것을 인지하게 하기 위해서는 결국 상호간의 거리를 측정할 수 있어야 한다.
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
def train(self, images, labels):
self.images = images
self.labels = labels
def predict(self, test_images):
min_dist = sys.maxint
for i in range(self.images.shape[0]):
dist = np.sum(np.abs(self.images[i,:] - test_images))
if dist < min_dist:
min_dist = dist
min_index = i
return self.labels[min_index]
시간복잡성 상에서의 위 코드를 살펴보면 Training은 O(1), predict(n)인데 실제 프로덕에서는 추론할때마다 모든 데이터를 다 살펴봐야하기 때문에 좋은 방식은 아니다. 그럼 어떻게? 1개씩 다 비교하는게 아니라 2이상의 k개를 살펴보는 방식을 선택한다.
Visual Understanding에서 kNN이 잘 사용되지 않는 이유
위의 사진처럼 인간은 이렇게 일부 픽셀만 바꾸거나 조금 이동해도 명확하게 이해하지만, 실제로 kNN의 방식에서 거리는 크게 변화한다.
대부분 시각적 자료는 차원이 높은데 결국 차원이 많아지면 거리 측정 연산이 어려워지고, 가깝다는 것을 파악하기도 어렵다.(드넓은 우주에서 행성 띄엄띄엄 있는 것을 우리는 가까운 아이라고 볼 수 있을지?와 같은 맥락)
그에 대한 해결책으로 위와 같은 방식을 사용한다.
2. Linear Classifier
kNN처럼 모든 트레이닝 샘플을 외우는 것이 아니라, image x를 label y로 변환시켜주는 f를 찾는 parametric approach를 해보는 것이 더 효율적이다.
Advantage of parametric models:
1. 한번 학습되면 기억해두어야 하는건, W, b의 가중치 뿐이기 때문에 우리는 트레이닝 데이터셋을 들고 있을 필요가 없다.(space efficient)
2. 테스트 기간에 single matrix 연산만 하면 되기 때문에 추론이 빨라진다.
행렬, 벡터는 일종의 선형변환이기 때문에 그에 맞게 좌표에 그려보면 직관적으로 이 역시도 좌표상으로 분류할 수 있다고 해석할 수 있게 된다.
W(학습한 가중치)를 각각 픽셀형태(2X2)로 바꿔서 시각화했을 때, linear classifier의 훈련과정은 마치 훈련데이터로부터 template을 배우는 과정이라고 해석할 수 있다. kNN과 큰 차이점은 kNN은 이미지가 10억개면 10억개의 템플릿을 배우는 느낌이고, linear classifier은 10개(label dimension)를 배워서 효율적
추가 질문
bias : bias는 사실 모든 트레이닝 데이터에 동등하게 적용되는 값이기에 (data independent) 기본값이라고 볼 수도 있다. 예를 들면 트레이닝 데이터 셋에 라벨이 8인 데이터가 많으면 기본적으로 bias는 8의 값을 높이는 방식으로 학습될 가능성이 높음.(모델은 답을 맞추도록 학습되기 때문에)
추천 시스템에서도 어떤 추천 컨텐츠에 대해서 bias를 사람들이 컨텐츠에 대해 반응하는 평균값으로 줄 수 있지만 개개인마다 추천에 대해 후한 사람의 경우에는 bias가 올라갈 수도 있고, 아이템마다 선호도가 다르면 그에 따라 달라질 수도 있다. 내가 이해한 바로는 bias가 데이터 독립적일 수는 있지만 domain과 관련된 특성을 좀 고려할 수도 있는 역할을 할 것 같다.
'Machine Learning > 공부 기록' 카테고리의 다른 글
랭체인 튜토리얼 (0) | 2024.01.31 |
---|---|
[허깅페이스] Diffusers Tutorial - 모델 사용하기 (0) | 2023.12.30 |
A/B 테스트에서의 양측검정 vs 단측검정 (0) | 2023.10.12 |
시각적 이해를 위한 머신러닝 5~7강 (1) | 2023.10.02 |
시각적 이해를 위한 머신러닝 3, 4강 (0) | 2023.09.28 |