개인적으로 읽고 쓰는 공부용 리뷰입니다.

틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다.

paper overview

  • 논문링크 : paper link
  • CVPR 2022
  • convnet + transfomer
  • cnn과 transformer의 장점을 적절히 섞으면서 성능향상을 이끌어 냄

Abstract

transformer가 대부분의 downstream task에서 sota찍고 날라다니지만 CNN 아직 죽지않았다. 심폐소생술 가능하다. 보여주겠다. 

1. Introduction

  • CNN은 sliding window” 전략을 택한다.
  • VIT의 주요한 포인트는 큰 데이터와 큰 모델의 "scaling"
  • 이 둘을 잘 조합한게 swin transformer
  • convolution의 본질은 여전히 살아있으며 아직도 중요하다.
The essence of convolution is not becoming irrelevant; rather, it remains much desired and has never faded.
  • 이를 증명하기 위해서 resnet에 transfomer의 특징을 하나씩 적용해가며 성능을 끌어올린다.
How do design decisions in Transformers impact ConvNets’ performance? 

2. Modernizing a ConvNet: a Roadmap

사실 상 이 그림이 이 논문의 전부를 표현함. 일단 x축은 imagenet 성능을 나타내고 y축은 적용한 방법이다. 남색 막대는 resnet50의 성능이고 회색바는 resnet200의 성능이다. 별은 resnet50의 GFLOPs를 의미한다. 

조금 더 부연설명하자면 vanilla resnet50의 성능은 78.8이고 여기에 stage ratio 를 적용했을 때, 79.4로 성능향상 0.4GFLOPs 증가인 것이다. 거기에 추가로 patchify stem을 적용했을 때 추가로 79.5까지 성능이 증가된 것이다. 빗금 쳐진 Kernel size 9, 11은 채택되지 않은 방법을 의미한다. 


논문의 나머지는 이제부터 78.8에서 82.0까지  성능을 끌어올린 각각의 세부 기법들에 대해서 설명한다.

 

2.1. Training Techniques

사실 resnet이 처음 나왔을 때에 비해 현재는 많은 학습 방법들이 생겨났다. optimizer, scheduler, augmentation 등등.

그렇기 때문에 초기 resnet에 단순히 최신 학습 기법들만 적용해도 성능은 향상할 것이다. 

왼쪽 table처럼 학습을 했을 때 모델은 기존 성능은 76.1에서 78.8로 향상한다. ConvNeXt모델은 여기서부터 시작한다.

2.2. Macro Design

Changing stage compute ratio : resnet의 기존 convbolck 구조 (3,4,6,3)에서 swin transformer처럼 (3,3,9,3)으로 바꿨더니 79.4로 성능 향상. ( Swin-T, on the other hand, followed the same principle but with a slightly different stage compute ratio of 1:1:3:1)

Changing stem to “Patchify” : Resnet은 처음에 7by7 conv with s=2 적용하고 maxpool 때려서 초기에 1/4로 featuremap 크기를 줄이는데 이 방식을 transformer의 patch 처럼 바꿔서 적용한다. ( We replace the ResNet-style stem cell with a patchify layer implemented using a 4×4, stride 4 convolutional layer. ) 성능은 79.5로 향상


2.3. ResNeXt-ify

  • Resnet을 ResNeXt처럼 변경. depthwise conv와 3x3 group conv 적용. ( ResNeXt employs grouped convolution for the 3×3 conv layer in a bottleneck block. Depthwise conv is similar to the weighted sum operation in self-attention. )
  • SwinTransformer와 같은 width를 가지도록 채널을 96으로 증가 ( we increase the network width to the same number of channels as Swin-T’s (from 64 to 96). ) 
  • 성능은 80.5로 향상

2.4. Inverted Bottleneck


(a) is a ResNeXt block
(b) is an inverted bottleneck block
  • Transformer block is that it creates an inverted bottleneck. MLP block is four times wider than the input dimension. 
  • depthwise conv에서 연산량이 증가하긴 하지만 downsampling convlayer에서 연산량이 많이 줄어들어서 전체 연산량은 줄어들었음.
  • 성능은 80.5에서 80.6으로 향상

2.5. Large Kernel Sizes

Moving up depthwise conv layer  
아까 b처럼 바꿨던 부분을 transformer처럼 3by3 conv부분을 위로 올려서 적용.
당연히 연산량도 엄청 줄어들고 성능도 79.9로 감소

Increasing the kernel size : conv layer를 위로 올려서 생긴 연산량 및 성능 감소를 보완하기 위해 3by3대신 보다 큰 kernel을 사용 5~11까지 사용해봤는데 7by7 conv를 적용했을 때 80.6으로 연산량과 성능에서 제일 좋았음. -> 7by7 선택


2.6. Micro Design

Replacing ReLU with GELU    
왼쪽 그림처럼 ReLU가 사용 되는 부분을 GELU로 변경. GELU는 다양한 transformer에서 사용 됨

GELU, which can be thought of as a smoother variant of ReLU, is utilized in the most advanced Transformers, including BERT and GPT-2 and, most recently, ViTs.

성능은 똑같이 80.6

Fewer activation functions

Transformers have fewer activation functions compared to ResNet.
There is only one activation function present in the MLP block.

