샴 네트워크와 엘라스틱 왜곡
포스트
취소

샴 네트워크와 엘라스틱 왜곡

머신 비전 프로젝트 1 할 때 gemini한테 얻어낸 자료임. 그 프로젝트: https://dapin1490.github.io/satinbower/posts/HAE-mvision-prj-3/

Gemini가 정리해준 내용 기반으로 글만 좀 조립했음

table of contents

샴 네트워크와 엘라스틱 왜곡

1. 샴 네트워크 (Siamese Network)

샴 네트워크는 두 개 이상의 동일한 하위 네트워크(Sub-network)가 가중치를 공유(Weight Sharing)하며 입력 데이터 간의 유사도를 학습하는 구조입니다.

가. 구조 및 작동 원리

  • 가중치 공유: 두 입력 이미지(예: 필자 A의 글씨와 필자 B의 글씨)는 동일한 구조와 매개변수를 가진 CNN 백본을 통과합니다.
  • 임베딩(Embedding): 각 네트워크는 입력을 고차원 공간상의 벡터(Feature Vector)로 변환합니다.
  • 거리 측정: 두 벡터 사이의 거리(주로 유클리드 거리 또는 코사인 유사도)를 계산하여 두 이미지가 얼마나 닮았는지 판단합니다.

나. 손실 함수 (Loss Function)

  • 대조 손실 (Contrastive Loss): 동일한 필자의 데이터 쌍은 거리를 가깝게($0$에 가깝게), 서로 다른 필자의 데이터 쌍은 설정된 임계값(Margin) 이상으로 멀어지도록 학습합니다.
  • 트리플렛 손실 (Triplet Loss): 기준(Anchor), 동일 필자(Positive), 타인(Negative)의 세 데이터를 동시에 비교하여, 기준과 동일 필자 사이의 거리가 타인과의 거리보다 작아지도록 최적화합니다.

다. 필자 식별에서의 이점

기존 분류 모델이 “A는 누구인가”를 맞추는 방식이라면, 샴 네트워크는 “이 두 글씨는 같은 사람이 썼는가”를 학습합니다. 이는 클래스당 데이터가 적은 상황에서 일반화 성능이 뛰어나며, 학습하지 않은 새로운 필자가 추가되어도 재학습 없이 식별이 가능하다는 장점이 있습니다.


2. 엘라스틱 왜곡 (Elastic Distortion)

엘라스틱 왜곡은 이미지의 픽셀을 국부적으로 무작위 이동시켜 데이터의 변동성을 인위적으로 생성하는 증강(Augmentation) 기법입니다. 이는 손글씨 인식 분야의 표준 기법 중 하나인 Simard 등의 알고리즘을 주로 따릅니다.

가. 생성 알고리즘 단계

  1. 무작위 변위장 생성: 이미지의 각 픽셀 $(x, y)$에 대해 $-\mathbf{1}$에서 $\mathbf{1}$ 사이의 무작위 값으로 구성된 변위 벡터 $\Delta x$, $\Delta y$를 생성합니다.
  2. 가우시안 필터링: 생성된 변위장에 가우시안 블러($\sigma$)를 적용하여 급격한 변화를 줄이고 부드러운 변형을 유도합니다. 이 단계가 글씨의 유기적인 흐름을 결정합니다.
  3. 스케일링: 정규화된 변위장에 강도 계수($\alpha$)를 곱하여 왜곡의 정도를 조절합니다.
  4. 픽셀 재배치: 계산된 변위를 바탕으로 원본 이미지의 픽셀 위치를 이동시킵니다.

나. 필자 식별에서의 효과

손글씨는 필기 시 근육의 미세한 떨림이나 속도 변화에 의해 매번 형태가 달라집니다. 엘라스틱 왜곡은 아핀 변환(회전, 이동, 크기 조절)이 표현하지 못하는 이러한 비정형적 형태 변화를 효과적으로 모사합니다. 이를 통해 모델은 글자의 외형적 틀에 고착되지 않고, 필자 고유의 본질적인 획 특성을 학습할 수 있게 됩니다.


샴 네트워크 구축과 이상/삼항 대조 비교

1. 샴 네트워크(Siamese Network) 구축 단계

샴 네트워크는 두 개 이상의 입력 데이터에 대해 동일한 가중치를 공유하는 모델을 구축하고, 출력된 특징 벡터(Embedding) 간의 거리를 비교하도록 설계합니다.

가. 네트워크 아키텍처 정의

  • 백본(Backbone) 선정: 필자 식별에는 미세한 획의 특징이 중요하므로, 너무 깊지 않으면서도 수용력이 있는 ResNet-18이나 EfficientNet-B0가 적합합니다.
  • 공유 레이어(Shared Layers): 두 개(또는 세 개)의 입력이 동일한 가중치를 가진 하나의 모델 객체를 통과하도록 구현합니다.
  • 임베딩 레이어: 마지막 Fully Connected 레이어에서 고차원 벡터(예: 128차원 또는 256차원)를 출력하고, L2 정규화(L2 Normalization)를 적용하여 구(Sphere) 공간상에 특징을 위치시킵니다.

