728x90

1. 개념 요약

- 데이터에 대한 라벨을 사전에 구축하지 않아도, self supervised learning을 통해 Representation Learning을 수행

 

2. 기본 아이디어

여러 입력 쌍에 대해 유사도를 라벨 판별 모델을 학습함. (데이터 포인트 간의 유사성과 차이를 학습)

즉, 학습된 표현 공간 상에서 비슷한 데이터는 가까이, 다른 데이터는 멀리 위치하도록 학습하는 방법.

- 이때, GT label y가 0(similar) 아니면 1(dissimilar)임. (only two types)

- GT가 similar인 경우와 dissimilar인 경우 각각에 적용되는 loss function의 종류가 서로 다름 (L_s, L_d)

D_w: 우리가 계산한 x_1와 x_2 간 distance

- 학습을 통해, 모델은  데이터 포인트를  구별할  있는 특성을 파악해내고, 데이터 표현을 향상시키는  도움을 줌 

 

3. 이점:

- self-supervised인 만큼 비용이 적음 (단, 아예 비지도 학습인 생성 모델을 활용하는 경우도 구축 비용이 적음.

라벨링 데이터를 활용하는 판별 모델보다는 구축 비용이 저렴함.)

- 보다 general한 feature representation & unseen class에도 대응 가능

- 다른 task로 fine tuning할 때 모델 구조 수정 없이 이뤄질 수 있어서 간편함.

 

4. 기본 원리

https://velog.io/@yjkim0520/Contrastive-Learning

1) Data Augmentation

- positive pair & negative pair 생성 ((늘 그렇듯^^) negative sampling이 주요 관건)

2) Generating Representation (=Feature Extraction)

- 주로 pre-trained backbone 활용 (ex. ResNet)

3) Projection Head (=Obtain Metric Embedding)

- 2에서 얻은 extracted feature embedding을 metric space로 project시켜줌

- 이를 위해 간단한 MLP가 사용됨

- 이 Head 자체를 통해 metric learning이 진행되는 건 아니고, 앞단의 embedding output의 차원을 축소하는 역할을 함.

- 해당 head의 output이 이후 metric learning을 위한 contrastive metric loss 계산의 대상이 됨

4) Contrastive Loss 계산

- Loss function에 여러 종류가 있는데, 그 중 InfoNCE, NT-Xent 등이 있음

- 아까 언급했듯, GT가 similar인 경우와 dissimilar인 경우 적용되는 loss function의 종류가 서로 다름

 

 

4. 원리 조금 더 구체적으로

Input sample X_i 각각에 대해 이하 과정을 진행

1) prior knowledge를 바탕으로, X_i와 비슷한 것들을 모두 S_{xi}에 넣음
2) S_{xi}에 해당하는 모든 X에 대해서는 Y_{ij}의 라벨을 0으로 지정, 해당하지 않을 경우 라벨을 1로 지정 

→ 마치 labeled training set처럼, (X_i, X_j, Y_{ij})과 같은 pair로 만듦
→ 실제 train을 진행할 때, Y_{ij}=0인 경우에는 W가 D_w = D(ij)를 줄이도록 학습하고, vice versa 

 

5. Application

5-1. SimCLR

1차 임베딩 결과인 Representation output을 활용하여 → Downstream task 수행

loss function으로 NT-Xent를 사용함 (분자: L_s, 분모: L_d)

이 NT-Xent를 통해 contrastive learning이 이루어지는 것.

NT-Xent

 

 

5-2. NCE

SIMCLR은 데이터 포인트 간 유사성을 비교하고 구조화된 임베딩을 학습하는 반면, 
NCE는 비교적 단순한 분류 모델(binary classifier)을 활용하여 데이터 포인트를 분류하며 학습

특히, 확률분포 개념을 이용함으로써 task가 더 간단해짐.

 

- M개의 training examples가 있다고 할 때

→ True pairs: centor word + another word appeared in context (즉 함께 get along하는 두 단어)

→ Fake pairs: 랜덤하게 아무 두 단어로 구성된 pair

 

- "True pairs가 어떠한 확률분포로부터 샘플링되었나?"

: 그것을 p_m이라고 가정하고, 우리의 목표는 p_m을 예측하는 것.

- 반면, Fake pairs에 대한 확률분포 p_n을 구해둠. (이건 상수같은 느낌, 학습 대상이 아님)

 

- 모델이 학습해야 할 task

: True pairs와 Fake pairs가 섞여있는 와중에, 각 샘플들이 p_m에서 왔는지 p_n에서 왔는지 binary classification

