cs231n을 3월 ~ 5월 정도에 걸쳐 한번 정리를 쭉 했으나, 중간중간에 이해를 완벽하게 하지 못하고 넘긴 부분들이 많은 것 같아 학기가 시작하기 전에 다시 한번 싹 정리하는 것을 목표로 하려고 합니다.

 

 

슬라이드를 과도하게 많이 집어넣으면 글 하나당 내용이 너무 많아지는 것을 방지하기 위해서 필요 없다고 생각되는 일부 슬라이드는 제외하면서 작성하려고 합니다.

 

 

또한, lecture를 하나씩 정리할 때마다, 글의 마지막에 해당 lecture를 정리하였다면 바로 대답할 수 있어야 하는 내용들을 Quiz 형식으로 정리해서 만들어보고자 합니다. 이를 통해서 해당 강의의 내용을 내가 잘 이해하고 습득하였는지 확인해보실 수 있을 것이라고 생각합니다. 

 

 

저도 이 분야의 전문가는 아니라서, 어떤 게 가장 중요한지는 명확하지 않아 덜 중요한 내용이 Quiz로 출제될 수 있습니다.

 

 

 

오늘 다룰 내용은 두 번째 강의에 해당하는 Image Classification pipeline에 대해서 정리해보려고 합니다.

 

 

Computer Vision에서, 중요한 task인 Image Classification은 특정한 input image data가 주어졌을 때, 이미 정해져 있는 label 중에서 어떤 label에 해당하는지 구별하는 task입니다. 위에 나온 슬라이드의 경우는, 고양이 사진이 주어졌기 때문에, 고양이라는 label로 구분하는 것이 요구됩니다.

 

 

 

 

인간의 입장에서, 고양이 사진을 보고 고양이로 판단하는 것은 전혀 어렵지 않은 문제입니다. 하지만 컴퓨터가 Image를 분류하는 것은 매우 어려운 일인데, 이는 컴퓨터 입장에서 보는 것이 고양이 사진이 아니라, 거대한 size를 가진 숫자들의 matrix 이기 때문입니다. 슬라이드의 오른쪽에 보이는 것처럼, 실제로 컴퓨터는 0부터 255로 구성되어있는 matrix를 보게 됩니다.

 

이렇게, 컴퓨터가 실제로 보고 있는 pixel 값과, 고양이라고 하는 의미상 아이디어 간에는 큰 gap이 존재하게 되는데, 이를 'Semantic Gap'이라고 설명합니다. 

 

 

 

 

 

 

그렇다면, 컴퓨터가 Image classification을 하면서 어떠한 어려움을 겪게 되는지를 강의에서 설명하고 있습니다.

 

 

첫 번째 어려움은 바로 viewpoint variation입니다. 고양이가 얌전히 있다고 생각하였을 때, 만약 카메라가 움직이게 되면 image data matrix 안에 있는 숫자들은 바뀌지만 고양이라고 하는 label은 그대로 유지됩니다. 따라서 우리가 사용하게 될 알고리즘은 이러한 상황에도 강건하게 작동할 수 있어야 합니다.

 

 

 

 

 

 

 

두 번째로는 밝기와 관련된 어려움으로, 밝은 곳에서 찍었을 때와 어두운 곳에서 찍었을 때 모두 고양이로 분류할 수 있어야 합니다.

 

세 번째로는 자세와 관련된 어려움으로, 가만히 앉아있는 자세뿐 아니라, 누워있거나 다른 자세로 앉아있는 경우에도 고양이로 분류할 수 있어야 합니다.

 

이외에도, 고양이의 신체 중 일부가 가려져 고양이의 일부만 보고도 고양이로 분류할 수 있어야 한다거나, 혹은 고양이의 주변 배경이 고양이와 유사할 때도 고양이로 분류할 수 있어야 합니다.

 

그리고 Intraclass variation이라고 하는 어려움도 존재하는데, 이는 같은 class 여도 그 안에서 차이가 있다는 의미입니다. 즉 고양이들도 모두 똑같이 생긴 것이 아니라, 생김새나 모양, 크기가 다를 수 있는데 이런 경우에도 모두 고양이로 분류할 수 있어야만 합니다.

 

 

 

 

 