나. 데이터 쌍(Pair) 또는 삼항(Triplet) 생성

  • 이항 대조용: (이미지1, 이미지2, 라벨) 형태로 구성합니다. 라벨은 ‘같은 필자(1)’, ‘다른 필자(0)’로 표기합니다.
  • 삼항 대조용: (기준 이미지, 긍정 이미지, 부정 이미지) 형태로 구성합니다. 기준(Anchor)과 긍정(Positive)은 같은 필자, 부정(Negative)은 다른 필자의 글씨입니다.

2. 이항 대조 vs 삼항 대조 비교 및 추천

필자 식별(Writer Identification) 프로젝트에서 어떤 학습 방식이 더 효율적인지 비교 분석합니다.

구분이항 대조 (Contrastive Loss)삼항 대조 (Triplet Loss)
입력 개수2개 (Pair)3개 (Anchor, Positive, Negative)
학습 목표같은 클래스는 거리 $0$, 다른 클래스는 마진 $m$ 이상 유지상대적 거리 최적화 ($d(A,P) + m < d(A,N)$)
특징구현이 비교적 간단하고 수렴이 빠름미세한 스타일 차이(Fine-grained) 구분에 강력함
단점절대적인 거리를 강제하여 과적합 위험 존재적절한 삼항(Hard Triplet) 추출 기법이 필수적임

수식적 정의

  • 이항 대조 손실:

    \[L = (1-Y)\frac{1}{2}D^2 + (Y)\frac{1}{2}\max(0, m - D)^2\]

    (여기서 $D$는 유클리드 거리, $Y$는 불일치 여부 라벨)

  • 삼항 대조 손실:

    \[L = \max(0, d(A, P) - d(A, N) + \alpha)\]

    ($\alpha$는 마진 상수를 의미)

추천: 삼항 대조 학습(Triplet Learning)

현재 데이터셋이 5명의 필자로 구성된 소규모 클래스임을 고려할 때, 삼항 대조 학습을 권장합니다. 필자 식별은 ‘글자’라는 공통된 형태 안에서 개인의 미세한 ‘습관’을 찾아야 합니다. 삼항 대조 방식은 절대적인 거리를 좁히기보다 “다른 사람보다 내 글씨가 더 가깝게”라는 상대적 관계를 학습하므로, 필자 고유의 변별력 있는 임베딩 공간을 형성하는 데 훨씬 유리합니다.


3. 엘라스틱 왜곡(Elastic Distortion) 구현 포인트

엘라스틱 왜곡은 손글씨의 유기적인 변형을 모사하는 데 필수적입니다.

  1. 파라미터 설정: 가우시안 표준편차($\sigma$)와 강도($\alpha$) 조절이 핵심입니다. $\sigma$가 크면 부드러운 왜곡이 발생하고, $\alpha$가 크면 왜곡의 진폭이 커집니다.
  2. 적용 시점: 학습 매 에포크마다 실시간으로 랜덤하게 적용하여 모델이 데이터의 형태에 고착되지 않도록 합니다.
  3. 주의사항: 왜곡이 너무 심할 경우 글자의 구조적 정보가 파괴되어 필자 식별 자체를 방해할 수 있으므로, 육안으로 식별 가능한 수준의 임계값을 찾아야 합니다.

전이 학습이 추천되는가?

삼항 대조 학습(Triplet Learning) 기반의 샴 네트워크 구현 시에도 전이 학습(Transfer Learning)을 적용하는 것이 강력히 권장됩니다. 이에 대한 기술적 근거와 추천 모델을 제시합니다.


1. 전이 학습 적용 추천 이유

필자 식별 작업에서 사전 학습된 가중치(Pre-trained Weights)를 사용하는 이유는 다음과 같습니다.

가. 하위 계층 특징(Low-level Features)의 범용성

ImageNet과 같은 대규모 데이터셋으로 학습된 모델의 초기 레이어들은 선, 곡선, 색상 대비, 질감 등 시각 정보 처리에 필수적인 기본적인 필터들을 이미 갖추고 있습니다. 필자 식별 역시 글자의 ‘획(Stroke)’이라는 기하학적 선들의 조합을 분석해야 하므로, 밑바닥부터 학습하는 것보다 훨씬 효율적으로 특징을 추출할 수 있습니다.

나. 데이터 부족 문제 해결 및 수렴 속도 향상

