본문 바로가기
목차
ML

DL Vision Model들에서 Stem이란?

by ds31x 2026. 7. 13.
728x90
반응형

1. Stem의 어원

영어 stem

  • 고대 영어의 stefn 또는 stemn 에서 유래했다고 함.
    • 본래 식물의 줄기, 나무의 몸통, 배의 선수 부분처럼
    • 전체 구조를 지탱하는 중심축을 의미 함.
  • 여러 분야에서 다른 구성 요소가 연결되거나 뻗어나가는 기반 부분이라는 의미로 확장 (Merriam-Webster)
  • 이후 언어학에서는 접사가 붙는 단어의 중심 부분을 word stem 이라고 부르는 등,

딥러닝의 vision model들에서 사용하는 stem도 이러한 비유에서 나온 용어임.

  • 입력을 처음 받아 처리하고,
  • 이후의 여러 stage와 block으로 feature를 전달하는
  • 네트워크의 시작 부분

식물에서 줄기가 가지와 잎으로 신호와 영양분을 전달하듯이,
신경망의 stem은 원시 입력을 초기 feature로 변환하여 네트워크 본체에 전달함.


2. Stem 구조의 시작

사실 Stem이라는 용어가 나오기 전인 초기 CNN에도 오늘날 stem이라고 부르는 구조가 이미 존재했음.

LeNet(1998), AlexNet(2012), VGG(2014), GoogLeNet(2014) 등에서

  • 반복되는 주요 feature extraction block에 들어가기 전에
  • convolution과 pooling을 사용하여 입력 영상의 해상도를 줄이고 channel 수를 늘렸음.

단 초기 논문에서는 이를 반드시 stem이라는 독립된 명칭으로 구분하지는 않았음.

  • 예를 들어 ResNet 원 논문은 첫 번째 $7\times7$ convolution과 max pooling을 구조표에 기술하지만,
  • 이를 명시적으로 stem이라고 정의하지는 않음.

즉, 다음을 명심할 것:

  • 초기 CNN에 stem의 기능적 구조가 존재했다는 것은 맞음.
  • 초기 CNN 논문이 처음부터 그 구조를 모두 stem이라고 명명한 것은 아님.

사실 stem은 새로운 연산을 가리키는 이름이 아니라,
기존에 존재하던 입력부의 여러 연산을 하나의 기능적 단위로 묶어 부르는 아키텍처 용어로 정착한 것임.


3. Stem 용어의 시작

Stem이라는 용어는
Inception 계열에서
명시적인 아키텍처 용어로 정착

확인 가능한 대표적인 명시적 사용은

Inception-v4의 구조는 개념적으로 다음과 같이 나뉨.

$$
\text{Input}
\rightarrow
\text{Stem}
\rightarrow
\substack{\text{Inception} \\ \text{blocks}}
\rightarrow
\substack{\text{Reduction} \\ \text{blocks}}
\rightarrow
\text{Classifier}
$$

이 논문을 통해 stem 이라는 용어는 다음을 가리키는 용어로 사용되기 시작:

  • 입력에 직접 연결된 초기 처리부
  • 반복되는 본체 block에 들어가기 전의 준비 단계
  • 초기 downsampling과 channel projection을 담당하는 부분

stem이라는 용어를
Inception 연구진이 최초로 만들었다기 보다는
Inception-v4 논문이 stem을 명확한 아키텍처 구성 요소로 제시하면서 용어의 정착에 기여했다
고 이해하시는 것을 추천 (최초 논쟁은 ...).


4. ResNet에서의 stem

ImageNet용 ResNet (2015)의 입력부는 다음과 같이 구성됨:

$$
\text{Input}
\rightarrow
\substack{7\times7\text{ Conv,} \\ \text{stride }2}
\rightarrow
\text{BN}
\rightarrow
\text{ReLU}
\rightarrow
\substack{3\times3\text{ MaxPool,} \\ \text{stride }2}
$$

아래 그림에는 BatchNormalization(2015) 과 ReLU(2010)가 빠짐: 
The network has an image of size $224\times224$ as input, with a convolutional layer with $7\times7$ kernels and 64 output channels, followed by batch normalization (BN) and ReLU.