숫자로 구성된 list를 분류하는 것과는 다르게, 물체들을 어떻게 인식할지에 대한 명백하고, 직관적인 알고리즘이 존재하지 않습니다. 따라서 image classification은 어려운 문제라고 설명합니다.

 

 

 

 

 

 

그렇다면, 과거 사람들은 이 문제를 그냥 포기했을까요? 그렇지 않습니다. 이 문제를 어떻게든 풀기 위해 다양한 연구들이 진행되어왔습니다. 과거에 사용했던 방법 중 하나는 다음과 같은 방식으로 물체를 분류했습니다. 먼저 사진에서 edge를 찾습니다. (edge는 가장자리라는 뜻으로, 오른쪽의 사진을 보시면 대략 이해할 수 있을 것입니다.) 그러고 나서 모든 코너와 boundary들을 분류하고, 3개의 선이 만나면 코너이고, 귀에는 코너가 몇 개이고... 등등 이런 식으로 어떤 사물을 인식할 수 있는 규칙을 만든 것입니다. 아마 물체마다 가지고 있는 특징들이 있으니, 이런 방법을 통해 해결하려고 한 것 같습니다. 

 

하지만 이러한 방식은 잘 작동하지 않았습니다. 일단 매우 불안정합니다. 방금 설명했지만, 같은 고양이일지라도 포즈가 다르거나, 조명이 다르거나, 혹은 고양이의 일부만 가지고도 고양이를 구별해야 하는데, 이렇게 규칙 기반으로 하게 되면 해당 규칙에서 벗어난 경우는 고양이로 분류할 수 없을 것입니다. 그리고 우리가 구분해야 하는 모든 사물에 대해서 각각 이러한 규칙을 작업해야 한다는 문제점이 있었습니다. 구분해야 하는 사물의 종류가 많다면, 이는 매우 어려운 일이겠죠?

 

이처럼 기존 방법은 세상에 있는 모든 사물들을 분류하기에는 한계점이 명확했기 때문에, 사람들은 세상에 있는 모든 사물들을 분류할 수 있는 어떤 새로운 방법을 찾고 싶어 했습니다.

 

 

 

 

 

그렇게 해서 나오게 된 방법이 바로 Data-Driven Approach입니다. 각 사물에 대해서 규칙을 만드는 것이 아니라, 데이터를 기반으로 학습을 하는 방법을 생각해낸 것입니다.

 

먼저, 이미지와 label로 구성된 dataset을 모은 후, 이를 이용해서 사물을 분류할 수 있는 classifier를 학습시켰습니다. 그러고 나서, 새로운 이미지에 대해서 이 classifier가 사물을 분류하게 됩니다.

 

여기서 classifier가 가지고 있는 의미에 대해서 조금 더 생각해볼 필요가 있는데요, classifier는 다양한 데이터들을 받아들여서 이를 어떤 방법으로 요약하고, 여러 가지 사물들을 어떻게 인식할 것인지에 대한 지식을 요약하는 모델이라고 생각하시면 됩니다. 기존의 방법론은 사람이 직접 손수 각 사물을 어떻게 인식할 것인지에 대한 지식을 규칙을 기반으로 만들어준 것이지만, Data-driven approach에서는 데이터를 기반으로 모델이 이러한 지식을 직접 요약한다는 점에서 차이가 있다고 생각할 수 있습니다.

 

Data-Driven approach에서는 train과 predict 총 두 가지로 모델이 나눠지게 되는데요. train의 경우는 input으로 이미지와 label을 받게 되고, 이 데이터들을 기반으로 여러 가지 사물들을 어떻게 인식할 것인지에 대한 지식을 요약하는 모델이 output으로 나오게 됩니다. classifier라고 하는 용어로 위에서는 소개되었죠.

 

predict는 사물을 분류할 수 있는 model과 분류할 이미지인 test_image를 input으로 받게 되고, model을 이용하여 분류할 이미지인 test_image들의 label을 예측한 결괏값인 test_labels를 output으로 내보내게 됩니다. 즉, Data-Driven approach에서는 '학습'과 '예측'이 분리되어 있음을 나타내고 있습니다.

 

 

 

 

 

첫 번째로 소개할 classifier는 Nearest Neighbor라고 하는 model입니다. 말 그대로, 자신과 가장 가까이에 있는 이웃(데이터)과 같은 label을 가지게 만들어주는 model입니다.

 

train(학습)에서는, 단순히 모든 data와 label들을 기억합니다. 

 

