Hard skills/Machine Learning (21)


Scikit-learn Gradient Boosting 모델 예측값이 매번 달라지는 문제와 해결


아래 코드는 k-fold cross-validation 을 통해 best parameter 를 찾은 후, test set 에 대해 예측하는 코드이다. 이 코드에서 random_state=2020 을 지정하지 않으면, GridSearchCV 를 통해 구한 best parameters set이 매번 달라졌다. 즉 이말은 Gradient Boosting Tree 가 fitting 할 때마다 달라진다는 뜻이다. 


def cv_and_prediction(x_vars, name, model=False): train_x = metadata_valid[x_vars] train_y = metadata_valid["case"] test_x = metadata_test[x_vars] test_y = metadata_test["case"] model = GradientBoostingClassifier(random_state=2020) param_test = { "n_estimators": range(50, 100, 25), "max_depth": [1, 2, 4], "learning_rate": [0.0001, 0.001, 0.01, 0.1], "subsample": [0.7, 0.9], "max_features": list(range(1, len(x_vars), 2)), } gsearch = GridSearchCV( estimator=model, param_grid=param_test, scoring="roc_auc", n_jobs=4, iid=False, cv=5, ) gsearch.fit(train_x, train_y) print(name) print("Best CV Score", gsearch.best_score_) print("Best Params", gsearch.best_params_) model = GradientBoostingClassifier(**gsearch.best_params_) model.fit(train_x, train_y) metadata_test[name] = model.predict_proba(test_x)[:, 1] return model


왜 이런문제가 발생하는가 ?


Decision trees can be unstable because small variations in the data might result in a completely different tree being generated. This problem is mitigated by using decision trees within an ensemble.


The problem of learning an optimal decision tree is known to be NP-complete under several aspects of optimality and even for simple concepts. Consequently, practical decision-tree learning algorithms are based on heuristic algorithms such as the greedy algorithm where locally optimal decisions are made at each node. Such algorithms cannot guarantee to return the globally optimal decision tree. This can be mitigated by training multiple trees in an ensemble learner, where the features and samples are randomly sampled with replacement.


구글링을 통해 문제가 발생할 수 있을만한 원인을 찾았다. 


1. 우선 Decision tree 를 적합하는 방법은 heuristic algorithm (greedy algorithm) 이다. 왜냐하면 optimal 한 decision tree 를 찾는 것은 np-complete 문제이기 때문이다. 하지만 직접적인 문제는 아닌듯하다. greedy 한 방법으로 tree 를 만들더라도 매번 같은 greedy 한 방법을 이용하면 같은 tree 가 생성되기 때문이다.


2. Gradient Boosting 과 같은 ensemble 방법에서는 매 iteration 마다 subsample 을 만들어서 negative gradient 를 예측하는 모델을 만들어서 합치게 되는데 이 때, subsample 이 random 하게 설정되기 때문에 매 번 모형이 달라지고 이로 인해 예측 값이 조금씩 달라지게 된다.  


정확한 원인이 무엇이든 Gradient boosting tree 를 만드는 것에는 randomness가 있으며 reproducible 한 코드를 작성하고 싶으면 GradientBoostingClassifier(random_state=2020) 와 같이 random_state 를 지정해야한다. 


참고

https://scikit-learn.org/stable/modules/tree.html#tree

구글 번역기는 하나의 긴 문장을 두 개의 문장으로 쪼개주기도 한다.

 

임상 정보 기반 위험도 평가부는 임상 정보와 유전체 정보에 따른 위험도를 산출하는 모듈로, 유전체/가족력 정보를 통해 대상자를 몇 가지 표현형 (phenotype) 으로 나눈 후, 각 표현형의 나이에 따른 유방암 발생 확률에 임상 정보를 통해 추정한 상대 위험도 (relative risk)를 곱하는 방법을 통해 위험도를 산출한다. 

 

The clinical information-based risk assessment unit is a module that calculates the risk according to clinical information and genomic information. After dividing the subject into several phenotypes through genome / family history information, the risk of breast cancer according to the age of each phenotype and clinical It is calculated by the squared relative risk estimated from the information.

 

빠르게 영문 번역해야할 일이 있어 번역기의 도움을 받았는데 정말 좋은 것 같다. RNN seq to seq 의 개념에서 마침표를 하나의 단어로 인식한다면 기술적으로 불가능한것은 아니겠지만 어떻게 트레이닝을 했을지 정말 놀랍다. 

One shot learning, Siamese Network 이해


Problem Definition 


이미지 인식 분야에서 각 label 의 이미지 수가 적을 때 이를 인식하고 분류하는 것은 challenging 합니다. 예를 들어 얼굴 인식 분야에서는 단 몇 장의 이미지만을 통해 동일인인지 여부를 구분해야하는 문제가 있습니다. 물론 augmentation 과 같은 방법으로 샘플 수를 늘려서 CNN 으로 multi-class classification 문제를 풀도록 학습시키는 방법이 가능합니다. 하지만 이 경우, 새로운 사람이 데이터 베이스에 추가되었을 때, 모델을 새로 학습해야한다는 문제가 생깁니다. 즉, 실시간 시스템에 적합하지 않은 방법입니다. 


이러한 문제를 해결하는 한 가지 방법은 "Distance function" 을 이용하는 것입니다. 


D(x_1, x_2) = degree of difference between images 


Distance function 을 이용해, 예를 들어, D(Image1, Image2) <= k 인 경우 같은 사람이라고 예측하고, > k 인 경우 다른 사람이라고 예측할 수 있습니다. 또는 DB 에 있는 모든 Image 에 대해사 distance 를 계산한 후에 가장 distance 가 작은 사람으로 분류할 수 있습니다. 이러한 아이디어의 의미는 face recognition 에서는 누구인지 구분하는 것보다 "동일인지 여부" 가 중요하다는 것입니다. 또한 이를 이용해 multiclass classification 을 할 수도 있습니다. 이는 아이디어 측면에서 머신러닝의 고전적인 방법인 nearest neighbor 방법과 비슷합니다. 본 포스팅은 Distance function 의 인풋으로 넣기 위한 representation 을 만드는 함수 f 를 딥러닝으로 학습하는 방법에 관한 것입니다. 이미지의 distance 를 계산하기 위한 representation learning 개념입니다. 


Siamese Network + Triple loss