입력이 $224\times224$이면 이 stem을 통과한 출력의 공간 해상도는 $56\times56$이 됨:

$$
224
\xrightarrow{\text{stride }2}
112
\xrightarrow{ \substack { \text{max pool} \\ \text{stride }2} }
56
$$

따라서 전체 downsampling 비율은 다음과 같음:

$$
\frac{224}{56}=4
$$

오늘날에는
이 부분을 일반적으로
ResNet stem 또는 input stem
이라고 부름.

참고로, 이후 연구에서는

  • 기존의 큰 $7\times7$ convolution을
  • 여러 개의 $3\times3$ convolution으로 교체하는 구조가 제안되었고,
  • 이를 deep stem이라고 부르기도 함.

ResNet-C와 ResNet-D 계열의 연구에서도
이러한 입력부 변경을 명시적으로 stem 수정으로 설명함. 

 

따라서 다음 표현이 정확함.

ResNet의 stem은
첫 번째 residual stage인 layer1에 들어가기 전에 배치된
convolution, normalization, activation, pooling 입력부임.

 

ResNet에서 Stem은

  • residual block 자체를 포함하지 않으며,
  • 일반적으로 첫 번째 residual stage 이전까지를 가리킴.

5. 경량 CNN에서의 stem

MobileNet과 EfficientNet 계열에서는
연산량을 줄이기 위해 ResNet보다 단순한 stem이 사용됨.

 

일반적으로 $3\times3$, stride 2 convolution을 사용하여

  • 입력 해상도를 절반으로 줄인 뒤
  • 본체의 MBConv 또는 Fused-MBConv block으로 전달함.

EfficientNet-B0의 구조를 단순화하면 다음과 같음:

$$
\text{Input}
\rightarrow
\substack{3\times3\text{ Conv,} \\ \text{stride }2}
\rightarrow
\text{BN}
\rightarrow
\text{Activation}
\rightarrow
\substack{\text{MBConv} \\ \text{stages}}
$$

여기서는 stem 자체가

  • 전체 해상도를 1/2로 줄이고,
  • 이후 각 stage의 stride 2 block들이 추가 downsampling을 수행함.

참고로, EfficientNet은 이러한 기본 네트워크를 바탕으로
depth, width, input resolution을 함께 확장하는 compound scaling을 사용함. 

 

구현체에서는 이 부분이 다음과 같은 이름으로 나타날 수 있음.

  • conv_stem
  • stem_conv
  • features[0]
  • embedder

코드에서 Stem을 정확히 구분하려면 변수 이름보다는 본체의 반복 block에 들어가기 전 입력 처리부인가를 기준으로 stem을 판단해야 함.


6. Vision Transformer의 stem

6.1 ViT의 patch embedding

ViT는 입력 영상을 $P\times P$ 크기의 patch로 나눈 뒤 각 patch를 $D$차원 vector로 선형 투영함.

 

입력이 다음과 같다고 하자:

$$
\mathbf{x}
\in
\mathbb{R}^{B\times C\times H\times W}
$$

이 입력은 patch embedding 을 거쳐 다음과 같은 token sequence가 됨:

$$
\mathbf{z}
\in
\mathbb{R}^{B\times N\times D},
\qquad
N=\frac{H}{P}\frac{W}{P}
$$

 

ViT-B/16에서는 $P=16$이므로 $224\times224$ 영상에서 생성되는 patch token 수는 다음과 같음:

$$
N= \frac{224}{16} \times \frac{224}{16} = 14\times14 =196
$$

 

이 과정은

  • 이미지 pixel을
  • Transformer가 처리할 수 있는 token으로 변환한다는 점에서
  • CNN stem과 동일한 입력 변환 역할을 수행 함.

다만 ViT 원 논문에서는

  • 주로 patch embedding 또는 linear projection of patches라는 용어를 사용함.
  • 반드시 stem이라고만 부르지는 않았음 에 유의.

6.2 Patchify stem 이라는 표현

2021년의 Early Convolutions Help Transformers See Better에서 등장:

  • ViT의 patch embedding을 명시적으로 patchify stem이라고 부름.
  • 이 논문은 ViT의 기본 patch embedding과 CNN 방식의 convolutional stem을 다음과 같이 비교함.

