- 최대한 쉽게, cs231n 강의를 스스로 다시 이해하며, 처음 딥러닝을 공부하는 사람들도 쉽게 이해할 수 있게 정리해보았습니다.

- 저도 초보인지라 틀리는 부분이 있을 수 있고, 이해가 안 되는 부분이 있을 수 있습니다. 만약 틀린 부분이 있거나 잘 이해가 되지 않는 부분이 있다면, 바로 댓글로 질문해 주세요! 내용과 관련된 질문은 최대한 아는 선에서 대답해 드리겠습니다!

- 보는 중에 사진들에 나오는 수식같은 경우는, 따로 설명하지 않았다면 건너뛰어도 됩니다.

- 이해가 잘 되지 않은 설명이거나, 설명이 명확하지 않은 것 같으면, 댓글로 피드백 부탁드립니다.

- 1강은 전체적으로 컴퓨터비전이 어떤 역사를 가지고 있는지 등에 설명하는 내용이므로, 일단 생략하도록 하겠습니다.

 

 

 

 

컴퓨터 비전에서 가장 중요한 것은 바로 이미지 분류 작업입니다. 이미지 분류란, 어떤 사진들을 보았을 때, 그 사진들이 어떤 물체 또는 동물 등인지 분류하게 하는 것입니다.. 위의 사진을 예로 들면, 귀여운 고양이 사진을 보았을 때, 컴퓨터가 '이건 고양이야!' 하고 말하게 만드는 것이죠.

 

사람들은 이런 작업들을 비교적 쉽게 수행해 냅니다. 하지만, 컴퓨터는 그렇지 못하죠. 왜 그럴까요?

 

 

일단, 컴퓨터는 우리가 사진을 보는것 처럼 사진을 보지 않습니다. 컴퓨터는 어떤 사진을 볼 때, 우리처럼 '흠, 이건 고양이 사진이군' 하며 보는 것이 아닙니다. RGB 값을 나타내는 수없이 많은 숫자들의 나열로 보는 것이죠. 그렇기 때문에, 컴퓨터는 이런 사진을 한눈에 알아볼 방법이 없습니다. 주변의 모든 물체가 죄다 숫자들로 보인다고 생각하면 이해가 쉬울 것 같습니다. 지금 여러분들이 보고 있는 화면도 그냥 숫자만 있다고 생각하면.. 이게 컴퓨터 화면인지 인식하기 힘들겠죠?

 

 

그 외에도 다른 문제점들이 있습니다.

일단, 사진을 찍는 각도에 따라 숫자들이 죄다 바뀐다는 것이죠. 아무리 똑같은 고양이를 찍어도, 아무리 똑같은 사물을 찍어도 카메라가 살짝 오른쪽으로 간다면, 화면 자체는 비슷할지라도 모든 숫자들 또한 살짝 오른쪽으로 가버리니.. 어떤 숫자들이 어떤 부분에 있다는 단순한 점만으로는 찾기에 힘들어 보입니다.

 

 

 

아무리 같은 고양이라도 조명이 다르면 숫자들은 모두 달라지고, 자세가 달라도 모두 달라지도, 어디에 숨어있으면 또 달라지고, 배경이랑 비슷하면 숫자들이 다들 비슷할것이고(색상값이므로), 고양이가 많으면 또 인식하기에 힘들 것입니다.

 

 

그렇기 때문에, 단순한 코딩으로는 이 문제를 해결할 수 없다는 것을 알게 됩니다.

가령, '1+1'을 하는 프로그램을 코딩해라! 하는 것은 단순한 코딩으로 바로 답을 알 수 있겠지만, 위처럼 숫자 나열들을 주며 '자, 이제 이 숫자들이 의미하는 바가 무엇일까..? 고양이?? 개??? 한번 맞춰봐!!'같은 사이코 같은 문제는 단순한 코딩으로 맞출 수 없습니다.

 

 

 

그래서 사람들은 '데이터에 기반한 접근법'을 생각하게 됩니다. 단순히 어떤 사진을 보고 인식하는 코드를 짜는 것이 아니라

무수히 많은 사진들과, 그 사진들이 무엇인지 알려주는 정답을 먼저 구하는 겁니다.

그 후, 머신러닝이라는 방식으로 