Our approach is to build a trainable system that nonlinearly maps the raw images of faces to points in a low dimensional space so that the distance between these points is small if the images belong to the same person and large otherwise. Learning the similarity metric is realized by training a network that consists of two identical convolutional networks that share the same set of weights - a Siamese Architecture (Sumit Chopra, 2005, CVPR)

함수 f 를 딥러닝 방법을 통해 학습할 수 있는 한 가지 방법은 Siamese network 을 이용하는 것입니다. Siamese network 는 2005년에 CVPR 에 발표된 방법으로, weights 를 공유하는 두 개의 CNN 입니다. 이 CNN은 Image1과 Image2를 f(Image1) 과 f(Image2) 라는 vector representation 으로 변환시킵니다. 그리고 f 를 학습시키기 위해 loss function 을 정의하고, distance 를 나타낼 수 있는 representation 을 만드는 방향으로 weights가 학습됩니다. 이미지1과 이미지2의 distance 를 f(Image1)과 f(Image2)의 l2 norm 으로 정의해봅시다. 


$$ D(x_1, x_2) = ||f(x_1) - f(x_2) || ^2 $$


loss function 으로 사용할 수 있는 한 가지는 Triplet loss 입니다. Triplet loss 는 3개의 이미지로부터 loss function 을 만드는 방법이며, 아이디어는 같은 사람의 이미지의 distance 가 다른 사람의 이미지의 distance 보다 작아지도록 하자는 것입니다. 이는 기술적으로  D(Anchor, Positive)D(Anchor, Negative) 보다 작아지도록 잡자는 것입니다. 이 때, Anchor 와 Positive 는 같은 사람의 다른 이미지이고, Negative 는 Anchor, Positive 와 다른 사람입니다. 이 때, alpha 라는 margin 을 주어 충분한 차이가 벌어지도록 합니다. 



이러한 아이디어를 이용해 실제로 정의되는 triplet loss 는 아래와 같습니다.


$$ L(A, P, N) = max(||f(A) - f(P)||^2 - || f(A)-f(N) || ^2 + \alpha, 0) $$


실제 배치 트레이닝시 loss 는 아래와 같이 계산될 것입니다. m 은 배치 샘플 수입니다. 


$$ J = \sum^{m}_{i=1} L(A^i, P^i, N^i) $$


Triplet loss 의 문제는, A, P, N 을 random 하게 골랐을 때, loss 가 0이 되는 것이 너무 쉽게 만족한다는 것입니다. 그래서 실제 트레이닝시 중요한 것은 구분하기 어려운 샘플을 고르는 것입니다. 즉, A-P 와 A-N의 distance 의 차이가 크지 않은 두 이미지를 우선적으로 사용하는 것이 좋습니다. 이 방법은 Triplet loss 를 제시한 논문에 설명되어 있습니다.  

https://omoindrot.github.io/triplet-loss


트레이닝 데이터에서 Triple loss 로 하나의 CNN 을 구현한 후 학습한 후, 테스트 데이터에서는 예를 들어, 이미지의 representation 을 얻은 후, DB 에 있는 representation 과의 distance가 k 미만일 때, 같은 사람이라고 verification 할 수 있습니다.


Siamese Network + Binary loss


아래와 같이 문제를 Binary classification 으로 formulation 해서 face recognition 을 구현할 수도 있습니다. 실제로 많이 사용하며, 성능도 괜찮은 방법입니다. 




https://medium.com/predict/face-recognition-from-scratch-using-siamese-networks-and-tensorflow-df03e32f8cd0


이 방법에서 Siamese Network 는 두 이미지를 input 으로 하고, 같은 사람을 1, 다른 사람을 0 로 encoding 된 label 을 통해 training 됩니다. triplet loss 를 사용한 방법에서는 max(l2 distance 의 차이+alpha, 0) 을 줄이는 방향으로 training 이 되었지만, binary classification 을 활용한 방법의 경우 구조가 약간다릅니다. 


Siamese network와 binary classification 을 결합한 방법에서 CNN 이후 아키텍쳐는 다음과 같습니다.  


1. 두 이미지에 대해 CNN 을 통과시켜 나온 두 representation 의 l1 vector 를 구합니다 (l1 vector는 CNN 으로 변환된 벡터의 absolute distance 를 원소로 갖는 vector 입니다).

2. l1 vector 를 hidden layer 에 통과시킨후 output layer 에서 sigmoid 변환을 합니다. 

3. Binary cross entropy 를 loss function 으로 모델을 학습합니다. 

4. 모델은 0-1 사이의 값을 갖는 output 내보냅니다. 이 값은 크면 클 수록 두 이미지가 비슷하다라는 것이므로 "similarity" 라고 할 수 있습니다. 

5. 이 과정을 거치면 X1, X2 에 대한 CNN 의 output representation f(X1), f(X2) 는 같은 사람에 대해서 distance가 작게, 다른 사람에 대해서는 distance 가 크게 나오게 됩니다. 



참고 


  • GyeongHo Kim 2021.01.29 15:48

    잘 읽었습니다 감사합니다


잘 정리된 사이트가 있어 공유합니다. H-index 기준 1위 CVPR, 2위 NIPS, 3위 EECV, 4위 ICML, 5위는 얼마전 서울에서 열렸던 ICCV 네요. 





무엇을 기준으로 한지는 잘 모르겠으나, 아래와 같이 Conference 와 Journal 의 Rank 를 분류한 자료도 있습니다. SIGIR, WWW, ACL, KDD, AAAI, IJCAI, ICML, NIPS, ICLR가 아래 기준 Rank 1 에 속한 conference 들입니다. 


Conference Ranking 

Read all the relevant papers from major top proceedings/journals. Read, read and read! 
Find new ideas, Do solid research, Publish top papers, Get professional internships/jobs! 
Rank 1 (CCF-A): SIGIR, WWW, ACLKDD, AAAI, IJCAI, ICML, NIPS, ICLR.
Rank 2 (CCF-B): CIKM, WSDMEMNLP.
Rank 3 (CCF-C): ECIR, NAACL.
SIGIR-sponsored conferences:  SIGIR, CIKM, WSDMICTIR, CHIIR.
A better computer science department ranking list based on top conference publications: http://csrankings.org.

Best Paper Awards in Top Computer Science Conferences 
Best Papers vs. Top Cited Papers in Computer Science (since 1996)
Google CS Conference&Journal Ranking (IR&Search&Web&DB)
Google CS Conference&Journal Ranking (Core IR)
Google CS Conference&Journal Ranking (NLP)
Google CS Conference&Journal Ranking (DM)
Google CS Conference&Journal Ranking (ML&AI)