predict(예측)에서는, 예측하려고 하는 이미지의 label을 training image 중에서 가장 유사하다고 생각되는 image의 label로 예측해줍니다.

 

근데 여기서 한 가지 의문이 듭니다. 그렇다면, '가장 유사하다'라는 것을 어떻게 알 수 있을까요? 그것은 곧 다루게 됩니다.

 

 

 

 

 

우리가 사용하는 예시 dataset은 바로 CIFAR10이라고 하는 dataset입니다. 10개의 class로 구성되어있고, 5만 개의 training image로 구성되어 있습니다. 각 class 별로 균등하게 분포되어있어, class 당 5천 개의 image가 있습니다. 그리고 10000개의 testing image도 포함되어 있습니다.

 

 

화면의 오른쪽에는 Test image와 nearest neighbor를 나타내고 있는데요, test image는 label을 예측해야 하는 이미지를 의미하고, nearest neighbor는 해당 이미지와 가장 가깝다고 생각되는 training image들을 나타낸 것입니다. 

 

 

 

 

 

 

 

아까 궁금했던 내용이 드디어 나오게 됩니다. 즉 두 이미지 간의 유사성은 어떻게 판단할 수 있을까요?

 

 

방금 CIFAR10의 예시에서 test image와 training image 간의 유사성은 다음과 같은 척도를 이용해 판단하게 됩니다.

 

 

L1 distance는 두 이미지 간의 차이에 절댓값을 이용해서 계산하게 됩니다. 각 pixel 별로 계산한 뒤에, 모두 합쳐서 하나의 값으로 나타내 줍니다. 즉, 슬라이드에 나온 456이라는 값이 바로 test image와 training image가 얼마나 비슷한지를 나타내는 척도가 되는 것이죠. 이 값이 작으면 작을수록 두 이미지가 비슷하다는 의미가 됩니다.

 

 

 

 

 

다음은 Nearest Neighbor classifier를 코드로 나타낸 것입니다. 먼저 학습하는 코드를 살펴보면, 별도의 연산 과정 없이 image 데이터와 label을 변수로 저장하는 코드를 나타내고 있습니다.

 

 

 

 

 

 

 

다음으로는 예측하는 코드입니다. L1 distance를 이용해서 training dataset에 있는 데이터들과 test image 각각에 대해서 거리를 측정하고, 이것이 가장 작은 것을 label로 지정해주는 코드입니다.

 

 

 

 

 

 

 

강의자료에서는 N개의 data가 있다고 할 때, 학습과 예측이 얼마나 빠른지를 물어보고 있습니다.

 

 

Training은 단순히 자료를 저장하면 되기 때문에, 메모리에 올리는 작업만 하면 되지만, 예측의 경우 N개의 image에 대해서 모두 계산해봐야 하기 때문에, 연산량은 O(N)로 계산됩니다. 이는 문제가 되고, 우리는 예측은 빠르게 하면서 학습은 느려도 되는 상황을 만들고자 합니다. 예측이 빨라야 하는 이유는, 우리가 이러한 예측을 사용하는 것은 핸드폰이나 브라우저, 저전력 device 등에서 사용되기 때문에 연산량이 많이 요구되면 활용하기가 어렵기 때문입니다. 예를 들어, 사진을 찍어서 해당 물체가 어떤 종류의 물체인지 알려주는 앱이 있는데 사진을 찍고 나서 1시간 뒤에 답을 알려준다면 앱으로써의 가치가 없겠죠? 이렇게 생각해보면 예측이 빠른 것이 얼마나 중요한지 알 수 있습니다.

 

 

 

 

 

위의 사진은, 데이터에 대해서 Nearest Neighbor classifier를 적용했을 때 나타나는 모습을 나타낸 것입니다. 빨간색, 파란색, 녹색, 노란색, 보라색은 각각 해당 영역의 label을 나타냅니다. 즉, 이 데이터는 5개의 label을 가진 데이터들로 구성되어 있습니다. 

 

 