Patchify stem

$$
P\times P\text{ Conv},
\qquad
\text{kernel size}=P,
\qquad
\text{stride}=P
$$

 

ViT-B/16에서는 다음과 같음.

$$
16\times16\text{ Conv, stride }16
$$

  • 하나의 큰 stride로 영상을 즉시 $16$배 downsampling함.

Convolutional stem

$$
\substack{3\times3\text{ Conv,} \\ \text{stride }2}
\rightarrow
\substack{3\times3\text{ Conv,} \\ \text{stride }2}
\rightarrow
\cdots
$$

  • 여러 개의 작은 convolution을 사용하여 해상도를 단계적으로 줄임.

참고로, 이 연구에서는

  • patchify stem을 경량 convolutional stem으로 교체했을 때
  • 학습이 optimizer와 hyperparameter 선택에 덜 민감해지고,
  • ImageNet-1K에서 최고 성능도 개선되는 결과를 보고함.

이 논문을 보더라도 최소 2021년에는

  • stem이라는 CNN 용어가
  • Vision Transformer의 입력 tokenization 구조까지 확장되어 사용되고 있음 을 확인가능함.

7. Swin Transformer에서의 stem

Swin Transformer

  • 입력 영상을 기본적으로 $\times4$ patch로 나누고,
  • 각 patch의 RGB 값을 펼친 뒤
  • embedding dimension $C$로 투영함.
  • 이후 생성된 feature가 Stage 1의 Swin Transformer block으로 전달됨.

$$ \mathbf{x} \in \mathbb{R}^{B \times 3 \times 224 \times 224} \;\xrightarrow{\;4 \times 4\ \text{patch embedding}\;}\; \mathbf{z} \in \mathbb{R}^{B \times 56 \times 56 \times C} $$

 

공간 해상도 변화는 다음과 같음:

$$
224 \rightarrow 56
$$

따라서 Swin의 patch embedding은 전체 해상도를 $4$배 downsampling함.

$$ \frac{224}{56}=4 $$

 

이는 ResNet의 conv7×7 + maxpool stem이

$224\times224$를 $56\times56$으로 줄이는 것과 출력 해상도 측면에서 정확히 대응함.

 

다만 연산 방식은 서로 다름.

모델 입력부 연산 출력해상도 출력형태
ResNet $7\times7$ conv + max pooling $56\times56$ feature map
Swin $4\times4$ patch embedding $56\times56$ patch token grid

 

참고로, 해당 module에 대한 Swin의 공식 구성 요소 이름은 patch embedding
하지만, 아키텍처 관점에서는 stem 역할을 수행한다
고 표현하는 것도 무리는 없음.

 

Hugging Face의 Swin 구현에서도

  • 입력부는 SwinEmbeddingspatch_embeddings 같은 이름으로 구성됨.
  • 즉, 기능적으로는 stem이지만 실제 module 이름은 stem이 아닐 수 있음.

8. 현재 딥러닝에서 stem이 의미하는 것

현재 stem은 특정한 layer 종류가 아니라 다음과 같은 기능적 위치를 나타내는 용어 라고 보는게 안전함:

$$
\text{Raw input}
\rightarrow
\boxed{\text{Stem}}
\rightarrow
\text{Backbone stages}
\rightarrow
\text{Head}
$$

일반적인 stem의 역할은 다음과 같음.

  1. 입력 형식 변환
    • RGB image, spectrogram, video frame 등의 원시 입력을 model 내부 feature로 변환함.
  2. Channel projection
    • 입력 channel 수를 네트워크가 사용할 초기 hidden dimension으로 확장함.
    • $C_{\text{in}} \rightarrow C_{\text{stem}}$
  3. 초기 downsampling
    • 높은 해상도의 입력을 줄여 이후 layer의 계산량을 감소시킴.
    • $H\times W\rightarrow \frac{H}{s}\times\frac{W}{s}$
  4. 초기 local feature 추출
    • 작은 convolution을 사용하는 stem은
    • edge, texture, color contrast와 같은 국소 구조를 먼저 추출할 수 있음.
  5. Tokenization
    • Vision Transformer 계열에서는 pixel grid를
    • token sequence 또는 token grid로 변환함.

