- Penultimate: 마지막(끝)에서 두 번째
- Penultimate Layer: 제일 마지막 Layer 인 Classifier (Linear + softmax) 바로 직전 layer
간혹 대학원 수업 도중 Penultimate Layer에 대한 내용이 언급되고는 하였는데, 해당 Layer의 의미에 대해 정리해보려 한다.
Penultimate Layer
딥러닝 모델에서 Penultimate Layer는 말 그대로 끝에서 두 번째 층을 의미한다. 특히 분류(Classification) 문제에서 이 층은 모델의 최종 표현(feature representation)을 생성하는 데 중요한 역할을 한다. 출력층 바로 앞에 위치하며, 모델이 입력 데이터를 어떻게 이해하고 있는지를 간접적으로 보여주는 층이기도 하다.
Penultimate Layer는 보통 추상적인 고차원 표현을 포함하고 있으며, 이 표현은 최종 출력 전에 모든 이전 층의 학습 결과를 집약한 형태라고 볼 수 있다. 이 층의 출력은 다음과 같은 이유로 매우 유용하다.
- 특징 추출(feature extraction)에 사용 가능하다.
→ Pretrained 모델의 Penultimate Layer 출력을 이용하면 다양한 다운스트림 작업에 활용할 수 있다. - 시각화와 해석 가능성(interpretability)을 높인다.
→ 예: t-SNE나 PCA를 활용해 이 층의 출력을 2D로 시각화하면, 클래스 간의 분포나 클러스터링 경향을 파악할 수 있다. - Few-shot Learning이나 Transfer Learning에서 핵심 역할을 한다.
→ 전체 모델을 fine-tune 하지 않고 penultimate representation만 활용하는 방식이 자주 쓰인다.
다음과 같이 Penultimate Layer 출력을 얻으면 이를 기반으로 새로운 분류기를 학습하거나 시각화하는 데 사용할 수 있다. PyTorch를 기준으로 Penultimate Layer 출력을 추출하는 예시이다.
import torch
import torchvision.models as models
model = models.resnet50(pretrained=True)
model.eval()
def get_penultimate_output(x):
modules = list(model.children())[:-1] # 마지막 FC 층 제외
penultimate_model = torch.nn.Sequential(*modules)
with torch.no_grad():
features = penultimate_model(x)
return features.squeeze()
# 입력 이미지 예시
# output = get_penultimate_output(input_tensor)
실제 예시를 몇 가지 더 살펴보면 다음과 같다.
예시 1: 이미지 분류 모델에서의 Penultimate Layer
이미지 분류 분야에서 사용되는 ResNet, EfficientNet, ViT (Vision Transformer) 등의 모델에서도 Penultimate Layer의 위치는 구조적으로 명확하게 정의되어 있다.
일반적으로 다음과 같이 정의한다.
- CNN 기반 모델(예: ResNet)에서는 Fully Connected (FC) 분류기 직전의 global average pooling 또는 projection 층의 출력을 Penultimate Layer로 본다. 이 출력은 이미지 전체를 요약한 최종 시각 특징 벡터로, 분류 결과에 직접적으로 영향을 미친다.
- ViT와 같은 Transformer 기반 모델에서는 CLS 토큰의 마지막 블록 이전(hidden layer) 출력이 Penultimate Layer에 해당한다. 이 위치는 문맥이 충분히 반영된 상태에서 마지막 예측 전의 핵심 표현 정보를 담고 있다.
이 층의 출력은 일반적으로 (batch_size, feature_dim) 형태의 고차원 벡터이며, 입력 이미지를 대표하는 압축된 시각 정보라고 볼 수 있다.
이미지 분류 모델에서의 Penultimate Layer 활용 사례는 다음과 같다.
- 이미지 임베딩 추출
→ Penultimate Layer에서 추출한 벡터는 이미지 검색(Image Retrieval), 유사도 측정(Similarity Matching), 시각적 군집화(Clustering) 등에 직접 사용 가능하다. - 중간 피처 기반 전이 학습
→ 사전학습된 분류 모델의 Penultimate 출력을 그대로 사용하여 다른 비전 태스크(예: 객체 탐지, 스타일 분류)에 전이 학습할 수 있다. - 시각화 및 설명 가능성 향상
→ 이 층의 출력을 기반으로 t-SNE, PCA를 적용하면 클래스 간 시각적 분포를 분석할 수 있으며, 이는 모델이 어떤 시각 패턴을 학습했는지 해석하는 데 도움이 된다.
예시 2: Transformer / Attention 모델에서의 Penultimate Layer
Transformer 계열 모델에서 Penultimate Layer는 다음과 같은 위치에 해당한다.
- Encoder 기준: N개의 Encoder Layer 중, 마지막 층 바로 전인 (N-1) 번째 Layer 출력이 penultimate이다.
- Decoder 기준: 마찬가지로, Decoder의 마지막 층 바로 앞의 출력이 해당된다.
Transformer / Attention 모델에서의 Penultimate Layer의 출력은 보통 다음과 같은 특징을 가진다.
- Contextual Representation의 정점 직전
→ Attention을 통해 문맥이 모두 반영된 상태에서, 마지막 예측 바로 직전의 정보를 담고 있다.
→ 특히 BERT나 GPT에서도 이 층의 출력은 hidden state로서 전이학습에서 자주 활용된다. - Token-level 임베딩으로 활용
→ 예를 들어, 각 토큰에 대한 penultimate hidden state는 token classification, tagging, 혹은 token similarity 분석에 사용될 수 있다. - Fine-tuning 지점으로 적합
→ 마지막 출력층은 task-specific 하지만, penultimate는 보다 일반적인 표현을 포함하고 있어 다양한 task에 범용적으로 활용 가능하다.
예시 3: 음성 인식 모델에서의 Penultimate Layer
음성 인식 모델, 특히 Conformer나 RNN-T, Transformer-CTC와 같은 구조에서는 Penultimate Layer의 위치가 보다 구조적으로 정의되어야 한다.
일반적으로 다음과 같이 정의한다.
- Conformer-CTC 모델에서는 Encoder의 마지막 블록 직전 층의 출력을 Penultimate Layer로 볼 수 있다. 이 출력은 최종 CTC 로스 계산 이전에 가장 정보가 응축된 고차원 특징 벡터이다.
- 이 층의 출력은 보통 시간축을 따라 존재하며, 각 프레임에 대해 d차원의 벡터를 반환한다. 즉, \( T \times d_{model} \) 형태를 가지며, 각 시점의 음성 특징이 높은 표현력으로 인코딩 되어 있다.
음성 인식 모델에서의 Penultimate Layer의 활용 사례는 다음과 같다.
- 음성 임베딩 추출
→ Penultimate Layer에서 추출한 벡터는 화자 인식(Speaker ID), 감정 인식(Emotion Recognition), 키워드 검출(Keyword Spotting) 등에 바로 사용 가능하다. - 중간 피처 기반 전이 학습
→ ASR 모델에서 학습한 Penultimate 표현을 그대로 사용하여 downstream task에 transfer learning을 적용한다. - 디코더 이전 단계의 정보 가시화
→ 이 층에서 추출된 정보를 분석하면 모델이 어떤 음향 패턴을 ‘이해’하고 있는지를 파악할 수 있다.