일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 네트워크 기초
- 합성곱 신경망
- 넘파이
- numpy 기초
- ack
- 데이터 마이닝
- 넘파이 기초
- cpp
- 넘파이 배열
- 머신러닝
- 코테
- python
- 코딩테스트실력진단
- cpp class
- c++
- 코딩테스트
- 데이터 분석
- Machine Learning
- 기계학습
- 자바
- Design Pattern
- NumPy
- 디자인 패턴
- 차원축소
- java
- lambda
- 코드트리
- OOP
- 클러스터링
- 파이썬
- Today
- Total
준비하는 대학생
[자연언어 처리] CNN 핵심 요소 본문
합성곱 신경망(CNN)은 딥러닝에서 이미지 인식, 음성 인식 등 다양한 분야에서 성공적으로 활용되고 있습니다.
풀링 (Pooling)
풀링은 CNN에서 중요한 역할을 합니다. 특성 맵에서 중요한 정보를 보존하면서 크기를 줄여 계산 부하를 감소시키고, 과적합을 방지합니다.
- 최대 풀링 (Max Pooling): 윈도우 내에서 가장 큰 값을 선택하여 특성을 요약합니다. 중요한 정보를 강조하고, 더 뚜렷한 특징을 추출합니다.
- 평균 풀링 (Average Pooling): 윈도우 내 모든 값의 평균을 계산하여 정보를 압축합니다. 더 부드러운 특성 맵을 생성합니다.
CNN의 핵심 요소 중 하나는 풀링(pooling)입니다. 풀링은 CNN의 합성곱 층에서 생성된 특성 맵의 차원을 줄여주는 다운샘플링 과정입니다. 이는 모델의 계산 복잡도를 줄이고, 과적합을 방지하는 데 도움을 줍니다. 가장 흔한 형태의 풀링은 최대 풀링(max pooling)과 평균 풀링(average pooling)입니다. 최대 풀링은 각 윈도우에서 가장 큰 값을 선택하여 특성을 요약하고, 평균 풀링은 윈도우 내 모든 값의 평균을 계산하여 정보를 압축합니다.
풀링을 통해 CNN은 다양한 크기와 형태를 가진 입력에 대해 강인하게 반응할 수 있으며, 이는 특히 이미지 인식에서 중요한 특징이 됩니다. 특성 맵의 크기가 줄어들면서 각 특성이 더 넓은 입력 영역을 커버하게 되어, CNN이 이미지의 전역적인 정보를 더 잘 파악할 수 있도록 합니다.
예시 코드:(최대 풀링과 평균 풀링)
import torch
import torch.nn as nn
import torch.nn.functional as F
# 임의의 특성 맵 생성
feature_map = torch.tensor([[[2, 4, 4, 0], [2, 4, 4, 0], [2, 4, 4, 0], [2, 4, 4, 0]]], dtype=torch.float32)
feature_map = feature_map.unsqueeze(0) # 배치 차원 추가
# 최대 풀링
pool = nn.MaxPool2d(2, stride=2)
max_pooled = pool(feature_map)
# 평균 풀링
avg_pooled = F.avg_pool2d(feature_map, 2, stride=2)
print("Original Feature Map:\n", feature_map)
print("Max Pooled Feature Map:\n", max_pooled)
print("Average Pooled Feature Map:\n", avg_pooled)
Original Feature Map:
tensor([[[[2., 4., 4., 0.],
[2., 4., 4., 0.],
[2., 4., 4., 0.],
[2., 4., 4., 0.]]]])
Max Pooled Feature Map:
tensor([[[[4., 4.],
[4., 4.]]]])
Average Pooled Feature Map:
tensor([[[[3., 2.],
[3., 2.]]]])
- 이 예제코드에서는 4x4 크기의 특성 맵에 대해 2x2 윈도우를 사용하여 최대 풀링과 평균 풀링을 적용합니다.
- MaxPool2d와 avg_pool2d는 각각 최대 값을 선택하거나 평균 값을 계산하여 2x2 크기의 윈도우를 한 칸씩 이동합니다.
- 최종적으로 4x4 특성 맵은 2x2 크기로 축소됩니다.
- 최대 풀링은 가장 두드러진 특성(가장 큰 값)을, 평균 풀링은 윈도우 내의 전반적인 특성을 반영합니다.
배치 정규화 (Batch Normalization)
또 다른 중요한 개념은 배치 정규화(Batch Normalization)입니다. 이 기술은 네트워크의 각 층에서 활성화 값의 분포가 일정하도록 조정하여, 네트워크의 학습을 안정화하고 가속화하기 위해 사용됩니다. 각 배치의 출력을 정규화하여 평균이 0이고 분산이 1이 되도록 만듭니다. 이는 모델이 가중치 초기화에 덜 민감하게 되고, 더 높은 학습률을 사용할 수 있게 해줍니다.
예시 코드
# 임의의 데이터 생성
input_data = torch.randn(100, 64)
# 배치 정규화 적용
batch_norm = nn.BatchNorm1d(64)
output = batch_norm(input_data)
print("Batch Normalized Output:\n", output)
Batch Normalized Output:
tensor([[-0.9878, 1.1044, -0.1166, ..., -0.0716, 1.6438, -0.1930],
[-0.5609, -1.2086, -0.0115, ..., -1.5245, -0.0244, 0.4617],
[-1.2373, 0.8091, -0.1505, ..., 0.5647, -0.4459, 0.5731],
...,
[ 0.2660, -2.6457, -0.8528, ..., 1.1439, -1.4309, 0.3925],
[-0.3308, -0.2321, 0.6078, ..., 1.7210, 0.7130, 0.8700],
[-1.1455, 0.2128, -2.1856, ..., -0.1313, -0.1466, 1.1970]],
grad_fn=<NativeBatchNormBackward0>)
- 이 예제코드에서는 64개의 특성을 가진 100개의 데이터 포인트로 구성된 배치에 배치 정규화를 적용합니다.
- BatchNorm1d 레이어는 입력 데이터의 각 특성에 대해 정규화를 수행하여 평균을 0으로, 분산을 1로 만듭니다.
- 이 과정은 학습을 안정화시키고 더 빠른 수렴을 가능하게 합니다.
NiN 연결 (Network in Network)
CNN의 구조를 발전시킨 NiN(Network-in-Network) 연결은 각 픽셀 위치에서 더 복잡한 추상화를 가능하게 해주는 1x1 합성곱 레이어를 추가합니다. 이는 모델이 더 세밀한 패턴을 추출할 수 있게 해주며, 전체 연결 레이어 대신 글로벌 평균 풀링을 사용하여 파라미터 수를 줄이고 과적합을 완화하는 효과를 가집니다.
예시 코드( 1x1 합성곱 (NiN 연결))
# 임의의 데이터 생성
input_data = torch.randn(1, 192, 28, 28) # 예: 192채널의 28x28 이미지 배치
# 1x1 합성곱 적용
nin = nn.Conv2d(192, 32, kernel_size=1) # 192채널을 32채널로 변환
output = nin(input_data)
print("Output shape after 1x1 Convolution (NiN):\n", output.shape)
Output shape after 1x1 Convolution (NiN):
torch.Size([1, 32, 28, 28])
- 이 코드에서는 192채널을 가진 28x28 이미지에 1x1 합성곱을 적용합니다.
- 이 합성곱은 각 위치에서 192개의 특성을 32개로 변환합니다.
- 이러한 방식으로 NiN 연결은 채널 간의 정보를 합치고, 더 높은 수준의 추상화를 수행하며, 네트워크의 매개변수 수를 감소시킵니다.
잔차 연결 (Residual Connection)
잔차 연결(Residual Connection)은 신경망이 깊어짐에 따라 발생하는 학습 문제를 해결하기 위해 도입되었습니다. 이는 입력 데이터를 몇 개의 레이어를 건너 뛰어 출력에 직접 더하는 방식으로, 역전파 시에 기울기가 손실 없이 효율적으로 전달되도록 돕습니다. 이는 매우 깊은 신경망의 학습을 가능하게 하고, 딥러닝 모델의 성능을 크게 향상시켰습니다.
예시 코드: 잔차 블록 (Residual Block)
class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels):
super(ResidualBlock, self).__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)
self.bn1 = nn.BatchNorm2d(out_channels)
self.relu = nn.ReLU(inplace=True)
self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
self.bn2 = nn.BatchNorm2d(out_channels)
def forward(self, x):
residual = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out += residual # 잔차 연결
out = self.relu(out)
return out
# 임의의 데이터 생성
input_data = torch.randn(1, 32, 28, 28) # 예: 32채널의 28x28 이미지 배치
# 잔차 블록 생성 및 적용
res_block = ResidualBlock(32, 32)
output = res_block(input_data)
print("Output shape after Residual Block:\n", output.shape)
Output shape after Residual Block:
torch.Size([1, 32, 28, 28])
- 잔차 블록은 입력 x를 두 개의 합성곱 층과 배치 정규화, ReLU 활성화 함수를 거치게 합니다.
- 핵심은 입력 x를 층의 출력에 더해주는 것으로, 이를 통해 신경망은 입력에 직접적인 경로를 갖게 되어 깊은 네트워크에서 그라디언트 소실 문제를 완화시킵니다.
- 최종으로, 모델은 더 깊게 쌓을 수 있게 되고, 학습이 향상됩니다.
이러한 기법들의 도입으로, CNN은 보다 복잡한 데이터의 특징을 효과적으로 모델링하고, 이미지나 오디오와 같은 고차원 데이터에 대한 인식 작업을 성공적으로 수행할 수 있습니다. CNN의 발전은 계속 진행 중이며, 새로운 아키텍처와 학습 기법이 연구되고 개발되어 더욱 강력하고 다재다능한 모델로 발전하고 있습니다.
'Programming > NLP' 카테고리의 다른 글
[자연언어처리] 피드 포워드 신경망(MLP, CNN) (2) | 2023.11.25 |
---|---|
[Deep Learning] Activation Function (활성화 함수) (0) | 2023.11.10 |
[자연어 처리] 웹 스크레이핑 기초 - 1 (0) | 2023.09.14 |