본문 바로가기
컴퓨터/Computer Vision

[Vision] CS231n 2-1 kNN(최근접 이웃), L1 distance..

by IT황구 2021. 1. 13.
728x90
반응형

2강을 듣고 복습 하는데 시간이 많이 걸렸다.

심지어 선형 분류는 다음 포스팅에 쓸것이다.

참고로 처음에 듣고 이해가 잘 안가서

https://cs231n.github.io/classification/

뭐 강의노트 같은것 같은데 여길 참고했다. (아래 쓰는 내용들은 다 강의노트 기반이다)

** 아직 학부 수업을 안들어서 배운것을 confirm 해줄 사람이 없습니다. 따라서 틀릴 수 있습니다. (다름 X, wrong)

이런것들은 추후에 배워가면서 수정할 수 도 있으니 댓글로 알려주시면 감사하겠습니다.

 

Image Classification

이미지를 픽셀들의 배열로 표현하고 거기에 label을 할당하는 작업.

사람이 하는 이미지 분류는 그냥 눈으로 보고나서 시각적으로 받아들여진 물체를 나누면 된다.

하지만 컴퓨터는 인간처럼 눈으로 볼 수 없다.

컴퓨터는 width, height, color channel(RGB) 로 된 3가지 값으로 본다.

출처 : CS231n ppt

이런 고양이 사진도 viewpoint가 다르거나 (정면이 아닌 측면에서 보는것 등)

illumination (빛) , Deformation(변형), Occlusion(가려지는것), Background clutter(배경색에 의해서 합쳐져 보이는것), intraclass variation(같은 고양이어도 다른 종들) 에 의해서 구분하기가 힘들어지게 된다.

그럼 이런것을 어떻게 처리할까..?

Data-Driven Approach

데이터 기반 접근방법

label이 있는 dataset들을 모아서, ML을 이용해서 classifier(분류기)를 학습시킵니다.

그다음 classifier를 이용해서 새로운 이미지를 평가합니다.

이미지 분류 파이프라이닝 을 보면

Input -> learning -> Evaluation

input : N개의 이미지 set에서 label이 붙은 K개의 각각 다른 클래스(카테고리)

이 데이터들을 training set으로 이용합니다.

Learning : 모든 클래스들이 어떻게 생겼는지 training set을 이용해서 학습시킵니다.

Evaluation : test set을 이용해서 이 image의 label이 뭔지 predict 시켜봄으로써 classifier의 성능을 테스트합니다.

결과가 나오면 예측한것과 실제 이미지를 비교합니다.

여기서 실제 이미지는 ground truth(실측 자료) 라고 표현합니다.

그럼 분류기는 어떤것들이 있을까??

 

Nearest Neighbor Classifier (최근접 이웃 분류기)

픽셀기반 분류

결론부터 말하자면

test set을 평가한 후에 가장 비슷한 사진들을 순서대로 test set옆에 나열한다.

즉 가장 가까울수록 유사한 이미지라고 판단하는 것이다.

L1 distance, L2 distance를 이용해서 구할 수 있다.

일단 이 NN 방법은 추후 배울 CNN과는 연관이 없다.

그리고 매우 드물게 사용되는 방법이다.

그러면 이걸 왜 알려줬을까?

이미지 분류 문제에대해서 가장 기본적 접근을 하는 idea를 제공하기 때문이다.

dataset은 예시로 나온 CIFAR-10 이라는것을 사용한다.

32*32 pixel로 이루어진 10개의 클래스들이 존재한다.

training set 5만장, test set 1만장이 존재한다.

* training set: ML을 이용해서 학습할 데이터들.

* test set: 만들어진 분류기를 test할 data. 최후에 딱 한번만 test 해야한다.(중요)

이때 test는 L1 distance와 L2 distance를 이용하는데

두개의 식은 저렇게 된다.

L1은 1-norm , L2는 2-norm 이랑 같다. 지난번 선형대수때 포스팅 한 내용을 보면 와닿을 것 같다.

https://blog.naver.com/rbals0445/222197324297

 

[선형대수] 1. 선형대수는 어디에 쓰이는지, 내적활용

안녕하세요!!​인공지능을 위한 선형대수를 수강하면서 어떤 부분들이 선형대수에 사용되는지 궁금했습니다...