Most Cited Papers in Top Conferences in Recent 5 Years:
IR/Web: SIGIR, WWW, CIKM, WSDM
NLP: ACL, EMNLP, NAACL
ML/DM: ICML, NIPSKDDAAAI, IJCAI, ICLR
Most Cited Computer Scientists by H Index
Citations Statistics of Top Computer Science Researchers by Prof. Jimmy Lin
Number of submissions and acceptance rate of NLP conferences

Journal Ranking 

Rank 1

Rank 2
  • ACM Transactions on Intelligent Systems and Technology(TIST)
  • Information Processing & Management (IPM)
  • Information Retrieval (IRJ)
  • Journal of the American Society for Information Science and Technology (JASIST)


참고


https://sites.google.com/site/lyangwww/resources?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F&showPrintDialog=1

http://www.guide2research.com/topconf/machine-learning

https://jackietseng.github.io/conference_call_for_paper/conferences.html

  • morningpig 2020.07.19 02:50

    논문 보는 곳을 찾고 있었는데 정말 감사합니다

딥러닝 분야별 State-of-the-art (SOTA) 브라우저


딥러닝 분야 (Image Classification, Semantic Segmentation, Object Detection, Medical 등) 별 SOTA 알고리즘을 확인할 수 있는 사이트를 찾게 되어 공유합니다. Data set 별로 가장 성능이 좋은 방법들을 나열해놓고 있습니다. 최신 기술의 업데이트를 한 곳에서 확인할 수 있어 매우 유용한 사이트인것 같습니다. Semantic Segmentation 분야의 경우, DeepLab 이 최신 기술이라고 알고 있었는데 이외에도 들어보지 못한 ACNet, HRNet 등의 방법들도 좋은 성능을 내고 있네요.

https://paperswithcode.com/sota?fbclid=IwAR16wLSr-BAcl-eZAwMVIHdsmpgBF6dN4ETR5kRGg02f_5xBBOlN6uMapo4


일반 Softmax 함수 


import tensorflow as tf
import numpy as np

z = [1,2,3,4,5,6]

def softmax(a) : 
    c = np.max(a) 
    exp_a = np.exp(a-c) 
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y

q = softmax(z)


Softmax with Temperature Parameter


def softmax_with_temperature(z, T) : 
    z = np.array(z)
    z = z / T 
    max_z = np.max(z) 
    exp_z = np.exp(z-max_z) 
    sum_exp_z = np.sum(exp_z)
    y = exp_z / sum_exp_z
    return y

calibrated_q2 = softmax_with_temperature(z, 2)
calibrated_q10 = softmax_with_temperature(z, 10)


Temperature 를 크게 줄 수록 각 확률 값들의 차이가 줄어듬을 확인할 수 있음

하지만, 순서는 변하지 않기 때문에 정확도에 영향을 주지 않음 


fig = sns.barplot(x=np.array([0,1,2,3,4,5]), y=q)
fig.set(ylim=(0,1))
plt.show()

fig2 = sns.barplot(x=np.array([0,1,2,3,4,5]), y=calibrated_q2)
fig2.set(ylim=(0,1))
plt.show()

fig3 = sns.barplot(x=np.array([0,1,2,3,4,5]), y=calibrated_q10)
fig3.set(ylim=(0,1))
plt.show()


[논문리뷰] 현대 딥러닝의 Calibration 에 대하여



현대 Neural network 의 calibration 에 관하여라는 논문을 리뷰하여 포스팅하겠습니다. 딥러닝의 성능 (performance) 이라 하면 일반적인 용어 '정확도' 를 뜻하는 경우가 많습니다. 그 정확도란 1) 예측 한 것중에 얼마나 맞았는가? 2) 데이터가 얼마나 잘 분류가 되었는가? 두 관점이 있으며, accuracy, precision (positive predictied value), recall (sensitivity)f1-score (precision 과 recall 의 조화평균) 등 대표적이고 많이 사용되는 measure 라고 할 수 있습니다. 하지만 calibration 도 정확도 못지 않게 중요한 성능이라고 할 수 있습니다. 본 논문에서는 '현대 뉴럴넷' 이 과거의 뉴럴넷보다 정확도는 향상되었지만, calibration 이 좋지 않다 (poorly calibrated) 라는 점을 문제로 삼으며, post-processing calibration method temperature scaling 을 제시하고 있습니다.


Calibration 이란?


Calibration 이란 모형의 출력값이 실제 confidence (또는 이논문에서 calibrated confidence 로 표현) 를 반영하도록 만드는 것입니다. 예를 들어, X 의 Y1 에 대한 모형의 출력이 0.8이 나왔을 때, 80 % 확률로 Y1 일 것라는 의미를 갖도록 만드는 것입니다. 일반적으로 현대 딥러닝은 overconfident 합니다. 아래 그림은 1998 년 제시된 LeNet 과 2016년 제시된 ResNet (110 layer) 의 calibration 을 비교한 그림입니다. LeNet 의 경우 모형의 출력이 0~1 사이에 균일하게 분포되어있는 것을 볼 수 있지만, ResNet 의 경우 1 근처에 집중되어 있다는 것을 볼 수 있습니다. 그 결과로 아래 그림을 보면, ResNet 의 경우, confidence 와 accuracy가 많이 어긋난다는 것을 볼 수 있습니다. 모형의 출력이 실제 confidence 를 반영한다면 (calibrated confidence), confidence 와 accuracy 가 일치해야합니다. 


왜 Calibration 이 중요한가? 


모형의 예측값이, 실제 확률을 반영하는 것 (Calibration) 은  중요합니다. 딥러닝이 실제 세계에 응용될 때, 의사결정 프로세스의 하나의 구성요소가 되는 경우가 많습니다. 예를 들어, 의학적 진단 (computer-aided diagnosis)을 예로 들어보면, 딥러닝을 전적으로 신뢰해서 모든 판단을 딥러닝에 맡기는 식으로 의사결정이 이루어지는 경우는 적습니다. 딥러닝 모델의 confidence 가 낮은 경우에만 사람이 보는 방식으로 사람의 노동력을 줄이거나, false negative 가 치명적인 암 진단과 경우에는, cancer negative 로 예측한 것들 중, confidence 가 낮은 것만 사람이 재확인 하는 방식으로 하는 것도 가능합니다. 결국 이러한 의사 결정이 가능하기 위해서는 모형의 confidence 를 보는 것이 필요하고 이 confidence가 calibrated confidence 여야지 그 값에 신뢰성이 있다고 할 수 있습니다. 


