Convolutional Neural Networks
목표
  - Problem
    
      - So far our classifiers don’t respect the spatial structure of images!
- 지금 까지는 공간적으로 연관이 있는 이미지의 특성을 무시하고, 한줄 벡터로 펴서 학습시켰다. (fully connected neural network)
- 이미지의 특성(주변 픽셀이 비슷함)을 최대한 활용하고 싶다.
 
- Solution
    
      - Define new computational nodes that operate on images!
- $W$ 에 특정한 구조를 부여하여 공간적인 의존성을 반영할 수 있도록 하자.
 
- 지금까지 배운 것 : Fully-Connected Layers, Activation Function
- 오늘 배울 것 : Convolution Layers, Pooling Layers, Normalization
Convolution Layer
Comparison
  - Fully-Connected Layer- 
      - 계산 : 주어진 이미지 하나의 전체 부분과 내적
- “MLP” learns Bank of whole image templates
 
- Convolution Layer- 
      - 계산 : 필터를 a small chunk of the image 에 대해서만 내적
- convolve the filter with the image, i.e. “slide over the image spatially, computing dot products”
- “First-layer conv filter” learns local image templates
        
          - ex) AlexNet : Often learns oriented edges (엣지), opposing colors (보색)
 
 
Summary
  - Input
    
      - $N \times C_{in} \times H \times W$ Batch of images (preserve spatial structure)
 
- Convolution Layer
    
      - Hyperparameters
        
          - Kernel size : $K_H \times K_W$
- Number filters : $C_{out}$
- Padding : $P$
- Stride : $S$
 
- Weight matrix : $C_{out} \times C_{in} \times K_H \times K_W$
        
          - $C_{out}$ filters, each $C_{in} \times K_H \times K_W$
 
- Bias vector : $C_{out}$
 
- Output
    
      - $N \times C_{out} \times H\prime \times W\prime$ Batch of outputs
        
          - $C_{out}$ activation maps, each $1 \times H\prime \times W\prime$
- $H\prime = (H - K + 2P)/S + 1$
- $W\prime = (W - K + 2P)/S + 1$
 
- Parameters per filter : $C_{in} \times K_H \times K_W + 1$
- Number of learnable parameters : $C_{out} \times (C_{in} \times K_H \times K_W + 1)$
- Number of multiply-add operations : $(C_{in} \times K_H \times K_W)\times(C_{out} \times H\prime \times W\prime)$
 
- Common settings
A closer look at spatial dimensions
  - In general
    
      - Input : $W$, Filter : $K$
- Output : $W - K + 1$
- Problem : Feature maps “shrink” with each layer!
- Solution : padding (Add zeros around input)
 
- Padding- 
      - Input : $W$, Filter : $K$, Padding : $P$
- Output : $W - K + 1 + 2P$
- 보통 $P = (K -1) / 2$ 로 하여, input/output size 가 같도록 설정한다.
        
          - Receptive Fields- 
              - 생물학적 용어 : 시신경 하나가 볼 수 있는 바깥 영역
- Output의 B영역이 Input의 A영역을 보고있다. A는 B의 receptive field
                
                  - receptive field in the input
- receptive field in the previous layer
 
- $L$ 번째 layer 의 receptive filed size : $1 + L * (K - 1)$
 
 
- Problem : For large images we need many layers for each output to “see” the whole image
- Solution : Downsample inside the network
 
- Stride(Downsample : 뛰는 간격을 넓히기)- 
      - Input : $W$, Filter : $K$, Padding : $P$, Stride : $S$
- Output : $(W - K + 2P)/S + 1$
 
Stacking Convolutions
  - 주의 : convolution layer 를 여러 개 쌓기만 하면 linear transform 을 여러 번 하는 것 밖에 안된다. non-linear 연산을 끼워넣어야 한다.
- Example : Input -> Conv -> ReLU -> First hidden layer -> …
Other types of convolution
  - 1D Convolution
    
      - Input : $C_{in} \times W$
- Weights : $C_{out} \times C_{in} \times K$
 
- 2D Convolution (지금까지 살펴본 기본 ConvNet)
    
      - Input : $C_{in} \times H \times W$
- Weights : $C_{out} \times C_{in} \times K \times K$
 
- 3D Convolution
    
      - Input : $C_{in} \times H \times W \times D$
- Weights : $C_{out} \times C_{in} \times K \times K \times K$
 
Pooling Layer
  - Another way to downsample
- Hyperparameters
    
      - Kernel Size
