Search
Duplicate

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

supervised learning은 input에 대해 정답이 주어짐.
정답이 주어지지 않고, input들의 상대적인 관계 정보만 주어짐.
고양이는 비행기 보다 비슷하다.
Metric Learning은 두 input의 semantic distance function을 학습하는 것
Similar 하다는 것은 상당히 상대적임. 그 유사도를 수치적으로 표현하기는 쉽지 않음.
유사성에 대한 common sense가 있기 때문에 위와 같이 구분해 볼 수 있음.
Labeling 하지 않는 것은 Labeling 비용이 비싸기 때문.
상대적인 데이터들은 수집이 쉽다. pair로 만들기도 쉬움.
다만 이런 데이터는 noise가 있을 수 있음. 또한 추이적(transitivity) 관계가 성립하지 않을 수 있음.
metric learning도 supervised 이긴 함.
데이터셋이 multi modal로 들어올 수 있음.
살펴볼 주제들
ranking model은 item의 순서를 정렬해 줌.
point-wise는 점수를 갖고 결정 함.
pair-wise는 2개의 item 중에 어느 것이 더 선호 되는지를 결정 함.
list-wise는 정렬된 list를 줌.
이거는 계산량이 exponential 하게 증가하기 때문에 approximate로 pair-wise를 사용 함.
ranking을 매기는 과정 자체에서 embedding이 나오는데, 그걸 이용하면 다른 task에 대해서도 generalize가 됨. —representation learning.
비슷한 얼굴을 묶는 task를 통해 사람의 얼굴이 비슷하다는 것을 뉴럴 네트워크가 generalize 할 수 있게 됨.
Normalized Discounted Cumulative Gain(NDCG)는 랭킹을 매기는 metric에서 많이 쓰임
loss 함수는 1위를 맞출 때 점수를 많이 주고, 3등을 맞출 때 그보다 점수를 덜 주고 하는 식으로 높은 ranking에 더 높은 점수를 줌. —점수를 그냥 쓰는 경우와, 지수로 주어지는 경우가 있음.
예측 점수를 가능한 최대 DCG로 나눠주기 때문에 점수는 0-1사이의 값이 나옴.
NDCG 계산 예
Triplet은 3개의 input(anchor, positive, negative)으로 이루어져서 triplet임.
2010년대 많이 쓰였으나 현재는 다른 것을 더 많이 씀.
anchor-positive가 anchor-negative보다 높게 나와야 함.
loss는 anchor와 positive의 값을 anchor와 negative의 값으로 뺀 결과를 최소화하도록 함. 마지막에 α\alpha는 margin으로 positive와 negative의 간격을 α\alpha이상 벌리도록 함.
positive 데이터는 많은데, negative 데이터는 수집이 어려움.
그래서 positive가 아닌 것 중에 램덤으로 negative를 뽑아서 사용함.
문제는 그렇게 하면 너무 쉬워서 학습이 잘 안 됨.
그래서 처음에는 easy triplet으로 학습 시키고 그 후에 hard triplet으로 학습을 시킴
negative가 너무 쉬우면, mini-batch 단에서 현재 학습된 negative 보다 더 가까운 것을 찾아서 negative로 써서 학습 시킴. 그러면 좀 더 학습이 된다.
다만 negative mining을 하려면 batch size가 커야 됨.
문제는 batch size가 아주 커지면 gpu에 안 올라감.
negative가 positive보다 가깝거나, positive 보다는 멀지만 α\alpha 보다는 안 멀거나, 아예 α\alpha 보다 먼 경우가 있는 경우
positive와 α\alpha 사이에 존재하는 negative를 설정하는게 효과적이다. 이게 semi-hard negative mining
positive 보다 가까운 negative를 주면 문제가 너무 어려워서 학습이 안 됨.
FaceNet이 처음으로 Triplet을 사용한 논문.
15년에 나왔는데 그때 이미 성능이 높아서 현재 이미 널리 쓰이고 있음. 공항에서 쓰이고 있을 정도
FaceNet의 아키텍쳐
성능도 잘 나옴
FaceNet 예제
CDML은 영상에 like를 누른 사람들을 비슷한 그룹으로 모아서 그들에게 서로가 좋아한 것을 추천해 줌.
시청한 영상들을 graph로 표현한 뒤, achor와 연결된 것들을 positive로 연결하고, negative는 그렇지 않은 것 중에 무작위로 고름.
anchor와 positive는 가까이 두고 아닌 것들은 멀리 떨어뜨리는 triplet loss를 써 줌.
그걸 이용하면 연관된 비디오, 비디오 추천, 분류도 할 수 있음.
모델 아키텍쳐
이미지와 오디오를 각각 학습 시켜서 fully-connected를 합친 후에 triplet loss를 줌.
이때 fully-connected 이전은 freezing하고 역전파 시킴
사례
video 용량이 너무 커서 GPU에 넣을 수 없어서 CPU로 돌리면 시간이 너무 오래 걸림.
CDML을 개선해서 GCML을 만듦.
negative를 랜덤으로 하지 않고, 모든 video를 clustering 해서 처리 함.
negative를 무작위로 고르지 않고, clustring으로 묶은 것에서 상위 단계에서 옆의 node(친척)을 negative로 잡아 줌.
성과는 있었으나 의도했던 negative mining을 안하는 것은 못 함.
Contrastive Learning이 Triplet을 대체 함.
triplet을 안 하고 2개만 쓰임. 2개가 비슷(similar)하면 0으로 만들고, 다르면(dissimilar) 1로 만드는 loss 씀
similar일 떄는 그래프의 빨간색 loss, dissimilar일 때는 파란색 loss가 되도록 써서 합침.
similar한 경우에는 W를 줄여주고, dissimilar는 W를 증가시켜주는 방향으로 학습이 됨.
소프트맥스는 분모에 class들의 exponential을 씌운 합이 들어가는데, 이건 해당 클래스가 쓰이지 않는 상황에서도 분모에 남아서 영향을 줌.
이게 class 수가 적을 때는 문제가 없는데, 요즘 처럼 class가 수백 만~수천 만이 되면서 계산할게 너무 많아짐.
‘zebra 같이 잘 안 쓰이는 데이터에 대한 계산도 매번 해야 되는가’는 의문
softmax 분모의 negative를 다 쓰지 말고 sampling 해서 쓰자는 것이 아이디어. 어차피 대부분 0일 것이므로. 이때 positive인 것은 당연히 들어가야 하고 negative는 sampling 해서 사용.
이렇게 분모에 있는 것을 sampling 해서 쓰면 결국 contrastive learning이 된다.
contrastive learning은 분자에는 positive 값이 들어가고, 분모에는 positive class가 포함된 것과 그 외의 것들을 넣어서, 분자를 키우고, 분모를 줄이는 식으로 학습하면 됨.
SimCLR이 contrastive learning을 기반으로 한 모델.
positive를 수집하지 않고 Data Augmentation으로 만들어서 쓴다.
일단 1차로 같은 encoder에 넣어서 embedding을 한 후에,
그 후에 다시 몇 단계를 거쳐서 나온 2차 embedding 결과를 얻으면 그 둘의 similar를 계산하고 그 값을 maximize 한다.
분자를 positive로 두고, 분모에는 positive를 포함한 것을 두고, 분자를 키우고 분모를 줄이는게 결국 contrastive learning이 됨.
분자에는 자기 자신 i와 pair인 j을 넣고, 분모에는 자기 자신 i을 제외한 나머지 것들 —이때 positive인 j도 포함됨— 을 넣어서 loss를 준다.
Noise Contrastive Estimator(NCE)는 softmax 대신에 binary classifier를 해보자는 접근
2개의 input word가 어울릴 수 있느냐를 맞춤.
실제 어울리는 두 단어와 fake로 만든 두 단어를 두고, 정말로 어울리는 단어인지 fake인지를 맞추는 것을 학습 함.
실제 분포와 가짜 분포를 만들고 진짜와 가짜를 다 섞은 후에 거기서 뽑은 데이터가 실제 분포에서 나온 것인지 가짜 분포에서 나오게 한 것인지를 맞추게 함.
2개 중에 하나기 때문에 softmax를 안 쓰고 binary classfication으로 사용할 수 있게 함.
NCE의 loss 함수.
진짜를 맞췄을 때가 앞의 값이 나오고, 가짜일 때는 뒤의 값이 나오는데, 둘다 logistic regression을 사용하는데,
식을 따라가면 결국 분자에 존재하는 분포 pm(xi;θ),pm(yi;θ)p_m(x_i;\theta),p_m(y_i;\theta)를 최대화, 최소화 하는 것을 학습하게 됨.