이 그림에서 문제가 되는 점은 두 가지 있습니다. 첫 번째로, 사진의 중간쯤에 보이는 yellow island가 형성된다는 점입니다. 이 점은 label을 기준으로는 노란색으로 구별되는 것이 맞지만, 가장 가까이에 있는 점들이 녹색이라는 점에서 녹색으로 분류되었어야 더 자연스러울 것입니다. 두 번째로, 손가락처럼 삐죽삐죽 튀어나오는 부분들이 존재합니다. 그림의 왼쪽에 빨간색과 파란색이 마주하고 있는 영역들을 보면 이러한 현상이 나타나는 것을 알 수 있습니다. 또한, 중심에서 조금 위로 올라가 보면 점은 아무것도 없지만 녹색 영역이 위로 쭉 뻗어있는 영역을 확인할 수 있는데, 이 부분 또한 녹색이 파란색 영역을 침범한 것으로 문제가 될 수 있습니다. 이는 잡음 때문이거나, 결과가 잘못된 것입니다.

 

 

 

 

 

단순히 가장 가까운 이웃에 의해서 label을 결정하는 것이 아니라, 가장 가까운 K개의 데이터들로부터 majority vote를 하는 방식인 K-Nearest Neighbor classifier을 나타내는 슬라이드입니다. 이는 Nearest Neighbor classifier의 일반화된 버전이라고 볼 수 있습니다.

 

 

데이터의 label을 판단하는 데 사용되는 데이터의 개수인 K가 1에서 3, 5로 증가할수록 앞에서 언급된 Nearest Neighbor classifier의 문제점들이 조금 완화되는 모습을 확인할 수 있습니다. K=5 일 때는 손가락처럼 튀어나오는 부분이나, yellow island가 발생하지 않는 모습을 확인할 수 있습니다. 이를 통해, K의 값이 커질수록 잡음에 대해서 더 강건해지면서 decision region이 훨씬 부드러워지는 것을 볼 수 있습니다.

 

 

여기서 하얀색으로 나타난 부분은, KNN에 의해서 label을 결정할 수 없는 부분을 표현한 것입니다.

 

 

 

 

 

KNN을 사용하면서 추가적으로 생각해볼 수 있는 점은, 바로 Distance Metric을 결정하는 것입니다. 이전에는 L1 distance만 소개했으나, 자주 사용되는 distance metric에는 L2 distance도 존재합니다.

 

L2 distance는 두 거리의 차이에 제곱을 취해서 모두 더한 뒤, 다시 제곱근을 취해서 구할 수 있습니다. 보통 중학교, 고등학교 수학에서 두 점 사이의 거리를 구할 때 사용되는 공식과 동일합니다.

 

L1 distance의 경우, 선택하는 좌표계에 의존합니다. 따라서, 좌표계를 바꾸면 점과 점 사이의 L1 distance가 바뀌게 됩니다. 또한, input의 각각이 중요한 의미를 가지고 있다면 L1을 사용하는 것이 좋습니다. 예를 들어서, input data가 4차원이고, 각각 키, 몸무게, 나이, 발 사이즈를 의미한다면, L1을 사용하는 게 좋다는 것입니다.

 

L2 distance의 경우, 좌표계에 의존하지 않습니다. 따라서, 좌표계를 바꾸더라도 점과 점 사이의 L2 distance가 바뀌지 않게 됩니다. L1 distance와 반대로, input이 어떤 것을 의미하는지 모를 때는 L2를 사용하는 것이 좋습니다.

 

이처럼 distance metric을 고르는 것은 공간의 기저에 깔린 기하학에 대한 가정이 달라지기 때문에, 어떤 것을 선택하는지가 중요합니다.

 

 

 

 

위 슬라이드는, distance metric을 어떤 것으로 선택하느냐에 따라 decision region이 달라지는 것을 보여주고 있습니다.

 

L1 distance의 경우, decision region이 좌표계 형태로 나타납니다. 잘 보면 부드러운 느낌보다는, 사각형처럼 나타나는 것을 확인할 수 있습니다.

 

L2 distance의 경우, decision region이 자연스럽게 나타나는 것을 확인할 수 있습니다.

 

 

 

vision.stanford.edu/teaching/cs231n-demos/knn/

 

http://vision.stanford.edu/teaching/cs231n-demos/knn/

 

vision.stanford.edu

이 사이트에서 KNN의 demo을 제공하고 있는데, distance Metric과 K, class 수, 데이터 수를 다르게 지정해보면서 어떤 식으로 영역이 나타나는지를 확인해볼 수 있습니다. 

 

 

 

 

 

