K 개발자

합성곱 신경망 본문

인공지능/핸즈온 머신러닝

합성곱 신경망

ddingz 2020. 12. 28. 02:03

합성곱 층convolutional layer

첫 번째 합성곱 층의 뉴런은 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 합성곱 층 뉴런의 수용장 안에 있는 픽셀에만 연결
두 번째 합성곱 층에 있는 각 뉴런은 첫 번째 층의 작은 사각 영역 안에 위치한 뉴런에 연결
이런 구조는 네트워크가 첫 번째 은닉층에서는 작은 저수준 특성에 집중하고, 그다음 은닉층에서는 더 큰 고수준 특성으로 조합해나가도록 도와준다.
수용장 사이에 간격을 두어 큰 입력층을 훨씬 작은 층에 연결하는 것도 가능 (한 수용장과 다음 수용장 사이 간격을 스트라이드stride라고 한다.)

필터filter(합성곱 커널convolution kernel)

뉴런의 가중치는 수용장 크기의 작은 이미지로 표현될 수 있다.
층의 전체 뉴런에 적용된 하나의 필터는 하나의 특성 맵feature map을 만든다. (이 맵은 필터를 가장 크게 활성화시키는 이미지의 영역을 강조)

여러 가지 특성 맵 쌓기

각 특성 맵의 픽셀은 하나의 뉴런에 해당하고 하나의 특성 맵 안에서는 모든 뉴런이 같은 파라미터(i.e. 동일한 가중치와 편향)를 공유하지만, 다른 특성 맵에 있는 뉴런은 다른 파라미터를 사용
한 뉴런의 수용장은 앞서 설명한 것과 같지만, 이전 층에 있는 모든 특성 맵에 걸쳐 확장 (하나의 합성곱 층이 입력에 여러 필터를 동시에 적용하여 입력에 있는 여러 특성을 감지)

합성곱 층에 있는 뉴런의 출력 계산