transformer는 MLP block내에서 하나의 활성화 함수만 가지기 때문에 이것도 똑같이 처리함.

성능은 81.3으로 향상. 
( 이 부분이 많은 성능 향상을 가져왔는데 분석이 없어서 아쉬움. )

Fewer normalization layers : transformer block은 activation 함수처럼 normalization layer도 1개만 갖기 때문에 맨위 BN 빼고 아래 두 BN을 삭제. 성능은 81.4로 향상.

Substituting BN with LN : 마찬가지로 transformer block은 LN을 사용하기 때문에 1개 남은 BN을 LN으로 교체. 81.5로 성능 향상

Separate downsampling layers : resnet은 downsampling을 3x3 layer에서 stride 높여서 처리했는데, swin은 이부분을 나눠서 처리함. 이처럼 똑같이 독립시켜서 적용함. ( we use 2×2 conv layers with stride 2 for spatial downsampling. This modification surprisingly leads to diverged training.  Adding normalization layers at spatial resolution changes aids in training stability. ) 성능은 82.0으로 향상

이로써 최종적으로, 타겟팅한 swin transformer의 성능을 따라잡음. model scaling도 마찬가지로 resnet 200이 swin base의 성능을  뛰어 넘음.


이 뒤의 내용은 실험부분이고 주목할만한 부분은 없어서 스킵.

개인적으로 읽고 쓰는 공부용 리뷰입니다.

틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다.

paper overview

  • 논문링크 : paper link
  • ICLR 2022
  • model ensemble

Abstract

  • model ensemble이나 cascade를 committee라고 한다.
  • 우리는 기초로 돌아가서 committee base models의 효율성을 입증한다.
  • 간단한 committee는 NAS 등의 방법을 뛰어넘는다.
  • 우리의 결과는 efficientnet, vit등에서 이를 입증한다.

1. Introduction

  • We use the term “committee” to refer to model ensembles or cascades, which indicates that they are built using multiple independent models.
  • independently pre-trained models to build ensembles or cascades.
  • Ensemble multiple pre-trained models via a simple average over their predictions.
  • Cascades, we sequentially apply each model and use a simple heuristic to determine when to exit from the cascade.
  • We summarize our findings as follows:
    • Ensembles are more cost-effective than a single model in the large computation regime.
    • Cascades outperform single models in all computation regimes.
    • Committee based models" can be applied to various tasks, including not only image classification but also video classification and semantic segmentation.

2. Related Works

별 내용 없어서 pass

3. ENSEMBLES ARE ACCURATE, EFFICIENT, AND FAST TO TRAIN

  • 총 계산량이 제한되어 있을 때, 가장 높은 성능을 내는 것은 단일 모델인가 앙상블인가?
    실제 리얼 월드에서는 굉장히 중요하지만 이것을 다루는 연구는 거의 없다.
  • 그래서 우리가 한다. imagenet에서 efficientnet, resnet, mobilenetv2를 사용한다.
  • Figure 2에 단일 모델과 앙상블 및 cascade 성능을 보여준다. 조합이 많이 나올 수 있기 때문에 Pareto optimal ensembles만 보여준다.
  • 검정 네모 박스가 단일 모델 빨강 파랑 초록 네모박스가 앙상블 별이 cascade.
  • 앙상블은 작은 모델에선 조금 뒤쳐지지만 큰 모델에서는 단일 대비 좋은 성능을 보인다.
  • cascade는 전체적으로 단일 모델 대비 성능 연산속도에서 더 좋은 경향을 보인다. 여기서 cascade는 각 앙상블을 다이렉트로 변환한 것.
  • 대체로 앙상블이 작은 모델(or 적은 연산량)에서는 효율적이지 못한 모습을 보이는데 논문에서는 이를 두고 큰 모델은 작은 바이어스 및 큰 분산을 갖게 되는데 test err은 보통 분산의 영향이 크기 때문이라고 주장. 그렇기때문에 앙상블은 분산을 줄여주어 큰 연산에서 효율적이다라고 주장. 이 부분은 잘 이해가 안감

 

4. FROM ENSEMBLES TO CASCADES

  • 모델 cascade 방법 그냥 n개의 모델을 순차적으로 처리. 출력은 모두 평균내면서.
  • 만약 threshold보다 넘어가면 ealry exit 진행 -> 이로 인해 앙상블보다 평균 flops가 낮아짐
  • 만약 모든 모델을 통과했다면 앙상블과 같아짐.

4.1 CONFIDENCE FUNCTION

  • The higher g(α) is, the more likely the prediction α is correct.
  • max, the gap between the top-2 logits or prob, negative entropy 등등 해보고 결과 출력한게 figure 3.
  • All the metrics demonstrate reasonably good performance.
  • We adopt the maximum probability metric.
  • Threshold 별 연산량 및 정확도를 나타낸 cascade. t=1 일때 앙상블이랑 같으므로 연산량이 제일 많음
  • 그렇기 때문에 t가 커질수록 연산량도 많아짐.
  • 연산량 대비 정확도는 t가 커질수록 수렴하기 때문에 적당한 위치에서 고르면 됨.

