관리 메뉴

개발자의 스터디 노트

CNN의 추가 개념 본문

파이썬/파이토치 자연어처리

CNN의 추가 개념

박개발씨 2022. 2. 23. 01:03

1. 풀링

 풀링(pooling)은 고차원 특성 맵을 저차원 특성 맵으로 요약하는 연산입니다. 합성곱의 출력은 특성 맵입니다. 특성 맵의 값은 입력의 일부 영역을 요약합니다. 합성곱 연산의 중첩되는 특징 때문에 많은 특성이 중복될 수 있습니다. 풀링은 고차원이고 중복 가능성이 높은 특성 맵을 저차원으로 요약하는 방법입니다. 풀링은 특성 맵의 국부적인 영역에 적용하는 합, 평균, 최댓값과 같은 산술 연산입니다. 이런 풀링 연산을 각각 합 풀링(sum pooling), 평균 풀링(average pooling), 최대 풀링(max pooling)이라 합니다. 풀링은 통계적으로 약하고 크기가 큰 특성 맵을 강하고 작은 특성 맵으로 개선할 수 있습니다.

풀링 연산은 합성곱과 작동 방식이 같습니다. 입력 행렬의 위치를 바꿔가며 적용됩니다. 하지만 입력 행렬의 값에 곱해서 더하는 대신 풀링 연산은 값을 모으는 함수 G를 적용합니다. G는 어떤 연산도 될 수 있지만 합, 최댓값, 평균을 가장 많이 사용합니다.

 

2. 배치 정규화

배치 정규화(batch normalization)는 CNN을 만들 때 자주 사용되는 층입니다. 배치 정규화는 CNN의 출력에 적용되어 활성화값의 평균이 0이고 단위 분산이 되도록 만듭니다. 비슷하게 Z점수 변환에 사용하는 평균과 분산은 배치마다 업데이트하여 한 배치에서 변경 폭이 너무 크지 않도록 합니다. 배치 정규화는 모델이 파라미터 초기화에 덜 민감하게 만들고 학습률 튜닝을 단순화합니다.

 

배치 정규화와 Conv1D층 사용하기(예제 코드)

self.conv1 = nn.Conv1d(in_channels=1, out_channels=10, kernel_size=5, stride=1)
self.conv1_bn = nn.BatchNorm1d(num_features=10)

def forward(self, x):
	x = F.relu(self.conv1(x))
    self.conv1_bn(x)

 

 

3. NiN 연결 (1x1합성곱)

NiN(network-in-network) 연결은 kernel_size=1인 합성곱 커널을 사용하며 몇 가지 흥미로운 성질이 있습니다. 특히 1x1 합성곱은 채널에 걸쳐 동작하는 완전 연결 층과 비슷합니다. 이는 채널이 많은 특성 맵을 얕은 특성 맵으로 매핑하는 데 유용합니다. 

채널이 2개인 입력 텐서와 NiN 합성곱 채널

1 x 1 합성곱 연산의 예. 1 x 1 합성곱 연산이 어떻게 채널을 2개에서 1개로 줄이는지 눈여겨보세요.

 

4. 잔차 연결 / 잔차 블록

잔차 연결(residual connection)은 (층이 100개 이상인) 진짜 깊은 신경망을 가능하게 한 CNN의 중요한 트렌드입니다. 이를 스킵 연결(skip connection)이라고도 부릅니다. 합성곱 함수를 conv로 표현하면 잔차 블록(residual block)의 출력은 다음과 같습니다.

 

출력 = conv(입력) + 입력

잔차 연결은 원본 행렬에 합성곱의 출력을 더하는 방법입니다. 합성곱 층의 결과와 입력 행렬을 더하는 과정이 그림에 잘 나타납니다. 입력과 같은 크기의 출력을 만드는 전형적인 하이퍼파라미터 설정은 kernel_size=3과 padding=1입니다. 일반적으로 홀수 kernel_size와 padding=(floor(kernel_size)/2 - 1)은 입력과 같은 크기의 출력을 만듭니다.