(2022-07-20) 현재에도 많이 사용하고 있는 방법인 CSP에 대한 논문이다 

CSP는 계속돼서 사용되어 지금은 Modified CSPv6까지 나왔다 

개인적인 생각으로는 기존 residual shortcut을 몇 개의(2~3개의) convolution마다 진행했다면 CSP shortcut은 그런 residual shortcut 몇 개마다 진행한다. 

 

Abstract 

  • CSP : Cross Stage Partial Network 
  • 기존의 CNN들의 computation이 많이 소모되는 이유는 네트워크 최적화 내의 중복 기울기 정보(Duplicated gradient information) 때문이다 
  • CSPNet은 시작과 끝에서 feature map을 통합하여 기울기의 variability를 respect 한다
  • 결과적으로, ImageNet dataset에서 동등한 정확도로 20% computations를 감소시켰다 
  • CSPNet은 쉽게 적용할 수 있고 기존 shortcut 방식들을 대체할 수 있는 일반적인 구조이다. 
    - transition layer : BN + 1x1 conv + 2x2 avg pooling 
    - growth rate : Dense Block을 지날 때마다 증가되는 feature map의 사이즈 

Dense connection

 

1. Introduction 

  • Neural Network가 더 깊고 넓어질 수 록 더 강력함을 보여줬다
  • 그러나 이런 확장 구조는 매우 많은 computations를 필요로 한다 
  • 이전의 몇몇 접근법에서는 모바일 GPU를 기준으로 설계되었다 ( depth-wise separable convolution) 
    depth-wise separable conv는 ASIC(Application-Specific Integrated Circuit)과 호환되지 않는다. 
  • 이 제안의 초점은 기본 layer의 featuer map을 두 부분으로 나누어 제안하는 cross-stage hierarchy에 따라 mergeing 한다 
  • 중요 개념은 gradient의 흐름을 다른 두 개의 네트워크 경로에 나누는 것이다 
  • CSPNet에서 주로 다루는 문제는 3가지이다 
    1. CNN의 학습능력(learning ability) 강화 
        - 경량화하면서도 충분한 정확도를 유지 
        - ResNet, ResNeXt, DenseNet등에 쉽게 적용 가능하고 computation effort를 10~20%가량 줄이지만 정확도는 거의 떨어지지 않거나 outperform 
    2. Removing computational bottlenecks 
        - 너무 많은 computational bottleneck은 inference process에서 더 많은 cycles이 필요하게 된다 
        - utilization을 더 효율적으로 높이고 필요 없는 에너지 소모를 줄인다 ( 저자 중에 College of Artificial Intelligence and Green Energy National Chiao Tung Univ가 있는데 친환경에너지 쪽이어서 그런지 이런 이야기가 좀 있다)
        - YOLOv3 기반 모델에서 computational bottleneck을 80%가량 감소시킨다 
    3. Reducing memory costs 
        - DRAN은 비싸고 크기도 큰데 DRAM사용량을 줄이면 ASIC의 비용을 감소시킬 수 있을 것이다 
        - 메모리 사용량을 줄이기 위해 cross-channel pooling을 이용 - feature pyramid 생성 과정에서 feature map의 compress를 수행한다 
        - PeleeNet에서 feature pyramids를 생성할 때 memory 사용량을 75% 감소할 수 있었다 
  • CSPNet은 CNN에서 학습 용량을 증가시킬 수 있고 작은 모델에서 더 좋은 정확도를 얻을 수 있다. 
    GTX 1080ti에서 109 FPS, 50%의 AP50을 얻었다 
    - 메모리 대역폭을 줄일 수 있었고 Nvidia jetson TX2에서 42% AP50, 49 FPS를 얻었다 

 

