개요 

Face recognition 발전 방향중 Loss function변화를 통한 성능향상, 그중에서도  Classification loss 에 해당.

 

설명

본 블로그 글중 'Open set/Closed set...'에서도 언급했었는데, Face Recognition은 위 사진처럼 Separable하게 할건지 Discriminative 하게 할건지중 open set을 위해서 단순히 class 별로 분리하는 hyper plane을 찾는것(classification)을 넘어서 추가 클래스를 데비해 같은 클래스끼리 가까이 하고 다른클래스는 멀리 위치 시키는 mapping을 수행해야한다.

center loss는 그것을 수행하기 위한 방법중 하나이다.

 

 

Classification은 다음 사진과 같은 문제가 있다.

같은 클래스내에서도 variation이 있기 때문에 Separable 하더라도 충분히 discrimnative 하지 않다면 Face Recognition 성능 저하를 일으킨다.

-> Center loss 를 이용해 discriminative 하게 만들자.  식은 다음과 같다.

mini batch 안에서 각 class 마다 class center를 정한후 class에 속하는 sample들을 class center와 가깝게 위치하도록 loss 로 잡아준다. 이때 center는 feature가 바뀌게 되면 새롭게 업데이트 된다. 

원래는 모든 데이터셋을 가지고 class 별로 center 를 구하는것이 맞으나 inefficient, impractical 하므로 

1. mini-batch 내에서 center 구함.

2. 매 iteration 마다 각 클래스 내의 feature들을 averaging 하여 center loss 를 구하고 이를 사용하여 center를 업데이트함.

위 두가지 공식을 가지고 구하게 된다. 정리된 식은 다음과 같다. 

적용되는 loss = classification loss + lamda * Center loss

최종 Loss는 inter class간 떨어뜨리기 위한 Classification Loss, intra class내에서 뭉쳐있게 하기 위한 Center loss를 더한값으로 사용하여 Inter는 separate 하면서 동시에 intra는 compact하게 만든다.

 

위 내용들을 적용시킨 최종 러닝 알고리듬은 다음과 같다.

 

 

lambda(intra를 inter에 비해 얼마나 중요시 여길거냐) 에 따른 분류되는 embedding된 data들

 

출처 : Yandong Wen, et al. , "A Discriminative Feature Learning Approach for Deep Face Recognition" 2016, ECCV

출처 : www.slideshare.net/JisungDavidKim/center-loss-for-face-recognition

Triplet Loss

 

개요

Triplet Loss는 앞에 설명한 Contrastive loss 와 같이 Deep learning based Face recognition에서 두가지 기술 발전방향중 Loss function에의한 발전에 속하고 그 중에서 verification loss function에 해당. 간단히 말하면 무작위 데이터셋을 뽑은후 positive pair와 negative 를 sample한후 positive는 가까이, negative는 멀리 배치하는 방법.

 

설명

-Distance based loss function

- Anchor(a), Positive(p), Negative(n) 세가지 input 사용

- 식 

   L=max(d(a,p)−d(a,n)+margin,0).

-> positive sample은 가까이, negative sample 은 멀리배치하도록 학습하게됨. 이때 margin 이 더해져 있기 때문에  negative를 멀리 보내게 됨.

Triplet Mining

개요

Triplet Loss 에 따라 dataset의 카테고리를 나눌 수 있음. 종류는 Easy, Hard, Semi-hard

설명

-Easy triplets = loss 가 0 일때 = Max안의 함수가 음수 일때= n은 멀리, a는 가까이 충분히 분리가 잘 되어있을때

=d(a,p)+margin<d(a,n)

 

-hard triplets = negative가 positive보다 anchor에 가까울때 

=d(a,n)<d(a,p)

 

-Semi-hard triplets = negative가 positive보단 멀리 떨어져 있지만 충분한 margin을 넘진 못해서 Loss가 양수일때

=d(a,p)<d(a,n)<d(a,p)+margin

 

실질적으로 max(~~,0)인 함수이므로 anchor와 positive + margin을 기준으로 negative값에 따라 좌우되게 된다.

그러므로 hard negative, easy negative, semi-hard negative라고도 표현한다. 

위 설명을 그림으로 표기하면 다음과 같다.

 

Training

-Offline Triplet mining : manually triplet 을 만든다음 network에 적용시킨다(positve, anchor, negative pair를 일일히 만든다)