그렇게 만들어진 분류기로, 사진들을 분류하면.. 사진이 잘 분류되지 않을까?? 하는 생각인거죠.

아이에게 교육하는 방식과 비슷하다고 생각하시면 됩니다. 우리가 아이들에게 어떻게 생긴 것들이 고양이인지 가르칠 때, 아무 고양이 사진 하나만 가지고 '이게 고양이야!'라고 하진 않죠? 

다양한 고양이 사진들을 보여주면서 '이것도 고양이, 저것도 고양이, 그리고 요것도 고양이란다!' 하는 방식을 통해 아이들을 가르친다면, 아이들은 훨씬 더 빠르게 어떤 것이 고양이인지 알아낼 것입니다. 바로 이런 것과 동일한 접근법이라고 보시면 될 것 같습니다.

 

 

그래서, 처음 생각해낸 분류법이 바로 Nearest Neighbor, 즉 '가장 가까운 이웃 찾기' 방법입니다.

이름이 굉장히 직관적인데요, 말 그대로 사진들을 모두 외워서, 다른 사진들을 봤을 때 지금까지 알고 있던 사진들과 비교하며, 가장 비슷하게 생긴 것을 찾아내는 겁니다.

바로, 아이들에게 '이렇게 생긴 것은 대강 고양이일 거고, 저렇게 생긴 거는 대강 배일 거야. 알겠지??' 하며 가르치는 것입니다.

 

 

그리고, 이렇게 가르칠 때 데이터셋은 CIFAR-10이라는 데이터셋을 사용할 겁니다.

데이터셋이란, 앞면에는 사진이 그려져 있고, 뒷면에는 그것이 어떤 사진인지 적혀있는 카드 뭉치라고 생각하시면 될 것 같습니다.

그리고, CIFAR-10이라는 카드 뭉치는 총 10가지 종류의 물체/동물들을 모아놓은 사진 뭉치인데, 비행기, 차, 새, 고양이 등을 나눠놓은 카드 뭉치입니다.

그리고, 우리는 이 카드 뭉치를 '컴퓨터'라는 아이에게 가져다주어 위의 'Nearest Neighbor'라는 교육법으로 아이를 가르칠 겁니다.

 

 

그런데, 사진이 뭐가 비슷한지 어떻게 아냐고요? 바로 이런 방식으로 알아낼 수 있습니다.

아까 전에, 컴퓨터는 사진을 볼 때 숫자들의 나열로 본다고 했습니다. 그렇다면, 그 숫자들 사이의 크기가 비슷하다면, 사진도 비슷하겠죠?

이런 생각을 바탕으로, 사진의 숫자들을 모두 뺄 겁니다. 그리고 거기에다가 절댓값을 씌워 주면? 두 숫자 사이의 거리, 즉 두 사진 사이의 다른 정도가 나옵니다. 이것은 L1 distance(L1 거리)라고 부르는데, 이 짓을 사진의 모든 픽셀에 똑같이 해준 후 나온 숫자들을 모두 더해주면, 두 사진 사이의 다른 정도가 하나의 숫자로 나올 수 있습니다.

 

 

 

그러면, 이제 한번 아이에게 분류하는 법을 가르쳐 볼까요? 일반적으로, 아이를 가르칠 때에는 두 가지 방법으로 나누어 줍니다.

첫 번째는, training(훈련) 부분입니다. 그리고 아까도 말했듯이, Nearest Neighbor에게 train은 그저 사진들을 외우는 것일 뿐입니다.

그리고, predict(예측) 부분입니다. 아이에게 지금까지 봤던 사진이 아닌 다른 사진을 주면서, '이게 뭘까~?' 하는 것이죠.

Nearest Neighbor는, predict작업은 사진을 보고, 지금까지 외웠던 사진들의 숫자들로 빼 주는 것입니다.

'개 사진들이랑 뺐을 때는.. 평균 100만큼 차이나고, 고양이 사진들이랑 뺐을 때는, 평균 200만큼 차이가 나네! 그러면 아마 이 사진은 고양이보다는 개에 더 가까울 거야!'

라고 생각하는 과정이, 바로 Nearest Neighbor의 predict 과정입니다.

 

 