p_m에서 true pairs가 나올 확률을 maximize

p_m에서 fake pairs가 나올 확률을 minimize

 

그림에서 p_m: p_model / p_n: p_noise

 

 

reference: https://velog.io/@yjkim0520/Contrastive-Learning

https://cedar.buffalo.edu/~srihari/CSE676/18.6%20Noise%20Contrastive%20Estimation.pdf

728x90

728x90

Reference(아주굿): https://sonsnotation.blogspot.com/2020/11/8-normalization.html

 

4 types of Normalization

Normalization

1. 개념: 데이터의 범위를 사용자가 원하는 범위로 제한하는 것

 

2. 여러 기법

- feature들의 0~1 scale (ex. 이미지 데이터 픽셀이 0~255 사이의 값 → 0.0~1.0 사이의 값)

- 표준화(Standardization): 표준정규분포를 갖도록 평균을 빼고 표편으로 나누는 것

- whitening(e.g. batch normalization): 2단계로 구성 (1) Stardardize(standard normalize) pre-activation function (2) Scale and shift

etc.

 

3. 장점

: optimal solution으로의 수렴 속도가 빨라진다.

layer가 1개이든, 2개 이상의 딥러닝이든, 정규화를 할 경우 loss function의 형태가 elongated(타원형)에서 spherical(구 형)으로 바뀌고, optimal solution으로 가는 경로가 더 효율적으로 개선된다.

 


Batch Normalization & Layer Normalization

 

Batch Norm Layer Norm
- Whitening 기법 베이스
(0) 매 순간(=weight가 training되는 순간)마다
(1) Stardardize(standard normalize) pre-activation function
(2) Scale and shift

-
 입력 데이터의 분포를 조정하여, 신경망 내부에서 학습 안정성과 속도 개선
주로 CNN, FCNN에서 활용
->배치 내부의 통계적 변화로 인한 그래디언트 소실 문제를 완화
주로 RNN, 순차적 데이터(시퀀스) 다루는 경우 활용
-> 시간적인 의존성을 고려하여 안정적인 정규화를 제공
주로 mini-batch 내 데이터가 여러 개(=batch size가 2 이상)인 경우
-> 미니배치 크기에 영향을 받음
mini-batch에 들어있는 데이터가 한 개(=batch size가 1)인 경우에도 사용 가능
Standardize에서 사용하는 평균과 표준편차는,
mini-batch 내 모든 데이터의 Feature(채널) '별'로 평균과 표편을 계산.

테스트 시에는, 전체 데이터셋의 평균과 표편을 사용 (배치별로 구해뒀던 평균과 분산을 버리지 않고 메모리에 기억해뒀다가, 재사용)
Standardize에서 사용하는 평균과 표준편차는,
batch에 있는 '모든 feature(모든 채널)'에 대한 평균과 분산
즉, hidden layer 전체의 평균과 분산으로 normalization

 

장점

layer가 여러 개인 DL에서 ...

- 기존에 back prop 시, activation function(eg. 기울기가 0인 영역이 넓은 sigmoid / tanh이나, G.V. issue를 간접적으로 회피하는 ReLU 등.)을 통과하면서 gradient vanishing 문제가 발생하는데,

 

매 순간 Whitening을 수행하여 input을 평균 0, 표준편차 1인 분포로 normalization시켜 주면,

 

- G.V. issue의 근본 원인인 Internal Covariance Shift 문제(아무리 input layer에서 정규분포를 가지는 입력을 줘도 hidden layer를 지나면서 그 분포가 점점 정규분포를 벗어나는 현상)를 해결

Internal Covariance Shift 현상
Internal Covariance Shift로 가속화되는 gradient vanishing

 

Whitening의 두 단계

1. Normalize pre-activation function : pre-activate 된 샘플을 standard normalize

2. Scale and shift : standard normalize 된 샘플의 variance와 bias를 조절할 수 있는 γ, β를 부과해서 parameterize

variance와 bias를 다시 조절하는 이유는 sigmoid의 경우는 중심에 분포가 몰려 있는 것이 효과적이지만, 다른 activation은 그렇지 않기 때문이다. 즉, 학습을 통해 γ와 β를 학습해 적절한 분포를 가지게 하기 위함.

728x90
728x90

 Keras의 callback

: training 단계에서(epoch 시작부터 끝까지) 어떠한 동작을 수행하는 object

