Q1. CNN을 구성하는 각 레이어의 역할에 대해 설명해보세요.
A1. CNN을 구성하는 레이어는 크게 합성곱(이미지 특징 추출), 풀링(이미지 크기 축소), 정규화(과적합 방지), 활성화 함수(비선형성 부여), 전결합(예측) 계열로 나뉜다. 주어진 테스크에 따라 사용하는 레이어 종류와 개수가 다르다.
Q2. 오토 인코더가 적용되기 적합한 상황에 대해 설명하고, 오토 인코더를 구성하는 인코더(Encoder)와 디코더(Decoder) 각각의 개념과 차이점에 대해 설명하세요.
A2. 오토 인코더는 복원 및 이상 탐지 테스크에 쓴다. 인코더는 입력 데이터의 특징을 추출하는 것이고, 디코더는 추출한 특징을 기반으로 유사한 데이터를 복원하는 것이다.
CNN 레이어 종류 정리
| 범주 | 역할 | 사용 예시 |
|---|---|---|
| 합성곱 | 이미지 특징 추출 (커널 기반 공간 정보 인코딩) | nn.Conv2d(1, 32, 3, 1, 1) |
| 업샘플링 + 학습 가능한 디코딩 (Transpose Conv) | nn.ConvTranspose2d(32, 16, 2, 2, 0) | |
| 단순 업샘플링 (보간 기반 확대) | nn.Upsample(scale_factor=2, mode='bilinear') | |
| 업샘플링 (채널 → 공간 변환, Super-Resolution용) | nn.PixelShuffle(2) | |
| 공간 외곽 채우기 (패딩 추가) | nn.ZeroPad2d(1) | |
| 풀링 | 주요 특징 보존 + 해상도 축소 (Downsampling) | nn.MaxPool2d(2) |
| 평균 기반 다운샘플링 | nn.AvgPool2d(2) | |
| 입력 크기에 관계없는 풀링 (출력 크기 고정) | nn.AdaptiveAvgPool2d((1, 1)) | |
| 최대값 기반 적응형 풀링 | nn.AdaptiveMaxPool2d((1, 1)) | |
| 정규화 | 배치 단위 정규화 (CNN에서 자주 사용) | nn.BatchNorm2d(32) |
| 샘플 단위 정규화 (Style Transfer 등에서 사용) | nn.InstanceNorm2d(32) | |
| 채널/위치 정규화 (Transformer 계열) | nn.LayerNorm([32, 28, 28]) | |
| 과적합 방지용 뉴런 랜덤 제거 | nn.Dropout(0.5) | |
| 2D Feature Map 기반 드롭아웃 | nn.Dropout2d(0.3) | |
| 활성화 함수 | 양수 통과, 음수 제거 (비선형성 도입) | nn.ReLU() |
| ReLU 변형, 음수도 일부 반영 | nn.LeakyReLU(0.1) | |
| 확률 해석을 위한 출력 스케일링 | nn.Sigmoid() | |
| -1~1 출력 범위의 비선형 함수 | nn.Tanh() | |
| Transformer 기본 활성화 함수 | nn.GELU() | |
| Swish 계열, 성능 향상 기대 | nn.SiLU() | |
| 전결합 및 구조 | 선형 출력 변환 (분류 등 마지막 계층) | nn.Linear(128, 10) |
| 다차원 → 1차원 벡터 변환 | nn.Flatten() | |
| 아무 연산도 하지 않음 (Skip placeholder용) | nn.Identity() | |
| 두 벡터 간 비선형 결합 | nn.Bilinear(64, 64, 32) | |
| 입력과 출력 직접 더하는 잔차 연결 구조 | out = x + F(x) 형태 Skip Connection 직접 구현 | |
| 시계열 | 정수 입력을 밀집 임베딩 벡터로 변환 | nn.Embedding(num_embeddings, emb_dim) |
| 시퀀스 내 위치 정보 부여 (직접 구현) | get_positional_encoding() | |
| 장기 의존성 순차 학습 (시계열) | nn.LSTM(input_size, hidden_size) | |
| LSTM보다 단순한 순차 학습 구조 | nn.GRU(input_size, hidden_size) |
| 인코더 | 디코더 |
|---|---|
| 입력 → 잠재 공간 | 잠재 공간 → 출력 |
| 정보 압축 목적 | 정보 복원 목적 |
| CNN 또는 MLP 가능 | 주로 업샘플링 구조 사용 |
| 오토인코더 종류 | 핵심 개념 | 주요 특징 | 주 용도 |
|---|---|---|---|
| Vanilla AutoEncoder | 인코더-디코더 기본 구조 | MLP 또는 CNN 기반의 가장 단순한 형태 | 차원 축소, 이미지 복원 |
| Denoising AutoEncoder (DAE) | 노이즈 입력 → 원본 복원 | 입력에 노이즈 추가 / 정답은 원본 | 노이즈 제거, 강건한 특징 학습 |
| Sparse AutoEncoder (SAE) | 희소성 유도 | 활성 뉴런 수 최소화 (L1 또는 KL Divergence) | 이상 탐지, 해석 가능한 특징 |
| Variational AutoEncoder (VAE) | 확률 분포 기반 | 정규분포 latent 공간, 샘플링 가능 | 생성 모델, 잠재공간 탐색 |
| Contractive AutoEncoder (CAE) | 입력 변화에 둔감 | 인코더의 미분값 최소화 | 노이즈 저항, 견고한 특징 학습 |
| Convolutional AutoEncoder (ConvAE) | CNN 기반 AE | 공간적 특징 보존, Conv + Pool 구조 | 이미지 복원, 시각적 특징 추출 |
| Stacked AutoEncoder | 여러 AE 중첩 | 사전학습 기반 층별 학습 | 복잡한 표현 학습, 전이학습 |
| Deep AutoEncoder | 깊은 AE 구조 | 다층 MLP 인코더-디코더 | 고차원 비선형 차원 축소 |
| Seq2Seq AutoEncoder | 시퀀스 입력 대응 | LSTM, GRU 기반 인코딩/디코딩 | 문장 요약, 시계열 임베딩 |
| Attention AutoEncoder | 어텐션 적용 AE | Self-Attention 구조 포함 | 텍스트 처리, 시계열 정보 집중 |
| Adversarial AutoEncoder (AAE) | AE + GAN 구조 | latent 분포에 GAN 판별기 추가 | 정규화된 latent 학습, 생성 모델 |
CNN은 크게 Convolution Layer, Pooling Layer, 그리고 Fully Connected Layer로 구성됩니다.
먼저, Convolution Layer는 입력 데이터에서 특징(feature)을 추출하는 역할을 합니다. 필터 또는 커널이라는 작은 행렬을 사용해 이미지를 스캔하면서, 엣지나 텍스처 같은 특징을 학습합니다. 이 레이어는 이미지의 공간적 구조를 보존하면서 특징을 추출할 수 있는 것이 큰 장점입니다.
그다음 Pooling Layer는 데이터의 크기를 줄여 계산량을 감소시키고, 모델의 일반화 능력을 높이는 역할을 합니다. Max Pooling은 가장 중요한 값을 선택해 중요한 정보를 보존하고, Average Pooling은 값들의 평균을 취해 데이터를 축소합니다. 이를 통해 과적합을 방지하는 효과도 있습니다.
마지막으로 Fully Connected Layer는 Convolution Layer와 Pooling Layer를 통해 학습된 특징들을 종합적으로 분석해 최종적으로 분류(classification)나 예측 작업을 수행합니다. 이 레이어는 전체 뉴런이 연결되어 있어 종합적인 결정을 내리는 데 적합합니다.
추가적으로, 활성화 함수나 정규화 레이어도 CNN의 중요한 구성 요소로, 비선형성을 추가하거나 학습을 안정화하는 데 기여합니다.
AutoEncoder는 데이터를 압축하고 복원하는 과정에서 중요한 특징을 학습하는 데 적합하며, 다음과 같은 상황에서 활용됩니다.
먼저, 차원 축소 작업에 적합합니다. 고차원 데이터를 저차원으로 효율적으로 표현하여 분석하거나 시각화할 때 사용할 수 있습니다. 또한, 데이터에 포함된 잡음(노이즈)을 제거하고 원본 데이터를 복원하는 데 유용한 Denoising 작업에도 사용됩니다. 이상치 탐지에서도 AutoEncoder가 유용한데, 정상 데이터를 학습한 모델은 이상 데이터를 복원하기 어려워 이 차이를 기반으로 이상치를 탐지할 수 있습니다. 마지막으로, 생성 모델링에도 사용되며, 잠재 공간(latent space)을 활용해 새로운 데이터를 생성할 수 있습니다.
AutoEncoder는 크게 인코더(Encoder)와 디코더(Decoder)로 구성됩니다. 인코더는 입력 데이터를 압축하여 잠재 공간에 표현하는 역할을 합니다. 이 과정에서 입력 데이터의 중요한 특징만 추출하고, 불필요한 정보를 제거합니다. 예를 들어, 고차원 데이터에서 주요 패턴만 학습하는 역할을 합니다.
반대로 디코더는 잠재 공간에서 압축된 표현을 다시 원래 데이터로 복원하는 역할을 합니다. 디코더는 인코더가 학습한 특징을 기반으로 데이터의 세부 정보를 복원하며, 입력 데이터와 유사한 출력을 생성하는 데 초점이 맞춰져 있습니다.
인코더와 디코더의 차이점은 작업의 방향성입니다. 인코더는 데이터를 축소하고 특징을 학습하며, 디코더는 축소된 데이터를 기반으로 복원하는 작업을 수행합니다. 이 두 과정은 서로 연결되어 입력 데이터와 복원된 데이터 간의 차이를 최소화하는 것을 목표로 합니다.