그런데 문제가 있습니다. 이것을 외우는 데는 시간이 엄청나게 빨리 걸립니다. 아, 사람이 외울 때는 당연히 오래 걸리겠지만, 우리의 아이는 엄청난 기억력을 가진 컴퓨터라는 아이니깐, 순식간에 외울 수 있습니다.

하지만, 이것을 예측하는 것은 꽤나 오랜 시간이 걸립니다. 아이가 지금까지 50000개의 사진을 외웠다면, 그 모든 사진들을 죄다 빼주면서 계산을 해야 하니까요. 단순히 연산이 50000번인 것도 아니고, 50000개의 사진의 모든 숫자들을 다 빼서 더하고, 평균을 내고... 을 해야 하니까요.

근데 이게 왜 문제냐고요? 만약 우리가 개나 고양이 사진을 찍어서, 이게 개인지 고양이인지 구분하는 프로그램을 만들었는데, 사진 하나 찍고 이게 개인지 고양이인지 구분하려고 보니깐 1시간이 걸린다고 하네요! 그러면, 여러분들이라면 과연 이 프로그램을 사용할까요? 그렇지 않겠죠..? 웬만한 변태가 아니라면 말입니다.

그렇기 때문에, 훈련에 걸리는 시간은 오래 걸려도 별로 상관이 없습니다. 이 훈련은 한 번만 하면 다음부터 사용할 때에는 그 정도의 시간은 걸리지 않으니까요. 하지만, 예측 단계에서 이렇게 느리면.. 그것은 문제가 생긴다는 것이죠.

 

 

아무튼, 다시 본론으로 돌아가 봅시다. 이것은 Nearest Neighbor 방식으로 교육받은 아이가 그린 그림입니다. 색깔은 개나 고양이 같은 사진의 종류를 말하고, 점들은 사진을 말합니다. 즉, '형아, 저기 점 주변에 찍히는 다른 점들은 내가 배경으로 색칠해놓은 색의 사진일 거야. 그렇지?'라고 말하는 것이죠. 근데, 과연 그럴까요?

가운데 노란색 부분을 봅시다. 직관적으로 봤을 때, 뭔가 저 노란색 주변에 있는 점들은 초록색이어야 할 것 같은 느낌, 안 드시나요? 아무래도 초록색으로 둘러싸여 있는데, 저 점 하나 때문에 그 부분만 노란색 부분이 된다는 것은, 약간 무리가 있어 보입니다.

 

 

그래서 고안된 방법이 K-Nearest Neighbor 방법입니다. 가장 가까운 사진을 찾는 건 그대로이지만, 주변 K개를 봤을 때 가장 비슷한 것이 바로 정답일 거라는 생각인 것이죠.

위의 사진에서 그것이 가장 잘 보입니다. K=1이었을 때는, Nearest Neighbor와 정말히 똑같은 그림이 그려집니다. 하지만, K=3, K=5 일때는 초록색 부분의 가운데 배경 색이 초록색으로 바뀌었고, 위에 삐죽 튀어나왔던 부분도 파란색과 보라색으로 바뀐 것을 볼 수 있습니다.

 

 

그래서.. CIFAR-10을 K-Nearest Neighbor로 훈련시킨 결과입니다. 왼쪽은 정답 종류를 의미하는 사진, 오른쪽은 훈련된 컴퓨터가 고른 예측입니다.

멀리서 보면 꽤나 잘 맞춘 것으로 볼 수도 있습니다. 실제로 사진이 다 비슷하게 생겼기 때문이죠. 특히, 개구리 (위에서 4번째) 사진들은 죄다 배경의 흰색 계열로써, 사진 전체적으로 굉장히 비슷하죠.

하지만, 그것만 비슷할 뿐, 자세히 보면 완전 틀린 답들을 골라내고 있습니다. 사진이 비슷하긴 하지만, 그렇다고 그것이 정답이라는 보장은 없으니깐 말이죠. 

 

 

잘 안 나온 것 같으니, 다른 방법을 한번 써봅시다. 아까 전에 L1 distance라고 이야기했던 것 기억나시나요? 그것 대신, L2 distance라는 친구를 사용해서 두 사진 사이의 차이를 알아내 볼 겁니다. 정확한 수식은 잘 모르셔도 됩니다. 그저, 거리를 재는 다른 방법이라는 생각과, 대충 거리를 그림으로 나타내면 위처럼 L1은 다이아몬드, L2는 원 형태가 나온다는 정도만 아시면 될 것 같습니다.

 

 