Calibration Measures


모형의 Calibration 이 잘되었는지를 어떻게 확인할 수 있을까요? 논문에 나와있는 3가지 measure 를 정리해보았습니다. 


1) Reliability Diagram


Reliability diagram 은 expected accuracy 와 observed accuracy 를 각각 x, y 축으로 하여 그린 그래프를 말합니다. 이 때, expected accuracy (confidence) 를 기준으로 bin 을 쪼개서 (ex. decile) 각 bin 에서 observed accuracy 를 아래와 같이 구함으로써 그래프를 그릴 수 있습니다. 




파이썬 코드로 Reliability diagram 그리는 법을 참고 바랍니다. 


2) Expected Calibration Error (ECE) 



ECE 는 confidence와 실제 accuracy 의 차이의 기댓값으로 연속형 변수에서 이를 실제로 구할 수 있는 방법은 없습니다. 따라서 "binning" 을 통해 위와 같이 approximation 됩니다. ECE는 M 개의 bin 에 대하여 각 bin 마다의 expected accuracy 와 confidence 의 차이를 가중 평균 (weighted mean) 한 것입니다. 이 때 가중치는 위 식에 나와있듯, bin 의 sample size / 전체 sample size 입니다. 



3) Negative log likelihood



Negative log likelihood 는 통계 모형의 quality 를 평가하는데 표준적으로 많이 쓰이는 measure 입니다. 딥러닝/머신러닝 분야에서는 cross-entropy loss 라고도 불립니다 (분류 문제에 있어서). 이러한 log likelihood 와 cross-entropy 와의 관련성은 제 블로그 포스팅에서도 다룬적이 있으니 참고 바랍니다. Logistic regression 은 이 negative log likelihood 를 최소화 하는 계수를 찾게되며, 딥러닝도 cross-entropy 를 손실함으로 놓는다면, 마찬가지입니다. NLL 은 calibration 을 의미하는 measure 로 보기는 어려우나, calibration 도 어느정도 반영하고 있다고 볼 수 있습니다.  



현대 딥러닝 기법과 Calibration 의 관계


본 논문에서는 Model capacity 와 Regularization 방법이 miscalibration 과 관계가 있다는 실험 결과를 제시하고 있습니다. 하지만 이 부분에 대해 인과성을 단정할 수는 없습니다. 


1) Model capacity


최근 등장하는 딥러닝 모형들은 매우 많은 layer 를 갖고 있습니다. 적게는 수백개에서부터 수천개의 layer 가 있으며, layer 마다 수백개의 convolution filter 가 사용됩니다. 최근 연구에 따르면, 많은 layer 를 가질 수록 traninig set 의 특징을 더욱 잘 학습하고, generalization 도 더 좋다는 것을 보여주었습니다. 



위 figure 에서 가장 왼쪽 그림은 ResNet 에 대하여 64개의 filter 로 고정 후, depth 를 올리면서 error와 ece를 관찰한 그림입니다. depth 가 증가할 수록 error 는 줄어들지만 ECE는 증가하는 것을 확인할 수 있습니다. 왼쪽에서 두 번째 그림은 depth 를 고정시킨 후, filter 의 수를 증가시키면서 error와 ece 를 관찰한 것인데, 마찬가지로 error는 줄어들지만 ece 는 증가합니다. 후반부에는 유지되지만 초반부에 매우 빠르게 ece 가 증가하는 것을 확인할 수 있습니다. 즉, model capacity 가 클 수록 ece는 증가합니다. 이 이유는 모델이 training set 에 대한 loss 를 최소화하는 방향으로 학습되기 때문입니다. 그렇기 때문에 training set 을 완벽하게 분류할 수 있기 되더라도 loss 를 줄이기 위하여 confidence 를 높여 1에 가까운 값을 예측하기 때문입니다. 따라서 test set 에 대해 예측할 때도 마찬가지의 현상을 보이게 됩니다.  


2) Batch Normalization (BN)


Batch normalization 방법은 distribution shifts in activations 을 최소화해서 딥러닝의 optimization 및 regularization 을 향상시키는 방법입니다. batch normalization 의 도입은 매우 깊은 모델 (resnet, densenet 과 같은) 을 학습시킬 수 있는 한 가지 breakthrough 였습니다. 위 figure 의 3번째 그림을 보면 BN 이 calibration 에 미치는 영향을 볼 수 있습니다. 결론은 BN 의 도입은 calibration 을 낮추며, 원인은 알 수 없다는 것입니다. 


3) Weight decay 


BN 의 도입 이후 최근 weight decay 가 많이 쓰이지 않는 regularization 방법입니다. BN 논문에서 L2 regularization 를 쓰지 않는게 일반화에 도움이 된다는 내용이 보고되기도 했습니다. 따라서 최근에는 weight decay 를 과거와 비교하여 매우 작게 주는 것이 일반적입니다. 하지만 안타깝게도 이것은 calibration 에 좋지 않은 영향을 준다고 합니다. 위 figure의 가장 오른쪽 그림을 보면 weight decay 를 크게 줄 수록 오히려 ece 가 좋아지며, weight decay 가 적을 수록 ece 가 증가합니다. 직관적으로도, weight decay 가 적으면 training set 에 대해 loss 를 최소화 시키는 weight 가 얻어지는 것이기 때문에 test set 에 대해 overconfident 한 모델이 얻어질 것이라는 것을 짐작할 수 있습니다. 


Calibration 방법 


Post-processing calibration 은 모델의 예측 확률로부터 Calibrated probability 를 구하는 과정입니다. 이 방법은 validation set 이 필수적으로 필요합니다 (물론 이 validation set 은 training 할 때 쓰인 validation set 과 같은 set 이어야 합니다.).


Post-processing calibration의 목적은 모델의 예측값 p 로부터 calibrated probability q 를 구하는 것입니다. 간단하게 positive class, negative class 로 나뉘어진 binary prediction 을 예로 들어봅시다. 첫 번째로 소개할 방법은 Histogram binning 방법입니다. 


1) Histogram Binning : Zadrozny 는 2001 년 ICML 에서 decision trees and naive bayesian classifier 의 예측값을 calibration 하는 방법을 제시했습니다. Histogram binning 은 매우 간단하고 직관적인 calibration 방법으로 non-parametric calibration 방법입니다. 절차는 아래와 같습니다. 