$z_ {i,j,k}=b_ {k}+\sum_ {u=0}^{f_ {h}-1} \sum_ {v=0}^{f_ {w}-1} \sum_ {{k}'=0}^{f_ {{n}'}-1}x_ {{i}',{j}',{k}'}\times w_ {u,v,{k}',k}\text{ 여기서}\begin{cases} {i}'=i \times s_ {h}+u \\ {j}'=j \times s_ {w}+v \end{cases}$

  • $z_ {i,j,k}$는 합성곱 층($l$ 층)의 $k$ 특성 맵에서 $i$행, $j$열에 위치한 뉴런의 출력
  • $s_ {h}$와 $s_ {w}$는 수직과 수평 스트라이드이고 $f_ {h}$와 $f_ {w}$는 수용장의 높이와 너비, $f_ {{n}'}$는 이전 층($l-1$ 층)에 있는 특성 맵의 수
  • $x_ {{i}',{j}',{k}'}$는 $l-1$ 층의 ${i}'$행, ${j}'$열, ${k}'$ 특성 맵(혹은 $l-1$ 층이 입력층이면 ${k}'$ 채널)에 있는 뉴런의 출력
  • $b_ {k}$는 ($l$ 레이어에 있는) $k$ 특성 맵의 편향 (이를 $k$ 특성 맵의 전체 밝기를 조정하는 다이얼로 생각할 수 있다.)
  • $w_ {u,v,{k}',k}$는 $l$ 층의 $k$ 특성 맵에 있는 모든 뉴런과 (뉴런의 수용장에 연관된) $u$행, $v$열, 그리고 ${k}'$ 특성 맵에 위치한 입력 사이의 연결 가중치

풀링 층pooling layer

계산량과 메모리 사용량, (결과적으로 과대적합의 위험을 줄여주는) 파라미터 수를 줄이기 위해 입력 이미지의 부표본subsample(i.e. 축소본)을 만드는 것
합성곱 층에서와 마찬가지로 풀링 층의 각 뉴런은 이전 층의 작은 사각 영역의 수용장 안에 있는 뉴런의 출력과 연결 (이전과 동일하게 크기, 스트라이드, 패딩 유형을 지정)
하지만 풀링 뉴런은 가중치가 없다. (i.e. 최대나 평균 같은 합산 함수를 사용해 입력값을 더하는 것이 전부)

최대 풀링 층max pooling layer

각 수용장에서 가장 큰 입력값이 다음 층으로 전달되고 다른 값은 버려진다.
CNN에서 몇 개 층마다 최대 풀링 층을 추가하면 전체적으로 일정 수준의 이동 불변성translation invariance을 얻을 수 있다.
또한 최대 풀링은 회전과 확대, 축소에 대해 약간의 불변성invariance을 제공
(제한적이지만) 이와 같은 불변성은 분류 작업처럼 예측이 이런 작은 변화에서 영향을 받지 않는 경우 유용

평균 풀링 층average pooling layer

최댓값이 아닌 평균을 계산하는 것만 빼고 최대 풀링 층과 동일하게 작동
일반적으로 평균을 계산하면 최댓값을 계산하는 것보다 정보 손실이 적다.
반면 최대 풀링이 의미 없는 것은 모두 제거하고 가장 큰 특징만 유지하기에 다음 층이 조금 더 명확한 신호로 작업
또한 최대 풀링이 평균 풀링보다 강력한 이동 불변성을 제공하고 연산 비용이 조금 덜 든다.

깊이방향depthwise 풀링 층

최대 풀링과 평균 풀링을 공간 차원이 아니라 깊이 차원으로 수행
이를 통해 CNN이 다양한 특성에 대한 불변성을 학습 (회전, 두께, 밝기, 왜곡, 색상 등)

전역 평균 풀링 층global average pooling layer

각 특성 맵의 평균을 계산하는 것 (입력과 공간 방향 차원이 같은 커널을 사용하는 풀링 층과 같다.)
각 샘플의 특성 맵마다 하나의 숫자를 출력한다는 의미 (파괴적인 연산이지만 출력층에는 유용)


CNN 구조

전형적인 CNN 구조는 합성곱 층을 몇 개 쌓고 (각각 ReLU 층을 그 뒤에 놓고), 그다음에 풀링층을 쌓고, 그다음에 또 합성곱 층(+ReLU)을 몇 개 더 쌓고, 그다음에 다시 풀링 층을 쌓는 식
네트워크를 통과하여 진행할수록 이미지는 점점 작아지지만, 합성곱 층 때문에 일반적으로 점점 더 깊어진다. (i.e. 더 많은 특성 맵)
맨 위층에는 몇 개의 완전 연결 층(+ReLU)으로 구성된 일반적인 피드포워드 신경망feedfoward neural network이 추가되고 마지막 층 (e.g. 클래스 확률을 추정하기 위한 소프트맥스 층)에서 예측을 출력

LeNet-5

손글씨 숫자 인식(MNIST)에 널리 사용된 CNN 구조

AlexNet

처음으로 합성곱 층 위에 풀링 층을 쌓지 않고 바로 합성곱 층끼리 쌓았다.
훈련 이미지를 랜덤하게 여러 간격으로 이동하거나 수평으로 뒤집고 조명을 바꾸는 식으로 데이터 증식data augmentation을 수행
첫 번째와 두 번째 합성곱 층의 ReLU 단계 후에 바로 LRNlocal response normalization이라 부르는 경쟁적인 정규화 단계를 사용 (가장 강하게 활성화된 뉴런이 다른 특성 맵에 있는 같은 위치의 뉴런을 억제)
이는 특성 맵을 각기 특별하게 다른 것과 구분되게 하고, 더 넓은 시각에서 특징을 탐색하도록 만들어 결국 일반화 성능을 향상
LRN
$b_ {i}=a_ {i}(k+\alpha \sum_{j=j_ {low}}^{j_ {high}}{a_ {j}}^{2})^{-\beta }\text{ 여기서}\begin{cases} j_ {high}=\text{min}(i+\frac{r}{2},f_ {n}-1) \\ j_ {low}=\text{max}(0,i-\frac{r}{2}) \end{cases}$

  • $b_ {i}$는 $i$ 특성 맵, $u$행, $v$열에 위치한 뉴런의 정규화된 출력 (이 식에서는 현재의 행과 열에 위치한 뉴런만 고려하므로 $u$와 $v$는 없다.)
  • $a_ {i}$는 ReLU 단계를 지나고 정규화 단계는 거치기 전인 뉴런의 활성화 값
  • $k,\alpha,\beta,r$은 하이퍼파라미터이다. $k$는 편향, $r$은 깊이 반경depth radius
  • $f_ {n}$은 특성 맵의 수

GoogLeNet

인셉션 모듈inception module이라는 서브 네트워크를 가지고 있어서 GoogLeNet이 이전의 구조보다 훨씬 효과적으로 파라미터를 사용

VGGNet

2개 또는 3개의 합성곱 층 뒤에 풀링 층이 나오고 다시 2개 또는 3개의 합성곱 층과 풀링 층이 등장하는 식 (단순하고 고전적인 구조)
마지막 밀집 네트워크는 2개의 은닉층과 출력층
많은 개수의 필터를 사용하지만 3x3 필터만 사용

ResNet

잔차 네트워크residual network를 사용
신경망을 훈련시킬 때는 목적 함수 $h(x)$를 모델링하는 것이 목표
만약 입력 $x$를 네트워크 출력에 더한다면 (i.e. 스킵 연결을 추가하면) 네트워크는 $h(x)$ 대신 $f(x)=h(x)-x$를 학습 (잔차 학습residual learning)
일반적인 신경망을 초기화할 때는 가중치가 0에 가깝기 때문에 네트워크도 0에 가까운 값을 출력
스킵 연결을 추가하면 이 네트워크는 입력과 같은 값을 출력 (i.e. 초기에는 항등 함수identity function를 모델링)
목적 함수가 항등 함수에 가깝다면 (대부분의 경우에 해당) 훈련 속도가 매우 빨라질 것
또한 스킵 연결을 많이 추가하면 일부 층이 아직 학습되지 않았더라도 네트워크는 훈련을 시작할 수 있다. (스킵 연결 덕분에 입력 신호가 전체 네트워크에 손쉽게 영향을 미치게 된다.)
심층 잔차 네트워크는 스킵 연결을 가진 작은 신경망인 잔차 유닛residual unit(RU)을 쌓은 것
각 잔차 유닛은 배치 정규화(BN)와 ReLU, 3x3 커널을 사용하고 공간 정보를 유지하는 (스트라이드 1, "same" 패딩) 두 개의 합성곱 층

Xception(extreme inception)

GoogLeNet과 ResNet의 아이디어를 합쳤지만 인셉션 모듈은 깊이별 분리 합성곱 층depthwise separable convolution layer(간단히 분리 합성곱 층)이라는 특별한 층으로 대체
분리 합성곱 층은 공간 패턴과 채널 사이 패턴을 분리하여 모델링할 수 있다고 가정 (두 개의 부분으로 구성)
첫 번째 부분은 하나의 공간 필터를 각 입력 특성 맵에 적용
두 번째 부분에서는 채널 사이 패턴만 조사 (이 부분은 1x1 필터를 사용한 일반적인 합성곱 층)
분리 합성곱 층은 입력 채널마다 하나의 공간 필터만 가지기 때문에 입력층과 같이 채널이 너무 적은 층 다음에 사용하는 것을 피해야 한다.

SENetsqueeze-and-excitation network

인셉션 네트워크와 ResNet 같은 기존 구조를 확장 (SE-Inception, SE-ResNet)
원래 구조에 있는 모든 유닛(i.e. 모든 인셉션 모듈이나 모든 잔차 유닛)에 SE 블록block이라는 작은 신경망을 추가하여 성능을 향상
SE 블록이 추가된 부분의 유닛의 출력을 깊이 차원에 초점을 맞추어 분석
어떤 특성이 일반적으로 동시에 가장 크게 활성화되는지 학습한 정보를 사용하여 특성 맵을 보정 (관련 없는 특성 맵의 값을 줄인다.)
하나의 SE 블록은 전역 평균 풀링 층과 ReLU 활성화 함수를 사용하는 밀집 은닉층, 시그모이드 활성화 함수를 사용하는 밀집 출력 층으로 구성 (3개의 층)


분류와 위치 추정

사진에서 물체의 위치를 추정하는 것은 회귀 작업으로 나타낼 수 있다.
물체 주위의 바운딩 박스bounding box를 예측하는 일반적인 방법은 물체 중심의 수평, 수직 좌표와 높이, 너비를 예측 (i.e. 네 개의 숫자를 예측)
바운딩 박스에 널리 사용되는 지표는 IoUintersection over union (예측한 바운딩 박스와 타깃 바운딩 박스 사이에 중첩되는 영역을 전체 영역으로 나눈 것)


객체 탐지object detection

하나의 이미지에서 여러 물체를 분류하고 위치를 추정하는 작업
몇 년 전까지 사용되던 방법은 하나의 물체를 분류하고 위치를 찾는 분류기를 훈련한 다음 이미지를 슬라이딩하면서 모두 훑는 것
불필요한 바운딩 박스를 제거하기 위해 사후 처리가 필요 (NMSnon-max suppression)
NMS

  1. 먼저 CNN에 물체가 이미지에 존재하는지 확률을 추정하기 위해 존재여부objectness 출력을 추가한다. 시그모이드 활성화 함수를 사용하고 이진 크로스 엔트로피 손실을 사용해 훈련한다. 그다음 존재여부 점수가 어떤 임곗값 이하인 바운딩 박스를 모두 삭제
  2. 존재여부 점수가 가장 높은 바운딩 박스를 찾고 이 박스와 많이 중첩된 (e.g. IoU가 60% 이상인) 다른 바운딩 박스를 모두 제거
  3. 더는 제거할 바운딩 박스가 없을 때까지 2단계를 반복

완전 합성곱 신경망fully convolutional network(FCN)

CNN 맨 위의 밀집 층을 합성곱 층으로 바꾼다.
FCN은 합성곱 층(그리고 동일한 성질을 가진 풀링 층)만 가지므로 어떤 크기의 이미지에서도 훈련하고 실행할 수 있다. (대신 합성곱 층은 입력 채널마다 커널 가중치가 달라서 특정 개수의 채널을 기대)
FCN 방식은 이미지를 딱 한 번만 처리하기 때문에 효율적

YOLOyou only look once

사실 딱 한 번만 본다는 의미의 유명한 객체 탐지 방법 (매우 빠르고 정확하다.)


시맨틱 분할semantic segmentation

각 픽셀은 픽셀이 속한 객체의 클래스로 분류 (클래스가 같은 물체는 구별되지 않는다.)
이미지가 일반적인 CNN을 통과할 때 점진적으로 위치 정보를 잃기 때문에 해상도를 늘리는 업샘플링 층upsampling layer을 추가
이미지에 (0으로 채워진) 빈 행과 열을 삽입하여 늘린 다음 일반적인 합성곱을 수행하는 전치 합성곱 층transposed convolutional layer을 사용
아래쪽 층에서부터 스킵 연결을 추가하여 풀링 층에서 잃은 일부 공간 정보를 복원 (동일한 크기의 아래쪽 층의 출력을 더한다.)
원본 이미지 크기보다 더 크게 업샘플링을 하는 것도 가능 (이미지의 해상도를 증가시키는 데 사용할 수 있으며 이를 초해상도super-resolution라고 부른다.)
인스턴스 분할instance segmentation은 시맨틱 분할과 비슷하지만 동일한 클래스 물체를 하나의 덩어리로 합치는 것이 아니라 각 물체를 구분하여 표시


실습코드링크 : CNN

'인공지능 > 핸즈온 머신러닝' 카테고리의 다른 글

순환 신경망과 어텐션  (0) 2021.01.16
순환 신경망과 합성곱 신경망  (0) 2021.01.07
텐서플로 데이터 API  (0) 2020.12.19
자동 미분  (0) 2020.12.10
텐서플로란  (0) 2020.12.08
Comments