.. 그리고 이것이, K=1, 그리고 L1 또는 L2를 사용해서 훈련했을 때 컴퓨터가 그려낸 사진입니다. 약간 형태가 다른 게 느껴지실 겁니다.

 

 

""쉬는 시간?""

이 사진들을 한번 만들어 보며 가벼운 실습을 하고 싶다면,

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

이 곳에 들어가셔서, 직접 K값과 거리(L1, L2)를 바꾸면서, 종류 개수도 바꾸면서.. 어떤 그림이 그려지는지 확인해보시는 것도 좋을 것 같습니다.

 

 

 

위에서 잠깐 해보았으면, '그럼, K랑 distance는 어떤 게 가장 좋은 거야??'라는 생각이 드셨을지 모르겠습니다. K와 distance는 우리가 직접 정해야 하는 값, 즉 Hyperparameter(초모수) 니까요. 이에 대한 정답은 간단합니다. 

상황마다 다릅니다! 그리고, 직접 하나하나 넣어 보면서, 어떤 것이 가장 정답률이 높은 지를 알아내는 것이 중요하죠.

hyperparameter이라는 말은 앞으로도 굉장히 자주 나올 말이니까, 숙지해 두는 것이 좋을 것 같습니다.

 

 

 

그렇다면, 이 hyperparameter들을 제대로 맞추는 방법을 알아봅시다.

가장 먼저 드는 생각은, '아니, 그냥 내 데이터셋에다가 집어넣어서, 제일 잘 작동되는 거 고르면 되는거 아니야??' 일 것 같습니다.

하지만, 이렇게 해버리면 문제가 생겨버립니다. 아까 위의 사진을 다시 생각해 봅시다. 다른 사진이 들어오지 않을 때에, K=1이 가장 우리의 데이터셋에서 좋은 효과를 내고 있다고 볼 수 있었을 것입니다. 하지만, 다른 사진이 들어갈 때에는, 약간 문제가 생겼죠? 즉, 우리가 진정으로 원하는 것은, 우리가 가지고 있는 데이터셋에서 작동이 잘 되는 것이 아니라, 그냥 진짜로 찍은 사진에 작동이 잘 되는 것을 찾고 싶은 것이죠.

 

그러면, 다음 생각은 '아니.. 그럼 train과 test로 나눈 후에, test에 잘 되는 놈으로 하지!' 일 것입니다. 하지만, 그것마저도 별로 좋은 선택은 아닙니다. train에서 훈련된 것을 test에서 확인을 한 후에, test값에 적절한 k 또는 distance 값을 바꾸어 주더라도, 결국엔 test 셋에서만 잘 되는 것일 수도 있고, 아예 새로운 데이터가 들어왔을 때는 또 어떻게 반응할지 모르기 때문이죠.

 

그럼, 다른 좋은 생각 없을까요? 한번, 데이터셋을 세 부분으로 나누어 봅시다. train, validation, test로 말이죠.

train 데이터셋에서 열심히 훈련된 값을, validation 데이터셋으로 확인하며 hyperparameter를 바꾸어 주고, test는 마지막 딱 한 번만 만져 보는 것이죠. 이렇게 되면, test 셋은 마치 우리의 데이터셋 안에 없는, 세상에서 아예 새로운 데이터가 되는 셈이고, 그렇다면 우리가 원하던 '진짜 새로운 데이터에서의 테스트'를 해 볼 수 있게 되는 것이죠.

 

 

그리고, Cross-Validation이라는 방식도 존재합니다. 일단 큰 거 하나와, 작은 거 하나 총두 개로 먼저 나눕니다. 그 후, 작은 거는 test 셋으로 설정하고, 큰 거 하나를 놓고 다시 여러 개로 나누어서, 첫 번째 부분만 val로 놓고, 나머지를 train으로 놓은 뒤에 hyperparameter를 설정하고, 다시 두 번째 부분만 val로 놓고, 나머지를 모두 train으로 놓은 뒤에 hyperparameter를 설정하고.. 