1) 예측값을 M 개의 bin 으로 쪼갭니다. bin 을 쪼개는 방법은; 1. 같은 interval 로 쪼개기 2. sample 수로 쪼개기가 있습니다. 

2) 이후에 Bin 마다 Score 를 구합니다. 

3) Score 는 bin-wise squared loss 를 최소화하는 방법으로 선택됩니다. 


* Bin-wise squared loss


여기서 1은 indicator function 입니다. 이를 최소화하는 theta1~theta_m 을 구해서 이를 bin 마다의 score로 쓰는 것입니다. 위 식을 최소화하면 결국 스코어는 해당 bin 에서의 positive-class 의 비율이 됩니다. 즉, histogram binning 방법은 예측값을 binning 한 후, 각 bin 에서의 positive-class 의 비율로 확률을 재할당하는 것으로 이해할 수 있습니다. 


2) Platt scaling: Platt scaling 은 1999년 Platt 이 제시한 방법으로 SVM 의 출력을 '확률화' 하기 위한 방법으로 제시되었습니다. Platt scaling 은 histogram binning 과는 다르게 parametric 방법입니다. 최초로 제시된 이 방법에서는 모형의 출력을 logistic regression 의 input 으로 넣습니다. 뉴럴넷의 경우, 최종 모델의 출력값이 sigmoid 되기 전의 값 z 를 아래와 같이 변환합니다. 


$$ q_i = \sigma(az_i + b) $$


이 때, a, b 는 validation set 에 대해서 NLL (=binary cross entropy) 을 최소화 시키는 방향으로 학습이 됩니다. 당연하지만 이 과정에서 학습된 뉴럴넷의 weight는 영향을 받지 않습니다. 



3) Temperature scaling: Temperature scaling 은 Platt scaling 에 기초한 방법입니다. K 개의 label 이 있는 다중 분류 문제에서 Temperature scaling 방법에서는 단일 scalar parameter T 를 이용해 logit vector z 를 아래와 같이 변환합니다. 



본 논문의 저자는 T 를 temperature 라고 부릅니다. T 는 soft max function 을 "soften" 시키는 일을 합니다. T 가 커질 수록 최종 calibrated probability q 는 1/K 로 수렴합니다 (이것은 uncertainty가 극대화 된다는 의미입니다). 식을 보면 T 가 1일 때가 원래 softmax를 이용하여 confidence 를 구하는 방법이라는 것을 알 수 있습니다. T는 validation set 에 대해 NLL 을 최소화 하는 식으로 optimization 하는 방법입니다. T 의 장점은 argmax 를 바꾸지는 않는다는 것입니다. 즉, T 는 모델의 정확도에는 영향을 주지 않고, Calibration 에만 영향을 줍니다. 


참고

https://arxiv.org/pdf/1706.04599.pdf

https://machinelearningmastery.com/calibrated-classification-model-in-scikit-learn/

  • GyeongHo Kim 2020.09.17 00:51 신고

    덕분에 좋은 논문의 좋은 해석을 보았습니다. 감사합니다

  • soom 2020.11.24 15:12

    관련 자료 검색 중 오게 됐습니다. 설명 감사합니다.

  • soom 2020.11.24 15:12

    관련 자료 검색 중 오게 됐습니다. 설명 감사합니다.

예측값을 변수로 활용하는 앙상블 테크닉 Blending


Blending 은 Ensemble 의 한 종류입니다. Ensemble 이란 예측 모형을 통합해서 하나의 예측을 수행하는 것을 말합니다. Ensemble 의 묘미는 서로 다른 예측 모형들을 합쳐 더 강한 예측 모형을 만들 수 있다는 것입니다다. 가령 정확도 0.7, 0.7 인 모델 두 개를 합쳐서 0.9 을 만들 수 있습니다. 본 포스팅에서는 Ensemble 의 한 가지 종류인 Blending 에 대해 설명해보려고 합니다. 



Blending 의 프로세스  


1. Traning/Validation/Test set 을 나눈다. 

2. Training set 에 모델 피팅을 한다. 

3. Validation/Test set 에 대해 예측을 한다. 

4. Validation set 과 Validation set 에 대한 예측이 새로운 모델을 만드는 데에 사용된다.

5. 4의 모델을 최종 Test set 에 대한 예측을 하는데 사용된다. 


조금 더 명확하게 보기 위해 Blending 을 활용한 코드를 보면서 설명을 하겠습니다. 아래 코드는 Decision tree 와 KNN 을 활용해 각각 validation set 과 test set 에 대한 예측을 수행하는 코드입니다. 


Blending 구현 - 파이썬 

참고 (https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-for-ensemble-models/)

model1 = tree.DecisionTreeClassifier()
model1.fit(x_train, y_train)
val_pred1=model1.predict(x_val)
test_pred1=model1.predict(x_test)
val_pred1=pd.DataFrame(val_pred1)
test_pred1=pd.DataFrame(test_pred1)

model2 = KNeighborsClassifier()
model2.fit(x_train,y_train)
val_pred2=model2.predict(x_val)
test_pred2=model2.predict(x_test)
val_pred2=pd.DataFrame(val_pred2)
test_pred2=pd.DataFrame(test_pred2)


아래 코드는 validation set 의 예측 결과 (Decision tree, KNN) 을 원래 feature 에 붙여서 새로운 데이터셋 df_val 을 만든 후, Final prediction model (이 예제에서는 Logistic regression model) 을 적합시키고, test set 에 대한 예측을 수행하는 것입니다. 

df_val=pd.concat([x_val, val_pred1,val_pred2],axis=1)
df_test=pd.concat([x_test, test_pred1,test_pred2],axis=1)

model = LogisticRegression()
model.fit(df_val,y_val)
model.score(df_test,y_test)


Blending 과 Stacking 의 차이점