4.2. CONVERTING ENSEMBLES TO CASCADES

  • 이제 뭐 바로 이해 될텐데, family 내 한단계 낮은 모델의 cascade와 단일 모델을 비교한 것. 정확도를 비슷하게 유지하면 속도가 빨라지고, 반대로 flops를 비슷하게 유지하면 정확도가 향상 된다. ( 모든 케이스에서 그러하다는 것에 주목)

5.MODEL SELECTION FOR BUILDING CASCADES

  • 모델 선정은 별거 없음 그냥 가능한 조합 중 Accuracy랑 flops 계산하여 적절하게 선정
  • 아래 테이블은 worst case를 고려해서 연산량이 기준치 안으로 오게 선정한 것.

  • self cascade. Test time augmentation을 cascade에 적용해본 것.

  • semantic segmentation with cascade. 
  • cityscapes 같은 경우 찾기 쉬운 road class도 있고 찾기 어려운 신호등도 있는데 연산량을 위해 grid 단위로 설정 512 일 경우는 1024/512 * 2046/512 = 8개의 grid로 설정

개인적으로 읽고 쓰는 공부용 리뷰입니다.

틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다.

paper overview

논문이라기보다는 technical report에 가깝지만 내용이 재밌어서 가져왔다. 주 내용은 제목 그대로 "작은 모델들 앙상블 하는 것이 큰 모델 보다 효과적이다" 라는 것이다. 증명을 위해 cifar와 imagenet으로 실험을 진행했으며, 각 데이터셋에 wide resnet, efficientnet을 사용한다. 사실 내용은 크게 볼 것 없지만 google reseach길래..

Abstract

  • 모델 앙상블이 하나의 모델보다 속도도 빠르고 더 정확하다. 심지어 이 차이는 모델의 사이즈가 점점 커질수록 크다.
  • cifar10이랑 imagenet에서 검증한다.
  • 하나의 거대 모델을 튜닝하는 것보다는 모델 앙상블 하는 것이 trade-off에서 더 유연하다. 

1. Introduction

  • 일반적으로 모델의 파라미터 수를 증가시켜면 동일한 파라미터나 연산 수의 앙상블보다는 좋을 것이라고 예상함 ( 오버피팅 제외) 왜냐하면, 모델 앙상블은 하나의 거대 모델보다 less connectivity하기 때문이다.
  • 단일 모델보다 적은 연산 량으로 더 높은 정확도를 보이는 앙상블을 찾는 것을 보여준다.
  • 이를 위해 우리는 cifar에는 wide-resnet을, imagenet에는 efficientnet을 활용한다.
  • NAS를 통해 다양한 조합을 시도해봤지만 같은 구조의 모델 앙상블 보다 더 나은 방법을 찾기 못했다.
  • 다양한 구조를 활용하는 것은 더 나은 방법 ( NAS 보다)을 사용하거나 차라리 단일 모델을 튜닝하는 것이 낫다. 

2. Approaches and Experiments

  • 앙상블 할 때 같은 구조를 독립적으로 학습한다. 
  • 각 모델의 출력은 기하 평균으로 계산. (element-wise 곱의 제곱근으로 계산)

2.1. Image Classification on CIFAR-10

  • wide resnet family 선정, 8개씩 각각 학습
  • n=16 ( WRN 논문 기준 N=2), k = {1,2,4,8}, image size 32x32. 
  • 오버피팅 방지 위해 작은 모델 사용.

  •  파란선은 wrn 16-1을 사용하여 1~8개씩 앙상블 한 결과를 보여줌. 노란선 ~ 빨간선도 마찬가지.
  • 초록색 3 즉 wrn16-4 3개가 wrn 16-8 1개보다 높은 성능을 보이며 더 적은 연산량을 가짐. 하지만 파란거 3보다 주황색1이 조금더 높은 성능을 보임. 즉 Abstract에서 말한 "this gap in im- provement widens as models become large." 것이 이 부분.

WRN 구조 기본적으로 4개의 conv layer를 갖고 N이 커질수록 6개씩 커짐 즉 6N+4 의 개수를 가지며 k는 conv block의 width를 의미.

2.2. Image Classification on ImageNet

  • efficientnet b0~b7 사용. 3개씩 각각 학습.
  • 오버피팅 효과를 더 잘보기위해 autoaugment, randaugment등 사용하지 않음.

3. Result

  • 모델 크기가 작을 땐 앙상블의 효과가 적어 보일 수 있지만 모델이 커질수록 앙상블의 효과를 확실히 볼 수 있다.
  • 어쨌든 앙상블이 가능한 상황이라면, 하나의 모델을 짜내는 것보다 앙상블이 효과 적이다.
  • 단순히 같은 모델들의 학습 및 앙상블 보다 다양한 구조를 사용하면 더 좋을 것 같아서 NAS 써봤지만 효과 못 봤다.

개인적으로 읽고 쓰는 공부용 리뷰입니다.

틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다.

paper overview

  • 논문링크 : paper link
  • fully convolutional network 
  • encoding & decoding