- Stride
- Pooling function
 
- Max Pooling
    
      - Introduces invariance (불변성) to small spatial shifts
        
          - 이미지 자체가 공간적으로 조금 움직여도 크게 변하지 않는다는 특성이 있다.
 
- No learnable parameters
 
Summary
  - Input
    
      - $C_{in} \times H \times W$
 
- Pooling layer
    
      - Hyperparameters
        
          - Kernel size : $K$
- Stride : $S$
- Pooling function (max, avg)
 
 
- Output
    
      - $C \times H\prime \times W\prime$
        
          - $H\prime = (H - K)/S + 1$
- $W\prime = (W - K)/S + 1$
 
- Number of learnable parameters : None!
 
- Common settings
Convolutional Networks
  - Classic architecture : [Conv, ReLU, Poll] X N, flatten, [FC, ReLU] X N, FC
    
      - Example : LeNet-5
- Spatial size decreases (using pooling or strided conv) (공간적인 사이즈가 줄어든다.)
- Number of channels increases (total “volume” is preserved!)
 
Batch Normalization
  - Problem : Deep Networks very hard to train
    
      - $L(W)$ 가 non-convex in $W$
- $W$ 에 대한 고차원 (LeNet-5 도 100만 차원 이상)
- vanishing gradient: Layer 가 많아질수록 $L$ 에 대한 앞쪽 layer weight 들의 gradient 가 0 에 너무 가까워짐..
 
- Normalization- 
      - ${\hat{x}}{i,j} = \frac{x{i,j} - \mu_{j}}{\sqrt{\sigma_{j}^{2} + \epsilon}}$
- Normalization 후에 학습이 좀 더 빨리 된다는 것을 발견
- 보통 Batch Normalization, Layer Normalization 등..
 
- Batch Normalization- 
      - imagine (deep) neural network
- let’s focus on one layer and its input
        
          - input : $X \in R^{N \times D}$
            
              - N : Batch size
- D : Dimension
 
- layer : linear
 
- 문제 의식 : internal covariance shift
          - Batch 마다 x 의 분포가 같지 않은 현상
            
              - Batch마다 Mean vector 랑 covariance 가 달라짐
 
- 학습 과정에서 batch 마다 activation 값들의 분포가 다르다.
            
              - 수학적으로 증명할 수는 없지만, 이럴수록 gradient 계산이 잘 안되고 loss 가 잘 안 떨어지더라(decrease)
- 이것이 weight 의 학습을 방해하는것 아닌가
 
 
- 방법
        
          - Input 이 들어오면 바로 layer 에 넣는 것이 아니라 normalization 후 넣는다.
- Input : $X \in R^{N \times D}$
- $\mu_{j} = \frac{1}{N} \sum_{i=1}^{N} x_{i,j}$
            
              - Per-channel mean (변수별 평균), shape is $D$
 
- $\sigma_{j}^{2} = \frac{1}{N} \sum_{i=1}^{N} (x_{i,j} - \mu_{j})^2$
            
              - Per-channel std (변수별 표준편차), shape is $D$
 
- $\hat{x}{i,j} = \frac{x{i,j} - \mu_{j}}{\sqrt{\sigma_{j}^{2} + \epsilon}}$
            
              - Normalized $x$, shape is $N \times D$
- 분산이 0이 되는 것을 막기 위해서 $\epsilon$ 을 더함
 
- Problem : input이 zero-mean, unit variance 인 것이 어려운 제약조건 아닌가?
            
              - $\hat{X} \cdot \gamma + \beta$ 를 하고, $\gamma, \beta$ 는 learnable 하게 만들면 된다.
- Learnable scale and shift parameters : $\gamma, \beta \in R^{D}$
- Learning $\gamma = \sigma, \beta = \mu$ will recover the identity function!
- 따라서, $y_{i,j} = \gamma_{j} {\hat{x}}{i,j} + \beta{j}$
                
                  - Output, shape is $N \times D$
 
 
 
 
- Batch Normalization : Test-Time
    
      - Problem : Estimates depend on minibatch; can’t do this at test-time!
- test time 때에는 batch 의 개념이 모호하기 때문에 training time 때 저장해둔 mean 과 std 를 사용한다. (저장하는 방식은 다양)
        
          - $\mu_{j}$ : (Running) average of values seen during training
- $\sigma_{j}^{2}$ : (Running) average of values seen during training
 