-Onling Triplet mining : training data를 batch 형식으로 주어 batch 내에서 triplet을 생성하게 된다. 이렇게하면 triplet을 random하게 뽑게 하므로 high loss를 가지는 triplet(학습에 영향을 많이 끼치는 중요한 triplet)을 찾는 기회가 생긴다.

batch size가 N이면 최대 N^3의 triplet을 생성 할 수 있다. 한번에 모든 data에 대해 triplet 을 만드는것보다 학습속도가 빨라진다.

 

-실제 구현 코드 

  -offline : github.com/eroj333/learning-cv-ml/blob/master/SNN/Offline%20Triplet%20Mining.ipynb

  -online : github.com/eroj333/learning-cv-ml/blob/master/SNN/Online%20Triplet%20Mining.ipynb

 

eroj333/learning-cv-ml

Contribute to eroj333/learning-cv-ml development by creating an account on GitHub.

github.com

Embedding Space for train data using PCA in Tensorboard.

 

출처 : medium.com/@enoshshr/triplet-loss-and-siamese-neural-networks-5d363fdeba9b

 

Closed-set

- 일반적으로 생각하는 classification problem 이다 = input 을 넣으면 정해진 N class 의 output으로 mapping 해준다.

- 학습한 후에는 학습하기전 정해놓은 class에 포함되지 않은 새로운 사람을 추가하거나 있는 사람을 없앨 수 없다.

-> 사람은 굉장히 많고 수시로 관찰하는 clalss가 추가/제외되므로 실제 Face Verification/Identification에 사용하기 어렵다.

-model은 학습하면서 주어진 class를 space안에서 구별할 수 있는 hyper plane을 찾게된다.

 

Open-set

-아예 처음보는 클래스에 대한 데이터도 처리해야 하므로 model은 모든 데이터에 대해 generalize해야한다.

-model은 학습하면서 metric-learning problem을 풀게된다.

      *metric-learning problem = 일종의 similarity metric을 배우는것으로, 서로 구별되는 discriminative features를 뽑기위해 학습한다. 

-hyperplane으로 image를 separate하기 보다는 input space를 재정렬 하게되는데. 비슷한 이미지는 가까이 붙이고 다른 이미지는 멀리 떨어뜨리는, 일종의 clustering problem을 풀게된다.

-그러므로 학습된 model은 data간의 distance matrix를 만드는데 사용 할 수 있고, metric learning이라고 불리는 이유가 된다. (distance metric 자체를 learning을 통해 학습하므로) 

 

Contrastive Loss 

-2005, Yann Le cunn이 처음 소개

-처음목적은 Dimensionality Reduction = inforamtion을 최대한 보존하면서 dimension을 줄이는 mapping 찾기.

-> unseen data에도 generalize 해야하고, 주변간의 관계도 유지하면서 dimension을 줄여야한다.

-> 같은사람이면 사진속 이미지에서 비슷할것이다+ 다른사람이면 이미지간 다를것이다.

->사진마다 찍히는 환경(포즈,조명,크기등)이 모두 다르므로 generalize 하기 위해선 point wise 비교하는것보다는 좀더 높은차원(=추상화가 더많이 된)의 feature 차원에서 비교하는것이 좋을것이다 (코가높다, 눈이크다 등등)

-> feature embedding 한 후에 둘간의 유사도를 비교(Siameses Network 내용 참조)해서 가까우면 같은 사람, 먼사람이면 다른사람이라 구분하자.

물론 같다 다르다의 기준은 threshold를 놓고 비교해서 결정하는데, 이것또한 학습한다.

 

->그럼 어떻게 학습하지?

Contrastive Loss의 Generalized 된 식

위식은 class 가 같은경우 Y=0 이어야 Ls를 줄이는 방향으로, 다를경우, Y=1이어야 Ld를 줄이는 방식으로 작동되게 되어 있습니다. 일반적으로  같은경우 Y=1, 틀린경우 Y=0을 택할것 같은데 다르게 되어있네요...  

1-Y, Y가 반대로 된것같은데.. 아시는분 있으면 댓글 달아주세요!

 

(1-Y,Y) 던 ,(Y,1-Y)던 컨셉은 달라지지 않으니 계속 설명하겠습니다.

