일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 커널제거
- 인공지능
- 키분배 알고리즘
- tcp
- recommender
- 인페인팅
- 컴퓨터 보안 키분배
- Git
- feynman's restaurant
- 파인만의 식당문제
- cs231n
- 자바스크립트 비동기
- 러스트
- Readme image
- 커널생성
- image restoration
- brew 권한
- 협업필터링
- 메세지인증코드
- 머신러닝
- react-cookie
- 딥러닝
- pagerank
- computer vision
- 프라미스
- rust
- 비동기 프로그래밍
- 파이썬
- Hits
- 페이지랭크
- Today
- Total
Worth spreading
cs231n (2017) - lecture2 _ 2 (linear classifier) 본문
지난 시간에 이어 이번 시간에는 선형분류기(linear classifier)에 대해서 배워보겠습니다.
선형분류기는 이미지 분류문제에 있어 KNN보다 좀 더 강력한 접근법입니다.
또한 이 선형분류기를 이용해 더 복잡한 딥러닝 알고리즘(CNN,RNN)등으로 확장해 나갈 것입니다.
선형분류기는 딥러닝에서 가장 기본적인 applicaition 중 하나입니다.
우리가 앞으로 구성할 딥러닝 구조를 체내의 신경망구조와 비슷하다고 해서 신경망(Neural net)이라 부르기도 하는데요, 이 뉴럴넷의 재료가 될 수 있는 것들 중 하나가 바로 선형분류기입니다.
신경망을 구성한다는 것은 레고를 조립하는 것에 비유할 수 있습니다.
즉, 우리가 배울 CNN, RNN등 각각의 독립적인 딥러닝 구조들을 우리가 원하는대로 레고처럼 이어 붙여서 사용할 수 있습니다.
예를 들어 바로 위의 슬라이드에 나온 것처럼 뉴럴넷을 구성할 수 있습니다. 우선 CNN을 통해 이미지를 분류하고 RNN을 통해 이 이미지에서 일어나고있는 일을 표현하고 있습니다.
자 그럼 이제 지난 시간에 살펴봤던 CIFAR10에 선형분류기를 사용해보겠습니다.
그런데 선형분류기는 KNN과는 다른 방식의 문제 해결법을 사용합니다. 선형분류기에서 사용하는 접근법은 Parametric Approach라고 하는데요, 파라미터라고 하는 것을 사용하기 때문입니다. 가중치(weight)이라고 표현하기도 합니다.
앞으로 배울 대부분의 딥러닝 application 기법들은 위와 같은 parametric approach를 사용합니다.
파라미터 값들은 우리가 가지고 있는 학습데이터들의 요약한(summarize) 정보를 가지고 있다고 할 수 있습니다.
위 슬라이드에 나와있는 식은 가장 간단한 선형분류기입니다.
f(x,W) = Wx + b
각 변수가 무얼 뜻하는지 하나하나 알아보겠습니다.
우선 함수 f의 입력값 x,W에서 x는 입력 데이터, W는 파라미터입니다. 뒤에 더해지는 b는 bias라고 하는 녀석인데 뒤에서 자세히 다루도록 하겠습니다.
CIFAR10의 데이터 카테고리 개수가 10개이므로 우리는 x 곱하기 W의 결과가 10개의 숫자를 뱉어내도록 만들 것입니다.
여기서부터 행렬곱셈(내적, dot product)을 사용하게 됩니다.
이전 시간에 설명해드렸다시피 CIFAR10의 이미지 사이즈는 [32x32x3] 입니다. 여기서 이 픽셀들을 연산의 편의를 위해서 한줄로 펴겠습니다.
이렇게 한줄로 펴면 [3072x1]의 행렬을 얻게됩니다.
위에서 언급했듯이 우리는 행렬의 내적을 이용해 x와 W를 곱할 것입니다. 우리는 이 결과가 10개의 숫자로 나타나도록 만들 것이므로 W의 모양은 [10x3072] 로 만들겠습니다.
그런데 행렬 내적의 결과(output)가 [10x1]로 나오게 하려면 xW가 아니라 Wx 순서로 행렬곱셈을 해줘야합니다.
( [10x3072] * [3072x1] = [10x1] )
선형분류기 안으로 들어오는 데이터가 x니까 x가 왼쪽에서 날아와서 xW곱해지는게 맞지 않을까 싶기도 한데 우리가 원하는 결과를 위해서는 Wx순서로 곱해줘야 합니다.
[2x2] 크기의 이미지를 가지고 예를 들어보겠습니다. 분류할 클래스의 개수는 3개(고양이, 강아지, 배)입니다. (결과가 세 개의 숫자로 나와야겠죠)
우선 [2x2] 픽셀을 위에서 했듯이 [4x1]로 펴줍니다.
그리고 W*x의 결과가 '3개의 숫자'로 나와야 하니 [3x4]모양의 파라미터를 만들어줍니다.
그리고 W와 x를 dot product 해줍니다
-------------------
행렬곱(dot product)을 잠깐 되돌아보면1
m1 행렬과 m2 행렬을 dot product한다고 했을 때
왼쪽 행렬(m1)의 열(column)과 오른쪽 행렬(m2)의 행(row)이 같아야 dot product를 할 수 있고
결과는 왼쪽 행렬의 형(row) x 오른쪽 행렬의 열(column) 모양으로 나옵니다.
-> m1 [a1 x b1] * m2 [a2 x b2] = m3 [a1 x b2] // b1 == a2
* dot product는 교환법칙이 성립되지 않습니다. ( m1*m2 != m2&m1 )
----------------------
그런데 뒤에 더해지는 녀석이 있습니다. 바로 전 슬라이드에서 'b'라는 이름으로 등장했던 bias라는 녀석입니다.
bias는 output과 같은 모양을 갖는 상수로 세 개의 클래스를 분류하는 문제이므로 3x1의 모양을 갖고 있습니다.
bias는 W*x의 결과에 그대로 더해집니다.
---------------------
* Bias를 더해주는 이유 : 이전 강의에서 말씀드렸듯이 우리가 만드는 분류기(classifier)의 목표는 학습데이터를 분류하는 것이 아니라 한번도 보지못한(unseen) 데이터를 분류하는 것입니다. 이것을 도와주는 역할을 하는 것이 bias입니다.
보시다시피 Bias는 output에는 영향을 주지만 input data와는 직접 곱해지지 않고 나중에 더해지기만 합니다. 이러한 점에서 bias는 데이터와는 독립적으로 존재하게 되는데요.이러한 bias를 유지함으로 우리는 input data에 전적으로 휘둘리지(?) 않게 됩니다.
---------------------
이렇게 Wx + b의 결과가 오른쪽과 같이 [3x1]행렬로 나왔습니다. 여기서 우리가 얻은 숫자가 각 class의 점수(score)입니다. 점수가 가장 높은 것이 우리의 예측 결과라고 생각하시면 됩니다.( [cat : -96.8 , dog : 437.9 , ship : 61.95] -> Dog!!)
앞으로 우리는 선형분류기가 옳은 결과를 나타내도록 W(파라미터)의 값을 개선시켜나갈 것입니다.
위 슬라이드의 하단을 보시면 10개의 이미지가 나와있습니다. CIFAR10 이미지를 분류(classify)하도록 학습시킨 파라미터(W)들을 이미지화 한 것입니다.
자세히 보시면 각 클래스마다 해당 라벨의 사물(동물)과 비슷한 형태를 갖고 있는 것을 알 수 있습니다.(나름)
CIFAR10에서의 파라미터인 [10x3072]행렬의 각 행(row)이 비행기, 차, 새, 고양이,사슴 등등.... 의 형상(templete)을 대표하는 것입니다.
각 행이 하나의 선형분류기 역할을 합니다. 비행기에 대한 선형분류기, 차에 대한 선형분류기, 새에 대한 선형분류기 등등
([1x3072] 선형분류기 10개를 이어붙인거죠).
이 중에서 가장 강한 값을 가지는 선형분류기를 우리의 예측값으로 결정하는 것입니다.
이러한 선형분류기를 좌표계에 그리면 다음과 같습니다.
위 슬라이드에서는 세 개의 선형분류기를 보여주고 있습니다. 위와 같이 각 선형분류기가 decision boundary를 만들어 이미지들을 분류하고 있습니다.
이제 선형분류기가 갖고있는 문제에 대해 살펴보겠습니다.
선형분류기가 잘 동작하지 못하는 dataset을 만드는 건 쉽습니다.
1.사분면에서 opposite한 위치에 decision boundary가 있는 경우
2. 원형의 decision boundary가 있는 경우
3. 여러 개의 독립적인 decision boundary가 있는 경우
위 세 가지 경우 모두 하나의 선을 그어 두 class를 분류하는 것은 매우 어려울듯 합니다
이번 강의에서 우리는 행렬의 내적을 이용해 얻은 값들을 각 클래스 data들의 templete(linear classifier)과 대응시켜 분류할 수 있는 것을 보았고
학습된 W가 새로운 데이터에 대해서도 분류를 할 수 있다는 것을 보았습니다.
하지만 우리는 아직 올바른 w를 고르는 법도 배우지 않았고 우리의 선형분류기 wx+b이 정확히 무엇을 의미하는 지도 배우지 않았습니다.
다음 lecture3에서
- Loss function ( 파라미터의 좋고 나쁨을 숫자로 판단해주는 function)
- Optimization ( 랜덤한 파라미터(W) 값으로부터 Loss function값을 최소화시키는 법)
- ConvNets ( 우리의 f(x,W)=Wx+b 함수를 변경 )
이 세 가지에 대해서 배워보겠습니다.