이런 방식으로 해서, 그 결과의 평균값으로 hyperparameter를 설정하는 것입니다. 혹시 validation을 나눈 것이 이상하게 나누어져 제대로 되지 않을 수도 있으니, 이런 식으로 hyperparameter를 정해 보는 것이죠. 이렇게 한다면, 더욱더 확실하게 hyperparameter의 값을 구할 수 있을 것입니다.

하지만, 딥러닝에서 자주 사용되는 기술은 아닙니다. 이후에 나올 training 들은, 연산을 굉장히 많이 해야 하므로, 저렇게 하나하나 다 해보는 데에는 너무 오래 걸리고, 힘이 들기 때문이죠.

 

 

 

그렇다면, 이런 식으로 설정된 hyperparameter들을 한번 비교해 봅시다.

그래프의 가로축은 k의 값이고, 세로축은 test에서의 정확도 값입니다.

그래프를 보시면 아시겠지만, k가 대충 7 정도일 때 가장 높은 정확도를 보이는 것을 확인할 수 있습니다. 즉, k를 7 정도로 사용하는 것이 가장 효율적일 것이라는 거죠.

주의하셔야 할 점은, 이렇게 나온 hyperparameter들은 문제 및 데이터셋마다 모두 다르다는 것입니다. 같은 방식으로 훈련을 하더라도, 

'이 사진을 보고 개인지 고양이인지 구별하시오'라는 문제에 최적화된 hyperparameter의 값과

'이 사진을 보고 웃는 얼굴인지 우는 얼굴인지 구별하시오'라는 문제에 최적화된 hyperparameter의 값이 다르다는 것이죠.

즉, 이러한 과정은 모든 데이터셋과 문제들마다 한 번씩 거쳐가며 설정하는 것이 좋다는 것입니다.

 

 

하지만, 지금까지 열심히 공부했던, Nearest Neighbor이라는 방식은 절대로 사용되지 않습니다.

우선, 초반에도 언급한 predict 과정이 굉장히 오래 걸린다는 것과, 사진 사이의 distance는 사실 그렇게 의미 있는 값이 아니라는 것 때문이죠.

예를 들어, 위의 Boxed, Shifted, Tinted 사진은 왼쪽의 원본 사진과 같은 L2값을 가지고 있다고 합니다. 즉, 이것으로 학습을 한다면 얼굴에 박스가 쳐져있던, 색이 바래졌든 간에 같은 사진으로 생각해 버린다는 것이죠.

또한, 저---위에 Lecture 2 - 30에서 보았을 때에도 잠깐 언급했지만, 사진이 비슷하게 생겼다고 해서 비슷한 물체인 것은 아닙니다.

갈색 조명으로 갈색 느낌을 준 축구공과, 갈색 농구공은 비슷하게 생겼지만 다른 공인 것처럼 말이죠.

 

더 큰 문제로는, 차원이 넓어질수록 필요한 데이터의 개수가 기하급수적으로 많아집니다. 1차원일 때에는 4개만 필요하면 데이터의 개수가, 2차원이 되면 4*4=16개가 필요해지고, 3차원이 되면 4*4*4=64개가 필요해지니까요.

'오잉? 생각보다 적네?'라고 생각하실지 모르겠지만, 실제로는 이것보다 훨씬 큰, 100000 같은 수가 1차원에 필요하다 하면, 2차원은 10000*10000,, 3차원은 10000*10000*10000개가 필요하니... 정말 정말 많아지는 것을 볼 수 있습니다.

 

 

그럼.. 우리 지금까지 허튼짓 한 거냐고요?? 어차피 안 쓸 거 왜 알려줬냐고요?

그 질문을 하기 전에, 일단 이것을 배우는 과정을 통해 배운 것들을 확인해봅시다.

우선, 이미지 분류에는 트레이닝 이미지와 그에 맞는 카테고리들이 필요하고, test 셋에서 그것을 predict 해야 한다는 것을 알았습니다.

K-nearest는 그 카테고리, 라벨들을 가장 가까운, 유사한 training 셋의 사진으로 맞춘다는 것도 알았고,

 distance(L1, L2)와 K값은 hyperparameter(초모수)라는 것이라는 것도 알았고,

hyperparameter를 고를 때에는 validation 셋에서 골라야 하고, test 셋에서 맨 마지막 딱 한번 돌려봐야 한다는 것도 알았습니다!

 