Blending 은 종종 다른 Ensemble technique 인 Stacking 과 비교가 됩니다. Stacking 은 다른 예측 모형들의 결과값을 통해 새로운 모델을 만드는 Ensemble 방법입니다. Stacking 의 경우는 Training set 의 예측값을 Training data 로 하여 Meta classifier (또는 Meta regression) 을 학습합니다. 그리고 이 Meta classifier 를 통해 Test set 을 예측합니다. Blending 과 Stacking 의 차이점은 1) Blending 은 validation set 에 대한 예측값을 training 에 이용하지만, Stacking 은 training set 에 대한 예측값을 활용합니다. 2) Blending 을 예측값 뿐 아니라 원래 Feature 도 활용하는 반면, Stacking 은 예측값만 활용합니다. 그러면 이러한 의문이 남습니다. 왜 validation set 만 활용해서 Final prediction model 을 구축해야하는가? Training Set 에의 feature에 Training set 으로부터 예측한 예측값을 붙여서 활용하면 되지 않는가? 입니다. 만약 training performance 와 validation performance 가 비슷하다면 가능한 방법입니다. 하지만 training performance 가 높다면, feature 가 예측에 별로 필요하지 않게 됩니다. 따라서 feature를 예측에 활용하는 blending 의 장점이 없게 됩니다. 따라서 blending 을 잘활용하기 위해서는 validation set 의 meta-feature (원래 feature 및 예측값) 을 통해 training 하고, test set 에 대해 성능을 최종 평가해야합니다. 


참고

https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-for-ensemble-models/

https://machinelearningmastery.com/implementing-stacking-scratch-python/


Label smoothing


본 포스팅에서는 최근 딥러닝 모델의 정확도와 Calibration 향상 최종적으로는 model generalization 에 도움이 된다고 알려진 Label smoothing 에 대해서 살펴보도록 하겠습니다. 


Introduction


이미지 분류는 이미지를 n 개의 카테고리로 할당하는 일을 말합니다. 예를 들어, 고양이와 개를 분류하는 이미지 분류문제를 예로 들어보자. 이미지의 크기가 248x400 라면, RGB 각 3개의 채널이 존재하기 때문에 하나의 이미지는 248x400x3 의 3차원 벡터로 표현할 수 있습니다. 이 벡터를 단 하나의 값으로 요약하는 것이 이미지 분류 문제에서 하는 것입니다. 

이미지 분류 문제의 예



고양이와 개를 분류하는 위의 예는 이진 분류 (binary classification) 의 예로 볼 수 있습니다. 이미지 분류의 목적 (248x400x3) 의 벡터를 하나의 값으로 요약하는) 을 달성하기 위해서는 학습 데이터 (training data) 가 필요합니다. 즉, 데이터의 갯수가 n 일 때, 학습 데이터의 형태는 이미지 : nx248x400x3 / Label: n 의 벡터로 표현할 수 있습니다. 근데 문제는, 잘못 labeling 된 이미지가 있을 수 있다는 것입니다. 특히, 이미지의 출처가 인터넷인 경우에는 이러한 mislabeling 의 문제가 빈번하게 일어납니다. 

예를 들어, 위와 같은 상황에서 딥러닝 모델은 Dog 라고 잘못 labeling 된 고양이의 이미지까지 학습하게 됩니다. 물론 데이터의 수가 적다면 이를 눈으로 일일히 확인하며 수정할 수 있지만, 데이터의 수가 많다면 이는 불가능합니다. 


$$ L = −(ylog(p)+(1−y)log(1−p)) $$

Binary classification 에서는 위와 같은 binary cross entropy 를 씁니다. 딥러닝 모델을 트레이닝하면서 loss 를 계산할 때, 잘못 labeling 된 sample 에 대해서는 loss 값이 크게 계산되게 됩니다. 이것은 training 도중 문제를 발생시킬 수 있습니다. 

Label Smoothing — One Possible Solution

이러한 문제를 해결하기 위한 한 가지 가능한 방법이 label smoothing 입니다. 이진 분류 문제에서 label 은 0 또는 1로 주어집니다. label 이 1이라고 하는 것은 그것의 label 이 1 임을 100 % 확신한다는 뜻입니다. 하지만 반드시 그렇지 않을 수 있다는 것이 핵심 문제입니다. 왜냐하면 사람이 annotation 하는 것이기 때문에 실수의 가능성이 언제나 존재합니다. 이 때 발생할 수 있는 잘못된 loss 의 영향을 줄이기 위하여 label 을 0또는 1이 아니라 smooth 하게 부여하는 것이 label smoothing 의 아이디어입니다. 또한 label smoothing 은 mislabeling 된 데이터를 고려하기 위해 사용되는 것에 추가적으로 regularization에 도움을 주면서, model generalization 과 calibration 에 도움이 된다는 것이 알려져있습니다.

Maximum likelihood learning with a softmax classifier and hard targets may actually never converge, the softmax can never predict a probability of exactly 0 or exactly 1, so it will continue to learn larger and larger weights, making more extreme predictions. forever (출처)

tensorflow 에는 label smoothing 에 대한 implementation 을 제공합니다. 아래와 같이 softmax_cross_entropy 의 parameter 로 label_smoothing 값을 전달할 수 있습니다. 


tensorflow document 를 보면 label_smoothing 값이 0이 아닌 경우, 아래와 같이 label smoothing 을 한다고 설명이 되어있습니다. 

"If label_smoothing is nonzero, smooth the labels towards 1/num_classes: new_onehot_labels = onehot_labels * (1 - label_smoothing) + label_smoothing / num_classes"

이것이 무엇을 뜻할까요? 

예를 들어 개/고양이 이진분류문제에서 label_smoothing 이 0.2로 설정되었다고 해봅시다. 그리고, 0은 고양이, 1은 개라는 rule 로 labeling 을 했다고 합시다. 위의 식을 이용하면 새로운 label 은 아래와 같이 계산됩니다. 

new_onehot_labels = 1 * (1 — 0.2) + 0.2 / 2 = 1*(0.8) + 0.1
new_onehot_labels = 0.9 

그리고 원래 0으로 부여되었던 label 의 경우 tensorflow 에서는 1-0.9 = 0.1 로 부여하게됩니다. 왜 label smoothing 을 이용하면 model calibration 에 도움이 될까요? 직관적인 해석은, 모델이 target 을 정확하게 예측하지 않아도 되도록 만드는 것입니다. 예를 들어, 원래 label 이 1인 데이터에 대해서 모델은 1을 최대한 예측하도록 트레이닝되는데 label smoothing 을 적용하면 '그래 0.9 정도면 잘 예측했다.' 정도의 loss 값을 산출하게 되는 것입니다. 그렇기 때문에 모델이 overconfident 해지는 경향을 막게 되아 calibration 및 regularization 이 되는 효과를 갖게 됩니다.  

Reference

https://towardsdatascience.com/label-smoothing-making-model-robust-to-incorrect-labels-2fae037ffbd0