- callback들을 통해서 tensorboard에 모든 batch of training들에 대해 metric 수치를 모니터링할 수도 있고, 이를 저장하는 것도 가능

- Early Stop이나 Learning Rate Scheduling과 같은 기능을 통해 학습결과에 따라 학습을 멈추거나 학습률을 조정할수도 있음

=> 이처럼 Callback들을 잘 활용한다면, 딥러닝 학습의 결과를 보다 좋게 만들 수 있음.

 

주요 활용되는 callbacks

  1. ModelCheckpoint:
    • 기능: 모델의 훈련 중에 지정된 에포크마다 모델의 가중치를 저장.
    • 특징: 훈련 중간에 모델의 상태를 저장하여 최상의 성능을 보이는 모델을 선택할 수 있도록 도와줌. 이후 모델 재사용 또는 재훈련에 유용.
    • 아래 코드 참조
  2. EarlyStopping:
    • 기능: 모델의 훈련 중에 지정된 지표(monitor)를 모니터링하여 성능이 향상되지 않을 경우, 훈련을 조기 종료시킴.
    • 특징: 오버피팅을 방지하고 불필요한 계산을 줄여줌. 훈련 속도를 개선하고 최적의 성능을 달성할 수 있음.
  3. ReduceLROnPlateau:
    • 기능: 모델의 훈련 중에 지정된 지표(monitor)를 모니터링하고, 성능 개선이 없을 경우 학습률(learning rate)을 감소시킴.
    • 특징: 학습률을 동적으로 조정하여 학습 과정을 안정화하고, 최적의 학습률을 찾아주는 역할을 수행.
  4. TensorBoard:
    • 기능: 모델의 훈련 과정과 성능 지표를 시각화하기 위해 TensorBoard 로그를 생성.
    • 특징: 훈련과정을 시각화하여 모델의 동작을 이해하고 모델의 성능을 모니터링할 수 있도록 도와줌.
  5. LearningRateScheduler:
    • 기능: 지정된 학습률 스케줄링 함수를 사용하여 학습률을 동적으로 조정.
    • 특징: 학습률을 조정하여 학습 과정을 안정화하고 최적의 학습 속도를 찾아주는 역할. ReduceLROnPlateau와 유사하지만 더 많은 커스터마이징이 가능.
    • 아래 코드 참조

- Model Checkpoint with 코드!

tf.keras.callbacks.ModelCheckpoint(
    filepath,
    monitor: str = "val_loss",
    verbose: int = 0,
    save_best_only: bool = False,
    save_weights_only: bool = False,
    mode: str = "auto",
    save_freq="epoch",
    options=None,
    initial_value_threshold=None,
    **kwargs
)

 

- Keras에서 제공하는 LearningRateScheduler with 코드!!

=> 얘는 도대체 무슨 기능을 하는지 헷갈려서.. 알아봄

import tensorflow as tf

def lr_scheduler(epoch, lr):
    if epoch % 30 == 0 and epoch != 0:
        lr = lr * 0.1
    return lr

# LearningRateScheduler 콜백 함수 생성
scheduler = tf.keras.callbacks.LearningRateScheduler(lr_scheduler)

# 모델 컴파일
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 콜백 함수 등록하여 모델 훈련
model.fit(x_train, y_train, epochs=100, callbacks=[scheduler])

예제에서 lr_scheduler 함수는 현재 에포크를 확인하여 에포크가 30 배수일 때마다 학습률을 0.1 감소시킴

- 이렇게 하면 모델은 훈련 중간에 학습률을 조정하여 나은 성능을 얻을 있음.

- 이같이 Keras의 LearningRateScheduler는 사용자의 필요에 따라 학습률을 동적으로 스케줄링하여 함수를 원하는대로 정의할 수 있음

- callback함수의 일종이므로, callbacks 리스트에 append해주어야 함! :)

 

 

reference: https://rinha7.github.io/keras-callbacks/

https://keras.io/api/callbacks/base_callback/

 

728x90

728x90

 

0. why skip-connection?

https://lv99.tistory.com/25

 

ResNet (Shortcut Connection과 Identity Mapping) [설명/요약/정리]

등장 배경 레이어가 많아져, 인공신경망이 더 깊어질 수록 gradient vanishing/exploding 문제가 커집니다. 이전의 다른 방법들로 이 문제를 해결했다고 생각했지만, 수십개의 레이어를 가진 모델에서는

lv99.tistory.com

 

1. General Architecture of ResNet

1.1 Main Block of ResNet

https://www.neuralception.com/objectdetection-batchnorm/

2. Architecture of ResNet50

https://eremo2002.tistory.com/76

 

ResNet50 구현해보기

케라스를 이용하여 ResNet50을 구현하였다.ResNet 50-layer 네트워크 구조는 다음과 같다. 그리고 레이어가 50개 이상인 버전에서는 오른쪽과 같은 bottleneck skip connection 구조를 사용한다. 케라스에서 제

eremo2002.tistory.com

 

https://www.researchgate.net/figure/ResNet50-architecture-shown-with-the-size-of-the-filters-and-outputs-of-each_fig5_338563385

 

 

728x90

728x90

Major types of Loss function

1. MSE /. MSE / ,,, (회귀에 사용됨)

2. Margin-based (Discriminative setting)
• 0/1 loss
• logloss
• exponential loss
• hinge loss

 

3. Probabilistic setting
• Cross-Entropy (실제로 많이 사용됨)

- 크로스 엔트로피란 무엇?: https://3months.tistory.com/436 (아주 잘 정리됨, 이하 내용의 출처)

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

Cross-Entropy

- q와 p가 모두 식에 들어가기 때문에, cross-entropy 라는 이름이 붙었다고 할 수 있다. 

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

- 즉, 훈련 데이터를 사용한 예측 모형에서 cross-entropy는 실제 값과 예측값의 차이(dissimilarity)를 계산하는데 사용.

 

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

 

 

- 크로스 엔트로피 based on Negative Log-likelihood

why log?: 곱의 계산을 합의 계산으로 바꾸기 위해


정답인 class에 대해 우리 모델이 부여한 score (정답이 아닌 class로 예측할 확률은 모두 생략)


why negative?


*잠시, Likelihood-function이 뭔데?

https://angeloyeo.github.io/2020/07/17/MLE.html

- likelihood 라는 것은 특별히 어려운 것이 아니고, 지금 얻은 데이터가 특정 분포로부터 나왔을 가능도.

그림 1. 획득한 데이터와 추정되는 후보 분포 2개(각각 주황색, 파란색 곡선으로 표시)

눈으로 보기에도 파란색 곡선 보다는 주황색 곡선에서 이 데이터들을 얻었을 가능성이 더 커보인다. 왜냐면 획득한 데이터들의 분포가 주황색 곡선의 중심에 더 일치하는 것 처럼 보이기 때문이다. 이 예시를 보면, 우리가 데이터를 관찰함으로써 이 데이터가 추출되었을 것으로 생각되는 분포의 특성을 추정할 수 있음을 알 수 있다. 여기서는 추출된 분포가 정규분포라고 가정했고, 우리는 분포의 특성 중 평균을 추정하려고 했다.

출처: https://angeloyeo.github.io/2020/07/17/MLE.html

그림 2. 주황색 후보 분포에 대해 각 데이터들의 likelihood 기여도를 점선의 높이로 나타냈다.

 

- 수치적으로 이 likelihood를 계산하기 위해서는 각 데이터 샘플에서 후보 분포에 대한 높이(즉, likelihood 기여도)를 계산해서 다 곱함.

출처: https://angeloyeo.github.io/2020/07/17/MLE.html

 

 

  • CrossEntropyLoss != Log-likelihood model
    ("Negative Log"-likelihood는 loss function의 미분이 용이하고 직관적이도록 돕는 아이디어같은.)

    ("Likelihood function" 역시 파라미터 추정을 위한 컨셉' 느낌.)
  • 파이토치에서 CrossEntropyLossLogSoftmax를 적용한 후 Negative Log-likelihood(NLL) Loss까지 적용한 식과 동일하다. (여기서 LogSoftmax는Softmax 함수를 적용한 후 Log 함수를 적용하는 것과 동일한 함수.)
  • CrossEntropyLoss 안에서 LogSoftmax와 Negative Log-likelihood 가 진행되기 때문에 softmax나 log 함수가 적용되지 않은 모델 output(raw data)을 input으로 주어야 합니다.
  • 이와 달리 NLLLoss 안에서는 softmax나 log함수가 이뤄지지 않습니다. 그래서 모델 output(raw data)을 input으로 그대로 사용하는 것이 아니라 LogSoftmax 함수를 적용한 후 input으로 사용해야합니다.

 

 

출처: https://supermemi.tistory.com/entry/Loss-Cross-Entropy-Negative-Log-Likelihood-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC-Pytorch-Code


• KL Divergence (예측 분포와 정답 분포 간 차이 기반)

 

728x90

+ Recent posts