K-Nearest neighbor에서 K를 어떻게 결정할지, 혹은 distance metric을 어떤 것을 사용할지는 매우 중요한 부분입니다.

 

하지만, 이는 데이터로부터 학습되는 요소가 아닙니다. 알고리즘을 설계하는 사람이 선택해줘야 하는 값들이죠. 이를 hyperparameter라고 부릅니다. 머신러닝이나 딥러닝에서 매우 매우 자주 사용되는 용어이니, 꼭 기억해두어야 합니다.

 

hyperparameter는 어떤 게 가장 좋은지 바로 알 수 있는 방법이 없기 때문에, 문제에 따라서 다양한 값들을 시도해보고 가장 잘 작동한다고 보이는 값을 이용합니다. 

 

그렇다면, hyperparameter는 단순히 아무 값이나 다 해보면서 선택할까요? 가능한 모든 값을 직접 해보긴 현실적으로 힘들지 않을까요? 따라서 다음으로는 hyperparameter를 어떻게 결정해야 할지에 대해서 얘기해봅니다.

 

 

 

 

첫 번째로 생각해볼 수 있는 방법은 우리의 Dataset에 대해서 가장 잘 작동하는 hyperparameter를 사용해보는 것입니다. 하지만, 이러한 방법은 좋은 방법이 아닙니다. Machine Learning에서는 현재 우리가 가지고 있는 데이터에 대해서 최고 성능을 내는 것이 목표가 아니라, 본 적이 없는 데이터에 대해서 좋은 성능을 내는 것이 목표이기 때문입니다. 따라서, 우리가 가지고 있는 데이터에서만 가장 좋은 성능을 내는 hyperparameter를 사용하는 것은 좋은 선택이라고 보기 어렵습니다. 

 

 

 

 

두 번째로 생각해볼 수 있는 방법은 dataset을 학습용과 테스트용으로 나누고, 테스트 데이터에서 가장 좋은 성능을 내는 hyperparameter를 선택하는 것입니다. 하지만 이 방법도 문제가 있습니다. Test data는 우리가 만든 machine learning model이 본 적 없는 데이터에 대해서 어느 정도 성능을 낼지에 대한 추정치를 주는 역할을 하는데, 이 방법을 이용하면 test data에 대해서 나온 성능이 본 적 없는 데이터를 대표할 수 없게 됩니다. 

 

 

 

 

 

 

세 번째로 생각해볼 수 있는 방법은 데이터를 학습용, 검증용, 테스트용으로 분할시키는 것입니다. 학습용을 이용해서 모델을 학습하고, 검증용에서 가장 좋은 성능을 내는 hyperparameter를 선택한 뒤, 테스트용에서 성능을 점검해보는 것입니다. 이러한 방식을 이용하면 앞에서 나타났던 문제들 모두 발생하지 않게 됩니다. 실제로 대부분 이러한 3 분할 방식을 이용해 모델을 학습시키고, 테스트합니다.

 

 

 

 

 

 

네 번째로 생각해볼 수 있는 방법은 바로 Cross-Validation이라는 방법입니다. 데이터를 크게 학습용과 테스트용으로 나누고, 학습용 데이터를 K개의 fold로 나눈 다음, 한 번씩 돌아가면서 각 fold를 검증용으로 사용하는 것입니다. 이렇게 하면 모델이 훨씬 더 다양한 상황에서 검증을 진행해 더 좋은 hyperparameter를 선택할 수 있게 됩니다. 

 

 

 

 

 

이전에 설명했던 방법인 KNN은 이미지에서 사용하지 않는다고 합니다. 아까 설명했듯이, test time에서는 N개의 데이터 각각에 대해서 거리를 계산하여 가장 가까운 K개의 이미지 중 다수결에 해당하는 label을 지정하기 때문에 연산량이 높아 매우 느립니다. 그리고 픽셀에 대해서 distance metrics을 사용하였을 때, 유용한 정보를 주지 않는다고 합니다.

 

아래 나타난 사진 중 가장 왼쪽은 원본, 그리고 나머지 오른쪽 3개는 원본 이미지에 특수한 처리를 해준 이미지입니다. 하지만, 특수한 처리를 해준 이미지 3개 모두 원본 이미지와의 L2 distance를 계산하였을 때, 같은 값을 가진다고 합니다. 즉, 이러한 거리 척도는 지각적인 유사성에 대응되지 않습니다. (만약 지각적인 유사성에 대응되려면, 거리가 달라야만 합니다.)

 