- 표준화시키는 작업이 linear operation 이기 때문에, 이전 FC 나 Conv 레이어도 linear operation 이니까 둘을 합쳐서 저장해주면, test time 때 계산 부담이 추가적으로 생기지는 않을 것이다.
 
- Batch Normalization for ConvNets
    
      - Problem : 그림 구조를 보존하는 batch normalization 은 없을까?
- Batch Normalization for fully-connected networks
        
          - $x : N \times D$
- $\mu, \sigma : 1 \times D$
- $\gamma, \beta : 1 \times D$
- $y = \gamma (x - \mu) / \sigma + \beta$
 
- Batch Normalization for convolutional networks (Spatial Batchnorm, BatchNorm2D)
        
          - $x : N \times C \times H \times W$
- $\mu, \sigma : 1 \times C \times 1 \times 1$
- $\gamma, \beta : 1 \times C \times 1 \times 1$
- $y = \gamma (x - \mu) / \sigma + \beta$
 
 
- Batch Normalization 의 위치
    
      - Usually inserted after Fully Connected or Convolutional layers, and before nonlinearity.
 
- Batch Normalization 논문에서 실험으로 밝힌 제한적인 사실 (이론 X)
    
      - 장점
        
          - Inception 과 같은 Deep networks 도 더 훈련이 빠르고 쉽게 만들어준다.
- learning rate (step size)를 크게 하는 것이 가능해져서 더 빨리 수렴하도록 한다.
- 초기값 세팅에서 덜 민감해졌다. (robust to initialization)
- 일종의 훈련을 방해하는 요소가 될 수 있다. (acts as regularization)
- test time 때 추가적으로 만들어지는 계산노드도 없다.
 
- 단점 (한계)
        
          - 이론적으로 밝히지 못함 (Not well-understood theoretically (yet))
- batch normalization 의 로직이 training 때와 test 때 달라서, neural network 를 짤 때, 많은 버그의 소스(원인)가 될 수 있다.
 
 
- Layer Normalization- 
      - Batch Normalization for fully-connected networks
        
          - 방법 : each dimension 별로, sample 에 대해서 mean과 std로 표준화시킨 것
- $x : N \times D$
- $\mu, \sigma : 1 \times D$
- $\gamma, \beta : 1 \times D$
- $y = \gamma (x - \mu) / \sigma + \beta$
 
- Layer Normalization for fully-connected networks
        
          - 방법 : 각 sample 에 대해서, dimenstion 별 mean과 std로 표준화시킨 것
            
              - Same behavior at train and test!
- Used in RNNs, Transformers
 
- $x : N \times D$
- $\mu, \sigma : N \times 1$
- $\gamma, \beta : N \times 1$
- $y = \gamma (x - \mu) / \sigma + \beta$
 
 
- Instance Normalization- 
      - Batch Normalization for convolutional networks
        
          - $x : N \times C \times H \times W$
- $\mu, \sigma : 1 \times C \times 1 \times 1$
- $\gamma, \beta : 1 \times C \times 1 \times 1$
- $y = \gamma (x - \mu) / \sigma + \beta$
 
- Instance Normalization for convolutional networks
        
          - $x : N \times C \times H \times W$
- $\mu, \sigma : N \times C \times 1 \times 1$
- $\gamma, \beta : N \times C \times 1 \times 1$
- $y = \gamma (x - \mu) / \sigma + \beta$
 
 
- Group Normalization- 
      - 각 sample 에 대해서, color channel 몇 개씩 모아서 mean, std 를 구하는 것
 
Self-check
  - 다음 문제들을 단답형 (풀이 필요 없음) 또는 서술형 (수기풀이 필요)으로 답하세요. 2번과 3번만 서술형입니다.
- 문제 출처는 Coursera의 Convolutional Neural Networks (in Deep Learning Specialization led by Andrew Ng)의 1주차 퀴즈입니다.
- (혼동 주의) 아래 문제들은 우리 수업과 달리 image tensor를 (가로픽셀수) * (세로픽셀수) * (채널 수)로 표현하고 있습니다. 수업에서는 (채널 수) * (세로픽셀수) * (가로픽셀수)를 사용중입니다.
문제1 (단답형)

  - 답 : Detect vertical edges
문제2 (서술형)

  - 답 : (3 X 300 X 300 + 1)*100 = 27,000,100
문제3 (서술형)

  - 답 : 100*(3 X 5 X 5 + 1) = 7600
문제4 (단답형)

문제5 (단답형)

문제6 (단답형)

문제7 (단답형)

문제8 (단답형)
