강의 내용이 많기 때문에 두번에 나누어 정리하도록 한다.
우리가 일상속에서 접하는 이미지를 컴퓨터는 숫자의 메트릭스(행렬)로 인식한다.
1. 컴퓨터가 이미지를 인식하는데 있어 방해가 되는 요소들
- Illumination(밝기): 밝기가 너무 밝거나 어두운 경우 이미지의 식별이 어려울 수 있다.
- Deformatin(기형): 물체의 형태가 다양할 수 있다. 고양이의 경우 유연하기 때문에 여러가지(?)자세를 취할수 있기 때문에 고양이임을 식별하기 어려울 수 있다.
- Occlusion(폐색,폐쇄): 물체가 가려져있는 경우 물체를 식별하기 어렵다.
- Background Clutter(배경의혼잡): 배경과 물체의 구분이 어려운 경우, 배경이 너무 난잡한경우 물체 식별이 어렵다.
- Intraclass Variation(클래스내의다양성): 한가지 클래스(고양이)안에서도 그 모습이나 모양, 크기가 다양할 수 있어서 이런 다양한 개체를 하나의 클래스로 분류하는것이 쉽지 않다.
2. Image Classifier(이미지 분류기)함수의 기본적인 형태
하나의 이미지를 파라미터로 받아서 해당 이미지가 어떤 클래스에 속하는지(class label)을 리턴해주는 형태를 취한다.
def classify_image(image):
# some magic here
return class_label
3. 이미지 분류를 위한 기초적인 시도
고양이 이미지를 분류하기 위해서, 먼저 이미지에서 에지를 추출하고, 코너포인트(꼭짓점들)들을 찾은 뒤 해당 코너포인트와 에지의 위치를 이용해서 다른 고양이 이미지들과 비교, 고양이인지 아닌지를 식별하는 시도를 해볼수 있다. 그러나 이는 고양이가 아닌 트럭이나 자동차같은 다른 종류의 물체를 식별해야하는 경우 각 물체마다 전부 엣지와 코너포인트에 대한 정보를 따로따로 저장해야하는 번거로움이 있기 때문에 현실적으로 실행하기 어렵다.
4. 해결책: Data-Driven Approach
이를 해결하기 위해 Data-Driven Approach라는 방법을 사용한다. 이 방법은 3단계로 구성된다.
- 레이블이 포함된 이미지 데이터셋을 수집하기
- 머신러닝을 이용, 분류기를 학습시키기.
- 새로운 이미지(학습에 사용되지 않은)에 훈련된 분류기를 사용해서 이미지의 클래스를 분류해보기.
이 과정은 2가지 함수를 통해 수행된다.
1. 입력으로 이미지와 레이블(정답)을 받아서 모델(특정 종류의 분류기)을 리턴해주는 함수.
def train(images, labels):
#Machine learning
return model
2. 만들어진 모델과 새로운 이미지를 이용해서 해당 이미지의 레이블을 리턴해주는 함수.
def predict(model, test_image):
#Use model to predict labels
return test_labels
5. Example Dataset(머신러닝에 가장 흔하게 사용되는 유명한 데이터셋): CIFAR10
10개의 클래스(종류)로 구성되며 5만개의
트레이닝 이미지, 1만개의 테스트 이미지를 보유하고있는 데이터셋이다.
6. First Classifier: K-Nearest Neighbor
이 분류 방법은 매우 기초적인 방법으로, 먼저 학습데이터들의 정보를 저장하는것부터 시작한다. 하나의 데이터와 그 레이블을 전부 기억해두고, 새로운 샘플데이터(테스트데이터)가 들어왔을때, 이 샘플 데이터와 가장 거리가 가까운 k개의 이웃 데이터의 레이블들을 살펴본 후, 가장 많은 레이블을 새로운 샘플데이터의 레이블로 지정하는 방법이다.
Hyperparameters: methods to estimate distance(L1 or L2), K
*Hyperparameter: 모델을 학습시키기 위해 프로그래머가 직접 정해주어야 하는 요소들. 결국 적절한 hyperparameter를 찾는것이 모델을 학습시키는 최종 목적이다.
1. methods to estimate distance(L1 or L2)
* 이 강의에서는 거리를 측정하기 위한 2가지 방법을 제시한다.
(1) 멘하탄 거리(Manhattan distance)
input sample이 각각 개별적인 의미를 가지는 경우에 사용하면 좋은 거리측정방법이다. 예를들어 한 sample이 회사원에 대한 정보를 포함하고 있다면 각 feature(attribute)가 연봉, 근속년수 등에 대한 정보를 포함하는 경우를 생각해볼 수 있다. 이 거리 측정방법은 어떤 coordinate system을 사용하는지에 따라 결과가 달라진다.
(2) 유클리디안 거리(Euclidian distance)
1과 정반대의 특징을 가진다. 각 sample의 attribute가 특별한 의미를 가지지 않는 경우에 사용하며, 어떤 coordinate system을 사용하던 결과에 영향을 받지 않는다.
2. k
위의 이미지는 k값에 따른 분류 결과를 나타낸다. k값이 커짐에 따라 분류 성능이 향상되는것을 확인 할 수 있다. k=3일때 k=1의 결과에서 보이는 Island problem(녹색 영역 가운데에 뜬금없이 노란색 영역이 있는 경우)가 사라졌고, k=5일때는 k=3일때 남아있던 finger problem(경계가 울퉁불퉁 마치 손가락처럼 생긴 경우)가 사라진 것을 확인할 수 있다.
7. 적절한 Hyperparameter 찾기: Data를 분할하는 4가지 방법
적절한 하이퍼파라미터를 구하기 위해 나에게 주어진 데이터를 어떤 식으로 활용하는것이 가장 적절할지 생각해보아야 한다.
#Idea1: 첫번째 아이디어는 주어진 데이터를 모두 training데이터로 활용하는 방법이다. 이 방법은 사용하지 않는다. 모델의 정확도를 측정하는것이 불가능 하므로.
#Idea2: 두번째 아이디어는 주어진 데이터를 train, test데이터로 나누어서 train데이터를 이용해서 모델을 학습시킨 후 test데이터를 이용해서 이 모델의 성능을 평가하는 방법이다. 이 방법을 사용하게 되면 프로그래머는 모델의 성능을 올리기 위해 파라미터를 조정하게 되는데, 이럴경우 해당 test데이터에 최적화된 하이퍼파라미터를 찾게 되어버린다. 새로운 데이터가 아닌 test데이터에만 최적화된 하이퍼파라미터를 구하게 되는 것이다.
#Idea3: 마지막 방법은 주어진 데이터를 train, validation, test 세가지의 데이터로 분류하는 방법이다. train 데이터를 이용해서 모델을 학습시키고, validation을 통해 모델의 성능을 평가한다. 그 다음, 이 validation데이터에 대해 모델의 성능을 올리기 위해서 하이퍼파라미터를 조정한다. 여기까지는 두번째 아이디어의 방법과 일치한다. 그러나 그다음, 이렇게 구한 하이퍼파라미터를 가지고 test데이터를 통해 모델의 성능을 한번 더 평가한다는데서 두번째 아이디어와 차이가 있다. 2번의 테스트과정을 거치게되는 셈이다. 이때, test데이터는 프로젝트 가장 마지막에 사용하는것이 좋다. 마찬가지로 테스트데이터에 최적화된 하이퍼파 라미터를 구하게 되는것을 방지하기 위해.
#idea4: 그리고 마지막 방법은 tain데이터를 여러개의 fold로 나누어서 각 fold를 번갈아가며 validation data로 지정하는 방법이다. 이렇게 되면 하나의 validation데이터에 최적화된 파라미터를 찾게되는 오류로부터 보다 자유로울 수 있고, 정확도가 올라간다. 이를 모델이 더 robust하다고 표현한다. 하지만 이 방법은 딥러닝에서 잘 사용하지 않는데 이렇게 하게되면 시간이 매우 오래걸리기 때문이다. 따라서 데이터셋의 크기가 작은 경우, 이 방법을 이용하는것이 좋다.
하이퍼파라미터에 따른 모델의 성능(정확도)이다. k값에 따라서 정확도의 차이가 발생하는것을 확인 할 수 있다. #idea4를 활용해서 각 fold를 validation데이터로 지정했을때, test데이터를 통해 나온 점수를 점으로 표시하였다. 파란 선은 각 성능의 평균을 나타낸다.
8. 실제 이미지 분류에서 K-Nearest Neighbor를 사용하지 않는 2가지 이유
1. 위의 슬라이드를 보면 4개의 이미지가 있는데, 가장 왼쪽에 있는것이 원본이미지이다. 그리고 오른쪽 3개는 이 원본 이미지에 변형을 가한 이미지인데 K-Nearest Neighbor방법을 사용하는 경우 이 세 이미지의 거리(L2방법을 사용한 경우)가 모두 동일하다. 따라서 이 경우 이미지를 제대로 식별하는데 어려움이 있을 수 있으므로 이 방법은 사용하지 않는다.
2. 또한, 가장 가까운 이웃을 찾기 위해서는 말 그대로 "가까운"이웃이 필요하다. 아무리 가장 가까운 이웃이라도 절대적인 거리가 멀다면 가까운 이웃이라고 보기 어렵기 때문이다. 따라서 test데이터의 레이블을 결정하기 위해서는 그림과 같이train 데이터가 고르게 분포해야 한다. 이를 위해서는 그러나 꽤나 많은 수의 데이터가 필요하다(to desely cover the space). 또한, 차원이 커질수록 필요한 데이터의 수는 기하급수적으로 증가한다. 이러한 단점 때문에 K-Nearest Neighbors방법은 사용되지 않는다.
'바닥부터 시작하는 인공지능' 카테고리의 다른 글
[CS231N] Lecture3: Loss Functions and Optimization(1) 정리 (0) | 2021.04.28 |
---|---|
[CS231N]Lecture2: Image Classification Pipeline(2) 정리 (0) | 2021.04.20 |
[수학공부] 인공지능에 필요한 미적분 요약 정리 /Essential Calculus 솔루션/ Essential Calculus 2nd Edition (2) | 2021.02.04 |
[수학공부]인공지능을 위한 수학 총정리/ 요약본 다운로드 (34) | 2021.02.04 |
3분만에 정복하는 캐글(Kaggle) : 머신러닝 입문 (0) | 2019.09.02 |