where, G=embedding mapping function.

 처음에 나올때는 위 두번째 D 식처럼 Euclidean distance를 사용했지만, 다른종류의 similarity metric (Manhattan distance, Cosine similarity,etc.)도 사용가능하고 실제로 요즘은 hyper sphere 위에 mapping 한다는 개념으로 cosine simlarity를 사용하여 Theta+margin 개념을 사용하고 있다.

 

첫번째 L식으로 보게되면 Cross-Entropy(이하 CE)와 굉장히 유사하게 생겼는데 CE는 Classification task를 수행하면서 network에서 결과로 나오는 probabilty값을 사용한다면 , Contrastive loss의 Ls(similar class)와 Ld(dissimilar class)는 metric learning loss로써 network에서 결과로 나오는 포인트의 위치관계를 담고있다.

-> 이것이 cross-entropy를 metric learning 으로 사용하지 않는 이유인데, 즉 , CE는 이미지에서 뽑은 feature가 비교하고자 하는 이미지에서 가까운지,먼지 상관없이 뽑는법을 배우게된다.

 

실제 Le Cunn의 식 

Ls,Ld의 해당하는 부분의 식을 그래프로 그려보면 바로 학습을 진행할경우 같은 class는 0에 가깝게, 다른 class는 m(margin)보다 크게 보내는 Loss function임을 알 수 있다. 다만 Le cunn이 Ld에 1/D같은식을 안쓴이유를

Equalibrium이라는 intuition을 얘기 하는데, 이는 GAN에서 얘기하는것과 비슷하다.

Loss를 무작정 극단으로 치우치게 해서 학습(class가 다른 것들을 무한이 멀리보냄)하게 되면, 이미지상 비슷하지만  다른class 또한 무한히 멀리 보내게되고 그 반대도 학습한다. 결국 학습을 끝냈을때(Equilibrium에 도달하기 힘들어 학습하는데 오래걸리기도 함) generalization 능력을 잃게된다.

 

아래는 블로그 원작자의 원문 설명은 다음과 같다.  

  • If we were to use the same “margin” concept for similar points, we won’t force the similar points to be as close to each other as possible — thus a lot of them would be located near the margin and could be easily pushed out of it, which would make the training unstable and difficult to converge.
  • If we were to use the {1 / Dw} term for the dissimilar points, then we would continue pushing away white dots for eternity (in theory) or for just a very long time, even when the results are already separable and usable for a nearest-neighbour classification. This would also make it difficult to reach the Equilibrium point, is simply unnecessary and may push dissimilar points TOO far away, which may worsen the generalization performance of the model.

 

모델의 개략적인 모습은 다음 사진과 같다.

아래는 MNIST의 Contrastive Loss를 적용시켰을때 feature map의 모습

 

출처 : medium.com/@maksym.bekuzarov/losses-explained-contrastive-loss-f8f57fe32246

사진, 식 출처 : arxiv.org/abs/1704.08063

 

Losses explained: Contrastive Loss

This is a series of posts explaining different loss functions used for the task of Face Recognition/Face Verification.

medium.com

+나의 생각

1. 개요

Jane Street Market이라는 주가예측 회사에서 연 competition

실제 시장 결과를 토대로 얻어진 여러 feature들로 represent 되어있는 data를 보고 1(accept)/0(reject)할건지를 결정해서 maximum return을 하는 own quantitative trading model을 만들어라.

단, 사용하는 data들은 익명화 되어있음.

 


2.DATA

총 네개의 file

1. train.csv

:학습에 사용하게될 데이터.

-shape= (2390491, 138)

-2390491 = 총 500일의 trading data, but 날마다 여러번의 trading 기회 -> 총 2390491번의 거래

-138 = date(날짜) + feature_{0....129}(익명화된 feature. ex.PER) + ts_id(index 1,2,3....) + weight(얼마나 넣을지) + resp_{1,2,3,4,0}(time horizen 짧게 투자할건지, 길게투자할건지 길게하면 risky하게 가능)

 

2. example_test.csv

: 가상 test set , time-series API가 알아서 test/prediction 할때 사용

 

3. example_sample_submission.csv

: sample submission, format 참조용

 

4. features.csv

-feature들의 metadata가 정리되어있음

  (*metadata = data를 활용하기위한 data의 data)

-(30,130)

-30개의 tag들로 feature 130가지를 boolean으로 평가하는것 같은데 각tag마다 무슨 의미인지는 잘 모르겠음.

 