2,200장의 데이터는 딥러닝 모델이 수만 개의 파라미터를 무작위 상태에서 최적화하기에는 턱없이 부족합니다. 전이 학습을 사용하면 모델이 이미 검증된 특징 공간(Feature Space)에서 시작하므로, 훨씬 적은 에포크 내에서 안정적으로 수렴하며 과적합 위험을 낮출 수 있습니다.

다. 변별력 있는 임베딩(Embedding) 생성

삼항 대조 학습의 핵심은 데이터 간의 상대적 거리를 조절하는 것입니다. 이미 고도화된 특징 추출 능력을 갖춘 모델을 백본으로 사용하면, 필자 간의 미세한 스타일 차이를 벡터 공간상에 더 정교하게 투영할 수 있습니다.


2. 필자 식별을 위한 추천 백본 모델

데이터의 규모(5명, 2,200장)와 작업의 특성을 고려할 때 다음 모델들이 가장 적합합니다.

추천 모델특징 및 선정 이유추천 사전 학습 데이터
ResNet-18구조가 단순하면서도 잔차 연결(Residual Connection)을 통해 기울기 소실 없이 깊은 특징 학습 가능. 소규모 데이터셋에서 과적합 제어가 용이함.ImageNet
EfficientNet-B0MBConv 구조를 통해 파라미터 수 대비 극강의 성능을 보임. 샴 네트워크의 공유 가중치 연산 부담을 줄이면서도 정밀한 특징 추출 가능.ImageNet
MobileNetV3-Small연산 자원이 제한적인 경우 적합하며, SE(Squeeze-and-Excitation) 모듈이 탑재되어 중요한 획 정보에 집중하는 능력이 뛰어남.ImageNet

구현 시 주의사항:

  • Frozen vs Unfrozen: 초기에는 백본 모델의 가중치를 동결(Freeze)하고 삼항 대조 손실로 헤드(Embedding Layer) 부분만 학습시킨 뒤, 이후 낮은 학습률(Learning Rate)로 전체 모델을 미세 조정(Fine-tuning)하는 방식이 안정적입니다.

3. 모델 아키텍처 예시

삼항 대조 학습 구성 시 각 입력(Anchor, Positive, Negative)은 동일한 Pre-trained ResNet-18을 통과하며, 출력된 512차원(ResNet-18 기준) 벡터를 L2 정규화한 후 거리를 계산합니다.


레이어 동결과 학습률 제어

레이어 동결(Layer Freezing)은 전이 학습 시 사전 학습된 모델의 가중치가 업데이트되지 않도록 고정하는 기술적 조치입니다. 이를 구현하기 위해 학습을 수동으로 중단할 필요는 없으며, 코드를 통해 자동화된 단계적 학습(Multi-phase Training)을 수행합니다.


1. 레이어 동결(Freezing)의 정의 및 구현 방식

가. 기술적 정의

레이어 동결은 역전파(Backpropagation) 과정에서 특정 레이어의 가중치에 대한 기울기(Gradient) 계산을 생략하고, 업데이트를 수행하지 않도록 설정하는 것입니다.

나. 구현 방법

학습을 수동으로 중단하고 다시 시작하는 대신, 학습 루프(Training Loop) 내에서 특정 에포크(Epoch)에 도달했을 때 속성을 변경하거나, 서로 다른 학습률을 가진 옵티마이저를 구성하여 해결합니다.

  • PyTorch: param.requires_grad = False 설정을 통해 해당 파라미터를 최적화 대상에서 제외합니다.
  • TensorFlow/Keras: layer.trainable = False 설정을 사용합니다.

2. 2단계 학습 전략 (Two-Phase Training)

사전 학습된 모델을 샴 네트워크의 백본으로 사용할 때 가장 권장되는 전략은 다음과 같습니다.

Phase 1: 특징 추출기 고정 (Warm-up)

  • 상태: 백본(ResNet-18 등)은 동결, 새로 추가한 임베딩 헤드만 활성화.
  • 목적: 무작위로 초기화된 헤드에서 발생하는 큰 오차(Loss)가 사전 학습된 백본의 정교한 가중치를 파괴(Catastrophic Forgetting)하는 것을 방지합니다.
  • 학습률: 상대적으로 높은 학습률(예: $10^{-3}$)을 적용합니다.

Phase 2: 미세 조정 (Fine-tuning)

  • 상태: 백본의 일부 또는 전체 레이어를 동결 해제(Unfreeze).
  • 목적: 백본의 가중치가 손글씨 데이터셋(Target Domain)의 특성에 맞게 미세하게 조정되도록 유도합니다.
  • 학습률: Phase 1보다 훨씬 낮은 학습률(예: $10^{-5}$ 이하)을 적용합니다. 이는 기존의 범용적 특징을 유지하면서 미세한 스타일 차이만 학습하기 위함입니다.

3. 학습률 및 동결 제어 방법 (기술적 메커니즘)