nearest neighbor라는 가장 단순한 알고리즘으로, 우리는 앞으로 배워나갈 인공지능에 대한 기본적인 지식들을 깨달을 수 있었습니다.

그러면, 위 질문에 충분히 대답이 되었겠죠?

그럼 다음으로 넘어가서, 지금 배운 것을 써먹어봅시다!

 

.. 바로 Linear Classification(선형 분류)이라는 친구를 말이죠.

 

 

 

그럼, 일단 CIFAR-10 데이터셋을 다시 가져와 봅시다! 기억나시죠? 10개 카테고리로 이루어져 있고, 그에 맞는 사진들이 있던 바로 그거요!

 

 

자, 이미지가 32*32*3 (가로*세로*RGB) 개의 숫자들로 이루어져 있다고 해봅시다. (CIFAR10의 이미지 사이즈입니다.)

그러면, 그 사진의 숫자들과, weight(가중치)라는 변수를 어떤 함수에 같이 넣으면, 10개 카테고리에 대한 점수가 나오게 하면 어떨까요?

이것이 바로 linear classification의, Parametric (매개 변수적) 접근 방식입니다. 
이렇게 해두면, 앞의 Nearest Neighbor 과는 다르게, W값만 가지고 predict가 가능해지니, 훨씬 더 효율적이겠죠?

 

그렇다면 이것이 어떻게 작동할까요? 일단, 함수를 가장 기본적인 형태로, f(x, W) = W*x + b라고 하고 시작합시다. 저 함수를 지나가면, 10개의 카테고리 각각에 대한 점수가 나올 수 있게 말이죠.

이미지를 3072*1의 크기로 평평하게 펴봅시다. 그리고 그것을 x로 놓읍시다.

그 뒤, 어떤 수들을 3072*10(카테고리 개수)의 크기로 만들어봅시다. 참고로, 이 수가 무엇이 되어야 하는지는 한--참 뒤에 설명합니다. 일단은 그냥 랜덤 한 3072*10의 크기의 배열이 생성된다고 생각해 주세요. 그리고, 이것을 W라고 합시다.

그러면, W의 첫 번째 줄과 x를 곱하고, W의 두 번째 줄과 x를 곱하고,... , W의 10번째 줄과 x를 곱해서 10개의 수를 구할 수 있습니다.

그러면, 이제 f(x, W)=W*x+b라는 식중 W*x까지는 해낸 겁니다.

 

마지막으로, b를 더해주어야 합니다. 이때, b의 개수는 어때야 할까요?

네, 당연하게도 카테고리의 개수인, 10개 여야겠죠? 우리는 10가지 카테고리에 각각에 대한 점수를 구하고 싶으니깐, b를 1*10의 크기로 만들어줍시다. (참고 : 이 값은 bias, 편향 값이라고 불립니다.)

근데, 이거 왜 더하냐고요? 만약, 데이터셋에 고양이만 엄청 많고 개는 엄청 적다? 그러면 당연히 어떤 사진을 봤을 때 그게 고양이일 확률이 더 크겠죠? 그러므로 bias 값을 고양이에 더 크게 부과해 주어, '고양이' 점수에 보너스를 주는 것이죠.

 

 

 

 

 

위 사진은 지금까지 말했던 공식을 사진으로 나타낸 것입니다. 대충 어떻게 계산되는지 알아봅시다.

일단, 이미지는 2*2 크기의, 4개의 픽셀로 단순화된 이미지라고 가정하고, 세 가지 카테고리의 점수만 알아본다고 가정합니다.

그러면, 아까 전의 방법처럼 해볼까요?

일단, 사진의 크기는 2*2이므로, 1*4 크기로 평평하게 만들어 줍니다.

그리고, (사진의 크기) * (카테고리의 개수)인, 4*3 크기의 W값을 만들어 주겠습니다.

그 후, x와 W를 곱해주는데, 이렇게 곱하는 것을 스칼라 곱(Scalar product) 또는 점곱(Dot product)라고 합니다.