blog.naver.com

그렇다면 저것들을 어떻게 test할때 사용하는가??

L1 distance를 예시로 들면 이렇게 픽셀화 된 test 이미지를 training image랑 차이를 구해서

그 모든 차들의 합을 구하는 형태로 사용한다.

차이가 크면 ? 두개는 더 많이 다른 이미지이다

차이가 0이면 같은 이미지이고 0에 근접할수록 비슷한 이미지라는 뜻이다.

알고리즘 수업때 교수님이 manhattan distance에 대해서 얘기했었는데 굉장히 반가운 사진이었다.

 

L1 distance vs L2 distance

manhattan vs euclidean

두개의 방법은 언제 쓰면 좋을까?

L1 : pixel 값들의 차이가 클 때 좋다.

L2 : pixel 값들의 차이가 미미할때 좋다.

L2가 좀 더 벡터값들의 차이에 민감하게 반응한다고 나와있다.(unforgiving)

/*

그래서 L1이 왜 클 때 좋냐고 물어본다면 ..

일단 결론밖에 모르겠다. 너무 하나하나 세세히 보면 진도를 아예 못나갈 것 같아서 일단은 결과를 알고있으려고 한다.

(다음에 다시 볼 때 숙제로 남겨두기로..)

*/

L1, L2 norm은 p-norm 중에 가장 많이 쓰이는 norm이다.

https://planetmath.org/vectorpnorm

 

 

여길 참고하면 되는데, 저번에 쓴 선형대수와 같은 내용이어서 이해하는데 좀 더 편했다.

 

k-Nearest Neighbor Classifier (kNN 분류기)

NN classifier보다 좀 더 품질이 좋은 결과를 얻기 위한 분류기.

NN 분류기는 아래 사진처럼 분류된 trainig set에서 가장 근접한 이미지를 찾는다.

NN의 단점은 뭘까??

저 사진처럼 최근접 이웃이 틀린거라면 misprediction을 하게 된것이다.

이런 misprediction을 줄이기 위해서 kNN을 사용하면 좀 더 정확한걸 찾을 확률이 올라갈 것이다.

top k개의 근접 이미지를 찾는것인데, 앞에서 배운 NN은 k=1 이라고 생각하면 된다. (맨 앞에것만 쓰니까)

그러면 k=5개면 최상위 5개의 이미지에서 가장 test image에 맞다고 생각하는것에 투표를 하는것이다.

k값을 높여줄수록 좀 더 outlier를 제거하는데 효율적이다.(맞을 확률이 좀 더 높아질 수 있다)

*outlier : 비정상적으로 벗어난것들. 예를들어 IQ 평균이 50이라고 가정하면 어떤사람만 300일때 그 사람을 제외시켜야 좀 더 정확한 값을 얻을 수 있는것처럼..

이 사진은 L2 distance를 사용한 분류기로 만든 decision boundaries(결정 경계)이다.

하얀색 지역은 모호하게 분류된 경우이다.(적어도 2개이상의 클래스들이 투표수가 같은경우)

NN에는 흰색 경계가 나올 수 없는 이유이기도 하다.

위의 사진을 보면 k=1일때(NN)는 outlier들을 처리하지 못해서 초록색 안에 노란색 섬(island)이 있다. 이런 것들이 incorrect prediction을 하게 만든다.

반면 k=5인건 이러한 irregulation(outlier 같은것들)이 생기지 않게 좀 더 부드럽게 만들어준다.

여기 사진엔 나오지 않지만 test data를 좀 더 일반화 할 수 있다고 한다.

사진을 보면 흰색 바탕이 있다. 이런것들은 (red 2표,green 2표, blue1표) 이런식으로 동률의 투표가 있는 경우에 저런식이다.

이렇게 보면 kNN을 쓰는것이 실제로 거의 무조건 좋은것 같다는걸 눈으로 봤다.

그러면 K를 몇으로 하는게 가장 좋을까? 무조건 높으면 좋을까??

이어서 K를 어떻게 설정하면 좋을지에 대해서 배운다.

보는데 내용들이 굉장히 짜임새 있었다..

 