학습 중간에 수동으로 개입하지 않고 이를 처리하는 두 가지 주요 방법이 있습니다.

  1. 학습률 스케줄러(Learning Rate Scheduler) 활용: 에포크에 따라 학습률을 단계적으로 낮추며, 특정 시점에 레이어의 requires_grad 속성을 True로 전환하는 코드를 삽입합니다.
  2. 차등 학습률(Discriminative Learning Rates): 레이어별로 다른 학습률을 부여합니다. 백본에는 매우 낮은 학습률을, 헤드에는 높은 학습률을 처음부터 동시에 부여하여 동결과 유사한 효과를 낼 수 있습니다.

4. 요약 및 권장 사항

구분Phase 1 (동결 단계)Phase 2 (미세 조정 단계)
백본 가중치고정 (Frozen)업데이트 (Unfrozen)
임베딩 헤드학습 (Trainable)학습 (Trainable)
학습률(LR)$10^{-3} \sim 10^{-4}$$10^{-5} \sim 10^{-6}$
에포크 비중전체의 약 20~30%전체의 약 70~80%

동적 학습률 구현 팁

수동 중단 없이 코드를 통해 “10에포크까지는 백본 동결 + 고학습률, 이후에는 백본 해제 + 저학습률”로 프로그래밍하는 것이 가장 효율적입니다.

특정 에포크 이후에 레이어를 동결 해제(Unfreezing)하고 미세 조정(Fine-tuning)을 수행하는 것은 ‘스케줄러(Scheduler)’의 역할이라기보다 ‘훈련 루프(Training Loop) 내의 조건문’ 또는 ‘콜백(Callback)’의 영역에 해당합니다. 스케줄러는 주로 학습률($Learning Rate$)의 수치 변화만을 관리하기 때문입니다.

구현을 위한 핵심 메커니즘과 파이토치(PyTorch) 기반의 예시를 제시합니다.


1. 동결 해제 및 미세 조정 구현 원리

미세 조정을 시작하기 위해서는 두 가지 작업이 동시에 수행되어야 합니다.

가. 모델 구조 변경 (Unfreezing)

모델의 특정 레이어 혹은 전체 레이어의 requires_grad 속성을 True로 변경하여 기울기($Gradient$)가 계산되도록 설정합니다.

나. 옵티마이저(Optimizer) 업데이트

동결을 해제하면 학습 대상 파라미터가 늘어납니다. 따라서 기존 옵티마이저가 새로 활성화된 파라미터들을 인식할 수 있도록 파라미터 그룹을 다시 등록하거나, 학습률이 낮게 설정된 새로운 옵티마이저를 정의해야 합니다.


2. 단계별 구현 방법

방법 A: 훈련 루프 내 조건문 처리 (PyTorch 예시)

가장 직접적이고 직관적인 방법입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 초기 설정: 백본 동결
for param in model.backbone.parameters():
    param.requires_grad = False

# 옵티마이저 정의 (헤드 부분만 학습)
optimizer = torch.optim.Adam(model.head.parameters(), lr=1e-3)

for epoch in range(total_epochs):
    # 10번째 에포크에서 전체 동결 해제
    if epoch == 10:
        for param in model.backbone.parameters():
            param.requires_grad = True

        # 학습률을 낮추어 옵티마이저 재생성 (미세 조정 단계 진입)
        optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

    # 학습 수행 코드...

방법 B: 차등 학습률(Discriminative Learning Rates) 적용

동결과 해제를 수동으로 조절하지 않고, 백본에는 매우 낮은 학습률을, 헤드에는 높은 학습률을 처음부터 부여하는 방식입니다.

레이어 그룹초기 학습률목적
백본(Backbone)$10^{-6}$기존 특징 보존 및 미세 조정
임베딩 헤드(Head)$10^{-3}$새로운 도메인 데이터 적응

3. 미세 조정 시 주의사항

  1. 낮은 학습률 유지: 동결 해제 후에는 반드시 기존 학습률보다 10배에서 100배 낮은 수준($10^{-5}$ 이하)을 사용해야 합니다. 높은 학습률은 사전 학습된 지식을 파괴하는 파괴적 망각(Catastrophic Forgetting)을 유발합니다.
  2. 배치 정규화(Batch Normalization) 레이어: 미세 조정 시 BN 레이어의 가중치는 동결된 상태(Inference Mode)로 두는 것이 성능 안정화에 도움이 되는 경우가 많습니다.
  3. 데이터 증강과의 조화: 엘라스틱 왜곡과 같은 강력한 데이터 증강을 적용한 상태에서 미세 조정을 수행하면 모델의 일반화 성능이 극대화됩니다.
이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.

머신 비전 프로젝트 2 - 피드백

Optuna와 TPE, 메타-하이퍼파라미터