Stem이 이 모든 기능을 반드시 다 수행하는 것은 아님.

모델에 따라

  • 단순한 convolution 하나일 수도 있고,
  • 여러 convolution, normalization, activation, pooling으로 구성된 복합 block일 수도 있음.

9. Stem, backbone, stage, head의 차이

용어 위치 주요 역할
Stem 네트워크 시작 부분 원시 입력을 초기 feature 또는 token으로 변환
Stage backbone 내부 일정한 해상도와 channel 크기에서 feature 학습
Backbone stem과 여러 stage를 포함하는 feature extractor 저수준에서 고수준 representation까지 추출
Neck backbone과 head 사이 여러 scale의 feature를 결합
Head 네트워크 끝부분 classification, detection, segmentation 등 최종 출력 생성

문맥에 따라 stem을 backbone에 포함하기도 하고 별도로 구분하기도 함.

 

일반적인 image classification 구조에서는 다음과 같이 이해할 수 있음.

$$
\underbrace{
\text{Stem}
+
\text{Stage 1}
+
\text{Stage 2}
+
\text{Stage 3}
+
\text{Stage 4}
}_{\text{Backbone}} + \text{Classification Head}
$$

 

따라서 stem은 backbone 전체를 의미하지 않으며,
backbone에서 입력에 가장 가까운 초기 구간을 의미 함.


10. 모델별 stem의 대응 관계

계열 Stem에 해당하는 부분 대표 downsampling
ResNet
(2015)
conv $7\times7$, BN, ReLU, max pooling $\times4$
ResNet-D
(2019)
여러 $3\times3$ convolution으로 구성된 deep stem 모델 설정에 따라 $\times4$
EfficientNet
(V1: 2019)
(V2: 2021)
stem $3\times3$ convolution $\times2$
ConvNeXt
(2022)
$4\times4$, stride 4 patchify convolution $\times4$
ViT-B/16
(2020)
$16\times16$ patch embedding $\times16$
ViT-B/8
(2020)
$8\times8$ patch embedding $\times8$
Swin
(2021)
$4\times4$ patch embedding $\times4$

ConvNeXt는 CNN이지만 Swin과 유사한 $4\times4$, stride 4 patchify stem을 채택함.

 

이는 stem이라는 개념이

  • 더 이상 전통적인 conv + pooling 구조만을 뜻하지 않고,
  • 입력을 본체가 사용할 representation으로 바꾸는 초기 모듈 전체를 의미한다는 것을 보여줌.

정리

  • Stem은 본래 식물의 줄기나 구조물의 중심축을 의미하는 영어 단어,
  • 딥러닝에서 Stem은 입력과 네트워크 본체를 연결하는 초기 처리부를 가리킴.
    • 초기 CNN에도 stem의 기능은 존재했지만, 이를 항상 stem이라고 명명한 것은 아니었음.
    • Inception-v4 시기에는 입력부가 명시적으로 stem이라는 독립 구성 요소로 표현되었고,
    • 이후 ResNet, EfficientNet, ConvNeXt (2022) 등에서 일반적인 CNN 아키텍처 용어로 정착함.
  • Vision Transformer가 등장한 이후에는 그 의미가 다음과 같이 확장됨.
    • Stem은
    • raw input을 backbone이 처리할 수 있는
    • 초기 feature map 또는 token representation으로 변환하는 입력부임.

따라서 현대 딥러닝에서 stem은 convolution 자체를 의미하는 용어가 아님.

  • CNN에서는 convolutional stem,
  • ViT와 Swin에서는 patch embedding 또는 patchify stem으로 구현될 수 있으며,
  • 구현 방식과 관계없이 입력 변환, 초기 projection, downsampling 또는 tokenization을 담당하는 네트워크의 첫 구간이라는 기능으로 정의하는 것으로 이해하면 됨.

References

https://dsaint31.me/mkdocs_site/ML/ch09/batch_normalization/

 

BME

batch normalization bn deep learning gradient exploding gradient vanishing internal covariate shift layer normalization regularization Batch Normalization Batch Normalization은 Ioffe et al.이 2015년 제안한 기법으로 Gradient Vanishing과 Exploding

dsaint31.me

 

728x90