(*csv=comma separated value)


3.EDA Notebook으로 data 최대한 파악해보기

노트북 출처 : www.kaggle.com/carlmcbrideellis/jane-street-eda-of-day-0-and-feature-importance

train.csv

파일은 5.77G로 큼 불러들어 읽는데 시간이 좀 걸림


resp

: 뭐의 줄임말 인지는 잘 모르겠음. 다만 resp * weight=return 이라는것을 보면 가격 변동률로 예상됨.         

       500일동안 resp를 cumulative 한 그래프 x축 : 총 거래량인  2390491이 limit

                                                   

resp 1,2,3,4를 사용하면서 Time horizon에 따른 cumulative resp

maximum llikelihood estimation으로 time horizon T1,T2,T3,T4에 관계를 도출한  "Jane Street: time horizons and volatilities" written by pcarta 에 따르면.  Time horizon 간의 관계는 다음과 같다.

if time horizon(Tj)for resp_1 is 1
resp value는 gaussian dstribution을 보임.

max(resp)= 0.44846

min(resp)=-0.54938

skew(3rd standardized moment) : 0.10

kurtosis(4th) : 17.36 

standardize moment 설명. 출처 : https://en.wikipedia.org/wiki/Standardized_moment


Weight

: 얼마나 투자할지에 대한 수치로 추정 -> -값은 존재하지 않고 0값은 return에는 영향을 주진 않지만 dataset의 completeness를 위해 첨가했다고 대회측에서 작성. 

min=0.00,

max=167.29, on dat 446

17% of dataset, weight=0

0.17와 0.34 두곳에서 peak 가 있는것으로 보아 two distribution의 중첩이 아닐까란 추론

two distribution=? (selling, buying)?

mean = -1.32 for small , 0.4 for large -> don't forget it is value of logarithm

 

 


 

Cumulative return

: cumulative of return(weight * resp)

cumulative resp 은 우상향( 시간지나면 변동률 합산했을때 +) 였으나, weight을 곱하고 나니 하향을 띔(1아래로 떨어짐)

->이게좀 의문, 왜 모델 수익률이 -인지 ...

특히 resp 1,2,3 같은경우 time horizon이 짧고, 변동폭이 작음(conservative한 strategy 사용), lowest return

 

 

 

weight=0값 제외하고 plot 


Time

85th day 부터  시장에 변화가 생겼거나, model의 변화가 생긴것으로 의견이 모아진다.

 

 

하루 6.5시간이 trading hour이므로 23400 sec을 각 하루 거래량으로나누어주면 위의 표가 나온다.

 

 

하루거래량(volatility)을 x축으로 놓고 해당하는 날짜의 수의 비율을 y축으로 표기 

거래량이 많은날 = 일명 'volatile days'라 한다.

 

volatile days를 출력해보았을때 500일중 대부분 85일 이전에 위치한다


The Features

feature 0

: 1과 -1로만 이루어져있다.

1 : 1207005 번

-1 : 1183486 번

-true tag가 없다.

feature0 ,-1로 데이터 분류후에  resp와 return cumlative

다른 feature와 달리 1이냐 -1이냐 에 따라 매우 다른 dynamic을 가진다. bid/ask, long/short, call/put, 혹은 가격변동에 따른 buy/sell order(=면 1, -면 -1)

 

나머지 feature들은 4가지로 분류(Linear, Noisy, Hybryd, Negative)

 

feqture 41,42, 43(Tag14)

- 층이 discrete하게 나옴 -> security레벨같은 레벨개념의 feature일 가능성

- ts_id(n)과 ts_id(n+1)이 비슷한 값을 가지는 경향이있음.

 

feature 60,61,62,63,65,66,67,68

 비슷한 경향이 있음

특이하게 feature_64는 0.7~1.38사이 big gap이 있음.

날별로 plot하면 위와 같고 날마다 반복되는 값의 maximum, minimum이 일정한걸로 보아 시간과 관련된 feature로 보임(장시간에 따른 tick 횟수라던가,,, 장 시작시간, 마감시간에 거래량이 늘어나므로) -> 가운데 빈곳은 break time이라는 해석이 있음. 

 

feature_51 = log of the average daily volume of the stock

 

'Negative' features 

: Features 73, 75,76,77(noisy), 79, 81(noisy), 82.  Tag 23 section에 다포함

 