(참고 : https://ko.wikipedia.org/wiki/%EC%8A%A4%EC%B9%BC%EB%9D%BC%EA%B3%B1)

 

아, 물론 자세하게 수학적으로 갈 필요는 별로 없습니다. 곱하는 방식은 단순합니다.

일단, 고양이 점수를 먼저 계산해 봅시다.

첫 번째 줄, 즉 고양이를 나타내는 W값인 0.2,-0.5,0.1,2.0을 각각 x값인 56,231,24,2에 곱해줍니다.

계산기를 사용하면, 각각 11.2,-115.5,2.4,4.0이고, 이를 합해주면 -97.9가 되겠습니다.

그 후, 고양이의 bias값인 1을 더하면, 결국 -96.8이 나오고, 이것이 바로 위 함수, f(x, W)에서의 고양이의 점수라고 할 수 있습니다.

나머지 개, 배 점수는 직접 한번 구하여 맞는지 확인해 보는 것도 나쁘지 않을 것 같습니다.

 

 

 

자! 이제 그럼 f(x, W)=W*x+b의 모든 과정을 달려왔습니다.

아니 근데, 이거 왜 했냐고요?? 이게 그래서 뭐 하는 거냐고요??

 

자, 아래 사진들을 봅시다. 이 아래 사진들은, CIFAR-10 데이터셋으로 훈련된 Weight값을 사진으로 표현한 것입니다. 보시면 아시겠지만, 뭔가 카테고리에 가까운 방향으로 사진이 나온 것을 볼 수 있습니다. 특히, car 같은 경우는 정말 자동차처럼 생겼습니다.

그런데, horse 같은 경우를 보면 뭔가 많이 이상합니다. 머리가 양쪽에 두 개 달려있는 말처럼 보이시지 않나요? 이것이 바로 Linear Classifier의 문제점 중 하나인데, 왼쪽을 보고 있는 말과, 오른쪽을 보고 있는 말 같은 다양한 사진들이 존재하는데, 이것을 하나로 묶어서, 그냥 그러한 모든 자잘한 점들을 평균을 내버리니깐 말이죠.

물론, Linear Classifier는 카테고리마다 하나의 결과밖에 내지 못한다는 본연의 한계가 있으니, 그것치곤 상당히 잘 만들어졌다고 볼 수 있겠습니다.

 

 

 

그리고 이것을 조금 더 알기 쉽게 그래프에 놓고 보면, 일차함수 직선들이 가득한 좌표평면을 확인하실 수 있을 겁니다. 이 선 옆은 비행기, 이 선 아래는 사슴, 이 선 오른쪽은 자동차.. 이런 식으로 나누어진다고 할 수 있겠죠.

실제로, W는 기울기 값을, b는 y절편을 나타내므로, 무수히 많은 사진들이 있는 점들 중에서 최대한 많은 정답을 직선 한쪽으로 몰아넣을 수 있는 W, b값을 정하는 것으로 Linear Classifier의 훈련과정이 작동합니다.

 

그러나, 이런 문제점들도 발생할 수 있습니다.

일차함수 직선으로는 제대로 나눌 수 없는 위의 세 가지 경우들이 가장 대표적인 예시입니다.

만약 사진들이 저런 식으로 분포가 되어 있으면, 어떻게 해도 직선으로는 완벽하게 나눌 수 없겠죠?

 

 

그렇다면, 위의 예시를 한번 봅시다! 우리의 W와 b값이 잘 만들어져서, 사진들에 잘 작동하고 있는지 확인해 볼까요?

일단 고양이 같은 경우에는, 개에 점수가 가장 크고, 고양이는 중위권 정도를 하는 것을 보아, 정답을 맞히지는 못했겠지만 어느 정도는 했다고 볼 수 있겠습니다.

자동차는, 놀랍게도 정답을 맞혔습니다! 아니 잠깐만, 이게 왜 놀랍냐고요?

왜냐하면, 아직은 W값을 그냥 랜덤 값으로 둔 것이거든요!

그러니깐, 맞춘 게 용하다고 볼 수 있다는 것이죠.

한번 오른쪽 개구리를 보시면 더욱 와 닿을 텐데, 실제 정답이 뒤에서 2등인 점수가 나올 정도로.. 좋지 못합니다.

그렇다면, W값은 어떻게 설정해야 할까요? 어떻게 바꿔나가야 할까요?

 

 

.... 는 다음 시간에 하도록 하겠습니다!

다음 시간에는, 좋은 W값을 어떻게 찾아야 하는가에 대한 이야기로 시작해보도록 하죠.

 

+ Recent posts