lilpark.log
로그인
lilpark.log
로그인
[CS231n] Lecture 2: Image Classification 정리
Lil Park
·
2023년 2월 24일
팔로우
0
Classification
Computer Vision
Deep Learning
cs231n
0
cs231n
목록 보기
1/7
컴퓨터는 어떻게 이미지를 인식하는가? Semantic Gap이란 무엇인가?
사람은 이미지를 보고, 해당 물체가 고양이라는 것을 쉽게 인식
기계는 해당 이미지를 pixel로 이루어진 데이터로 봄
따라서, 기계는 해당 이미지가 고양이인지 쉽게 인식할 수 없음
이렇게 사람과 기계 사이의 이미지 인식 차이를 Semantic Gap이라고 부름
기계가 이미지를 인식하는 것이 어려운 이유는 무엇인가?
카메라의 위치를 조금만 옮겨도, 픽셀 값이 달라질 수 있음
이러한 문제는,
바라보는 방향
뿐만 아니라,
조명, 객체의 자세, 객체의 일부가 가려짐, 배경과 객체가 유사함, 하나의 클래스(고양이)에서 다양성이 존재하는 경우
에도 발생
이러한 문제에
강건한 알고리즘을 만드는 것
이 중요함 (다양한 고양이의 모습을 ‘고양이’라는 하나의 클래스로 전부 소화할 수 있도록 만드는 것이 중요)
중요한 점은, 고양이만 분류하는 것이 아니라, 이 외에 다른 여러가지 객체에 대해서도 잘 분류할 수 있어야 함 (기계도 인간처럼 분류를 잘 하도록 만들어야한다)
이는 굉장히 어려운 일이지만, 일부 제한된 상황을 가정한다면 가능한 일
앞서 언급한 문제들을 해결하기 위한 방법?
Image Clssifier를 만든다고 가정한다면, 어떤 코드를 작성해야 좋을까?
객체를 분류하기 위한, 직관적이고 명시적인 알고리즘은 존재하지 않을 것
고양이와 강아지를 분류하는 직관적인 알고리즘???
컴퓨터가 이미지를 인식하기 위한 알고리즘들
이미지의 코너와 엣지를 이용하여 이미지 속 객체를 인식하는 방법
이미지 속에서 엣지를 계산
코너와 엣지의 위치를 통해서 각 카테고리를 분류
즉, 명시적인 규칙 집합을 이용하는 방법
하지만, 이 방법은 잘 동작하지 않음
강건한 (Rubust) 방법이 아님
만약, 고양이가 아닌 새로운 객체(강아지, 트럭 등)를 인식해야한다면, 처음부터 새롭게 만들어야 함 (확장성이 없음)
데이터 중심 접근 방법
다양한 객체들에 유연하게 적용 가능한 확장성 알고리즘을 만들기 위해서 시도한 방법
기존처럼, 각 객체를 분류하기 위한 규칙을 만드는 방법이 아닌, 각 객체를 표현하는 많은 데이터를 수집하여 이용하는 방법
이렇게 수집한 데이터셋을 이용하여 Machine learning을 학습시킴
Machine learning 알고리즘은 어떤 식으로든 데이터를 요약해서 다양한 객체를 인식할 수 있는 모델을 만듦
Machine learning을 통해 입력 이미지를 분류하기 위해서는, 2개의 함수가 필요
Train 함수 → 입력은 이미지와 레이블, 출력은 모델
이는 입력 이미지와 레이블을 이용하여, 모델을 학습시키는 함수
Predict 함수 → 입력은 모델과 테스트 이미지, 출력은 이미지의 예측값
이는 학습된 모델을 이용하여, 테스트 이미지를 분류하는 함수
데이터 중심 접근 방법 중 하나인 KNN 알고리즘
Nearest neighbor는 단순한 classifier
train 과정에서는, 단순히 모든 학습 데이터를 기억함
이후 predict 과정에서, 새로운 이미지가 들어오면, 기존의 학습 데이터와 비교해서 가장 유사한 이미지로 레이블을 예측
Nearest neighbor 예제
50,000장의 학습 데이터가 10개의 카테고리로 균일하게 분포
10,000장의 테스트 데이터셋이 존재
KNN 알고리즘을 이용하여 train dataset을 학습한 후, test dataset에 이미지를 이용하여 predict를 진행하게 되면, 오른쪽 이미지처럼 train dataset에 존재하는 이미지들 중 test image와 비슷한 이미지를 뽑아냄
그러나 항상 맞는 동일한 레이블을 추출하는 것은 아님
즉, NN 알고리즘을 적용하면 training set에서 가장 가까운 샘플을 찾음
그렇다면, 테스트 이미지와 학습 이미지들을 비교할 때, 어떻게 유사함을 판단하는가?
유사성을 판단하기 위한 여러가지 방법들이 있음
해당 NN 알고리즘 예제에서는 L1 distance를 이용하여 유사성을 판단함
각 픽셀들을 서로 뺀 후 절댓값을 취하는 방법
KNN 알고리즘 코드
NN 알고리즘에서, train은 단순히 학습 데이터셋을 기억하는 과정이기 때문에, train 함수가 굉장히 단순하게 구현되어 있음
이후 predict 과정에서는, test 이미지와 학습된 이미지들 사이의 유사성을 판단하는데, 이때 L1 distance를 이용하였기 때문에, predict 함수에서는 이미지 간의 L1 distance를 측정
이후 L1 distance가 가장 작은 값을 계산하는 이미지가 가장 유사한 이미지라고 판단하여 최종 예측값으로 출력
그렇다면, 총 N개의 학습 이미지가 있을 때, train/test 함수의 속도는 얼마일까?
코드의 시간복잡도를 나타내는 표기 방법인 Big-O 표기법을 알야아 함
시간 복잡도란,
입력값의 변화에 따라 연산을 실행할 때, 연산 횟수에 비해 시간이 얼마나 걸리는가?
를 나타내는 척도
시간 복잡도의 표기법 중 하나가 Big-O 표기법
Big-O 표기법은 최학의 경우를 고려하는 방법으로, 프로그램이 실행되는 과정에서 소요되는 최악의 시간을 고려하는 표기 방법
train 단계에서는 단순히 이미지를 입력받고, 저장하는 과정이기 때문에 데이터 자체가 늘어난다고 해서, 연산 횟수가 많아지는 것은 아님
따라서, O(1),,, 즉, 상수 시간에 비례
test 단계에서는 하나의 test 이미지를 모든 학습 이미지들과 비교하여 L1 distance를 측정해야 함
따라서, 총 N번의 L1 distance 연산을 수행 O(N)
test time이 train time보다 더 걸린다는 것은 잘못된 것
왜냐하면, 우리는 학습에 소요되는 시간이 오래 걸리는 것은 괜찮지만,
해당 모델을 실제로 사용할 때, 시간이 많이 소요되는 것은 좋지 않음
단순한 예시로, 스마트폰 어플리케이션의 동작이 느린 것은 좋지 않음
KNN 알고리즘의 동작 방식
각 점은 학습 데이터이고, 점의 색은 클래스 레이블(카테고리)
모든 좌표들에 대해서, 각 좌표가 어떤 학습 데이터와 가까운지 계산(L1 distance)
NN 알고리즘은 공간을 나눠서 각 레이블로 분류
이 알고리즘의 문제는
초록색 영역 안에 노란 점이 존재한다는 것
가장 가까운 이웃만 고려하기 때문에, 이런 현상이 발생함
초록색이 파란색 영역을 침범하는 것도 문제
즉, 노이즈에 영향을 많이 받는 알고리즘
이러한 NN 알고리즘의 문제를 해결하기 위해서, KNN 알고리즘이 탄생
KNN 알고리즘은, 가장 가까운 이웃을 하나만 보는 것이 아니라, K개의 이웃을 이용하여 투표를 통해 최종 결과를 예측을 하는 방식
K 값이 증가할수록, 앞서 NN 알고리즘에서 발생한 문제들이 해결되고, 각 영역들의 경계가 부드러워지는 것을 확인할 수 있음
즉, KNN 알고리즘은 NN 알고리즘보다 노이즈에 강건한 알고리즘이라고 할 수 있음
따라서, KNN 알고리즘을 사용할때는 1보다 큰 K 값을 선정해야함
실제 KNN 알고리즘을 적용하여 이미지 분류를 한다면, K가 1일때보다, 더 좋은 결과를 얻을 수 있을 것
이미지 간의 차이점, 유사성을 어떻게 측정하고 비교할 것 인지?
기존에는 L1 distance를 이용했음
이는 픽셀 간 차이 절대값의 합
feature들이 개별적인 의미를 가지고 있다면, L1 distance가 잘 어울림
다른 방법으로는 L2 distance가 존재
이는
제곱 합의 제곱근
을 거리로 이용하는 방법
feature 간의 실질적인 의미를 잘 모르는 경우에는, L2 distance가 잘 어울림
어떤 거리 척도를 사용하느냐에 따라, 결정 경계의 차이가 있음을 확인할 수 있음
L1 distance의 경우, 좌표 시스템에 영향을 받기 때문에, 결정 경계가 좌표축에 영향을 받는 것을 확인할 수 있음
L2 distance의 경우, 좌표축의 영향을 받지 않고 결정 경계를 만들기 때문에, 조금 더 자연스러움
KNN을 사용하려면, 반드시 선택해야하는 항목들이 존재
K, 거리 척도(L1, L2) 등을 어떻게 선택하느냐에 따라서, 예측값이 바뀔 수 있음
이 값들을 어떻게 선정해야하는지??
실제로 이런 값들을 하이퍼 파라미터라고 함
일반적으로 파라미터(혹은 모델 파라미터)라고 부르는 값들은, 해당 모델의 학습 단계에서 업데이트가 되는 값들을 의미 (모델의 가중치)
하이퍼 파라미터는 모델의 학습을 통해 업데이트가 되는 값이 아닌, 학습 전에 우리가 선택을 해야하는 값들 (K, 거리척도, learning rate 등)
그렇다면, 하이퍼 파라미터 값은 어떻게 정해야 하는가?
가장 간단한 방법은, 다양한 하이퍼 파라미터 값을 시도해보고, 가장 좋은 값을 찾는 방법
그렇다면, 어떤 하이퍼 파라미터를 선택해야 하는가?
먼저, 학습 데이터의 정확도와 성능을 최대화하는 하이퍼 파라미터를 선택하는 방법
절대로 해서는 안되는 방법
이렇게 학습을 하면, 처음보는 새로운 데이터에 대해서는 좋은 성능을 보일 수 없음
학습 데이터를 얼마나 잘 맞추는지가 중요한 것이 아니라, 학습된 모델이 새로운 데이터를 얼마나 잘 예측하느냐가 중요
다음으로, 전체 데이터셋을 학습 데이터와 테스트 데이터로 나눠서 사용하는 방법
학습 데이터로 다양한 하이퍼 파라미터 값들을 학습시키고, 테스트 데이터를 이용해 확인한 후, 하이퍼 파라미터를 선택하는 방법
즉, 모델 학습은 학습 데이터로 진행하고, 그 중에서 테스트 데이터를 가장 잘 예측하는 모델을 선택하는 방법
이 또한, 나쁜 방법,,, 단순히 테스트 데이터만 잘 푸는 하이퍼 파라미터를 선택한 것일 수도 있음
가장 일반적인 방법은, 전체 데이터셋을 train, validation, test 셋으로 나누는 방법
training set을 이용하여 다양한 하이퍼 파라미터를 학습
이후 validation set으로 모델을 검증
이때, validation set에서 가장 성능이 좋았던 하이퍼 파라미터를 선택
최종적으로 선정된 모델의 성능을 test set을 이용하여 측정
이 수치가 최종 모델의 성능 수치
또 다른 방법은, 크로스 벨리데이션(교차 검증)
이 방법은 데이터셋이 작을 때, 많이 사용
먼저, 테스트 데이터셋을 정함 (마지막에만 사용)
training set을 여러 부분으로 나눠줌
이후, validation set을 그림과 같이 번갈아가면서 지정 (K-fold 교차 검증)
training set 학습 → validation set 검증 → validation set 재 지정 → training set 학습 → validation set 검증 → validation set 재 지정 → …
실제 이미지 분류에서는 KNN classifier를 잘 사용하지 않음
첫 번째 이유는, KNN이 predict 과정에서 느리다는 것
다음으로, L1, L2 distance가 이미지 간의 거리(유사도)를 측정하기에는 적절하지 않다는 것
해당 이미지들은, 일부러 같은 L2 distance를 갖도록 만든 이미지들인데, 중요한 점은 실제로 이미지들 간의 차이를 L2 distance로 측정하는 것은 좋지 않다는 예시
또 다른 문제는, 차원의 저주
KNN 알고리즘은 데이터셋을 이용하여 공간을 나누는 알고리즘
KNN이 잘 동작하려면, 그만큼 충분한 데이터셋이 필요함
데이터셋이 충분하지 않다면, 가장 가까운 이웃으로 판단되는 데이터가 실제로는 엄청 거리가 먼 데이터일 수도 있음
그렇다면, 이미지를 제대로 분류할 수 없음
따라서, 학습 데이터가 많아야 함
만약 학습 데이터의 차원이 높다면? (즉, 어떤 정수 값이 아닌, 3차원의 컬러 이미지라면?)
여기서 말하는 차원은, 간단하게 변수의 갯수라고 생각하면 쉬움
차원이 높을 수록, 학습에 필요한 데이터셋이 기하급수적으로 많아짐
이렇게 많은 양의 학습 데이터를 모으는 것은 불가능 (비용도 많이 들고, 시간도 오래 걸림)
Linear classification에 대해서 알아보자
Linear classification은 아주 간단한 알고리즘
NN과 CNN 기반의 알고리즘
Neural Network를 레고 블럭에 비유
레고 블럭을 쌓아서 만드는 것 처럼, CNN을 구성할 때, 여러가지 layer를 쌓아서 만듦
이후에 여러가지 layer를 살펴보겠지만, 가장 기본이 되는 딥러닝 알고리즘이 Linear classifier
Image Captioning
이미지를 인식하기 위해서, CNN이라는 것을 사용
그 이후에 자연어를 인식하기 위해서 RNN을 사용
즉, Image Captioning은 CNN과 RNN을 블럭처럼 붙혀서 한번에 학습시키는 방법
여기서 말하고자 하는 것은, Neural Network가 레고 블럭처럼 여러가지를 결합시켜서 사용이 가능함
그리고, Linear classifier가 기본 레고 블럭 중 하나
앞서 CIFAR-10 데이터셋을 이용하여 KNN 알고리즘을 학습했음
Linear classification에서는 KNN과는 다른 접근 방법을 이용
밑시딥에서 본 인공 신경망을 생각하면서 보면 좋음
입력 이미지 X가 주어짐
이 이미지를 input으로 받는 함수 f(x)를 만들 것인데,
이때 사용하는 가중치는 W로 표기
f(x) 함수를 통해 출력된 output은 10개의 카테고리에 대한 각각의 스코어 (고양이, 개, 사슴, 개구리 등등)
만약, 고양이 스코어가 높다는 것은, 입력 이미지가 고양이일 확률이 크다는 것을 의미
앞서 살펴본 KNN과의 차이점은, KNN은 파라미터가 존재하지 않음
즉, KNN은 모든 학습 데이터를 기억하고, 거리 척도를 이용하여 input image와 유사한 학습 데이터를 출력하고, 최종 결과를 예측
그러나, Linear classifier는, 모델 학습 과정에서 training data의 정보를 요약하고, 요약된 정보를 파라미터 W에 모아둠
이런 과정을 거친다면, predict 단계에서는 더 이상 training set이 필요하지 않음
즉, 딥러닝은 함수 F의 구조를 잘 설계하는 일
가중치 W와 데이터 X를 어떻게 조합하느냐 (함수를 어떻게 구성하느냐)는 여러가지 방법이 존재하겠지만, 가장 간단하게 생각할 수 있는 방법은 W와 X를 곱하는 것
이것이 바로 Linear classification
계산 과정은 행렬곱 연산
최종적으로 계산 후에, 10개의 레이블에 대한 스코어를 출력
이 스코어는, 해당 이미지가 각 레이블에 해당할 점수(혹은 확률)이 얼마인지를 확인하는 척도
그렇다면, 가중치 W가 의미하는 것은 무엇인가?
가중치 행렬 W를 각 행별로 시각화해보면, Linear classifier가 이미지를 인식하기 위해서 어떤 것들을 중점적으로 보는지 대략적으로 확인할 수 있음
즉, 각 클래스에 속한 이미지들이 갖는 공통된 특징을 추출하고, 이를 바탕으로 이미지를 분류한다는 것을 예측할 수 있음
단, Linear classifier의 문제 중 하나는, 각 클래스에 대해서 단 하나의 템플릿만 학습한다는 것
같은 클래스여도, 이미지에 따라서 다양한 특징이 존재할 수 있는데, 이를 평균화시키기 때문에, 이미지를 분류하기 위한 하나의 탬플릿만 존재
이 문제는 말 이미지에서 확인할 수 있음
Linear classifier의 또 다른 관점으로 해석
이미지를 고차원의 공간에서 한 점으로 보는 방법
이미지를 고차원 공간의 한 점으로 본다면,
Linear classifier는 각 클래스를 구분시켜주는 선형 결정 경계를 그어주는 역할
즉, 그림에서 파란색 선을 기준으로, 비행기 이미지와 아닌 이미지를 구분
이렇게 고차원 공간의 하나의 점 관점에서 해석할 때, Linear classification이 갖는 문제를 확인할 수 있음
위의 3가지 예시를 하나의 직선으로 구분할 수 없음 (밑시딥에서 XOR 구분 예시)
즉, Linear classifier 모델이 해결할 수 없는 문제들이 있다,,, → 이 문제를 해결하기 위해 고안된 방법들은 차차 다룰거임
Lil Park
코딩하는 물리학도
팔로우
다음 포스트
[CS231n] Lecture 3: Loss Function and Optimization 정리
0개의 댓글
댓글 작성