'Hybrid' features(Tag 21)

:noisy로 시작하지만 특정시점부터 linear 55,56,57,58,49 . Tag 21에 포함.

resp, resp_1,2,3,4와 대응 되는것처럼 보임 -> 

  • feature_55 is related to resp_1
  • feature_56 is related to resp_4
  • feature_57 is related to resp_2
  • feature_58 is related to resp_3
  • feature_59 is related to resp

If that is the case then

  • Tag 0 represents resp_4 features
  • Tag 1 represents resp features
  • Tag 2 represents resp_3 features
  • Tag 3 represents resp_2 features
  • Tag 4 represents resp_1 features

i.e.

  • resp_1 related features: 7, 8, 17, 18, 27, 28, 55, 72, 78, 84, 90, 96, 102, 108, 114, 120, and 121 (Note: 79.6% of all of the missing data is found within this set of features).
  • resp_2 related features: 11, 12, 21, 22, 31, 32, 57, 74, 80, 86, 92, 98, 104, 110, 116, 124, and 125 (Note: 15.2% of all of the missing data is found within this set of features).
  • resp_3 related features: 13, 14, 23, 24, 33, 34, 58, 75, 81, 87, 93, 99, 105, 111, 117, 126, and 127
  • resp_4 related features: 9, 10, 19, 20, 29, 30, 56, 73, 79, 85, 91, 97, 103, 109, 115, 122, and 123
  • resp related features: 15, 16, 25, 26, 35, 36, 59, 76, 82, 88, 94, 100, 106, 112, 118, 128, and 129

17개의 feature들을 각 resp(추측)에 맞게 plot하면 17*5=85 feature는 다음과 같이 떨어진다.

feature와 Tag관계

x축 : 130 Features(좌->우), y축: 29 Tags(상->하)
반복되는 패턴

위와 같이 반복되는 패턴은 resp , resp1,resp2,resp3,resp4 의 관계로 보임. 순서는 Tag0부터 (4,0,3,2,1)

 

feature 별로 해당되는 tag의 수

tag 는 적어도 1개에서 4개까지 가지고 있다. 예외로 feature_0는 0개의 tag

'Region'featuresTagsmissing values?observations

Region features Tags mnissing values? observations
0 feature_0 none none -1 or +1
1 1...6 Tag 6    
2 7-36 Tag 6    
2a 7..16 + 11 7, 8 and 11, 12  
2b 17...26 + 12 17, 18 and 21, 22  
2c 27...36 + 13 27, 28 and 31, 32  
3 37...72 various    
3a 55...59 Tag 21 All hybrid  
3b 60...68 Tag 22 Clock + time features?  
4 72-119 Tag 23    
4a 72...77 + 15 & 27 72 and 74  
4b 78...83 + 17 & 27 78 and 80  
4c 84...89 + 15 & 25 84 and 86  
4d 90...95 + 17 & 25 90 and 92  
4e 96...101 + 15 & 24 96 and 98  
4f 102...107 + 17 & 24 102 and 104  
4g 108...113 + 15 & 26 108 and 110  
4h 114...119 + 17 & 26 114 and 116  
5 120...129 Tag 28    
5a 120 + 4 missing data  
5b 121 + 4 & 16 missing data  
5c 122 + 0    
5d 123 + 0 & 16    
5e 124 + 3    
5f 125 + 3 & 16    
5g 126 + 2    
5h 127 + 2 & 16    
5i 128 + 1    
5j 129 + 1 & 16    

 

Action

:trade/pass(1/0)

가장 간단하게 가격변동률(resp)가 음수일때 pass, 양수일때 trade 하도록 짜보면

day 294를 제외하고 고르게 나쁘지 않게 거래함.

 

missing values(=NAN)

day 0 의 모습. x축: feature, y축: ts_id,  

빠진값의 pattern이 보인다. y축과 나란하게 빠진거 보면 일정 시간에 값을  missing 되었다 생각 할 수있다.

 

day 2 와 day294 는 missing value 가 없는데 이는 ts_id 자체가 매우 적고 feature가 빠지는 시간대에 안걸쳐 있었다 생각할 수 있다. -> outlier로 생각하고 빼도 될거같음

'인공지능 > 캐글' 카테고리의 다른 글

[Jane Street] Overfitting 막기위한 기법들  (0) 2021.02.14

+ Recent posts