Search
Duplicate

시각적 이해를 위한 머신러닝/ Metric Learning

지금까지 배운 것은 Supervised Learning
Relative Relationship은 명시적으로 Labeling을 해주지는 않고, 대신 현재 이미지와 비슷한 이미지를 제시함
(결국 클러스터링을 해주는 것)
Metric Learning이란 오브젝트 간의 Distance Function을 만드는 머신러닝
데이터셋의 의미가 상황에 따라 다를 수 있음
두 이미지의 유사도를 점수로 내려면 어떻게 모델링 해야 할까?
어떤 것은 어떤 것에 비해 더 비슷하다.
유사도를 위와 같이 할 수도 있음
기존의 라벨링 대신 유사한 이미지를 이용해서 학습하는 이유는 그게 데이터 수집이 더 쉽기 때문
positive pairs를 만들기도 쉬움 - data augmentation
하지만 수학적으로 noise가 발생하기 쉬움
a가 b보다 가깝고, b가 c보다 가깝고, c가 d보다 가까운데, d가 a보다 가까운 상황이 나올 수 있음
Metric Learning도 Supervised Learning이다.
다만 label 형식이 다른 형태임
레이블은 다른 형식으로도 할 수 있음
오늘 배울 것들
Learning to Rank는 말 그대로 Rank를 배우는 것
Learning to Rank의 학습데이터는 어느 정도 order가 적용된 아이템들의 list로 되어 있음
Rank Model은 어느 정도 정렬된 item들의 순열을 생성해 낸다.
추천 영상 목록 등 —정확히 정렬되었다고 하기는 어렵지만, 적당히 정렬됨. 애초에 사용자의 데이터가 희소하기 때문
문서 검색, 추천 시스템, 광고 등이 예시
문제는 Point-wise, Pair-wise, List-wise로 구분할 수 있음
Point-wise는 regression, classification과 비슷함. 각 아이템은 점수가 있고 그걸 학습 함.
Pair-wise는 선호가 반영된 쌍으로 된 아이템을 학습함 —두 개 중 어느게 더 나은지 판단
List-wise는 2개 이상의 정렬된 아이템을 받아서 최적을 학습함. 이거는 비용이 비싸서 잘 안 쓰임
Rank 모델을 만드는 이유는 추천을 잘하려는 목표도 있고, image나 video를 representation 하려는 목표도 있음
선호를 ordering 하는 과정에서 image와 video를 representation할 것이다는 가정. 그걸로 일반화가 가능할 것이다.
비슷한 얼굴을 계속 학습하면 결국 얼굴이 비슷하다는 컨셉을 이해할 수 있을 것이다.
Ranking을 평가하는 방식으로는 NDCG를 많이 사용 함
리스트가 있을 때 리스트 상위에 높은 점수를 갖도록 하는게 중요함.
DCG 식
식의 좌우는 rel가 지수냐 아니냐의 차이인데 rel은 정답이면 1 아니면 0이 나오는 값이 됨
보통 1아니면 0을 쓰는데 이러면 두 식은 사실 같음
그런데 넷플릭스 같은데는 1-5개짜리 별점을 사용해서 왼쪽 식을 사용하면 1-5점이 나오고 오른쪽 수식을 사용하면 1-31점까지 나올 수 있음
아래의 i는 순위에 대한 것으로 만일 1순위였으면 분모는 1이 되고, 3순위였으면 분모는 2가 되고, 7순위 였으면 분모는 3이 되어서 순위가 아래일 수록 점수가 낮아지도록 설계함
3위는 1위보다 2배 덜 중요하고 7위는 1위보다 3배 덜 중요하다.
NDCG는 Normalized DCG라는 의미가 된다.
NDCG 계산 예 —위 수식에서 2번째는 0.5가 아닌데 실수함. 3번째가 0.5이고, 2번째는 log23\log_{2} 3값이 됨
1순위를 틀리고, 2순위를 맞추고, 3순위를 틀린 상태에서 위와 같이 계산 됨
맞춘 점수 —위 예에서 0.5— 를 best일 때 가능한 점수 —위 예에서 1.75— 로 나눠서 normalize 시킨다. —최종 0.286
Triplet Loss는 3가지가 하나의 데이터를 이루고, 각각 anchor, positive, negative가 됨.
이때 anchor는 기준이 되고 —query가 됨—, positive는 anchor와 가까운 것, negative는 anchor와 먼 것을 의미한
고로 anchor와 positive가 가까이, anchor와 negative를 멀게 하도록 학습하는게 목표임. 아래 수식은 그것에 대한 것
anchor와 positive의 거리, anchor와 negative의 거리 차이를 이용하여 그 결과를 minimize되도록 하는게 L값이 됨
α\alpha는 하이퍼파라미터인데, positive - negative의 값이 α\alpha 보다 커지면 전체 수식은 음수가 되고 그렇게 되면 학습이 잘 된 것으로 본다.
그래서 목표는 α\alpha보다 postivie - negative의 값이 작아지도록 하는 것
positive 데이터는 anchor와 관련 있는 데이터로 하고 negative 데이터는 보통 랜덤으로 뽑음.
다만 단순 무작위로 하면 잘 안 됨
처음에는 학습이 조금 되지만, 몇 번 학습하면 더 배울게 없어짐
위와 같이 학습하면 금방 학습이 되어서 더 학습이 안 됨. 아래와 같이 해줘야 학습이 잘 됨
그래서 Online Negative Mining을 함
일단 처음에는 random으로 시작 함
그러다가 나중에는 나머지 batch에서 negative로 쓸만한 것들을 찾음
그래서 이 방법이 효과를 보려면 batch size가 커야 됨
근데 batch size가 커질수록 계산량이 커짐. O(B2)O(B^{2})
또한 메모리 한계도 존재 함
3가지 negative가 있다고 할 때
1.
positive 보다 가까움
이 경우 수식 상 negative 부분이 더 작기 때문에 positive의 값이 0에 수렴되도록 학습 됨
2.
positive 보다는 멀지만, α\alpha 를 더한 것보다는 가까움
이게 학습하기 좋음
3.
α\alpha를 더한 것보다도 멈
이거는 딱히 학습할게 없음
고로 2번에 해당하는 negative 데이터를 mining 함
FaceNet은 TripleLet 적용한 첫 논문
얼굴 클러스터링 문제를 처리함
같은 사람을 찾는데 정확도가 99%, 95%라는 놀라운 수치가 나옴
실제로 공항에서 사용될 정도로 잘 됨
앞 부분은 기존 deep learning과 유사하고 마지막 loss 부분만 Triplelet Loss를 사용함
모델별로 결과
결과 예시
CDML은 같은 아이디어를 Video 추천에 적용한 모델
좋아요, 싫어요를 이용해서 나와 비슷한 사람들을 모음
Anchor를 랜덤하게 잡고, 연결성이 있는 것을 Positive로 관련성이 없는 것을 Negative로 잡고 학습 함
Video Embedding 모델을 만들면 다른 것을 붙여서 여러 형태로 사용할 수 있음
모델 Layer 구조
이미지와 audio를 나눠서 학습시키고 나중에 합침
loss 부분은 Triplet Loss를 사용함
사례
CDML의 한계
batch size가 커야 됨
online negative mining 때문에 메모리 한계로 GPU도 못 씀
CDML의 한계를 개선한게 GCML
Negative를 Random하게 찍지 않고, 잘 고르자는 것
relational graph를 잘 클러스터링 함
가까운 cluster에서 negative로 고르자
bottom up으로 cluster를 합침
그렇게 합친 후에 negative를 형제 cluster 중에서 고름
만일 형제에서 안 되면 한 단계 더 올라가서 고름
Level을 조절하면서 데이터를 샘플링할 수 있음
효과는 있었지만 semi-hard negative를 완전히 없애지는 못 함
훨씬 작은 데이터셋(1/10)으로도 성능은 비슷하게 할 수 있었음
Contrastive Learning은 3개를 쓰는 Triplet과 달리 2개만 사용함
대신 두 이미지가 비슷하면 0, 비슷하지 않으면 1이 되도록 함
유사한 경우와 유사하지 않은 경우에 Loss 를 다른 것을 사용함
유사한 이미지일 경우 distance가 커질수록 loss가 커지도록 함
유사하지 않은 이미지일 경우 distance가 가까울수록 loss가 커지도록 함
학습 방법
이미지들을 classfication 할 때 맨 마지막에 class 개수만큼의 softmax 함수를 사용
만일 클래스 개수가 수백만-수천만개 있다면 저걸 다 계산하는게 비효율적이다.
zebra 같은 잘 안 쓰이는 단어를 반영해주는게 비효율적이므로 여기에도 negative sampling을 해주자는 아이디어
근데 실제로는 잘 되기도 할 때도 있고 잘 안될 때도 있음
SimCLR은 contrastive learning을 적용한 방식
오리지날 데이터에 대해 data augmentation을 적용해서 pair를 만들고 그것을 positive로 설정.
오리지날 데이터에 pair를 만들었으므로 데이터 전체는 2N개가 되고, 자기 자신과 positive를 제외한 2N-2개를 모두 negative로 설정
그것을 이용해서 contrastive learning을 한다.
Contrastive loss
분자는 유사도를 구하고 그 값이 높아지도록 함
분모는 2N개의 미니 배치에 대해서만 유사도를 구하고 그 값이 낮아지도록 함
이렇게 했더니 self-supersized learning 효과가 발생함. 사람이 labeling 하지 않아도, 스스로 관련 있는 것들을 찾아냄
위 방법을 좀 더 체계화 한 것이 NCE. 요즘 많이 쓰임
처음에는 word embedding에서 적용되었음
true-pair(중심에 있는 단어와 같이 등장한 단어)가 있고 fake-pair(랜덤하게 고른 단어)가 있음
pair가 들어왔을 때 true-pair냐, fake-pair냐를 학습함
이렇게 하면 word vector들이 의미를 할 것이다는 기대
학습 example MM개가 있을 때, 그 학습 example이 만들어진 어떤 확률 분포 PmP_{m}이 있다고 가정
이것이 각 단어들의 출현 확률 같은 것이 됨. 알고자 하는 것이 바로 이 확률 분포
예전에는 classfication을 위해 softmax를 씌우고 했었는데 이걸 안하기 위해 —안하는 이유는 계산량이 비효율적이기 때문— fake 확률 분포 PnP_{n}이 있다고 가정.
그리고 거기서 NN개의 샘플을 만들어 냄
PmP_{m}PnP_{n}에서 데이터를 가져와서 무작위로 섞은 후에 binary classification 을 푸는 형식으로 바꿈
softmax를 풀지 않고 진짜인거 가짜인것만 구별하도록 함
위 식이 기본 식인데, 왼쪽 것(M개)은 진짜이고 오른쪽(N개)은 fake가 됨. 목표는 식이 maximize하게 하는 것
maximize해야 하므로 진짜는 값이 크게 나오도록 해야 하고, 가짜는 값이 작게 나오도록 학습이 되어야 함
진짜, 가짜의 수식의 의미는 box의 화살표를 따라가면 됨
둘 다 함수 자체는 동일한데 그 결과가 반대가 나오도록 해야 함
시그모이드 함수 말고 다른 함수는 (진짜일 확률 / 가짜일 확률)의 형식으로 값이 커질 수록 진짜일 확률이 높아짐
이렇게 해서 진짜인 것끼리 가깝게 하고 가짜인 것은 멀어지게 함