https://arxiv.org/pdf/1906.02629.pdf

https://medium.com/@nainaakash012/when-does-label-smoothing-help-89654ec75326

https://rickwierenga.com/blog/fast.ai/FastAI2019-12.html

  • Lee 2020.02.04 11:24

    심플하면서도 실용적이고 재미있는 아이디어네요.ㅎㅎ 포스팅 잘보고갑니다.


Cross-entropy 의 이해: 정보이론과의 관계



1. 손실함수로서의 Cross-entropy


딥러닝에서 분류 모델에 대한 손실 함수로 cross-entropy 혹은 binary entropy 나 log loss 라는 것을 사용하게 된다. 손실함수로서의 cross-entropy 는 아래 식으로 계산할 수 있다. 

$$ - \frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} L_{ic}log(P_{ic}) $$ 

이 때, 

  • n = 데이터 갯수
  • C = 범주 갯수
  • L = 실제 값 (주로 0 또는 1)
  • P = 실제 값에 대한 확률 값 (0~1)  

만약 k = 3 이면 L_1 = [0, 0, 1] P_1 = [0.1, 0.2, 0.7] 과 같이 정의 될 수 있다. 이 때, 해당 데이터 포인트 (1) 에서 cross entropy 는 0*log(0.1) + 0*log(0.2) + 1*log(0.7) = -log(0.7) = 0.35 이다. 만약 L_2 = [0, 0, 1] P_2 = [0.5, 0.3, 0.2] 라면, 예측 모델은 상당히 잘못 예측했다는 것을 알 수 있고, 이 데이터 포인트 (2) 에서의 cross-entropy 는 -log(0.2) = 1.6 이다. 


딥러닝을 통한 예측 모델링에 있어, 실제 값과 예측값의 차이 (dissimilarity) 계산한다는 관점에서 cross-entropy 사용하는 것의 의미를 직관적으로 이해할 수 있다. 하지만 본 포스팅에서 이러한 식이 나오게 된 배경을 정보 이론 (Information theory) 을 기반으로 알아보려고한다. 


2. entropy 란 무엇인가?


entropy 란 불확실성 (uncertainty) 에 대한 척도이다. 결국 예측 모형으로 하고자 하는 것은 불확실성을 제어하고자 하는 것이다. 가방 안에 빨간공만 들어있다고 하자. 이 경우, 불확실성은 없다. 왜냐하면 어떤공을 꺼내도 빨간 공이기 때문이다. 따라서 이 경우 entropy 는 0이다. 우리가 신경써야하는 부분은 가방 안에서 꺼내는 공에 불확실성이 있는 경우이다. 


만약, 어떠한 사건이 같은 비율로 발생한다고 하고, 사건의 갯수를 n이라고 하면 entropy 는 log(n) 이다. 예를 들어, 가방 안에 빨간공과 녹색 공이 50:50으로 들어있다면 이 경우 entropy 는 log(2)=0.69 이다. 두 색깔의 공만 들어있는 경우, 50:50 으로 들어있을 때, 가장 entropy (불확실성) 이 크다. 이를 직관적으로 이해하면, 우리가 공을 꺼낼 때, 반반으로 들어있다면, 어떤 공이 더 자주 관찰될지 예측할 수 없기 때문에 entropy 가 크다고 이해할 수 있다.


하지만 일반적으로 가방 안에 각기 다른색의 공들이 다른 비율로 들어있는 경우가 많을 것이다. 이 때는 위와 같은 공식으로 구할 수 없으며, entropy 를 아래와 같은 식으로 구하게 된다. 

$$ H(q) = -\sum_{c=1}^{C} q(y_c)log(q(y_c)) $$ 


이 때, C는 범주의 갯수이고, q는 사건의 확률질량함수 (probability mass function) 이다. 예를 들어, 가방 안에 빨간공과 녹색공이 20:80 으로 들어있는 경우, H(q)=-(0.2log(0.2)+0.8log(0.8))=0.5 이다. 더욱 쉬운 이해를 위해 가방에서 공을 꺼낼 때, 더 많은 경우의 수가 존재한다고 해보자. 가령 100개의 각기 다른 색깔과 모양의 공이 가방 안에 들어있다. 이 경우, 가방에서 공을 꺼냈을 때 어떤 색과 모양을 갖는 공이 관찰될지 알기 매우 힘들다. 각 공이 동일한 확률로 관찰된다고 가정할 때 entropy = log(100) = 4.6 이다. 하지만 100개의 공이 들어있다고 하더라도, 한 종류의 공이 99 %를 차지하고 있으면 어떨까? 이 경우, 위 식에 의해 entropy는 매우 작아진다 (-(0.99*log(0.99)+99*(0.01/99*log(0.01/99))) = 0.1). 즉, entropy 는 예측하기 쉬운 일에서보다, 예측하기 힘든일에서 더 높다. 


3. Cross-entropy 


예측 모형은 실제 분포인 q 를 모르고, 모델링을 하여 q 분포를 예측하고자 하는 것이다. 예측 모델링을 통해 구한 분포를 p(x) 라고 해보자. 실제 분포인 q를 예측하는 p 분포를 만들었을 때, 이 때 cross-entropy 는 아래와 같이 정의된다. 

$$ H_p(q) = -\sum_{c=1}^{C} q(y_c)log(p(y_c)) $$ 


이 때, q와 p가 모두 식에 들어가기 때문에, cross-entropy 라는 이름이 붙었다고 할 수 있다. 머신러닝을 통한 예측 모형에서 훈련 데이터에서는 실제 분포인 p 를 알 수 있기 때문에 cross-entropy 를 계산할 수 있다. 즉, 훈련 데이터를 사용한 예측 모형에서 cross-entropy 는 실제 값과 예측값의 차이 (dissimilarity) 를 계산하는데 사용할 수 있다는 것이다. 또한, Cross-entropy > entropy 이다. 


예를 들어, 가방에 0.8/0.1/0.1 의 비율로, 빨간/녹색/노랑 공이 들어가 있다고 하자, 하지만 직감에는 0.2/0.2/0.6의 비율로 들어가 있을 것 같다. 이 때, entropy 와 cross-entropy 는 아래와 같이 계산된다. 


$$ H(q) = -[0.8log(0.8) + 0.1log(0.1) + 0.1log(0.1)] = 0.63 $$