따라서, 이미지에 대해서는 지각적인 유사성에 대응될 수 있는 다른 거리 척도가 필요합니다.

 

 

 

 

이외에도 차원의 저주라고 하는 문제점이 존재합니다. 

 

KNN이 좋은 성능을 내려면 우리의 training dataset이 공간을 빽빽이 채워야 합니다. 그렇지 않으면 모델이 판단하기에 가장 가까운 이웃이라고 생각하는 데이터가 꽤 멀리 존재할 수 있게 됩니다. (큰 공간에 점들이 듬성듬성 분포되어 있다고 상상해보시면 대략 이해가 가실 것입니다.)

 

문제는, 실제로 training dataset이 공간을 빽빽이 채우는 것은 충분한 학습 데이터가 필요하다는 것을 의미하며 문제의 차원에 지수적입니다. 그림에서 나타난 것처럼, 차원이 하나 늘어날수록 필요한 데이터의 수가 지수적으로 증가함을 알 수 있습니다. 현실적으로는 공간을 빽빽하게 메울 만큼의 데이터를 구하는 것은 불가능합니다. 오히려 데이터를 많이 구할 수 없는 경우들이 많기 때문에 더 적은 데이터로도 학습할 수 있는 모델이나 방법론들이 많이 연구되고 있죠. 

 

 

 

 

 

KNN에 대한 내용을 요약한 것입니다. 앞의 내용을 모두 숙지하셨다면, 읽으면서 아 이런 걸 얘기했었지? 하며 넘어가실 수 있을 겁니다.

 

 

 

다음으로는, Linear Classification에 대해서 다룹니다. 물론 매우 단순한 방법이긴 하지만, 아무리 복잡한 딥러닝 모델이어도 결국에는 가장 기초가 되는 개념은 linear classification이기 때문에 이에 대해서 확실하게 이해하는 것이 중요합니다.

 

 

 

Neural Network(신경망)이라고 하는 것은 결국에 linear classifier들을 여러 개 쌓아서 만든 것입니다. 즉 레고 블록과 같은 것이죠. 

 

 

 

 

 

 

이것이 바로 신경망을 활용한 예시입니다. Input으로는 사진을 넣어주고, output으로는 사진을 설명하는 글을 만들어서 알려줍니다. 사진을 이해하는데 활용되는 것은 CNN이며, 이를 입력으로 받아 글을 만들어주는 것은 RNN 계열의 신경망입니다.

 

 

 

 

 

지금부터 다뤄볼 linear classification은 parameter를 사용하는 모델 중 가장 간단한 모델인데요. 이를 통해 parametric approach에 대해서 알아봅니다.

 

이전에 우리가 사용했던 Nearest Neighbor나 K-Nearest Neighbor의 경우에는 별개의 parameter가 존재할 필요가 없었습니다. Test data를 기준으로 가장 가까운 데이터를 알아내서, 이를 통해 label을 결정하면 되기 때문이었죠. 하지만, Nearest Neighbor의 방식에는 치명적인 문제점이 있었죠. 바로 Test time이 매우 오래 걸린다는 점입니다. 

 

따라서, training time은 오래 걸려도 되지만, test time은 매우 짧을 수 있도록 하는 접근법이 필요한데요. 이것이 바로 parametric approach입니다. Parameter는 training data에 대한 우리의 지식을 요약한 결과라고 보시면 됩니다. 이를 이용하면 test 할 때는 별도의 training data를 이용하지 않고도, parameter만 가지고 본 적 없는 새로운 데이터에 대해서 label을 예측할 수 있게 됩니다. 

 

슬라이드에 나온 구체적인 예시를 한번 볼까요? Input data로는 32x32x3의 이미지 데이터를 받습니다. 총 3072개로 구성된 데이터죠. 이를 f(x, W)라고 하는 함수에 집어넣으면 함수는 주어진 10개의 class에 대해서 class score를 알려줍니다. 여기서 class score란, 해당 class에 속할 가능성을 나타내는 것으로 score가 높을수록 해당 class에 속할 가능성이 높아지게 됩니다.  

 

 

 

 

 

 

앞에서 f(x, W)가 어떤 식으로 구성되어있는지는 얘기해주지 않았는데요. 보통은 다음과 같은 형태로 구성됩니다.

 