2015 CVPR에 나온 논문으로([Submitted on 14 Nov 2014 (v1), last revised 8 Mar 2015 (this version, v2)]), 2021년인 지금 깊게 공부하기엔 매우 올드하지만, 이 논문은 semantic segmentation의 초석을 닦은 연구라고 생각하기때문에, 한번쯤은 짚고 갈 필요가 매우 있다고 생각한다. 이 논문의 핵심은 semantic segmentation과 fully convolution이다.  semantic segmentation은 일반적인 classification과 유사하지만 결과물만 다르다. 이미지 전체를 토대로 classification을 하는 것이 아닌 픽셀단위로 classification을 하는 것이다. imagnet dataset을 예시로 들어보자면 classification 네트워크의 경우 ouput shape가 n x 1000 이라면 segmentation의 경우라면 ouput shape가 입력과 크기가 똑같은  N x H x W x 1000이 될 것 이다. 물론 imagenet으로는 학습 못한다. segmentation용으로 레이블링 된 데이터가 없으므로.

저 그림은 voc dataset이다. 그리고 이 데이터셋은 클래스가 21개다. 그렇기 때문에 위 그림의 아웃풋의 채널이 21인 것이다. pixelwise prediction 전까지는 classification downsampling과정이랑 같다. 그러나 그 뒤에 아웃풋의 shape가 다르다. 이 차이점이다. 보통 feature를 뽑아내는 과정을 encoding이라고 하고, 이 후에 이미지 크기로 다시 복원하는 과정을 decoding이라고 한다. 위 그림에는 이 디코딩 과정이 생략된 것이다. 그리고 이 모든 과정을 convolution layer로만 네트워크를 구축했다. 그래서 논문 이름이 fully convolutional network인 것이다. 보통 classification은 마지막에 fully connected layer(fcl)이 붙는데 fcl은 고정된 크기의 인풋을 요구한다. 근데 이게 사라졌으니까, 이론적으로는 크기에 불변이다. ㅋㅋ 근데 stride가 1/2씩 떨어지고 보통 1/32까지 떨구기때문에 입력 이미지의 크기는 32의 배수로 한다. ( 아니어도 되는데 fowarding 맞추기가 귀찮다.) 

figure 2의 위쪽은 classification을 의미한다. 이 과정이 semantic segmentation으로 포함되면 아래 부분처럼 heatmap형식으로 나타나는 것을 보여주는 figure다. 

figure 3는 fcn의 전체적인 플로우다. 전체적으로 encoding 과정은 전체적으로 VGG와 같다. 풀링레이어는 풀1에서 풀5까지 다섯개의 레이어가 있다. 각각 1/2씩 해상도가 떨어져서 1/32까지 떨어진다. 컨브6,7은 기존의 fcl을 컨볼루션으로 대체한 것이다. 32x 16x 8x 4x 2x 얘네들은 upsample layer로, transposed conv를 의미한다. feature map이 겹쳐져 있는부분은 덧셈을 의미한다. 

pool5 만 사용한것이 fcn32. pool5+ pool4가 fcn 16, pool5,4,3다 쓴것이 fcn8이다 fcn뒤에 붙은것은 아웃풋 피쳐맵의 누적 스트라이드라고 생각하면 된다. 

네트워크의 stride가 커지면 더 complex한 feature를 학습할수는 있지만 spatial information이 사라지기 마련이다. fcn은 이것을 앞쪽의 feature map을 inference에서 활용하는 쪽으로 방향을 잡았고, 많은 이 후 논문들이 이러한 방식을 택하고 있다. 따라서 결과 이미지로보나 수치로보나 fcn8s가 제일 좋다. 

개인적으로 읽고 쓰는 공부용 리뷰입니다.

틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다.

 

paper overview

  • 논문링크 : paper link

  • Hierarchical Deep Aggregation(HDA)
  • Iterative Deep Aggregation(IDA)

원래 VGG 쓸 차롄데, 최근에 보고 코드를 짠거라 까먹기 전에 이거 먼저 리뷰를 쓴다.

 

이 논문의 주요 키워드는 aggregation이다. resnet의 residual connection부터 unet의 feature concatenation등 feature map의 hierarchical connection은 이전부터 많이 실험 및 연구 되어왔다. 이 논문에서는 과연 기존의 feature aggregation이 최선일까?라는 의문에서 이를 해결하기 위한 연구를 한 논문이다. 저자도 굉장히 유명한 Fisher Yu와 Evan Shelhamer다. 그리고 최신 네트워크의 backbone모델로도 많이 사용되고 있는 모델이다. 사실 내가 마지막으로 쓴 논문도 semantic segmentation에서 이 점을 어떻게 해결할까? 로 시작했던 점이어서 아쉽기도 하고 부러운.. 논문이다. 그리고 논문만 봐서는 사실 이해가 잘 안돼서 코드를 보고 역으로 추론한 것이 많다.

 

Feature aggregation 

사실 이 논문 외에도 semantic segmenation, object detection등 다양한 task에서 neural network의 중간 feature들을 어떻게 잘 종합하느냐에 따라 성능이 좌지우지 되는 것은 많은 연구를 통해 이미 증명되었다. 이 부분에 대해서는 논문은 계층적 그리고 반복적인 aggregation을 제안한다. 개인적으로 느끼기에는 논문이 영어가 너무 깔끔해서 쉽게 읽혔다. 다음 부분이 introduction의 핵심이다.

 

>>> "In this work, we investigate how to aggregate layers to better fuse semantic and spatial information for recognition and localization. Extending the “shallow” skip connections of current approaches, our aggregation architectures incorporate more depth and sharing. We introduce two structures for deep layer aggregation. iterative deep aggregation (IDA) and hierarchical deep aggregation (HDA)"

 