2. Related work 

  • CNN architectures design 
    ResNeXt 저자가 width, depth의 channel보다 cardinality(gradient의 다양성)를 늘리는 게 더 효과적일 수 있다 했다
    a. DenseNet 
        - 출력의 결과물을 그대로 concatenates 하여 다음 레이어의 인풋으로 사용했다 이러한 방식은 cardinality를 극대화할 수 있다
    b. SparseNet
        - dense connection은 exponentially spaced connection을 하여 parameter의 utilization을 효과적으로 개선할 수 있다 또한 높은 cardinality와 sparse connection이 gradient combination의 concept으로 왜 네트워크의 학습능력을 향상할 수 있는지 이유를 설명하고 partial ResNet(PRN)을 개발했다 

 

3. Method 

  • Cross Stage Partial Network 
    • DenseNet 
      아래 수식을 보면 DenseNet의 경우 역전파에서  $$ g_0, g_1,... g_{k-1} $$ 가 중복되어 사용됨을 볼 수 있다 
      이런 중복은 다른 레이어에서 같은 값을 중복해서 사용함을 의미한다 

 DenseNet에서의 순전파와 역전파 

 

  • 저자가 제안하는 CSPDenseNet은 입력 채널을 두 개의 파트로 분할한다 
    $$ x_0 = [x_0`, x_0``] $$ 두 개로 나누어진 파트는 스테이지의 마지막에서 직접적으로 연결된다 그리고 $$ x_0``$$ 는 dense block을 통과한다 
  • Dense layers의 출력 $$ [x_0``, x_1, ..., x_k]$$는 바로 transition layer를 통과하고 transition layer의 output $$x_t$$는 $$x_0``$$와 결합되고 바로 다른 transition layer를 통과하여 $$x_U$$를 생성한다. 

  • 위 공식을 보면 dense layer에서 들어오는 gradient 가 별도로 합쳐져 있음을 볼 수 있다 (gt) 
    또한 feature map x0`이 직접적으로 dense layers를 통과하지 않고 분리되어 통합된다 
    가중치 업데이트를 보면 두 갈래의 기울기 정보가 서로 중복되지 않는다. 
  • CSPDenseNet은 DenseNet의 feature reuse장점은 유지하면서 동시에 gradient flow를 truncation 하여 중복되는 gradient info의 과도한 양을 방지한다 
  • Partial Dense Blcok 
    - Incerease gradient path : feature map복사를 사용하여 gradient paths가 doubled 되는 것을 완화 
    - balance computations of each layer : 일반적으로 base layer의 채널의 개수는 growth rate보다 크다(input C 64, growth rate 32, 64,...) CSP는 base layer의 반절만 사용하기 때문에 계산 병목 현상의 절반 가까이를 효과적으로 해결할 수 있다 
    - reduce memory traffic : 총 m개의 dense layer가 있을 때
    $$ w\, \times \,h\, \times \, c,\, grouth\, rate\, :\, d, total \,m\, dense\, layers$$
    dense layer의 CIO(Convolution Input, Output)는
    $$ (c \times m ) + ((m^2 + m) \times d)/2 $$
    이고 partial dense block의 CIO는
    $$((c \times m)+(m^2 +m) \times d)/2$$
    일반적으로 m과 d는 C보다 매우 작기 때문에 partial block이 반절 가까이 네트워크 메모리 traffic을 절약할 수 있다 

 

 

  • 저자는 3가지 다른 방식의 Feature fusion 방식을 소개한다 
    1.  CSPDenseNet에 사용한 방식 두 갈래로 나누어진 경로에 하나는 Dense Block과 Transition layer를 지나고 그 뒤 두 갈래를 concatenate 한 후 다시 transition layer를 통과한다
    2. Fusion First는 두 갈래 중 하는 Dense Block을 통과하고 그 뒤 두 갈래를 합친 후 transition layer를 통과한다
    3. Fusion Last는 CSPDenseNet와 다르게 마지막에 두 갈래를 합치기만 하고 transition layer을 다시 지나가지 않는다
  • 위의 Fusion First와 Fusion Last는 다른 영향을 보여주는데 
    Fusion First는 두 갈래로 나뉜 기울기를 먼저 합친 다음 transition layer로 들어가기 때문에 많은 양의 기울기가 재사용된다 
    Fusion Last는 한 방향만 transition layer를 지나가고 그 뒤 두 갈래를 합치기 때문에 기울기의 흐름이 잘리기 때문에 기울기 정보가 재사용되지 않는다 
  • Fusion first는 실험 결과 Imagenet 데이터셋에서 computations는 효과적으로 감소되었고 정확도는 0.1% 밖에 감소되지 않았다
    Fusion Last 또한 computations는 감소되었지만 정확도가 1.5% 감소되었다 

일반 CNN에서의 CIO 계산 (출처 : HarDNet: A Low Memory Traffic Network )

  • 가정 1 
    - c 입력 채널 : 32 
    - m 몇개의 Dense layer : 3 
    - g growth rate : 32 
    $$ Dense \, layer :  (32 \times 3) + ((3^2 + 3) \times 32)/2 = (96 + (12 \times 32)/2 = 96 + 384 / 2 = 288 $$
    $$ partial \, dense \, block :  ((32 \times 3) + ((3^2 + 3) \times 32))/2 = ((96 + (12 \times 32))/2 = (96 + 384) / 2 =  240 $$
  • 가정 2 
    - c  : 4
    - m : 3 
    - g : 62
    $$ Dense \, layer :  (4 \times 3) + ((3^2 + 3) \times 64)/2 = (12 + (12 \times 64)/2 = 12 + 768 / 2 = 396 $$
    $$ partial \, dense \, block :  ((4 \times 3) + ((3^2 + 3) \times 64))/2 = ((12 + (12 \times 64))/2 = (12 + 768) / 2 =  390 $$
    - 채널과 growth rate의 차이가 매우 커야 Dense layer의 CIO가 더 커진다

ResNeXt에서 bottleneck 을 제거하고 transition layer을 사용하여 병목을 줄였다

 

4. Experiments 

  • Computational Bottleneck 
    기존의 ResXBlock에서 bottleneck layers를 제거하여 채널의 크기 변경을 감소시킴으로 인해 22%가량 computations를 감소시켰다 

PeleeNet에서 병목구간을 80% 가량 감소시켰다
ResNeXt에서 bottleneck layer를 제거함으로써 중간중간 아웃풋 채널의 개수가 일정하게 유지된다 ( computations 22% 감소 )

논문 : https://arxiv.org/pdf/1911.11929.pdf

 

기존 깊은 Convolution network의 vanishing gradient 문제는 Residual short cut을 통해 극복하였고 이제는 어떻게 하면 더 적은 파라미터로 좋은 성능을 낼 수 있는가가 되었다 

이후로는 어떻게 이전 레이어의 정보를 다음 레이어에 효율적으로 전달할 수 있는가? 가 주된 관심사가 되었다 

 

1. Abstract 

  • Cnn은 객체 인식 머신러닝에서 뛰어난 성과를 보였고 CNN에서 중요한 점은 네트워크의 깊이이다 LeNet부터 시작하여 Highway Networks, Residual Network들은 depth가 100이 넘게 레이어를 쌓았다 
  • CNN에서 네트워크가 점점 깊어지면서 생긴 문제점은 vanishing gradient와 washout이다. ResNet과 Highway Network는 Identity connection을 통하여 하나의 레이어에서 다음 레이어로 signal을 연결한다 
  • Stochastic depth shortens ResNet은 더 좋은 gradient flow를 위하여 학습중에 레이어를 무작위로 삭제하여 ResNet을 단축한다 
  • FractalNets은 네트워크에서 하나의 인풋에 대하여 여러 short paths로 나누어  Convolution을 적용하여 Residual을 학습하는 것과 비슷하게 네트워크를 깊게 쌓을 수 있
  • 위에서 설명한 네트워크들은 다양한 네트워크 구조와 트레이닝 절차에 대하여 다양한 접근법을 제시하지만 모두 같은 요점이 있다 - short path로 이전 레이어와 이후 레이어를 연결한다는 점이다 
  • 저자의 제안은 위에서 제안한 방식들에서 좋은 점만 빼서 네트워크안 레이어 사이의 최대의 정보 흐름을 보장한다 
    • 직접적으로 서로 다른 레이어를 연결한다 (feature map size를 amtching 한다 )
    • Feed-forward 특성을 유지하기 위해 각 레이어는 모든 이전 레이어에서 추가 입력을 얻고 모든 후속 레이어가 가진 feature-map을 전달한다 
    • ResNet과는 다르게 DenseNet은 Short cut을 summation하지 않고 concatenation 한다 
  • 이 연결패턴의 직관적이지 않는 부분은 기존 convolution net보다 더 적은 파라미터가 필요하다는 것이다 - 중복된 feature map을 다시 학습할 필요가 없기 때문에 
  • 각 계층은 이전 계층에서 상태를 읽고 후속 계층에 write 한다
    상태를 변경도 하지만 보존해야 하는 정보도 전달한다 
  • DenseNet은 네트워크에 추가되는 정보와 이전 레이어의 정보를 명시적으로 구분한다 
  • DenseNet은 매우 narrow 하다 ( 레이어당 12개의 필터 )
  • 각각의 레이어는 loss function과 원본 입력 signal의 gradients에 직접적으로 접근할 수 있다 
    또한 dense connection이 regularizing 효과도 있는 것을 관찰했다 
    overfitting을 감소시키고 학습 셋의 사이즈를 작게 가져갈 수 있다 

2. DenseNet

  • 기존의 ResNet의 공식은 \( x_L\) = \(H_L(x_L - 1) + x_L-_1) \)  이였다 
  • ResNet의 장점은 identity function을 통해 다음의 레이어에 이전 레이어의 가중치가 직접적으로 흐를 수 있다는 것이었다 하지만 여기서 identity function은 아웃풋 \(H_L\)은 summation울 포함하게 되는데 이는 정보의 흐름을 방해할 수 있다 
  • Dense Connectivity
  • 1) 모든 이후 레이어에 이전의 모든 레이어를 직접적으로 연결한다 

  • 2) \(x_L = H_L([x_0, x_1, ... , X_L-_1]\) 
  • 위의 수식은 x들끼리의 feature map의 size가 같지 않으면 실행될 수 없다 하지만 convolution network에서 필수적인 부분은 downsampling(pooling 레이어)이다. 
  • pooling을 가능하게 하기 위해 densely 연결된 dense block을 나눈다 ( 위 사진에서 Dense Block 1, 2, 3 ) 
  • 여기서 Dense Block 사이에 들어가는 Conv, Pooling을 transition layer라고 부르겠다 한다 
  • Batch norm과 1x1 conv, 2x2 avg pooling을 진행한다 

 

      • Growth rate 
      • 저자는 DenseNet에서 매우 narrow 한 레이어 구조를 갖기 위해 Growth rate라는 하이퍼파라미터를 추가하였다 
      • 해당 파라미터는 하나의 Dense Block을 지날 때마다 증가되는 feature map의 사이즈를 말한다 
      • 만약 \(H_L \) 이 k개의 feature map을 만든다면 다음 레이어는 \(k_0 + k x (L-1)\)의 input feature map을 가진다 

 

  • Bottleneck layers 
  • 각 레이어는 k개의 output feature-map을 가지지만 인풋은 더 크게 가질 수 있다 
  • 3x3 conv 이전에 1x1 conv를 이용하여 인풋 feature-maps의 개수를 줄일 수 있다 이는 또한 computational efficiency를 얻을 수 있다 - 이는 특히 narrow 한 DenseNet에 이점이 많다 
  • BN - ReLu - Conv(1x1) - BN - ReLu - Conv(3x3) 
  • 저자의 실험에 기반하여 각 1x1 conv가 4k의 feature-map을 생성하도록 한다 

 

  • Compression
  • 모델의 compactness(소형화)를 더 향상하기 위해 transition layer에서 feature-map의 개수를 감소시킨다 
  • Transition layer는 \(\theta m\)개의 output feature-map을 갖는다 0 < \(\theta\) < 1 
    DenseNet-C는 \(\theta\)를 0.5로 하였다 

 

  • Implementation Details 
  • 3x3 Conv는 입력에 대해 동일한 크기의 feature-maps를 유지하기 위해 zero padding 추가 
  • DenseBlock 사이에 transition layer추가 ( 1x1 conv, 2x2 avg pooling)
  • 마지막 레이어에는 global avg pooling 사용 
  • 각 3개의 Dense Block은 32x32, 16x16, 8x8의 feature map이 반복 
  • 기본 DenseNet 설정은 {L=40, k=12}, {L=100, k=12}, {L=100, k=24}
  • DenseNet-BC(B=bottleneck, C=Compression)는 {L=100, k=12}, {L=250, k=24}, {L=190, k=40}
  • ImageNet에서는 입력 이미지 224x224에 대하여 맨 처음 conv를 7x7 kernel에 stride 2 적용 

3. Experiments

  • 아래 그림에서 ResNet은 augmentation을 한것과 안한것의 정답률 차이가 컸는데 DenseNet에서는 작았다 이는 DenseNet이 보다 더 overfitting에 강하다는 것을 보여준다 
  • 파라미터 개수도 이전보다 작고 정답률이 향상됨을 볼 수 있다 

+는 augmentation한 것

  • Training 
  • 모든 데이터셋에 SGD 사용 
  • 초기 learning rate는 0.1로 하고 epochs가 50%, 75% 진행됐을 때 10씩 나눔 
  • ImageNet은 총 90 epochs에서 30, 60 때 10배씩 감소 
  • Weight decay 0.0001 이용, Nesterov momentum 0.9 사용 dampening 없이 
  • 다음에서 소개된 가중치 초기화 방식도 사용  ( K. He, X. Zhang, S. Ren, and J. Sun. Delving deep into rectifiers: Surpassing human-level performance on imagenet classification. In ICCV, 2015.)
  • Dropout 0.2 사용 ( 맨 처음 conv에서는 안 함)

4. Discussion 

  • 기존 ResNet과의 차이점은 단지 결합과 더함의 차이이다 하지만 이 작은 수정이 두 아키텍처의 동작을 크게 다르게 했다 
  • Input 결합의 직접적인 결과로 DenseNet은 이후의 모든 레이어의 feature map에 직접적으로 접근할 수 있었다 
  • 이는 네트워크 전체에서 feature reuse를 장려하고 더 딱 맞는(compact) 모델로 만들 수 있게 한다 
  • 모든 히든 레이어마다 classifier를 추가하는 Deeply-supervised Net과 비슷하고 차이는 하나의 loss function이 모든 레이어에 공유되므로 덜 복잡하다는 점이다 
  • 학습 중간에 무작위적으로 레이어를 삭제하는 stochastic depth regularization을 DenseNet에 이용하면 insight를 제공할 수 있을 거라 말한다 

  • 여기서 재밌는 그래프는 위의 feature reuse 그래프이다 
  • 실제로 모든 레이어가 이전 레이어의 feature-map에 접근하는지 알아보기 위해 레이어 s 와의 연결에 할당된 가중치 평균을 계산하였다 
  • 두 번째 세 번째 Dense block을 보면 맨 처음 source layer에서 뿌려지는 가중치가 일관되게 최소 가중치를 할당하는 것을 볼 수 있다 이는 transition layer에 의해 압축이 되었다는 것을 알 수 있다. 
  • 앞서 언급한 \(\theta\)에 의해 압축이 잘 됐다는 것을 알 수 있다 
  • 마지막 classification 레이어를 보면 Dense block 내부의 가중치를 전부 사용하지만 마지막 쪽 feature map에 집중하는 거로 보아 네트워크 후반에 생성된 더 높은 수준의 feature에 집중함을 알 수 있다

 

 

+ Recent posts