ex) 영상이 'car' 영상일 확률이 가장 높고, 그 'car'의 위치는 어디쯤에 있다.
물체가 있는지 / 물체의 중심점의 x좌표 / 물체의 중심점의 y좌표 / 물체의 넓이 / 물체의 높이를 찾아낸다.
Object Detection
ex) 영상 안에 있는 모든 물체들과 그것들의 위치(영역)을 함께 찾는다.
현재 예측치와 Ground Truth(참값)의 차이가 줄어들도록 CNN을 업데이트한다.
Object Detection에서는 box가 반드시 한 개인 것은 아니다. (여러 물체가 detect될 수 있다.) 따라서 object별로 벡터가 필요하다.
어느 위치에 object가 있는지 찾고 + 영역 크기도 결정하고 + 어떤 object인지도 알려줘야 한다. 복잡한 문제이다.
Object Detection 요소 기술
Region Proposal : Object가 있을만한 영역을 다수 추천
Non-max Suppression : 겹치는 영역 제거
Classification : 영역 속 Object 분류
Bounding Box Regression : Object 영역 (Boundary) 미세조정
Faster RCNN
기본 flow
https://medium.datadriveninvestor.com/review-on-fast-rcnn-202c9eadd23b
pre-trained된 cnn 모델을 통과시키고 두 개의 Stage로 나눈다. 위 그림같은 경우는 위 stage가 region proposal stage가 된다. 이후 region proposal가 추천해준 3개의 영역(위 그림의 경우)에 대해서만 classification과 bounding box regression을 수행하게 된다.
Region Proposal Architecture
https://tryolabs.com/blog/2017/11/15/our-odsc-talks-in-video/
anchor의 값이 9면 2k objectness scores(물체가 없는가에 대한 점수)의 output channels는 2*9가 되어 18개가 된다.
IOU(Intersection over Union) measure
IOU = 교집합 / 합집합
Objectness의 기준
(Training시) 이 영역이 object 영역인지 아닌지 판단하는 방법 : Ground Truth object 영역과 IoU를 계산해 IoU가 Threshold(ex) 0.6 -> IoU가 0.6 이상부터 물체라 판단.)보다 크면 이 영역을 object 영역이라 판단.
IoU로 판단하지 말고 Ground Truth Object영역과 교집합으로 판단하면 되는 문제 아닐까? but 그렇게 하면 Box Boundary Regressor가 할 일이 어려워진다.
RPN(Region Proposal Network)에서는 Ground Truth Object 영역과 IoU가 0.6이상 되는 후보 영역들을 찾아주는 것이 목적
Anchor Box
정해진 크기와 비율을 가진 미리 정의된 후보 Box
상단 그림의 오른쪽과 같이 미리 정의된 Anchor Box를 둔다. 각 Anchor Box를 Object가 있는 곳에 위치시켜 IoU가 0.6 이상이 되면 Object라고 Detect하도록 한다. 즉, 너무 작은 Anchor Box가 Object에 위치하게 되면 (물체의 아주 일부분만 보게 된다면) IoU가 0.6보다 작게 나올 테니 Object라고 판단하지 않는다. 이렇게 하면 딱 물체 크기에 적당히 알맞게 Boundary할 수 있게 된다. 위 그림에선 오른쪽 아래의 Anchor Box가 가장 적절하고 큰 IoU가 나타나게 될 것이다. 즉, 왼쪽부터 Anchor Box 0번이라고 하면 0,1,2,3,4,5,6,7번 Anchor Box는 Object가 거짓이라는 값(아니라는 값)을 뱉어낼 것이고, 마지막 8번째 Anchor Box만이 Object가 맞다(참)고 정답을 줄 것이다. 이를 한 번에 모아서 정답 벡터를 만들어낸다. 이에 대한 모든 정답 벡터를 모아 하나의 정답 박스를 만들어내게 된다.
상당히 많은 Boundary Box가 새겨지게 될텐데 이를 전부 이용해 연산을 하면 너무 많은 연산량으로 오랜 시간이 걸리게 될 것이다. 이를 보완해주는 것이 Non Max Suppression
Visual Recognition이란? 카메라를 통해 취득되는 사진이나 동영상에서 정보를 취득하는 과정
비선형 함수의 필요성
딥러닝 모델에서는 각 레이어마다 벡터(텐서)간의 연산이 이뤄지게 된다. 이 때, 비선형 함수가 존재하지 않으면 벡터간 연산은 결국 또 다른 하나의 벡터라는 결과가 나오게 되기 때문에 사실상 여러 개의 레이어를 썼다고 표현할 수 없게 된다. 그렇기 때문에 출력에 대해 비선형적 연산이 사이에 들어가야 한다. (ex)Tanh, Sigmoid, ReLU, Max pooling 등)
CNN
상대적 위치에 어떤 특징점이 있는지 알려준다 (ex) 좌측 상단에는 귀가 있고, 우측 하단에는 눈썹이 있고...)
layer가 올라갈수록 복합적 정보를 갖는 노드가 된다. 더 추상화된 정보를 갖고 있다고도 한다.
설명 가능한 AI(XAI)
기존 인공지능 동작 결과 : 이 그림은 95% 확률로 고양이다.
XAI 동작 결과 : 털, 수염이 존재하고, 유사한 귀의 모양을 가졌기 때문에 이 그림은 95%의 확률로 고양이이다.
Multi-channel Convolution
Color Image -> RGB 3 channels(depth)
output channel의 개수 = 필터의 개수
Input : [batch(영상이 몇 개가 있는가), in_height, in_width, in_channels] filter : [filter_height, filter_width, in_channels, out_channels]
pooling의 효과 : invariance를 높인다. 불변성을 갖도록 한다. 작은 변화에 크게 반응하지 않도록 한다.
첫 번째 단계 : 피쳐 추출기(Feature Extractor)와 분류기(classifier) 전부 학습 시킨 모델을 사용한다. -> 모델 파라미터를 변형하지 않고 사용 - 문제가 거의 같을 때 사용 ex) ImageNet 데이터로 학습된 모델을 개와 고양이 분류하는 문제에 사용 두 번째 단계 : 피쳐 추출기를 그대로 활용하고(weight copy), 분류기만 현재 자신이 갖고 있는 문제에 맞게 재학습시킨다. -> 문제가 비슷할 때 사용 ex) ImageNet 데이터로 학습된 모델을 어벤져스 캐릭터 분류 문제에 사용 세 번째 단계 : 피쳐 추출기에서 부분적으로 다시 학습을 시키고, 분류기를 자신이 갖고 있는 문제에 맞게 학습시킨다. -> 문제가 약간 다를 때 사용 ex) ImageNet 데이터로 학습된 모델을 얼굴인식 문제에 사용 네 번째 단계 : 피쳐 추출기와 분류기 전체를 재학습 혹은 미세 조정해야 한다. -> 문제가 많이 다를 때 사용 ex) ImageNet 데이터로 학습된 모델을 의료영상 문제에 사용
하나의 목표 단어 w와 상황 단어 c가 주어졌을 때 다음과 같은 확률모델을 가정한다. w에 해당하는 임베딩 벡터를 v_w, c에 해당하는 임베딩 벡터를 u_c라고 한다.
x_w를 단어 w에 대한 one-hot 벡터라 하면 v_w와 u_c는 다음과 같이 정의 됨.
이 모델 문제점은 확률모델의 분모 계산량이 많다. (|V|d와 비례)
해결책
Noise-contrastive estimation(Nce) : Normalization constant(위 식 분모)를 하나의 파라미터로 학습한다. 이진 분류 문제에 해당하는 새로운 목표함수를 최적화시킨다. 이렇게 해서 얻어지는 파라미터들이 원래 likelihood 최적해를 근사한다는 것이 증명된다.
이를 좀 더 단순화시키면 negative sampling이 된다.
Word2vec은 negative sampling을 사용.
Glove
Noise-Contrastive Estimation
참고 논문
Noise-Contrastive Estimation of Unnormalized Statistical Models, with Applications to Natural Image Statistics (JMLR)
A fast and simple algorithm for training neural probabilistic language models (ICML)
context h -> 다음 단어 w 예측
핵심 아이디어
고차원 multi-class classification -> binary classfication으로 전환
주제 분류 (ex) 논문 주제 분류 - 컴퓨터(AI, 데이터베이스, 그래픽, 암호학, etc...))
이메일 스팸 분류
감성 분류 (ex) 영화 리뷰, 제품 리뷰, 정치 리뷰, 예측(선거 결과))
여러 측면이 있을 수 있지만 간단한 작업에 집중
감정적, 태도적, 성격적 측면
주어진 텍스트가 긍정적 태도를 보이고 있는지, 부정적 태도를 보이고 있는지.
언어 분류 (영어? 한국어? 프랑스어?)
문서 분류 방법
규칙 기반 모델
단어들 조합을 사용한 규칙들 사용
ex) spam : black-list-address OR ("dollars" AND "you have been selected")
Precision(정확도)은 높지만 recall(예외적 상황 커버 힘듦)이 낮음
Snorkel (규칙 기반 모델 + 머신러닝 모델)
각각 규칙을 'labeling function'으로 간주
Graphical model 일종인 factor graph를 사용해 확률적 목표값을 생성하는 generative model
프로젝트 초기 labeled data가 부족하거나 클래스 정의 자체가 애매한 경우(하지만 규칙을 생성하는 것은 쉽다 가정)에 매우 유용한 방법
확률적 목표값이 생성된 후 딥모델 등 다양한 모델 사용 가능
지도학습
Input
a document - d
a fixed set of classes - C={c_1, c_2, ..., c_J}
A trasining set of m hand-labeled documents - (d_1, c_1), ...., (d_m, c_m)
Output
a learned classifier - γ : d -> c
다양한 모델 사용 가능
Naive Bayes
Naive Bayes 가정과 Bag of Words 표현에 기반한 간단한 모델
Bag of Words - 가방 안에 단어를 담고 섞는다!
순서를 고려하지 않은 단어들의 집합 (단어의 빈도수만 고려)
Naive Bayes 분류기
수식화
P(c|d) = P(d|c)P(c) / P(d)
분모는 최적의 클래스를 찾는데 상관이 없는 부분이라 빼도 된다.
위 문제를 해결하기 위하여 다음과 같은 2가지 가정을 사용한다.
Bag of Words 가정 : 위치는 확률에 영향을 주지 않는다.
조건부 독립(Conditional independence) 가정 : 클래스가 주어지면 속성들은 독립적이다.
가정들을 적용시킨 후의 수식
Naive Bayes 분류기는 입력값에 관한 선형 모델이다.
학습
MLE (Maximum Likelihood Estimation)
N_doc = 학습 데이터에 들어 있는 모든 문서의 수
Zero 확률문제(단어가 한 번도 나오지 않았을 시 나타나는 문제)를 개선하기 위한 Leplacel(add-1) smoothing
모든 단어들의 최소 빈도를 1로 설정하는 굉장히 간단한 방법.
알고리즘
function TRAIN NAIVE BAYES(D, C) return log P(c) and log P(w|c)
for each class c∈C #Calculate P(c) terms
N_doc = number of documents in D
N_c = number of documents from D in class c
logprior[c] <- log(N_c / N_doc)
V <- vocabulary of D
bigdoc[c] <- append(d) for d∈D with class c
for each word w in V # Calculate P(w|c) terms
count(w,c) <- of occurrences of w in bigdoc[c]
loglikelihood[w, c] <- log(count(w, c) + 1 / sigma_w'(count(w',c)+1))
return logprior, loglikelihood, V
function TEST NAIVE BAYES(testdoc, logprior, loglikelihood, C, V) return best c
for each class c∈C
sum[c] <- logprior[c]
for each position i in testdoc
word <- testdoc[i]
if word ∈ V
sum[c] <- sum[c]+loglikelihood[word, c]
return logprior, loglikelihood, V