IDA & HDA

>>> "IDA focuses on fusing resolutions and scales while HDA focuses on merging features from all modules and channels. IDA follows the base hierarchy to refine resolution and aggregate scale stage-bystage. HDA assembles its own hierarchy of tree-structured connections that cross and merge stages to aggregate different levels of representation."

 

논문에서 인용한 단락이다. 진짜 이 논문은 다른 것 필요 없고 위 단락으로 사실 설명이 끝이다. IDA는 서로 다른 resolution의 featuremap 들을 지속적으로 fusing하기위한 aggretation을 의미하고,  HDA는 같은 resolution상에서(같은 계층 상에서) 그 tree들을 서로 잘 aggregation하는 connection을 의미한다.

 

왼쪽 그림이 논문의 figure2다. c와 f만 잘라왔지만, 당연히 논문에는 a~f까지 다있다. a와 b는 기존에 존재하는 방식에 대해 언급하고 있고 d,e는 다른 방식의 aggregation에 대해서 설명하고 있지만, 결국에 제안하는 방식은 왼쪽 그림의 c(IDA), f(HDA)다.

 

흰색 네모들은 큰거와 작은 것이 각각 conv stage와 conv block들을 의미하고 초록색이 aggregation node를 의미한다. 

stage와 block의 차이점은 block모인것이 stage라고 생각하면 된다. resnet의 큰 conv block을 생각하면 된다.

즉 IDA는 stage단위로 엮어주고, HDA는 block단위로 엮어주는 개념이다. 사실 이그림만 봐서는 제대로 이해가 안됐지만, figure 3까지 같이 보면 이해가 좀 쉽다. 아래서부터는 각 aggregation에 대한 디테일한 설명이다. 

 

 

 

HDA(Hierarchical Deep Aggregation) detail

figure 3

이 figure3가 전체적인 DLA의 큰 flow인데, HDA와 IDA의 차이점이 확연하게 차이난다. 일단 가장 큰 차이점은 resolution의 차이라고 생각하면 된다. 파란선이 down sample을 의미하는데 각 HDA안에서는 down sample이 존재하지 않는다. IDA는 서로 다른 resolution의 지속적인 연결이라고 언급했는데 여기서 노란선이 이를 보여준다. HDA는 같은 stage내 feature map들의 conntection이다. 저 흰색 박스는 resnet의 conv block을 생각하면 된다. 그리고 빨간 박스는 HDA의 Tree level이라고 생각하면 쉽다 왼쪽 빨간박스부터 level1, level2, level3의 HDA를 의미한다. 

 

여기서 흰 박스들은 resnet의 conv block이라고 했는데, 발그림이긴 하지만 아래 그림을 보면

왼쪽부터 basic convblock, basic conv block with projection, bottlenect convblock, bottleneck convblock with projection이다. 아마 resnet을 짜봤으면 바로 이해했을 것이다. 위 그림중 왼쪽의 connection은 residual connection을 나타내는데, 이는 덧셈 연산이기 때문에 해상도가 안맞거나, channel수가 안맞으면 연산이 불가하다. projection은 이럴 때 1x1 conv를 이용해 resolution이나 channel을 맞춰주는 역할이다. resolution이 안맞을 때(주로 down sampling) stride=2로 주는데 그러면 전체 feature map을 고려하지 못하기때문에 avgpool을 선행하고 projection을 하는 경우도 있으나 여기서 다룰 문제는 아니므로 스킵.

아무튼 왼쪽 두개는 일반적인 conv block을 의미하고 오른쪽 두개는 연산을 줄이기 위해 채널을 줄였다가 다시 늘리는 bottlenect block이다. 이를 설명하는 이유는 위 figure3에서 작은 흰색 박스가 바로 이 conv block을 의미하기 때문이다. (아래 그림 참조)

 

작은 흰 네모 박스가 conv block을 의미 아. 물론 당연히bottlneck block일수도 있음

 만약 좌측 그림처럼 그냥 흰색 네모 박스 두개가 연달아 있었다면 이것은 그냥 resnet과 같이 conv block을 나열한 것이다. 근데 HDA에서는 위 그림처럼 새 node를 두어 앞의 block의 output도 aggregation에 사용한다. 이게 HDA의 개념이다. (참고로 aggregation node내에서는 concat +  1x1 conv의 연산이 이뤄진다. 이 안에도 1개의 conv가 포함되어 있다.)

 

 

HDA level2

 

HDA level2다. 중간을 기점으로 왼쪽을 잘라보면 HDA level1과 정확히 똑같은 모양이 있다. 조금만 멀리서 보면 결국 중간 기준 오른쪽도 마찬가지로 같다.

 

맞다. HDA level1을 두번 이은 것이다.  

 

흰색 네모 박스가 basic block일 경우 각각 conv layer를 2개씩 갖고 있으므로 HDA level2는 총 10개의 conv가 들어간다. ( aggregation node도 1개씩 갖고있기때문에)

 

마찬가지로 HDA level1의 경우  2x2 + 1 해서 5개의 conv layer를 갖는다. 

 

 

 

 