Hyperparameter 튜닝을 위한 Validation Set(검증 셋)

Hyperparameter는 무엇이고 validation set은 무엇일까..

출처 : cs231n

위에서 K를 어떻게 설정할지? distance는 어떤걸로 쓸지?? 이런걸 골라야 했다.

distance도 L1, L2외에도 여러 방법이 있다. 내적(dot product) 을 하는것도 있고..

이러한 선택들을 Hyperparameter라고 한다. 어떤 값을 고를지, 어떤 알고리즘을 쓸지..

이런 하이퍼파라미터는 data로부터 학습된 머신러닝 알고리즘에서 나타난다.

they come up very often in the design of many Machine Learning algorithms that learn from data

어떤 값을 선택해서 세팅할지는 항상 명확하지 않다.

가장 naive한 방법은 그냥 k를 여러값을 넣어보면서 돌린 후에 그 결과를 토대로 k를 구하는것이다.

좋은 아이디어고 실제로 그렇게 하지만 매우 조심해야한다고 한다. 이유가 뭘까

hyperparameter를 수정 할 목적으로 test set을 절대 사용해서는 안된다고 한다.

이론상(ideally) ML 알고리즘을 만들때 test set을 알고리즘 테스트때 딱 한번 외에는 절대 사용해선 안될 소중한 자원으로 생각해야 한다. test set에 맞추기위해서 hyperparameter를 수정하면 실제 모델을 배치했을때 상당한 성능 감소가 나올 수 있다.

-> 테스트 셋에서만 굴러가게 하지 말고 범용적인걸 고려해야 한다.

*Overfit (과적합)

test set에다가 hyperparameter를 맞추는걸 overfit 했다고 한다.

이걸 다른관점으로 보면 test set을 training set처럼 활용한것이다.

따라서 실제로 모델을 배치했을때 나올 accuracy 보다는 굉장히 optimistic한 값이 나올것이다. 왜??

-> 기출문제를 미리 풀어서 시험을 보면 당연 점수가 높게 나온다. 하지만 새로운 시험지를 받았다면?

당연히 점수가 이전보다 낮게 나올 수 밖에 없다.(신유형)

따라서 알고리즘을 평가하는 마지막에만 test set을 사용해야 test set이 우리가 만든 classifier의 일반화된 성능을 평가하는 척도,대용품(proxy) 이 될 것이다.

Idea 1 은 내 dataset에서만 잘 되는 k를 구하면

새로운 dataset에서 성능하락이 나올 수 밖에 없다.

idea 2는 train을 하고 test하면서 hyperparameter를 맞추면 (위에 말한것처럼) 알고리즘이 새로운 data에서 어떻게 작동하는지 알 수 없다.따라서 이것 또한 성능 하락이 날 수 밖에 없다.

idea 3은 train data를 train과 validation set(검증 셋) 으로 나누어서 사용하는 것인데 아래에서 내용을 기술할 것이다.

ex) 5만장의 CIFAR-10 을 예시로 들면

49000장은 training set, 1000장은 validation set으로 사용한다.

*validation set (검증 셋)

validation set은 hyperparameter를 설정하기 위한 fake test-set으로 사용한다.(필수적)

test 하기 전에 미리 테스트를 해보는 set 이라고 생각된다.

===========END===========

 

너무 길면 보기가 싫어서..

다음 포스팅에는 교차검증 부터 이어서 쓸 것이다.

training set이 적을 경우에 사용하는 방법인데 좀 더 정교한 값을 낼 수 있다.

번역은 정교한(sophisticated)인데 내 생각에 정교하다는건 .. 음 .. 좀 더 좋은 결과를 낼 수 있다고 생각했다.

실제로 각 fold마다 accuracy를 보여주고 거기서 최고 높은 값을 제시하는 k를 고르면 되기때문이다.

감사합니다.

blog.naver.com/rbals0445/222204854481

 

[Vision] CS231n 2-1 kNN(최근접 이웃), L1 distance..

2강을 듣고 복습 하는데 시간이 많이 걸렸다.심지어 선형 분류는 다음 포스팅에 쓸것이다. ​참고로 처음에...

blog.naver.com

여기서 원래 글 참고해도 좋다.(내가쓴것)

728x90
반응형