W는 가중치를 나타내는 matrix이고, x는 input data, b는 bias를 나타냅니다. Wx + b 연산을 이용하면, 10개의 class score를 얻을 수 있습니다. 

 

우리가 training data를 이용해서 학습을 한다는 것은, 결국 여기서 W를 알아내는 것을 말합니다. 즉, 어떤 이미지 데이터가 입력되었을 때, 10개의 class 중에 어디에 속할지 틀리지 않고 잘 맞출 수 있도록 만들어주는 matrix를 학습하는 것이죠. 

 

여기서 b는 bias를 나타내는데, 이는 데이터를 이용해 학습되지 않으며 보정 효과를 나타냅니다. 예를 들어서, 데이터에 고양이 사진이 개 사진보다 많다면, 고양이에 해당하는 bias가 다른 것보다 더 높은 값을 가지게 될 것입니다. 

 

 

 

 

조금 더 수치적으로 구체적인 예시를 볼까요? 만약 input image가 2x2 짜리 데이터이고, 3개의 class가 존재하는 상황이라고 가정합니다.

 

앞에서 설명한 대로, Wx + b의 연산을 진행하면, 각각의 클래스에 대한 점수를 얻을 수 있게 됩니다. 

 

Cat score를 얻는 과정만 한번 따라가보자면, $W$의 첫 번째 row와 input image를 stretch 한 것과 곱해줍니다.

 

즉 0.2*56 + -0.5*231 + 0.1*24 + 2.0*2 로 계산할 수 있죠. 여기에 bias인 1.1을 더해주면 cat score에 해당하는 -96.8을 얻을 수 있습니다.

 

 

이 슬라이드를 통해 기억해둬야 하는 점은, linear classification을 'template matching'이라고 하는 접근법으로 생각할 수 있다는 점입니다. 즉, 특정한 class를 나타낼 수 있는 template를 학습하는 것이라고 볼 수 있는데요.

 

예를 들어, 위의 슬라이드에서 첫 번째 줄인 [0.2, -0.5, 0.1, 2.0]는 고양이라고 하는 class를 분류할 수 있는 '틀(template)'이라고 보시면 됩니다. 두 번째 줄은 개를 분류하는 틀이 될 것이고, 세 번째 줄은 배를 분류하는 틀이 될 것입니다.

 

여기서 $Wx$는 dot product(내적)을 의미하는데요, 이는 각 클래스에 대한 template과 이미지 pixel 사이의 유사성을 계산한다고 생각할 수 있습니다. 

 

예를 들어서, template이 이미지 pixel과 유사하게 학습되었다면, 내적 값은 높아지게 될 것이고, 결국 해당 class로 분류될 가능성이 높아져 정답을 잘 맞힐 수 있겠죠?

 

 

 

 

 

 

위 슬라이드는, linear classification을 template matching의 관점에서 봤을 때 이를 시각화한 것입니다.

 

아까 weight matrix인 $W$에서 각 행이 각각의 class에 대응되는 template이라는 얘기를 했었는데요, 이를 input image 사이즈와 동일하게 재배열시켜서 만든 것이 바로 아래에 있는 사진들입니다.

 

자세히는 안 보이시겠지만, car의 경우는 우리가 차를 앞쪽에서 바라본 모습이 대략 보이시죠? cat의 경우는 고양이의 두 귀가 사진의 위쪽에 희미하게 보이는 것을 알 수 있고요. horse의 경우도 말의 모습이 어렴풋이 보이는 걸 확인할 수 있습니다. 

 

하지만 이러한 linear classifier에는 한계점이 존재합니다. 각각의 class에 대해서 딱 하나의 template만 학습한다는 것이죠. 따라서 같은 class 내에서도 variation이 존재한다면, 모든 variation들을 평균을 내버립니다. 그렇기 때문에 다양한 케이스에 대해서 모두 학습할 수는 없다는 한계점이 존재합니다.

 

이러한 linear classifier를 레고 블록처럼 여러 개 쌓은 neural network는, 각 class 별로 여러 개의 template을 학습한다고 생각할 수 있으며, 이를 통해 class 내에 존재하는 다양한 variation에 대해서도 학습할 수 있는 힘이 생깁니다. 예를 들어서, 우리가 맨 앞에서 언급했던 대로 고양이의 일부 모습만 보고도 고양이를 구별해야 한다거나, 혹은 고양이의 크기나 생김새가 다를 때도 모두 고양이로 분류하려면 다양한 template을 학습하는 것이 필요할 것입니다.

 

 

 

 

linear classifier를 다른 시각으로도 볼 수 있습니다. 이는 Geometric viewpoint(기하학적 관점)에 해당합니다.

 

이런 관점에서는, image를 고차원 공간에 있는 점으로 인식하게 되며, linear classifier는 한 범주와 다른 범주를 구분 짓는 선형 결정 경계를 만들어냅니다.

 

 

 

 

 

 

다음으로는, linear classifier를 이용해서 구분하기 어려운 케이스들을 보여주고 있습니다.

 

가장 왼쪽의 첫 번째 케이스의 경우는, 1 사분면과 3 사분면이 class 2, 2 사분면과 4 사분면이 class 1에 해당하는 경우인데, 두 class를 완벽하게 구분할 수 있는 linear classifier는 만들 수 없습니다.

 

두 번째 케이스와 세 번째 케이스도 마찬가지입니다. 

 

이렇게, linear classifier로 구분할 수 없는 경우들이 발생하기 때문에, neural network에서는 다양한 non-linearity를 추가해주어 이러한 경우도 분류할 수 있게 만들어줍니다. 

 

 

 

 

지금까지, 각 class의 score를 알려주는 linear score function을 이용했습니다.

 

하지만, 단순히 이 score만 가지고는, 해당 model이 얼마나 이미지를 잘 분류했는지 알 수 있는 방법이 없습니다.

 

잘 분류했는지를 파악해야 이 모델을 당장 쓸 수 있는지, 혹은 더 학습을 진행해서 더 잘 맞출 수 있는 weight을 얻어야 할지 판단할 수 있겠죠?

 

 

 

 

다음 강의에서는, 그렇다면 우리가 구한 weight가 얼마나 좋은지를 알려주는 loss function에 대해서 다루어볼 예정입니다.

 

또한, 임의의 W 값으로부터 시작해서, 최적의 W를 찾기 위해 어떻게 해야 하는지에 대해서도 알아볼 것이고요.

 

ConvNet에 대해서도 알아볼 예정입니다.

 

 

 

 

 

 

지금까지 cs231n의 두 번째 강의인 lecture 2에 대해서 모두 정리해 보았습니다.

 

역시나 혼자 공부할 때와 비교했을 때, 정리하는 글을 작성해보면 훨씬 더 정리가 잘 되는 것 같고 또한 공부한 내용들이 더 잘 정리되는 것 같습니다.

 

이번 Lecture 2를 잘 이해하셨는지 확인해볼 수 있는 문제를 한번 내보도록 하겠습니다.

 

 

 

 

cs231n Lecture 2 Quiz

 

 

 

 

Q1. Semantic Gap이란 무엇인가요?

 

 

Q2. 컴퓨터가 이미지의 class를 분류하는 데 있어서 다양한 어려움들이 존재하는데, 이러한 어려움들의 예시를 제시하세요.

 

 

Q3. Data-Driven approach는 왜 나오게 되었으며, 어떤 process를 가지고 있나요?

 

 

Q4. K-Nearest Neighbor classifier는 어떤 방식으로 test data의 label을 결정하나요? 또 K의 값이 커질수록 어떠한 특징을 나타내나요?

 

 

Q5. KNN에서 사용된 distance metric이 두 가지 있습니다. 각각의 식과, 특징은 무엇인가요?

 

 

Q6. Hyperparameter란 무엇인지 정의를 설명하고, 어떤 방법을 통해 hyperparameter를 결정하나요?

 

 

Q7. linear classifier는 template matching의 아이디어로도 설명할 수 있는데요. template matching이란 무엇인가요?

 

 

Q8. 데이터가 총 8개의 차원으로 구성되어있고, 우리가 분류해야 하는 class가 10개라고 했을 때, $Wx + b$에서 $W$, $x$, $b$ 각각의 차원은 어떻게 되어야 하나요? 그리고 $W$를 template의 관점에서 어떻게 해석할 수 있는지 설명하세요.

 

 

Q9. linear classifier의 한계점이 두 가지 있었습니다. 두 가지 한계점에 대해서 설명하세요. 

 

+ Recent posts