$$ H_p(q) = -[0.8log(0.2) + 0.1log(0.2) + 0.1log(0.6)] = 1.50 $$


4. Kullback-Leibler Divergence


 “KL Divergence” 라고 주로 부르는 서로 다른 두 분포의 차이 (dissimilarity) 를 측정하는데 쓰이는 measure 이다. 이를 entropy 와 cross-entropy 개념에 대입하면 두 entropy 의 차이로 계산된다. KL Divergence 의 정의는 아래와 같다 (아래 정의는 p와 q가 이산분포일 때 정의되는 것이며, 연속 분포일 때는 sum 대신 integral 이 들어갈 것임을 예상해볼 수 있다.). 두 분포, q (실제)와 p (예측)가 있을 때, 


$$ D_{KL}(q||p) = -\sum_{c=1}^{C} q(y_c) [log(p(y_c)) - log(q(y_c))] = H_p(q) - H(q) $$ 


cross-entropy = H_p(q) 는 실제 entropy = H(q) 보다 항상 크기 때문에 KL Divergence 는 항상 0보다 큰 값을 갖게된다. 예측 분포인 p 를 실제분포 q에 가깝게 하는 것이, 예측모형이 하고자하는 것이며, p가 q에 가까이갈 수록 KL Divergence 0에 가까워질 것이다. 그리고 H(q) 는 고정이기 때문에, H_p(q)를 최소화 시키는 것이 예측 모형을 최적화 시키는 것이라고 할 수 있다. 따라서 cross-entropy 를 최소화 시키는 것이 KL Divergenece 를 최소화 시키는 것이며, 이것이 불확실성을 제어하고자하는 예측모형의 실질적인 목적이라고 볼 수 있다. 


5. Cross-entropy 를 통한 loss function 


예를 들어, 이미지를 읽어들여 개/고양이/물고기를 분류하는 3개의 클래스를 갖는 다중 분류 문제를 생각해보자. 가방에 개/고양이/물고기라고 쓰인 공이 들어있다. 이 공은 해당 이미지에 대한 정답을 사람이 적어 놓은 것이다. 예측 모형은 주어진 정보 (이미지) 를 살펴본 후, 예측 분포를 산출했는데, p(y) = [0.2, 0.3, 0.5] 으로 예측했다. 즉, 공 (실제 정답) 을 꺼냈을 때, 개/고양이/물고기를 관찰할 확률이 각각 0.2/0.3/0.5 일 것이라고 예측 한 것이다. 하지만 실제 분포, q(y) = [0, 0, 1] 이다. 이 때, cross-entropy 는 매우 간단하게, -log(0.5) 이다.


2에서 예로 든, 빨간공 녹색공 예제와 다른점은, 빨간공 녹색공 예제에서는 공이 어떠한 확률질량함수를 갖고 가방 안에 들어있을 것이라고 가정한 것이지만, 현실의 분류 문제에서는 정답이 있다고 가정하고 하기 때문에 (즉, 공을 꺼낼 때 관찰하는 것이 100 % 정해져 있다.), 실제 분포인 q(y)가 [0,0,1], [1,0,0] .. 과 같은 one-hot encoding 된 벡터로 나타내어진다는 것이다. 왜냐하면 실제 이미지가 0.2 의 확률로 개일 수는 없다. 왜냐하면 그 이미지가 개라는 것이 "정답" 이라고 사람이 정의했기 때문이다. 즉, 어떠한 이미지가 무엇이냐는 것은 확률적이지 않다는 것이기 때문에 실제 분포의 entropy = H(q) = 0 이다. 하지만 cross-entropy 는 p와 q에서 정의되는 것이므로 구할 수 있다. 실제 분포의 entropy 가 0이기 때문에, cross-entropy = KL(q||p) 이다. 


이 경우, p와 q의 cross-entropy 는 실제로 아래와 같이 계산된다. 

$$ -\sum_{c=1}^{C} L_{c}log(P_{c}) $$  

$$ L_{c} = q(y_c)  $$

$$ P_{c} = p(y_c) $$ 


그리고 n 개의 데이터포인트에 대해 cross-entropy 의 평균을 구하는 것이 아래의 식이다. 

$$ - \frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} L_{ic}log(P_{ic}) $$ 


지금까지 손실함수로 cross-entropy 를 사용한다는 것이 무엇을 의미하는 것인지, entropy 를 기반으로 설명하였다. 손실함수로서의 cross-entropy 를 정보 이론의 관점, entropy 의 관점에서 이러한 관련성을 갖고 있다는 것을 이해하는데 도움이 되었으면 한다.  


참고

https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181a 


  • 민성 2019.10.18 11:46

    3. cross entropy 세션에서 H(q) 와 H_p(q) 두수식에서 두번재 텀부터 - 부호를 붙여야하거나 아니면 첫번째 - 부호 다음에 () 로 씌워야 할 것 같아요.

  • 김건호 2020.01.13 11:32

    좋은 글입니다. 잘 봤습니다:)

  • 이화 2020.04.20 11:29

    안녕하세요. 5. Cross-entropy 를 통한 loss function 섹션에서 '실제 분포의 cross-entropy가 0이기 때문에' 이 부분에서 그냥 entropy로 수정하셔야 할 것 같습니다. 글 잘봤습니다 :)

  • 지나가다 2020.10.26 12:14

    머신러닝을 통한 예측 모형에서 훈련 데이터에서는 실제 분포인 p 를 알 수 있기 때문에 cross-entropy 를 계산할 수 있다.

    에서 실제분포인 p --> 실제 분포인 q로 변경해야 하지 않을까 싶습니다.

  • 질문 2021.04.06 18:56

    안녕하세요 99개의 공과 1개의 공이 있는경우가
    (-(0.99*log(0.99)+99*(0.01/99*log(0.01/99))) = 0.1)

    라고 하셨는데

    1개의 공이 나올 확률은 1/100 이고
    99개의 공이 나올 확률은 99/100 아닌가요?
    따라서 계산이
    -(0.01*log(0.01) + 0.99 * log(0.99) ) = 0.08
    이어야 되는게 아닌가 질문 드립니다.

  • 2021.07.14 14:14

    안녕하세요. 위 댓글들처럼 어색한 부분이 조금 있지만
    정말 잘 정리된 글인 것 같습니다.

    오랜만에 Xent를 다시 머릿속에 새겨 넣고자 검색했는데, 정말 좋은 글을 발견해서 다행이네요.
    잘 읽고 갑니다. 감사합니다