HDA level3이다. 이또한 자세히 보면 HDA level2가 두번 나열되어있다. 즉 HDA1을 네번 이은 것이다.

맞다. tree 형태를 띄고 있다. 그래서 official code도 tree로 짜여져있는데, 개인적으로는 이 코드가 이해하기 너무 힘들다.

 

아무튼 HDA level3 는 8개의 conv block을 가지므로 basic block 기준, 2*8 + 4(aggregation) 총 20개의 conv layer를 가진다.

 

 

 

HDA를 종합해보자면 같은 계층 또는 Tree안에서 기존의 resnet과 달리 2개의 block마자 계층적인 aggregation이 이러난다. 하나의 Tree를 크게 보자면 뒤쪽일수록 more complex한 feature를 학습할 것이고 이를 보다 low한 앞쪽의 feature map과 합쳐주는 개념이다. 말 그대로 동일 Tree내에서 계층적인 aggregation을 하는 것이다. 물론 이 aggreation에는 앞서 말했듯이, concatenation을 사용한다. 

 

 

IDA(Iterative Deep Aggregation) detail

위의 figure3를 다시 보자. IDA는 노란 선으로 표현되어있다. 보면 노란선이 이어지는 하단의 conv block(흰 박스)들을 보면 중간에 down sampling이 일어난다. 논문에서도 언급된 다양한 resolution의 aggregation이란 이 것을 의미한다. down sampling은 receptive field를 크게 넓히면서 복잡한 feature를 학습하는데 도움을 주지만, 해상도가 작아지기 때문에 spatial information의 손실이 크다. 이를 보완하기위해 IDA를 사용하는 것이다. 단순한 노란선으로 연결되어있지만 해상도를 맞추기 위해 maxpooling을 사용하여 aggregation의 입력으로 들어간다. 즉 다른 feature map들과 함께 concat+ 1x1 conv를 하는 것이다. 

 

 

 

 

위 표를 보자

모든 DLA모델에대해 간략하게 나타낸 것이다. 모든 DLA는 6개의 stage로 구분했다.

stage 1,2 에서는 그냥 숫자가 적혀 있는데 이것은 그냥 conv layer 1개를 의미한다. 그리고 "-" 로 이어진 수는 HDA level - channel수 이다. 

 

예를 들어, DLA-34의 stage3에는 1-64가 적혀있다. 이것은 HDA level1 + 64 channel이란 소리다. 

 

사실 stage1과 stage2는 표대로만 보면 2개의 conv layer로 이루어진것처럼 보이지만 실제로는 input layer를 포함해서 총 3개의 conv layer이다. 

 

DLA34를 보자 34개의 conv layer가 있단 소리다.

 

stage1 + stage2 : 3개

stage3, HDA level1 : 5개 (위에 설명함)

stage4, HDA level2 : 10개

stage5, HDA level2 : 10개 

stage6, HDA level1개 5개 총 33개 + classifier에 1x1 conv1개 = 총 34개의 conv layer로 구성되어있다. 물론 중간에 max pool, bn, relu는 당연히 있다.

 

아 귀찮지만 공부 용도 이니 나중에 잘 기억하기 위해 DLA46까지만 보자면

stage1,2(3개) + stage3(7개 why? bottleneck이니까) + stage4(14개) +stage5(14개) +stage6(7개) + classifier(1개)= 46이다. 

 

C가 붙은건 보다시피 channel 수가 다른 모델에 비해 적다. compact 버전이다.

X가 붙은건 resnext 모델의 group conv를 사용한 것이다. 

X+C는 당연히 compact + group conv 를 의미한다.

 

 

DLA Segmentation

하.. 이건 나중에 쓸래 넘 힘들다 리뷰 

 

 

 

 

개인적으로 읽고 쓰는 공부용 리뷰입니다.

틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다.

 

paper overview

  • 논문링크 : arxiv.org/pdf/1311.2901.pdf

  • CNN의 visualizing에 대하여 연구한 논문

  • max-unpooling의 개념을 제안

  • cnn visualizing기법을 토대로 alexnet을 수정 및 개선

이 논문의 주요 키워드는 visualizing이다. 학습된 모델이 무엇을 보고 있는지 나타내어 모델의 개선에 이용했다.

보통 classification 논문을 다룰 때, 크게 언급 되지는 않지만 개인적으로 큰 contribution을 가진 논문이라고 생각한다. 

 

feature visualization 예시(출처 : zfnet 논문)

위 그림은 featuremap visualization을 위한 deconv의 과정이다. 그림 기준 왼쪽이 deconv의 일련의 과정이고 오른쪽은 우리가 아는 일반적인 CNN의 forward 과정이다. rectified feature map -> pooling -> conv -> relu -> pool의 과정을 나타낸다. 왼쪽은 반대로 위에서부터 max-unpool -> relu -> deconv(F^T)-> max-unpool의 과정이다. 

Max-unpooling

위 figure는 feature visualization의 일련의 과정이다. maxpooling의 경우 receptive field에서 max 값만 취하는 연산인데 이를 역연산 하기 위해서 max 값을 취한 곳의 위치를 기억했다가 un-pooling시 그 위치에 값을 입력하는 것이다. 물론 해당 위치 말고는 0으로 채워지는 sparse한 행렬이 되긴하겠지만 결과 이미지를 보면 어느정도 유의미한 결과를 얻은 것을 알 수 있다. 마찬가지로 활성화 함수를 거치면 (이 논문에서는 relu를 사용) 날라가는 값들이 존재하지만 결과 이미지를 토대로 추론해보면 크게 영향이 없는 듯 보여진다. 

 

