티스토리 뷰
0. 들어가면서
분류 문제로 다시 들어가 보자. 이번에 적을 모델은 Naive bayes(나이브 베이즈)라는 모델이다. 이 모델의 특징은 2가지이다.
- 이 모델은 컴퓨터가 분류를 했을 때, 사람이 직관적으로 판단이 가능하다.
- 굉장히 많은 머신러닝 연구에서 Naive Bayes 모델을 기본 모형으로 사용한다.
그러나 모델이 나온 지 오래된 모델이고 간단한 모델이라 결과는 그렇게 좋지 않다. 그러나 모델의 기준값인 base라인으로 대부분이 사용한다. ex_ "Naive Bayes 모델로 60% 로가 나왔다. 이거보다는 잘 나와야 하지 않겠냐?" 이러한 느낌으로 사용한다.
Features
Features란 분류를 하기위해 기준이 되는 성질이나, data detail 정도로 생각할 수 있다. 즉, image는 픽셀로 나타나 있는데, 컴퓨터가 이걸로 무엇을 하려면 숫자로 바꿔서 컴퓨터에 줘야 한다. 그리고 documents도 마찬가지로 text를 숫자로 표현을 해줘야 컴퓨터가 분류를 할 수 있다. 우리가 분류하려고 가지고 있는 데이터(images, documents 등)를 숫자로 표현해주는 과정을 Features라고 한다.
이제 생각할 부분은 image classification이나 documents classification에서 쓸 수 있는 Features에는 어떤 것들이 있는가에 대한 부분이다. features를 할 수 있어야 그다음 단계인 classification을 할 수 있다.
Naive Bayes 모델
simple classification으로 two binary features이다.
이게 나이브 베이즈 모델이다. 가장 위에 있는 P(M)이 우리가 알고 싶은 것이다. 이전 포스팅에서는 x에 대한 결과값 y라고 생각해도 좋다. 좀 더 예를 들자면, 사진 속 인물을 보고 결혼했을 확률을 찾아보다고 해보자. M은 결혼의 유무이고, S는 son아들이 사진에 같이 나왔는가? F는 패션에 대한 거다. 즉, S의 확률과 F의 확률로 M의 확률을 찾는 게 Naive Bayes Classifier이다. 여기서는 확률 통계를 알아야 한다.
결혼을 했을 때 아들처럼 보이는 아이를 안고 있을 확률은 0.8이라고 하고, 결혼한 후의 선글라스 끼고 모자 쓸 확률은 0.1이라고 했을 때, 기혼자인 확률을 계산하는 거다.
MNIST 데이터
우리는 아래의 그림을 보고 3이라는 걸 알 수 있으나 컴퓨터는 Naive bayes를 써서 어떻게 알 수 있을까??
일단 features를 생각해보자. 위에서는 아들의 유무와 패션으로 판단했다면 여기서는 간단하다. 각각의 픽셀에 번호를 매긴다. 위의 그림에서는 가로 8개와 세로 8개가 있다. (0,0)에서 (7, 7)까지 픽셀 번호가 매겨진다. 원래는 각각의 픽셀에 흰색인 0부터 검은색인 255까지의 색 중 하나가 포함된다. 그러나 우리는 간단히 보기 위해서 색을 0(흰)과 1(칠해짐)로 두 가지로만 판단한다.
(0,0) = 0
(0,1) = 0
(0,2) = 1
(0,3) = 1
....
64개의 dimensial 한 vector가 나온다. 이러한 과정이 데어터를 feature화 한 거다.
Naive Bayes model
우리가 구하고자 하는 숫자는 0부터 9까지 총 10가지다. P(Y)에는 같은 확률인 1/10로 가정하고 문제를 푼다(크게 안중 요하다). Fi, j는 (1, 2) 같은 좌표가 들어가고 Y는 0~9 사이의 숫자가 들어간다.
위의 그림처럼 3이라는 숫자가 주어졌을 때 각각의 픽셀이 0일 확률, 1일 확률을 계산을 해서 곱하면, 내가 분석하고 있는 숫자가 3인지, 다른 숫자인지를 알 수 있다. 다시 말해서 3이라는 숫자가 주어졌을 때 어느 픽셀이 1일 확률이 높고 어느 픽셀이 0일 확률이 높은 지를 알면 어떤 숫자인지 예측이 가능하다.
Conditional Probability Table(CPTs)
위 사진에서 on은 색이 칠해진 것에 대한 확률이다. 즉, (3, 1)에서 숫자마다 칠해질 확률이 적혀져 있는 거다.
이러한 경우는 P(Y)가 전부 0.1인 것은 uniform distribution이라고 한다. 그러면 non-uniform distribution의 경우는 무엇이 있을까? 핸드폰 번호를 쓰는 빈칸이 있다고 하자. 이 경우 처음 세 자리는 대부분 010이기 때문에 처음 세 자리는 010일 확률이 높다. 이러한 경우가 non-uniform distribution의 경우라고 할 수 있다.
이제 중요한 것은 옆의 사진에 있는 확률을 어떻게 구할 것인가가 포인트가 된다. Y에 따른 확률이 정확하지 않으면 인식을 잘 못하는 모델이 된다. 학습을 한다는 것이 왼쪽의 확률들을 하나하나 알아차린다는 것이다. 값들을 찾아낸 다는 것이 Naive Bayes를 학습한다는 것이고, 학습하고 난 모델을 썼을 때 잘 분류를 하려면 이러한 값들이 중요하다.
그러면 어디서 학습을 할까? Training Data에서 학습을 한다. Training Data는 100명에게 0~9까지 10번씩 쓰라고 해서 학습을 시키는 것이다. 100명이 10개씩 썼으면 한 숫자당 1000개의 데이터가 나온다. 이때 1000개의 데이터중 색칠된 횟수가 몇 번이냐 있는가로 확률을 구한다. 색칠된 적이 15번이 있으면 0.015 확률이다. (Empirically : use training data)
다른 방법으로 아는 방법은 전문가에게 물어보는 것이다. 의료 데이터 같은 경우는 일반 사람이 할 수 없으니 의사분들에게 종량이 있을 확률을 물어봐서 아는 방법 도 있다. (Elicitation : ask a human)
Parameter Estimation
정리하자면 위에서 확인했듯이 랜덤 변수의 확률을 확인하는 방법은 크게 2가지가 있다.
- Empirically : use training data
- Elicitation : ask a human
A Spam Filter
위에서는 숫자로 했지만, 이제 스팸메일의 필터를 만들어 보자. classification도 위와 동일하게 spam이냐 not spam이냐이다.
- P("Free"|spam) - spam일 때 Free가 나올 확률
- P("Hello"|not) - spam이 아닐 때 Hello가 나올 확룰
스팸 메일 100개와 스팸이 아닌 메일 100개를 분석해서 하면 확률을 구할 수 가 있다. text가 데이터일 때는 조심해야할 부분이 있다. 그건 바로 frequency(빈도)이다. 다시 말하면 'free'라는 단어가 한 번나오면 스펨이 아닐 수도 있는데 10번이 나올결우는 스펨일 수있다. 두 번째는 문맥상 위치이다. 'i am free'나 'free money' 와 같이 어떤 단어와 같이 나왔냐에 따라 느낌이 다르다. 그러나 많은 text에서 단어 순어(word order)를 고려하지 않고 대신에 Bag-of-Words를 쓴다.
Bag-of-Words model
단순히 특정 단어가 있는지 유무와 몇번 나왔는지만 판단한다. 그 이유는 모델이 간단하기 때문에 이 모델을 쓴다. 그러나 신경망으로 가면 이 모델을 쓰지 않는다.
Naive Bayes의 문제점
위의 그림을 보면 오른쪽아래 점을 찍은 것을 알 수 있다. 그런데 점을 찍은 위치의 확률은 러닝 시 찍힌 적이 없기 때문에 0이다. 따라서 Naive Bayes에서는 모든 확률들을 곱하여 값을 구하기 때문에 그림에 상관없이 확률이 0이 된다. 즉, Overfitting이 발생한다. 따라서 새로운 데이터에 대해 Generalization 할 수 있는 능력이 매우 떨어진다. 스펨 메일도 학습한 것에서 없는 것이 나오면 test 데이터에 의해 절대 그럴 수 없다고 나온다.
Smoothing
위의 문제점인 overfitting을 방지하기 위해 smoothing이라는 것을 한다. 쉽게 말해서 동전을 10번 던져서 앞면만 10번 나왔다고 11번째 던질 때는 뒷면이 안나오는 것이 아니다. 그렇기 때문에 나온 횟수에 +1을 전체에 다해주고 분모에 적히는 전체 횟수에도 +1을 해준다. 즉, 천번 시도해서 0번 나왔다면 확률이 0/1000 인데 이걸 1/1001로 바꾼다. 여기서 조금더 잘하려면 +1이 아니라 +k를 해준다. k/1000+k로 값이 나오는게 smoothing이다. 이걸 좀더 정확하게 명명하자면 Laplace Smoothing이라고 한다.
이제는 CPT만 학습해야하는게 아니라 smoothing에 대해서도 학습을 해야한다. +1이나 +k를 하는 것은 Hyperparameters라고 한다. Naive Bayes 모델을 제외한 거의 모든 머신러닝 모델들이 Hyperameters를 가지고 있다. 그렇다면 최적의 k 값을 어떻게 찾아 낼까?
Validation Data(held-out)
지금까지 training data와 test data에 대해 배웠다. 그러나 추가로 k 값을 알기 위한 data인 held-out data가 있다.
- training data - 이전에 배운 linear regression에서는 W를 학습하기 위해 사용했고, 여기서는 CPT를 학습하기 위해 사용됐다.
- test data - 학습을 완료 한 모델에 대해서 정확도를 판단 할 때, 항상 test data를 가지고 한다.
- validation Data - linear regression에서는 람다, 여기서는 k라는 Hyperameters에 적합한 값을 찾기 위해 사용 됐다.
보통 1000개의 data point가 있다면 일반적으로 Training Data/ Validation Data/ Test Data는 800/100/100 이나 700/100/200 정도로 사용된다. 즉, 데이터 1000개를 가지고 있다고 하더라도 다 학습하는데 쓸 수는 없다. 나누어서 써야한다.
Baselines
Machine Learning에 대한 연구를 하거나 모델을 제품이나 서비스에 넣는다고 할 때. 가장 중요한 것은 baseline과 비교하는 것이다. 앞에서 Naive Bayes의 중요성 중 하나로 Baseline으로 많이 활용된다고 했다.
Weak baseline
가장 많이 나오는 label로 classifier를 한다는 것이다. 예를 들면 이미지 분류 시 이미지 종류를 보면 개가 60%, 고양이가 20% 자동차가 20%라면 가장 많은 개로 분류해도 정확도가 60%가 나온다.
그러나 baseline을 정할 때 실제 연구에서는 보통 Naive Bayes와 Weak baseline 을 사용하지 않고 좀 더 정확도가 높은 baseline을 사용한다.
Error가 생길 때, 즉 분류가 잘 안 될때 어떻하나?
대부분의 경우는 feature를 더 많이 써야한다. 여기서 Naive Bayes에서는 랜덤 함수로 확률을 구했다. 그러나 이러한 경우 말고도 RGB로 0,1 뿐만아니라 다양한 숫자가 나오는 real-valued 인 경우도 있다.
'인공지능(Artificial Intelligence)' 카테고리의 다른 글
신경망(Neural Network) 기초 이해 (0) | 2020.10.28 |
---|---|
[자연어처리] Word Embedding의 개념과 한계 (0) | 2020.09.09 |
- Total
- Today
- Yesterday
- 자료구조
- react autoFocus
- login
- JavaScript
- 클라우데라
- DFS
- typescript
- read_csv
- pandas
- Vue
- django
- NextJS
- UserCreationForm
- Deque
- 자연어처리
- useState
- BFS
- logout
- TensorFlow
- nodejs
- useHistory 안됨
- vuejs
- Queue
- nextjs autoFocus
- next.config.js
- mongoDB
- Express
- error:0308010C:digital envelope routines::unsupported
- react
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |