극좌표계(Polar coordinates)는 평면 위의 점을 나타내는 또 다른 방법으로, 직교좌표계(Cartesian coordinates) 대신 사용됩니다. 직교좌표계에서는 xxyy라는 두 개의 직각 축을 사용해 점의 위치를 나타내지만, 극좌표계에서는 기준점에서의 거리와 기준 방향으로부터의 각도를 사용합니다.

 

극좌표계 개요

  1. 기준점 (원점): 극좌표계에서 기준점은 거리를 측정하는 기준이 되는 점입니다. 이 점은 보통 O로 표시되며, 직교좌표계에서의 원점 (0,0)(0, 0)에 해당합니다.
  2. 거리 (r): 극좌표계의 첫 번째 요소인 r은 기준점 O에서 평면상의 점 P(x,y)까지의 거리를 나타냅니다. r은 항상 0 이상의 값을 가지며, 보통 음수는 허용되지 않습니다. 이 때, 점 P의 위치는 직교좌표계(Cartesian coordinates)에서 (x,y)에 위치해 있습니다.
  3. 각도 (α 또는 θ): 두 번째 요소는 각도 $\alpha$ (또는 $\theta$)입니다. 이는 양의 x축(기준 방향)과 점 P를 연결하는 선분이 이루는 각도를 나타냅니다. 각도는 보통 라디안(radian)으로 측정되지만, 경우에 따라 도(degree)로도 측정될 수 있습니다.

직교좌표계와 극좌표계 간의 변환

직교좌표계 (x,y)에서 극좌표계 (r,α)로 변환하려면:

  • r (반지름 또는 거리)는 다음과 같이 계산됩니다. $r = x^2 + y^2이 공식은 피타고라스 정리에서 유도됩니다.
  • α (각도)는 다음과 같이 계산됩니다:α=atan2(y,x)α . atan2(y, x) 함수는 점 가 이루는 각도를 계산합니다.

극좌표계를 직교좌표계로 변환

극좌표계 (r,α)를 다시 직교좌표계 (x,y)로 변환하려면:

  • **x**는 다음과 같이 계산됩니다:x=rcos⁡(α)x 
  • **y**는 다음과 같이 계산됩니다:y=rsin⁡(α)y 

이미지 처리에서의 활용: 픽셀유동화

이미지 처리 분야에서는 특정 픽셀의 직교좌표 (x,y)를 극좌표 (r,α)로 변환하는 것이 유용할 수 있습니다. 예를 들어, 회전, 스케일링, 또는 특정 영역에서의 왜곡 변환 등을 수행할 때 극좌표계를 사용하면 효율적입니다. 변환 작업이 끝난 후에는 다시 극좌표를 직교좌표로 변환하여 이미지를 출력합니다.

픽셀 유동화(Pixel liquify)은 포토샵에서 특정 픽셀주변을 확장시키거나 줄이는 것을 의미합니다. 알고리즘은 아래와 같습니다.

1. 유동화 알고리즘 메인: 픽셀유동화는 중심점O을 0,0이 아닌 다른 포인트로하여, 유동화를 시킬 수 있습니다. 위의 그림에서, 원의 중심을 O로 생각하고, r만큼 떨어져있는 픽셀을 O와 가까운 중심점으로 옮길 수 있습니다. 이 옮길 때의 위치는 중심점에서 $\sqrt{r}$만큼 옮깁니다.

그렇게되면, 해당픽셀은 중심점O로부터 $\sqrt{r}$ 만 큼 떨어진 픽셀이됩니다. 또는, 움직임의 강도를 c만큼 주어 $c \sqrt{r}$ 만큼 옮길수도있습니다.

2. 거리에 따른 강도조절: 원점에서 가까운점은 덜 움직이고, 가장자리부분을 크게 움직이려면 exponential 함수를 이용하면됩니다. 음수의 지수함수는 x가 커질수록 0에 (거리가 멀수록 덜움직이고), x가 작을수록 큽니다(가까울수록 많이움직임). 

 

아래는 픽셀유동화의 중심점 O을 4곳(좌상단, 중앙부 2곳, 우하단)에 적용한 예시입니다. 모두 극좌표계를 이용해서(중앙점에 상대적인 위치변화) 변경했습니다.

 

반응형

 

Motivation

  1. 최근 연구들은 언어모델을 차용하여 비전문제를 풀려는 아키텍처가 많이 발표되고 있으며, 대표적으로 ViT(Vision Transformer)가 있습니다.
  2. (2021년 당시) Vision Transformer을 기반으로한 모델들은 ViT을 인코더 백본으로 특징을 뽑고, CNN을 여러겹 적용하여 decoders로 하여 꽤 좋은 성능을 보여주었습니다.
  3. 위의 아키텍처는 아래의 2문제가 있어, Segformer가 해결하고자 했던 것 입니다.
    1. Single scale low-resolution: 하나의 스케일의 feature만 사용된다는 것입니다. 인코더에서 이미지를 특징화하고, 디코더에서 하나의 입력스케일만 입력받습니다.
    2. Computational cost: 이미지가 클수록 계산량이 많다는 것입니다. 특히, 트랜스포머는 token 수 N의 N(O^{2})의 연산을 갖기에, 이미지 사이즈가 크면 연산량이 너무 많이 듭니다.

 

Segformer 장점

  • Positional encoding(PE) 사용하지 않습니다. PE을 안쓰고, Zero padding과 CNN으로 위치정보를 포함시켰기 때문입니다. 덕분에, 여러 크기의 입력이미지를 수용할 수 있습니다
  • 계층적 구조: Transformer에 들어가는 입력을 점진적으로 작게 나눠, 앞단에는 큰(거친, coarse)특징들 (예, 위치정보)를 뽑고, 후미의 블록에서는 상세한 특징(Fine)을 뽑도록 아키텍처가 구성되었습니다.
  • 경량 All-MLP 디코더: 디코더에 CNN하나없이 MLP로만 구성되어, 더 큰 수용장(Effective Receptive Field)을 가집니다. 따라서, 이미지 분절시에 멀리 떨어진 픽셀정보를 고려할 수 있습니다.

 

아키텍처 구성

Segformer은 크게 2가지의 구성입니다. 거의 모든 Segmentation 아키텍처와 동일하게 인코더와 디코더 구조를 갖습니다.

1) 인코더(Encoder): 계층적 트랜스포머(Hierachial Transformer). 트렌스포머의 패치크기를 다양하여 입력받습니다.

2) 디코더(All-MLP decoder) : 1)의 다양한 level의 features을 입력으로하는 디코더로, 최종적으로 $\frac{H}{4} \times \frac{W}{4} \times N_{cls}$의 이미지를 반환합니다. 이미지가 4배 작아져 다운샘플링 됩니다.

인코더의 메트릭스 크기는 입력피쳐(패치당) 사이즈입니다.

 

 


상세한 구성은 아래와 같습니다.

 

1. 입력 이미지: $H \times W \times 3$

2.계층패치화: 이미지를 $\frac{H}{2^{i+1}} \times \frac{W}{2^{i+1}} \times C_{i}$으로 패치화합니다. 예를 들어, 첫번째 트렌스포머 블럭에서는 패치(토큰)하나당 256/4 x 256/4 x C, 이후에는  256/8 x 256/8 x C2 이런식입니다.

3.패치 결합(Overlapped Patch Merge):

  • 결합인데, 사실은 패치를 결합된 상태에서 분리한다는 것이 더 이해가 쉽습니다. $ N \times N \times 3$ 패치를 $ 1 \times 1 \times C $벡터로 표현이 가능합니다. 일단 백터화해놓으면, 이후의 인코더블럭들에서는 $ 1 \times 1 \times C_{i} $ 이든, $ 1 \times 1 \times C_{i+1} $이든 표현이 가능합니다. 일단 벡터화를 하면 아래와 같이 패치를 쪼갤 수 있습니다.
  • 예를 들어,  첫 번째 입력이미지를 4x4로 쪼갠경우, 한 패치당 $\frac{224}{4} \times \frac{224}{4} \times C_{1}$ 크기를 갖습니다. 이 입력크기를 F1이라고 합니다. 이 F1을 입력크기를 다시 더 작은 단위의 크기로 쪼개서($ \frac{224}{8} \times \frac{224}{8} \times C_{2} $) 트랜스포머의 입력에 넣습니다. 트렌스포머 블럭1번째에서 1개 패치가 2번째트렌스포머 블럭의 4개가 되는것입니다.
  • 이런 패치과정을 겹치지않게(non overlapping)하게 하면 패치간의 연속성이 떨어져서, 겹쳐가면서 진행합니다.  (사실 정확히 4개가 아닐 수 있습니다)

4. Efficient Self-Attention

어텐션은 패치 수(토큰 수)에 영향을 받습니다. 정확히는 패치수(N)의 제곱입니다. Segformer을 이 N을 R비율 맞큼 줄입니다.

N=W x H 라고 할 때,

  1. $\text{ Reshape }(\frac{N}{R}, C \cdot R)$: 연산할 이미지의 수를 R배만큼 줄이고, 특징값을 R배만큼 늘립니다.
  2. $Linear(C\cdot R, C)$: R배만큼 늘어난 이미지 특징값을 C로 다시 선형변환해서, 압축합니다.

이러면 원래 $O(N^{2})$ 이던 계산량이 $O(\frac{N^{2}}{R})$으로 변경됩니다.

5. Mix-FFN: CNN과 Feed-forward network(FFN)을 단계적으로 진행하는 모듈입니다.이미지 분할(Segmentation)에서는 사실 포지셔널 임베딩 필요없다고 저자들은 주장하는데요. 제로패딩만 어느정도해도 위치정보가 들어간다는 연구가 있기 때문입니다. 

$x_{out} = MLP(GELU(Conv_{3 \times 3}(MLP(x_{in}))) + x_{in}$

  • $x_{in}$: self-attention 에서 나온 피쳐입니다.

6. All-MLP Decoder: CNN 보다 더 큰 수용장(Effective recept field, ERF)을 갖기위해서, 일부러 CNN을 사용하지 않고 MLP layer을 구차했습니다. 문제는 Transformer block에서 각기 다른 token(이미지)사이즈를 입력받아야하는데 아래와 같이 처리했습니다.

  1. 채널 수 맞춤: $\hat {F_{i}} = Linear(C_{i}, C)(F_{i}), \forall i $. 모든 i(Transformer block의 output)에 대해서 채널을 C로 맞춥니다. 이렇게하려면 MLP가 4개가 있어야겠죠.
  2. 업샘플링(upsampling): 모든 피처맵(F_{i})을 $\frac{H}{4} \times \frac{W}{4} $ 크기로 업샘플링을 합니다. 업샘플링은 Bilinear interpolation또는 Nearest interpolation로 해볼 수 있습니다.
  3. 결합(Concatenate) 후 Linear: ${F = Linear(4C, C)(Concat( \hat {F_{i}})), \forall i $ 2.에서 나온 모든 피쳐맵을 한축으로 concat합니다. 그 이후 Linear 채널을 교정합니다.  
  4. 분류: $M = Linear(C, N_{cls})(F)$ linear layer을 하나 넣어 클레스 수에 맞게 분류합니다.

 

아래 그림으로 보면 더 이해가 쉽습니다.

Yang, L., Wang, X., & Zhai, J. (2022). Waterline extraction for artificial coast with vision transformers.  Frontiers in Environmental Science ,  10 , 799250.

 

결과 1: 수용장이 더 커진게 맞나?

네, 수용장이 커졌습니다.

아래는 Cityscapes데이터셋에서의 100개이상의 이미지의 예측에서의 수용장을 시각화 한 것입니다. 실제로는 output값을 역전파해서 어떤 픽셀이 gradient가 컸는지 계산했을 것입니다. (https://ahmdtaha.medium.com/understanding-the-effective-receptive-field-in-deep-convolutional-neural-networks-b2642297927e)

DeepLabv3+ 모델과 SegFormer을 비교해봤을 떄, 더 큰 수용장을 보입니다. 특히, stage 4에서는 DeepLabV3+가 중심부에만 몰려있습니다.

 

모델사이즈에 따른 성능은?

인코더와 디코더 사이즈를 키울수록 mIoU지표는 확실히 좋아집니다.

 

PE 대신에 Mix-FFN(CNN+MLP)을 쓴게 더 좋은가?

포지셔널인코딩은 이미지 사이즈가 커지면, 포지셔널 인코딩을 Interpolation해서 사용해야하는데, 이 Interpolation때문에 성능열하가 존재한다고 이미 알려져있고, 그 결과도 재현되었습니다. PE로는 성능차이가 크게 떨어반해, Mix-FFN으로는 성능 열하가 적게 보여집니다.

 

Discussion

Segformer는 positional encoding 없이도 다양한 입력 이미지 크기를 처리할 수 있는 유연성을 가지며, 계층적 구조와 효율적인 self-attention 메커니즘을 통해 계산 효율성을 극대화합니다. 또한, 경량의 All-MLP 디코더를 채택하여 더 큰 수용장을 확보함으로써, 이미지 분할과 같은 작업에서 더욱 정교한 결과를 보였습니다.

반응형

 

Pre-commit 패키지?

pre-commit은 Git 저장소에서 커밋을 수행하기 전에 코드 품질을 보장하고 코드 스타일을 일관되게 유지할 수 있도록 도와주는 도구입니다. 이 패키지는 Git의 훅(hook) 시스템을 활용하여 커밋 전 다양한 자동화 작업을 실행할 수 있게 해줍니다. 이를 통해 코드의 품질을 유지하고, 협업 시 코드 스타일의 일관성을 보장할 수 있습니다.

주요 기능은 아래와 같습니다.

  1. 자동화된 코드 검사 및 포매팅: 코스 스타일을 검사하는 테스트입니다. 협업시 꽤 유용합니다.
  2. 다양한 훅(hook): hook은 스크립트나 명령어를 의미합니다. 여러가지 검사방법을 적용해볼 수 있습니다.
  3. 확장성: `pre-commit-config.yaml`을 변경하여 훅을 추가/제거 할 수 있습니다.

 

Pre-commit 패키지 설치방법

1. `pip`을 이용한 설치

$ pip install pre-commit
$ pre-commit --version # pre-commit 이 올바르게 설치되어있나 버전확인

2. configuration 세팅

  • `.pre-commit-config.yaml`이라는 파일을 만듭니다.
$ touch .pre-commit-config.yaml
$ pre-commit sample-config
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files

위 내용을 `.pre-commit-config.yaml`에 작성하고 저장하면 됩니다.

 

3. git hook script설치

pre-commit은 git의 hook시스템을 사용하하기 때문에 설치가 `.git/hooks`이하에 저장됩니다.

$ pre-commit install
pre-commit installed at .git/hooks/pre-commit

 

4. 실행: 아래와 같이 whitespace가 있는지 등을 알아서 검사해주고 ,문제가 있는 경우 exit code 1을 반환합니다.

$ pre-commit run --all-files
[INFO] Initializing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Installing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
Trim Trailing Whitespace.................................................Failed
- hook id: trailing-whitespace
- exit code: 1
- files were modified by this hook

Fixing notebooks/publications/figure1.sh
Fixing README.md
Fixing tiling_version17.py

Fix End of Files.........................................................Failed
- hook id: end-of-file-fixer
- exit code: 1
- files were modified by this hook

Fixing .gitignore
Fixing notebooks/publications/figure1.sh

Check Yaml...........................................(no files to check)Skipped
Check for added large files..............................................Passed

 

 

Pre-commit 패키지 언제 사용해야하나?

 

  1. Python 코드 포맷팅이 사람마다 다를 때: black 같은 코드 포맷터를 사용해 커밋 전에 코드를 자동으로 포맷팅.
  2. 정적 코드 분석: flake8을 사용해 코드 내 잠재적인 오류나 스타일 위반 사항을 검사.
  3. 보안 검사: bandit 같은 도구를 사용해 보안 관련 잠재적 취약점을 사전에 검사.

 

 

 

반응형

'Data science > MLOps' 카테고리의 다른 글

[MLOps] 디자인 패턴  (0) 2024.08.26
nvidia-driver, cuda toolkit update  (0) 2024.05.03
API token bucket: API 요청수 관리  (0) 2024.04.08
pip install -e 옵션에 대해  (0) 2024.04.02
[mlflow] child run id 조회하기  (0) 2023.09.25

요약


디스크에 저장없이 바이트범위만 획득하게하는 온라인패치는 패치의 배율, 좌표를 다양하게 할 수 있습니다. 온라인패치로 다양한 배율로 학습한 모델은 더 향상된 성능을 보여주었습니다. 그리고, 학습시, ImageNet을 파인튜닝하는게 FM모델을 만드는데 더 도움이 됩니다. 마지막으로, 데이터의 크기는 총 범위의 30% 정도면, 100%사용과 비슷한 성능을 기대할 수 있습니다. 그리고, 이 파이프라인은 eva라는 오픈소스로 공개되어있습니다.

 

Introduction

  1. 병리에서 자기지도학습알고리즘으로 대규모로 학습하는 사례가 많아짐.
  2. 어떤 방법으로 학습하고 적용해야, 효과적으로 large scale 모델을 학습할 수 있지 의문
  3. 이 연구에서는 
    1. 학습/테스트 파이프라인을 제시 (eva)
      1. 온라인패치
    2. 하이퍼 파라미터, 초기화 전략, 배율를 조사
    3. 평가용 지표를 제시

 

=> eva은 오픈소스로 공개되어있습니다. https://github.com/kaiko-ai/eva?tab=readme-ov-file#quick-start

 

Methods

Online high-throughput loading of patches from WSIs

  • 오프라인 패치: 학습전에 슬라이드이미지를 패치 단위로 디스크에 저장하고, 다시 불러오는 과정 -> 패치 사이즈/배율을 다양하게 저장하려면, 다양한 사이즈/배율의 N배 만큼 필요(=오버해드).
  • 온라인 패치: Online patching 라이브러리를 만들어서, 패치를 학습단계에서, 좌표, 배율레벨에 따라서 쉽게 뽑는 과정 (=디스크에 저장할 필요없음)

+ 추가로, 전경만 찾기위해서 U-net기반의 segmentation 모델이 들어가있어, thumnail level에서 전경만찾음.

개발은 Zarr data source 을 이용 (Zarr 포맷을 이용하는 경우, 타일 의 바이트 범위를 추출하게되서 효율적)함. Online patching 라이브러리는 비동기적으로 네트워크나 Binary Large object을 부를 수 있음.

 

Results

1. 온라인 패치 효과 : 온라인패치는 타일링을 격자형이아니라 랜덤으로 뽑을 수 있어서 효과적

=> 같은 훈련데이터 숫자가 아니긴하지만... 어쩃든 더 나은 성능을 보여줬다는 것.

 

2. 다양한 배율을 학습한 모델이 강건함

3. ImageNet 사전 훈련 모델을 튜닝하는 것 효과

대부분 ImageNet의 사전학습 가중치를 쓰는건데, 연구결과에 담길만큼 특이한게 있냐?라고 생각할만한대요. 병리쪽에서는 ImageNet을 tuning할지, from scratch부터훈련할지 딱히 정해지지 않아, 학습시 고려사항이 되는데요. 이 연구에서는 이 고민을 해결해줄 결과를 같이 제시합니다. from ImageNet으로 학습하는게 더 수렴이 빠르다는 결론을 내어줍니다.

4. 학습 데이터 사이즈의 성능

  1. 학습 슬라이드를 몇장써야하냐의 문제입니다. 이 논문 결과는 아래의 연구결과(Karther lab)랑 동일한데요. 한 30%의 데이터만 있어도 전체 학습과 큰차이가 없다라는 것입니다. 
  2. 패치 숫자를 1,000개 정도만 있어도 충분히 학습할 수 있다는 것도 보여줍니다,.

 

Reducing self-supervised learning complexity improves weakly-supervised classification performance in computational pathology

 

이 연구에서 ImageNet 사전 훈련 모델을 사용하는 이유는 단순히 기존의 방법을 따라가는 것이 아니라, 이를 통해 병리학적 데이터에서의 효과를 검증하고, 훈련 효율성을 높이며, 다른 연구와의 비교를 용이하게 하고, 사전 훈련의 한계와 개선점을 분석하기 위함입니다. 이러한 목적을 통해 연구의 신뢰성을 높이고, 병리학적 데이터에서 딥러닝 모델의 활용 가능성을 더욱 확장할 수 있습니다. 요약하면 아래와 같습니다.

반응형

 

요약


DICE loss에서 반영하지 못하는 background의 오분류를 패널티로 반영하기위한 손실함수. Confusion matrix의 요소들을 직접 사용하여 손실함수를 만듬.

 

DICE vs MCC(Mattew's correlation coefficient, MCC)

DICE loss을 사용하든, IoU(Jaccard loss)을 사용하든 둘 다 TN(True negative)에 대한 정보가 없습니다. 

 

이 True Negative을 반영하기위해서, confusion matrix에서 각 요소를 아래와 같이 만듭니다. 즉, TP와 TN은 많이 맞추고, FP,FN은 적은 confusion matrix을 만들기를 바라며, 이를 정규화하기위한 분모로 만듭니다. 아래를 보면 각 요소들이 분모에 2번씩 사용됩니다.

 

MCC은 미분가능한가?

다행히 MCC은 segmentation에서 pixel wise로 연산하기때문에 미분가능합니다. 각 요소를 아래와 같이 표현 할 수 있기 때문입니다.

 

아래와 같이 1-MCC로 손실함수로 사용하고, 각 항목을 y예측값에 대해서 미분하면됩니다.

 

이 식을 pytorch로 구현하면 아래와 같습니다.

class MCCLosswithLogits(torch.nn.Module):
    """
    Calculates the proposed Matthews Correlation Coefficient-based loss.

    Args:
        inputs (torch.Tensor): 1-hot encoded predictions
        targets (torch.Tensor): 1-hot encoded ground truth
    
    Reference:
        https://github.com/kakumarabhishek/MCC-Loss/blob/main/loss.py
    """

    def __init__(self):
        super(MCCLosswithLogits, self).__init__()

    def forward(self, logits, targets):
        """
        
        Note:
            위의 모든 코드가 logits값을 입력값으로 받고 있어서, logtis->confidence [0,1]으로 변경
            MCC = (TP.TN - FP.FN) / sqrt((TP+FP) . (TP+FN) . (TN+FP) . (TN+FN))
            where TP, TN, FP, and FN are elements in the confusion matrix.
        
        
        """
        pred = torch.sigmoid(logits)
        tp = torch.sum(torch.mul(pred, targets))
        tn = torch.sum(torch.mul((1 - pred), (1 - targets)))
        fp = torch.sum(torch.mul(pred, (1 - targets)))
        fn = torch.sum(torch.mul((1 - pred), targets))

        numerator = torch.mul(tp, tn) - torch.mul(fp, fn)
        denominator = torch.sqrt(
            torch.add(tp, 1, fp)
            * torch.add(tp, 1, fn)
            * torch.add(tn, 1, fp)
            * torch.add(tn, 1, fn)
        )

        # Adding 1 to the denominator to avoid divide-by-zero errors.
        mcc = torch.div(numerator.sum(), denominator.sum() + 1.0)
        return 1 - mcc
반응형

 

 

Motivation

CE(Cross-entropy)은 지도학습의 분류에 주로 사용됩니다. 하지만, 많은 단점들이 존재하는데, 예를 들어 noisy label이나 poor margin 같은게 있어 일반화 성능이 떨어집니다. CE의 대안으로 나온 여러가지 손실함수가 발명됬지만, 여러 챌린지에서 보면 여전히 CE을 쓰듯이, 실무에서는 큰 도움은 안됩니다.

최근에 대조학습(Constraive learning)으로, 라벨이 없이도 자기지도학습에서 사용됩니다. 미니 배치 내에서, 앵커와 같은 origin data은 가깝게, 앵커와 먼 데이터는 멀게 학습하는 방법으로 학습합니다.

Figure 2: Supervised The self-supervised contrastive loss (left, Eq. 1)

 

이 논문은 자기지도학습에서의 라벨을 이용하여 contrastive learning을 이용해서 학습하는 방법을 제안했습니다. 같은 클레스의 임베딩을 정규화한다음에 가깝게 위치시키고, 다른 클레스보다 멀게 학습시킵니다. 앵커하나에 여러 positive pair을 만들 수 있다는게 장점이고, 많은 negative pair도 만들 수 있습니다.

 

Method

  1. $\text{Aug()}$: 한 이미지 x로부터 이미지를 증강하는 모듈입니다. $\tilde{x}=Aug(x)$와 같이 $\tilde{x} $가 2개씩 생성됩니다. 각 $\tilde{x}$은 x로부터 새로운 view(증강법에 따른 변형)을 의미합니다. crop일수도, random rotation일 수도있습니다.
  2. $\text{Enc()}$: 인코더 파트입니다. 벡터표현을 위해서 인코더를 하나 만듭니다. 이 인코더는 1에서 만들어진 2개의 증강된이미지를 포워딩하여 벡터를 만듭니다. 벡터의 차원은 2,048입니다. $r=Enc(x)\in R^{D_{E}}$
  3. $Proj()$: Projection network입니다. 벡터표현이후에 128차원의 벡터로 프로젝션합니다. 이 벡터는 단위의 길이를 가질 수 있도록(unit hypersphere), 정규화를 합니다. Projection layer은 SSL에서는 사용하지 않습니다.

 

1. Contrastive loss function의 정의: 

  1. $\{x_{k}, y_{k}\}_{k=1,...N}$: 지도학습에서는 N개의 임의의 샘플이 있다고 가정합니다. N은 배치사이즈입니다.
  2. $\{\tilde{x_{l}}, \tilde{y_{k}|\}_{l=1,...,2N}$: 1.에서의 이미지를 각각 2개의 이미지 증강을한 결과를 의미합니다. 여기서 라벨은 $y_{k}$은 증강후에 $ \tilde{y_{2k-1}, \tilde{y_{2k} $로 되니, 다 같은 값입니다. 2N은 증강후의 배치입니다. 본문내에서는 "multi-viewed batch"라 합니다.

 

2. Self-supervised Contrastive Loss의 정의

Contrastive learning과 Supervised constrastive learning을 비교하면 아래와 같습니다. 라벨이 있으니, 같은 클레스끼리는 가깝게 학습시키게끔 변형되었습니다.

  • $P(i)$: 은 i랑 동일한 이미지는 아닌, positive 의 집합니다.
  • $A(i)$: 은 i(Anchor)가 아닌 나머지의 집합입니다.
  • $z_{i}$:은 Projection 이후의 임베딩값입니다.
  • $\tau$: temperature scaling

실제 논문에서 제안된건 아래와 같이 |P(i)|의 개수를 어디서 연산하냐에 따라서, 아래와 같이 2가지로 나뉩니다. 두 함수는 완전 동치는 아니라 각각 실험에서의 최적화된 방법을 사용하면 됩니다.

 

 

Results: 엄청좋아지나..? 그정도까진...

1. Top 1 classification 성능은 그냥 CE을 쓰나 SimCLR을 쓰나 엄청난 차이를 보이지 않습니다. 하지만 이 영역대에서 x%p올리기 쉽지않은데, SupCon으로 한번 최적화해보는건 좋은 선택같습니다.

 

2. 그래도 강건한 모델:

mCE라는 지표로 N은 이미지의 왜곡방법의 수를 의미하며, 분자 분모는 오차율입니다. mCE은 낮을수록 이미지 변환에도 강건하고 오차율이 없다는 것을 의미하는데요. 

$mCE = \frac{1}{N} \sum_{c=1}^{N} E_{c \text{baseline}} E_{c}$

여기서 corruption 이 정확히 어떤 이미지 변환인지는 표기는 안되어있으나, 이미지 corruption을 강하게 하더라도 종전모델보다 강건한 이미지를 나타냅니다.

 

얼마나 학습시켜야하나?

1. ResNet을 CE로 학습시키는데 1400정도 에폭을 활용: "Since SupCon uses 2 views per sample, its batch sizes are effectively twice the cross-entropy equiv-
alent. We therefore also experimented with the cross-entropy ResNet-50 baselines using a batch size
of 12,288. These only achieved 77.5% top-1 accuracy. We additionally experimented with increas-
ing the number of training epochs for cross-entropy all the way to 1400, but this actually decreased
accuracy (77.0%)"

2. 200에폭도 충분함

"The SupCon loss was trained for 700 epochs during pretraining for ResNet-200 and 350 epochs for
smaller models. Fig. 4(c) shows accuracy as a function of SupCon training epochs for a ResNet50,
demonstrating that even 200 epochs is likely sufficient for most purposes."

반응형

+ Recent posts