Deconvolution

리뷰를 하면서 새로 알게 된 사실이지만, 저자가 이전에 이미 관련된 논문을 썼었다. Deconvolutional Network(Zeiler et al., 2011)이 그 논문인데 이 논문에서는 자세하게 언급되어 있지않다. 아마 지금에서 transposed convolution으로 불리는 연산이지않을까 싶다. 이에 관련해서는 정말 많은 자료를 봤지만 이 블로그가 제일 잘 설명 되어있었다. zzsza.github.io/data/2018/06/25/upsampling-with-transposed-convolution/

 

Result

아래에 나오는 그림들은 학습이 다된 네트워크에 validation set을 forwarding하면서 나오는 feature map들을 visualization한 결과이다. 9개의 랜덤한 feature map을 뽑아 그 결과를 나타낸것이다. 색깔이 있는 그림은 feature map 영역에 대응하는 원본 이미지 영역이다.

논문에는 layer 5까지 있지만, 귀찮다  layer 4보다는 layer 3이, 3보다는 2가 조금더 low-level의 feature를 뽑아내는 것을 알 수 있다. 즉 네트워크가 뒤쪽으로 갈수록 좀 더 complex한, high-level의 feature가 나타나는 것이다. 결론적으로 네트워크의뒤쪽의 convolution filter들은 좀 더 앞의 filter보다 복잡한 특징들을 추출하도록 학습이 된다는 점이 중요하다. 당연히 지금에서야 생각해보면 layer가 누적될수록 그에 대응하는 receptive field도 넓어질 것이고 이에따라 표현하는 feature, 즉 feature map의 channel도 늘어나니 이러한 결과는 당연하다고 보여지지만, 이때 당시에 이를 연구하고 이렇게 visualization을 통해 모델의 구조도 더 효율적으로 바꾼 점은 엄청나다고 생각한다. 

 

Model architecture

zfnet같은 경우 모델에는 큰 컨트리뷰션이 없다. alexnet과 매우 유사하지만, 전반적으로 convolution filter size가 조금더 작아진 것 뿐이다. 

 

 

 

결론적으로 이 논문은 논문 제목 그 자체로 visualization과 understanding에 초점이 맞춰져있는데, 그 목적한 바를 정확히 구현하고 결과로 보여줬다. 본문에도 썼듯이 지금에 봐서야 이 결과 이미지들이 당연하게 여겨지지만 이 당시의 연구로는 엄청나다고 생각한다. 일단 개인적으로  지금이야 pytorch, keras등 사용하기 쉬운 framework들이 많이 있지만 이때는..  코딩실력이 너무 대단하고 부럽다. 

개인적으로 읽고 쓰는 공부용 리뷰입니다.

틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다.

 

paper overview

 

cf) 딥러닝 특성상 기술의 발전이 매우 빠르기때문에 8년전에 나온 이 논문은 사실 굉장히 올드하다. 그러므로 디테일하게 살펴보기보다는 중요한 키포인트만 짚고 넘어가는 것이 좋다.

 

 

main contributions

이 논문에서 주장하는 contribution은 다음과 같이 볼 수 있다.

  • ReLU
  • LRN
  • multi-gpu
  • overlapping pooling
  • reduce overfitting
    • data augmentation
    • dropout

 

 

ReLU

alexnet에서는 activation function으로  relu를 사용한다. relu는 지금까지도 많이 사용되는 activation function으로 기존에 비해 어떠한 장점이 있는지 파악하는 것이 중요하다. 

 

일반적으로 사용되던 sigmoid나 tanh함수는 고질적으로 gradient vanishing의 문제가 있다. 두 함수다 비슷한 모양으로 양쪽 끝으로 기울기가 0에 수렴하는 (논문에서는 saturating 하다 라고 표현 함) 형태를 띄고 있기때문에, layer가 많이 누적 될수록 즉 모델의 뒷단으로 갈수록 기울기가 0으로 수렴해 backpropagation시 기울기가 충분히 전달이 되기 힘들다. 모델의 학습에 있어서 gradient vanishing은 학습의 가능 여부가 달려있기때문에 매우 중요하다.  

alexnet에서는 이를 해결하기위해 non-saturating한 ReLU를 활성화함수로 사용한다. 또한 relu의 사용은 보다 더 빠른 학습이 가능하다.

 

 

 

그렇다면 왜? relu를 사용했는데, gradient vanishing이 완화 될까? 일단 그래프 개형에서도 볼 수 있듯이 sigmoid나 tanh와 달리 relu는 수렴하지않는 개형을 띄고있다. 그러니까 x>0 일 때, 기울기가 0에 가까워지는 일은 있을 수 없다. 그렇기때문에 이 문제점을 완화 시킬 수 있고, 역전파시 충분한 기울기의 전달이 가능하기 때문에 당연히 동일 epoch대비 더 빠르게 수렴하는 것은 당연하다. 또한 relu는 미분 또한 매우 간단하다.

 

cf) 왜 0보다 작은 값은 무시할까?

맨 처음에 이 논문을 읽고 relu는 왜 양수만 고려할까? 라고 의문이 들었다. 아래 링크에서 굉장히 만족할만한 답변을 얻을 수 있었다. "무의미한 연결을 끊어(pruning의 개념) 모델의 sparse한 연결을 위하는것이 relu의 key point다." "negative value를 예측하는 것은 무의미하다." 등의 다양한 답변이 있는데 다 맞는말이다. 사실 근데 쉽게 생각하면 convolution filter는 어떠한 특징을 잘 찾아내도록 학습이 되어야한다. 그럼 filter가 특징점이 위치한 영역에서 convolution이 됐을 때, sobel이나 laplacian이 고주파영역에서 높은 값을 출력하듯이 당연히 high activation이 일어나도록 학습되어야 하는거 아닌가?  

https://stackoverflow.com/questions/60436685/why-does-almost-every-activation-function-saturate-at-negative-input-values-in-a

 

 

LRN 

local response normalization의 약어로 쉽게 생각하면 neuron의 output을 주변값과 평균 내는 것이다. 논문에서는 이 normalization이 generalization에 도움이 된다고 주장한다. 특정 노드의 출력이 주변에 비해 굉장히 크다면 학습시 이 노드에 편향될 수 도있는데, LRN은 이러한 효과를 억제 시킬 수 있다. 어차피 지금은 batch normalization, group normalization등 더나은 성능을 보여주는 normalization 기법들이 있기때문에 사용하지 않는다. 심지어 VGG논문에서는 LRN이 효과가 없었다고 적혀있다. 

 

 

Overlapping pooling

엄청 간단한 개념이다. pooling layer에서 stride보다 더 큰 필터를 사용하여, receptive field가 겹치게끔 하겠다는건데, 논문에서는 이 overlapping pooling의 효과로 다음과 같이 주장하고 있다. "We generally observe during training that models with overlapping pooling find it slightly more difficult to overfit." 사실 실험적인 결과라 나는 잘 모르겠다. 

 

 

Multi-gpu

지금이야 gpu들이 memory가 12기가는 우스울 정도로 고성능이지만 이 논문에서는 GTX 580(3GB)을 사용했다. ㄷㄷ 심지어 alexnet은 고용량의 모델이다. 당연히 이 gpu로는 학습이 힘들었기때문에 두대의 gpu를 사용했다. channel을 기준으로 반반씩 나누어서 사용했는데, 예를들어, feturemap의 channel이 96이라면 앞의 48 채널은 0번 gpu 뒤의 48 채널은 1번 gpu에서 연산하는 식으로 했다. 사실 이것은 지금 우리가 사용하는 grouped convolution(with G=2)와 같은 방식이다. resnext 논문을 보면 좀더 자세히 설명되어있다. 

 

 

Reduce overfitting

오버피팅을 방지하는 방법으로는 regularization, data augmentation 등등 다양한 방법이 있지만 이 논문에서는 특히 엄청난 data augmentationdrop-out을 적용했다. data-augmentation은 resizing, cropping 등을 이용하여 데이터셋을 늘리는 방법이다. 데이터의 양을 늘리는 것은 모델의 학습이 더 잘되는 것과 직결되기때문에 근본적인 해결 방법이고 제일 효과적이다.

drop out은 학습 시 노드간의 연결을 확률 p에 근거하여 연산에 포함시키지 않는다.  당연히 매 학습마다 다양한 연결이 생성이 될것이고 이는 앙상블 효과를 낳기때문에 오버피팅방지에 도움이 된다. 그리고 inference시에는 학습 때사용한 p의 보상효과로 dropout이 적용된 레이어의 모든 연결에 p를 곱한다. 아래의 설명이 매우 명확하다.! 

 

Dropout is a regularization method that approximates training a large number of neural networks with different architectures in parallel. During training, some number of layer outputs are randomly ignored or “dropped out.” This has the effect of making the layer look-like and be treated-like a layer with a different number of nodes and connectivity to the prior layer. In effect, each update to a layer during training is performed with a different “view” of the configured layer.

 


cf) 과연 dropout은 진짜 regularization에 도움이 될까?

왜 이생각이 들었냐면, 실제로 모델을 설계하고 학습을 하다보면  gpu메모리를 상당히 많이 잡아먹고 학습에 큰 영향이 없는 것 처럼 보인다. 그래서 찾아봤다. 


>>> First, dropout is generally less effective at regularizing convolutional layers.
The reason? Since convolutional layers have few parameters, they need less regularization to begin with. Furthermore, because of the spatial relationships encoded in feature maps, activations can become highly correlated. This renders dropout ineffective.

>>> Second, what dropout is good at regularizing is becoming outdated.
Large models like VGG16 included fully connected layers at the end of the network. For models like this, overfitting was combatted by including dropout between fully connected layers. Unfortunately, recent architectures move away from this fully-connected block. By replacing dense layers with global average pooling, modern convnets have reduced model size while improving performance. I will write another post in the future detailing how to implement global average pooling in a convolutional network. Until then, I recommend reading the ResNet paper to get an idea of GAPs benefits.

ref)www.kdnuggets.com/2018/09/dropout-convolutional-networks.html

 

 

 

+ Recent posts