Rethinking the Inception Architecture for Computer Vision(Inception-v2, v3)

박요셉·2023년 6월 10일
0

Classification(Paper)

목록 보기
6/9
post-thumbnail

논문 제목 : Rethinking the Inception Architecture for Computer Vision
논문 링크 : https://arxiv.org/pdf/1512.00567.pdf

이번에 리뷰할 논문은 Inception-v2, v3에 대한 논문이다.
기존에 중요도가 높은 Inception-v1, v4만 하고 넘어가려 했으나
Inception-v2,v3에서도 읽어볼만한 부분(label smoothing 등등)들이 있어서 가볍게 읽어보려 한다.
구현은 하지 않고 내용 위주로 리뷰할 예정이다.
읽으면서 "즉"이 무쟈게 많이 등장할텐데, 이번 논문 표현이 좀 모호하고 복잡해서 내 나름대로 요약한 것이다.

후기 : 정말 괄호와 "즉", 주석이 난무하는 글이었다.
수식도 너무 많고, 기억도 잘 나지 않아 하나하나 따라가며 직접 쓰고 이해하는게 참 오래 걸렸다.
설명 틀린 것도 있었고, 표현이 통일되지 않아 헷갈렸다.

해리포터 - 혼혈왕자 마냥 주석을 무진장 썼다.
그래서 읽는 시간이 좀 오래 걸렸다..

중요 포인트

  • Inception 구조의 디자인 철학 정립
  • Conv factorization(5x5->3x3, 3x3->1x3,3x1)
  • Auxiliary classifier - 하나 제거 및 용도 밝힘(regularizer로도?) + auxiliary FC에도 BN 적용
  • 표현력 유지하며 grid size 줄이기
  • Label smoothing

Abstract

컴퓨팅 비용을 늘리고 model 크기를 키우는 것이 성능 향상에는 좋지만,
컴퓨팅 효율을 높이고 parameter를 줄이는 것은 여전히 mobile vision이나 big-data 처리를 가능하게 하는 중요한 요인이다.

이 논문에서 저자는 factorized convolution, aggressive regularization 등을 활용해 최대한 효율적으로 network를 scale up 하고자 한다.

ILSVRC validation 데이터셋으로 테스트했다.

  • single model의 경우 top-1/top-5 error가 21.2% / 5.6%로 sota급 성능이었다.
    사용된 network는 50억개의 multiply-add 연산이 있고, 2500만개 보다 적은 parameter를 사용했다.
  • 4 model ensemble + multi-crop한 경우 top-1/top-5 error는 17.3% / 3.5%였다.

1. Introduction

AlexNet(2012)이 성공한 이후, VGGNet, GoogLeNet(2014) 등 개선된 network가 많이 등장했다.
흥미로운 점은, classification 성능이 개선되면 덩달아 computer vision의 타분야도 같이 개선이 이뤄진다는 것이다.

VGGNet은 단순하지만 parameter가 너무 많다(AlexNet=60M, 이보다 3배 가량 많다).
그에 반해 GoogLeNet은 memory와 컴퓨팅 예산을 철저히 제한해 훨씬 적은 parameter로도 가능했다(AlexNet보다 12배 적다, 약 5M).

Inception 성능을 키울 때 단순히 scale up하는 것은 기존의 efficiency를 잃게 만든다.
(예를 들어 filter size를 2배로 하면 parameter는 4배가 된다)

또 Inception은 구조가 원체 복잡해서 다양한 컴퓨팅 기법들을 사용하면 더 복잡해진다.

따라서 본 논문에서는 어떤 원칙과 최적화 방법으로 효율적인 scaling up을 했는지 설명할 것이다.

즉 AlexNet 이후로 많이 개선된 network 등장, 심지어 classification 성능 좋아지면 타 분야도 같이 좋아짐.
그래서 성능 개선하려 함 -> 보통 성능은 깊이나 model 크기 키우면 좋아짐.
But Inception의 장점인 효율성은 단순 scale up하면 그 가치를 잃어버림.
이것저것 컴퓨팅 기법 적용하려해도 구조가 워낙 복잡해서 하기가 힘듦(GoogLeNet 당시에 디자인 철학이 없어서 더 어려움).
그래서 본 논문에서는 이러한 문제를 해결하기 위해 최대한 효율적으로 scale up하는 방법을 설명함.

2. General Design Principles

아래에 소개하는 원칙들은 large-scale experimentation을 기반으로 디자인되었다.
이러한 원칙에서 크게 벗어난 경우 성능 저하를 일으켰다.

    1. Representational bottleneck을 피해야 한다(특히 network 초반부에서!).
      Feed-forward network는 acyclic graph로 볼 수 있다(정보가 흐르는).
      즉 cut을 통해 정보의 양에 접근할 수 있다.
      (정보가 어느정도 지나가는지 보려면 graph를 잘라 그 흐름을 보면 된다는 뜻)
      그래서 extreme compression을 하는 bottleneck을 쓰지말고, gently decrease해야 한다.
      Dimensionality는 정보의 양을 어림짐작하는 용도이지, correlation structure같은 중요 요인들은 싸그리 폐기된다.
      (즉 차원 줄이기에 급급하면 정보 손실이 크니까, 천천히 줄여라)
    1. 높은 차원의 표현이 네트워크 내에서 처리되기 쉽다.
      Activation을 늘리는 것이 feature 분리를 더 잘한다.
      또 그 네트워크는 학습을 더 빨리 할 것이다.
      (즉 conv 잘게 쪼개서 activation 많이하면 feature를 더 잘 학습한다).
    1. Spatial aggregation을 할 때 차원 축소를 해도 representational power 손실 거의 없이 저차원으로 임베딩할 수 있다.
      (Spatial aggregation은 conv를 말하는듯, eg. 3x3 conv)
      이는 차원 축소 후 output이 spatial aggregation에 사용된다면, 인접 unit간의 강력한 상관관계가 정보 손실을 줄여준다는 가설에 기반한 원칙이다.
      또 학습도 빨라진다.
      (즉 conv 전 차원 축소를 해도 인접 unit의 상관관계로 인해 정보 손실이 적어 큰 문제가 없고, 학습도 빨라진다는 말인듯)
    1. 네트워크의 width, depth를 균형 맞춰야 한다.
      Width, depth를 늘리면 성능 향상이 되지만, 최적의 향상을 위해서는 둘 다 병렬적으로 증가해야 한다.
      따라서 컴퓨팅 예산을 depth, width에 균형있게 분배해야 한다.
      (즉 하나만 키우지 말고, 균형있게 늘리자)

이러한 원칙들이 타당하긴 하지만, 네트워크 성능 향상에 적용하기 쉽지 않았다.
따라서 이 방법들은 모호한 상황에서만 신중하게 적용했다.

3. Factorizing Convolutions with Large Filter Size

GoogLeNet의 장점의 상당수는 차원 축소에서 온다.
이는 factorizing convolution의 한 예로 볼 수 있다.

1x1 - 3x3 conv를 예로 들어보자.
가까운 activation이 높은 상관관계를 가지고 있기에, aggregation 전 activation은 줄일 수 있고 유사한 local representation을 보여준다.

아래에서는 몇 가지 factorizing(분해) 방법을 설명할 것이다.

Inception net은 fully convolutional해서, 각 weight는 activation 당 하나의 곱셈 연산이 있다.
즉 컴퓨팅 비용을 줄이면 parameter를 줄일 수 있다.
또 factorization을 통해, 더 구분되는 parameter를 얻을 수 있고 빠른 학습이 가능하다.
컴퓨팅 비용과 memory 사용이 줄어 분산 학습이 가능해진다.

내 방식으로 요약
기존 Inception net -> 차원 축소 덕 많이 봄.
차원 축소 역시 factorizing convolution(conv 쪼개기)의 한 예다.
How? 1x1 - 3x3을 생각해보면 1x1이 먼저 차원 축소(channel 감소) 한 후 3x3을 적용한다.
즉 많은 차원으로 conv할거를 2개로 쪼개서 한 것.
차원 축소가 왜 가능하나면 activation 하나하나가 다 다른 느낌이 아니라, 인접한 activation은 높은 상관관계가 있다.
즉 좀 줄여도 별탈 없음.
Conv 연산을 생각해보면 activation(output으로 생각) 1개 당 weight가 1번 쓰임.
그래서 컴퓨팅 연산 자체를 감소시킴 -> 사용되는 parameter를 줄일 수 있음.
(아마 5x5->3x3 2개로 바꾸는 것 같은 상황에서의 parameter 감소를 의미하는 듯)
이러한 factorization을 통해 더 쪼개진 parameter(feature인듯)을 얻고 이는 더 빠른 학습을 가능하게 함.
(학습이 빨라진다는게 단순히 한 epoch당 걸리는 시간이 아니라 네트워크 그 자체가 '수렴'하는 속도를 의미하는듯)
네트워크가 가벼워졌으니 분산 학습도 가능함.
아니 논문 왤케 말 어렵게 설명해놨지

3.1 Factorization into small convolutions

큰 filter는 불균형적으로 비싸다.
예를 들어 5x5 conv는 같은 수의 3x3 conv filter보다 약 2.78배 컴퓨팅 비용이 든다.
물론 5x5가 더 큰 구역을 capture해 추출할 수 있다.
그렇다면 5x5를 쪼갤 순 없을까?
3x3 conv - 3x3 FC layer를 하면 된다.
여기서 vision 네트워크이므로 translation invariance를 쓰기 위해 FC layer를 conv layer로 바꾸면 된다.
(즉 5x5 conv가 비싸니 vision 네트워크의 특성을 살리기 위해 2-layer 3x3 conv로 대체한다)

위 사진을 보면 알 수 있듯이 5x5 conv가 5x5의 영역을 1x1로 만드는 것을
5x5 영역을 3x3 conv로 먼저 capture(하면 3x3이 됨, stride=1, padding=0),
3x3 영역을 다시 3x3 conv(처음엔 FC였지만 conv로 대체)로 capture하여 1x1이 된다.

Translation Invariance가 뭘까?

위 사진처럼 위치가 변해도 그 특성을 찾아내는 것이다.
이는 shared weight(filter의 weight는 모두 같다), pooling layer 덕분이다.
FC layer는 이와 같은 특성을 지니지 못한다.
그림 출처
내용 참고 : https://ganghee-lee.tistory.com/43

인접 tile 간에 weight를 공유하는 것은 parameter를 확연히 줄인다.
(5x5 conv는 영역에 대해 한 번 쫙 훑지만, 3x3 conv는 3x3 영역을 또 만들고 이를 쓰기에 '공유'된다라고 표현된 듯)

어느정도로 컴퓨팅 비용이 절약되었는지 계산해보자.
5x5 filter 수를 n, grid filter(input channel)수를 m이라 하자.
n=αmn=\alpha m이라 가정할 수 있다.
5x5 conv가 집합 연산이라, α\alpha는 1보다 약간 더 클 것이다(GoogLeNet에서는 1.5 정도였음).
(이 말은, 5x5를 쓰면 보통 크기가 줄기에(이를 집합 연산이라 하는듯) 이를 보완하기 위해 filter는 늘어난다는 것이다)
5x5 conv를 2개의 3x3 conv으로 대체한다고 하자.
같은 효과를 내려면 3x3 conv는 각각 α\sqrt{\alpha}씩 팽창시키면 된다.
3x3 conv는 인접한 tile의 activation을 공유하기에, 연산량이 9+925×\frac{9+9}{25}\times 줄 것이다(약 28%).
Parameter도 딱 똑같이 줄어들 것이다(28% 감소!).

근데 계속 찝찝한 부분이 있다.
대체 3x3 conv 2개의 연산량이 왜 9+9일까?
25는 타당하다. 5x5 영역에 대해 5x5 conv filter가 1번 적용되니 총 25번 할 것이다.
근데 대체 3x3은 왜?
일단 5x5 영역에 대해 3x3 conv를 한 번 적용한다고 생각해보자.
총 9 set의 연산이며, 각 연산마다 9번의 연산이 있다. 총 81회.
그 다음 3x3 영역에 대해 3x3 conv를 하면 9회의 연산이 있다.
Total 90회.
이는 5x5에 비해 무척 많은 수이다.
그래서 내가 계산을 잘못한건지 의문이 생겨 검색한 결과 아래의 답변이 있었다.

내용 출처
즉 저 내용은 당장은 틀린게 맞지만, input이 커지면 커질수록 맞다는 것이다.
의문이 해소되었다(참고로 parameter는 정말 28% 감소한다).

그렇다면 이러한 2개의 의문이 들 수 있다.
1) 이 대체가 표현력의 감소로 이어지지는 않는가?
2) 첫 layer에서 linear activation을 유지해도 되는가?

저자들은 몇 번의 실험을 거쳐 linear activation이 더 좋지 않은 성능을 보여줬다고 한다.
(즉 ReLU를 끼워넣는게 더 성능이 좋다)
이 이득은 네트워크의 space of variation(=model capacity) 증가에 도움이 된다.
특히 output activation을 batch-normalize 했을 때 더 그렇다고 한다.

이러한 효과는 차원 축소에서 linear activation을 사용했을때도 비슷하다고 한다.

3x3 conv 2개를 쓸 때 ReLU를 쓸지 말지에 대한 의문으로 실험해보니,
쓰는게 낫다고 한다.
이는 차원 축소할 때도 해당된다(아마 1x1 뒤에 ReLU 쓰는 것을 말하는 듯).
ReLu를 쓰니 model capacity를 늘릴 때 도움된다.
Q. 그래서 표현력 감소로 이어지는가?
이거에 대한 답변은 왜 없을까... 안 이어지겠지..?

3.2 Spatial Factorization into Asymmetric Convolutions

3x3보다 큰 filter를 쓴 경우는 3x3 conv를 쌓아서 대체할 수 있으므로 별로 유용하지 않다.
그렇다면 3x3 conv는 더 줄일 수 있을까?
2x2를 예로 들어보자. 가능은 하다.
다만 그보다 asymmetric convolution(비대칭 conv, 1xn 같은 비대칭적인 size filter)가 더 낫다.

3x3 conv는 1x3 conv와 3x1 conv로 대체될 수 있고, parameter는 3+39\frac{3+3}{9}로 약 33% 저렴하다.
(계산 비용도 33% 절약된다는데 위에 Tensorflow KR 답변을 참고하자)
2x2 conv 2개를 쓴 경우는 4+49\frac{4+4}{9}라서 오직 11%밖에 절약하지 못한다.


이론상, Figure 6 처럼 어떤 nxn conv도 1xn conv외 nx1 conv로 대체할 수 있다.

실제로 적용해보니 초기 layer에는 잘 작동하지 않지만, 적당한 grid-size(12~20)의 feature map에서는 잘 작동한다.
그 레벨에서는 1x7 conv와 7x1 conv로 좋은 결과를 냈다.

Inception module 바꾸는 과정

Fig. 4, 기존의 Inception module

Fig. 5, 법칙 3에 의해 변형된 Inception module

Fig. 7, 비대칭 conv로 다시 한 번 변형한 Inception module
Q. 여기서 드는 의문.
법칙 3은 spatial aggregation 전체 차원 축소가 가능하다는건데.. Fig. 5는 5x5->3x3 2개로 바꾼 것이다.
법칙 3의 뜻이 차원 축소를 한다는 말이 사실 5x5 conv를 3x3 conv 2번 해도 괜찮다는 의미인가..?
이건 차원이 아니라 size 축소인데...
다시 읽어봐도 아닌데.. 그냥 넘어가자.

4. Utility of Auxiliary Classifiers

GoogLeNet은 auxiliary classifier(보조 분류기)의 도입이 vanishing gradient 문제를 막아 도움이 된다고 했다.
실험해보니, 수렴에는 보조 분류기 있는 것과 없는 것이 아무런 차이를 보이지 않았다.
학습 끝에서, 있는 쪽이 약간 더 높은 정확도를 달성했다.

GoogLeNet에서는 2개의 보조 분류기를 사용했다.
아래쪽의 보조 분류기를 제거해도 최종 결과에 영향을 미치지 않은 것으로 보아, GoogLeNet의 가설이 틀렸다.
(가설 : 이 branch들이 low-level feature을 발전시키는데 도움됨)

대신 저자는 이러한 보조 분류기가 "regularizer"로써 작용한다고 주장한다.
이는 네트워크가 BN이나 dropout이 있을때 잘 작동하는 것이 근거라 한다.
(그게.. 근거가 되나?)
또 이는 BN이 regularizer 역할을 한다는 미약한 증거가 되기도 한다.
(그게 또.. 미약한 증거가 되나? 라는 의문이 생긴다)


Fig. 8, 마지막 17x17 layer의 최상위에 있는 보조 분류기 모습
BN을 사용하면 top-1 accuracy가 0.4% 증가했다.

5. Efficient Grid Size Reduction

Pooling을 먼저하고 conv를 하면, size가 작아져서 representational bottleneck이 생긴다.
(즉 담을 수 있는 정보가 작아진 채로 conv를 해서 소실된다는 뜻)
따라서 conv를 먼저하고(=filter를 먼저 늘리고) pooling을 하는 것이 맞다.
근데 그러면 컴퓨팅 비용이 너무 많아진다.

예를 들어 d×d×kd\times d\times kd2×d2×2k\frac{d}{2}\times\frac{d}{2}\times2k로 만든다고 하자.
여기서 dd2d\rarr\frac{d}{2}를 하지 말고, k->2k를 먼저 한다.
근데 그러면 연산량이 2d2k22d^2k^2라서 grid size 먼저 줄이는 연산량인 2(d2)2k22(\frac{d}{2})^2k^2보다 훨씬 많아진다.

사실 엄밀히 계산하면 다음과 같다. 먼저 filter size를 fxfx2k라 하자.
각 filter는 한 번의 움직임에 f x f 만큼 계산하고, 총 d x d x k 만큼(input size) 2k번(output channel) 계산한다.
따라서 2f2k2d22f^2k^2d^2가 된다.
상대적인 값인듯하다. 여기에서 참고했는데 이 부분은 잘못 계산하신 듯하다.

그렇지만, grid size를 먼저 줄이자니 (d2)2k(\frac{d}{2})^2k만큼의 representation이 되어 덜 효과적이다(Fig. 9 참고).

이를 위해 두개의 평행한 stride 2 block을 쓴다.
P와 C로 block을 지칭하는데, P는 pooling(maximum or average), C는 conv이다.
둘다 stride 2이며 Figure 10처럼 concatenate된다.


Fig. 10(좌측)을 보면 계산 비용도 저렴해지고 법칙 1(bottleneck 피하기)도 위반하지 않는다.

6. Inception-v2

자세한 구조는 Table 1에 있다.

7x7 conv를 3개의 3x3 conv로 교체했다.
3개의 traditional Inception을 35x35x288에 적용했다.
마지막에 section 5(2개의 평행 block 기법)의 방법으로 17x17x768로 축소된다.

다음은 Fig. 5(5x5->3x3 2개)의 방법으로 제작된 5개의 Inception이 따른다.
이는 Fig. 10(section 5의 방법)의 방법으로 8x8x1280으로 축소된다.

가장 축소된 8x8 level에서는, 2개의 Inception이 Fig. 6(비대칭 conv)의 방법으로 적용되었다.
Output은 2048의 filter로 concatenate되었다.

그러나 사실 이러한 변화는 section 2의 원칙들이 지켜진다면 안정적이었다.

논문의 네트워크가 42 layer의 깊이였지만, 컴퓨팅 비용은 GoogLeNet보다 오직 2.5배 높아졌다.
(근데 GoogLeNet은 22 layer 깊이니까.. 1.9배 깊어졌는데 2.5배 높아진거면 훨씬 높아진거 아닌가..?)
그리고 여전히 VGGNet보다 효율적이다(VGGNet은 19 깊이다.. ㅋㅋ).

7. Model Regularization via Label Smoothing

이 챕터에서는 label-dropout의 marginalized effect를 추정해 분류기 layer를 regularize하는 메커니즘을 제안할 것이다.

매번 training example x에 대해, model은 확률을 계산한다.

  • 각 label k{1...K}k \in \{1...K\}에 대해 p(kx)=exp(zk)i=1Kexp(zi)p(k|x) = \frac{exp(z_k)}{\sum_{i=1}^{K}{exp(z_i)}} 이다. 즉 softmax 함수를 통과한 확률이다.
    ziz_i는 logit이다(저렇게 처리되기 전 확률값, 즉 softmax 통과하기 전 값이라 생각하면 된다)
  • Label들에 대한 ground-truth distribution q(kx)q(k|x)에 대해 이를 normalize해서 kq(kx)=1\sum_kq(k|x) = 1이다.
    (즉 p는 model이 compute하는 확률, q는 ground-truth distribution이고 q는 합치면 1이 되도록 설정한다.
    Ground-truth 란 우리가 정한 정답, 즉 모델이 이 답으로 도출해주길 바라는 정답이다.
    따라서 그 정답에 대한 distribution을 q라 하자)
  • 편의상 p, q는 x에 대해 독립적이라 하자.
  • Example의 loss를 cross-entropy로 정한다 : l=k=1Klog(p(k))q(k)l = -\sum_{k=1}^Klog(p(k))q(k).
    (앞서 p(kx),q(kx)p(k|x), q(k|x) 등 조건부 확률을 정했다.
    여기서 쓰인 것은 p(k),q(k)p(k), q(k)로 모든 x에 대한 것을 더한 것이다.
    Cross-entropy 식을 살펴보자. Multi-class일 때의 식이다.
    q(k)q(k)는 이미 정해진 값이다. 왜냐하면 모델이 내야하는 정답은 정해져있다.
    그렇다면 저 loss를 최소화하려면 p(k)p(k)를 최대화시켜야 한다.
    근데 대체 어떻게 최소화시켜야할까.
    이 글을 참고하자.
    요약하자면, q(k)q(k)는 one-hot encoding되어 있어서 정답인 label에서 p(k)p(k)를 최대화시키면 된다(정답 확률을 높이면 된다는 말).
    사실 one-hot encoding이 아니라도, q(k)q(k)가 가장 클 때(정답일 때) p(k)p(k)를 최대화시키는 것도 같은 말이다.)
  • Loss를 최소화시킨다는 말은 정답 label의 log-likelihood를 최대화시킨다는 것이다.
  • Cross-entropy loss는 logit zkz_k에 대해 미분 가능해서 모델 학습에 gradient로 쓸 수 있다.
  • 미분해보면 lzk=p(k)q(k)\frac{\partial l}{\partial z_k} = p(k)-q(k)이고 이는 -1과 1 사이에 bound되어 있다.
    미분 방법은 이 영상을 참고하자.
    Soft-max 유도 과정은 이 사이트를 참고하자.
    (조만간 정리해봐야겠다.. 맨날 헷갈림)
    (-1~1 bound인 이유는 p, q가 모두 0~1 사이기 때문이다.)
  • Single ground-truth label y에 대해 q(y)=1,q(k)=0(ky)q(y)=1, q(k)=0 (\forall k\neq y)일 때,
    cross-entropy를 최소화하는 것은 correct labeldml log-likelihood를 최대화하는 것이다.

    (q가 one-hot encoding 되어있다는 말이다)
  • 특정 sample x의 label y에 대해, log-likelihood는 q(k)=δk,yq(k) = \delta_{k,y}에 대해 최대화하며,
    이때 δk,y\delta_{k, y}는 Dirac Delta 함수이다.

    (사실 논문에는 Dirac Delta라 되어있지만, 실제로는 Kronecker Delta 함수이다.
    Kronecker Delta 함수는 두 index가 일치하면 1, 아니면 0을 반환하는 함수이다.
    위의 설명은 sample x의 추정 output, 즉 index가 같도록 하는 것이 곧 최대화를 시킨다는 말이다)
  • Maximum은 한정된 zkz_k말고 zyzk(ky)z_y \gg z_k(\forall k\neq y)인 경우 될 것이다.
    즉 ground-truth에 해당하는 logit이 나머지 logit보다 훨씬 큰 경우 가능하다는 것이다.

    (정답 label의 logit이 왕창 커야한다는 말)
  • 그러나 이는 2가지의 문제가 있다.
    1) Over-fitting을 일으킬 수 있다.
    Model이 매 학습마다 ground-truth label에다가 full probability를 할당(확률 몰빵)하면 일반화 성능을 장담할 수 없다.
    2) 이는 largest logit과 다른 것들과의 차이를 크게 하고,
    lzk\frac{\partial l}{\partial z_k}가 bound되어 있기에 모델이 adapt할 능력을 떨어뜨린다.

이에 따라 저자는 모델이 less confident(덜 자신감있는, 즉 정답을 덜 확신하게 만드는)한 메커니즘을 제안한다.

바로 Label-smoothing regularization, LSR이다.
이는 log-likelihood를 최대화하는 것이 목적이라면 적합하지 않다.
다만 모델을 regularize하고 더 adaptable하게 하는 것이 목적이라면 적합하다.

방법을 살펴보자.
먼저 training example x와 독립적 분포를 가진 u(k)u(k)와 smoothing-parameter ϵ\epsilon 을 사용한다.
Ground-truth label이 y일 때, label distribution q(kx)=δk,yq(k|x) = \delta_{k,y}를 다음과 같은 식으로 대체할 수 있다.

q(kx)=(1ϵ)δk,y+ϵu(k)q'(k|x) = (1-\epsilon)\delta_{k,y} + \epsilon u(k)

(즉 기존의 label ground-truth 확률을 약간 낮추는 것)
이 논문에서는 u(k)=1Ku(k)=\frac{1}{K}인 uniform-distribution을 사용해 식은 다음과 같아진다.

q(kx)=(1ϵ)δk,y+ϵKq'(k|x) = (1-\epsilon)\delta_{k,y} + \frac{\epsilon }{K}

이걸 시각화해보면 아래의 이미지와 같아진다.

이미지 출처 : https://blog.si-analytics.ai/21

LSR은 가장 큰 logit이 더 커지는걸 방지한다(극단적 분포 완화).

LSR이 적용되면, q(k)q'(k)는 큰 cross-entropy를 가질 것이다.
왜냐하면 q(k)=δk,yq(k)=\delta_{k,y}와 달리, 모든 q(k)q'(k)는 positive lower bound가 있기 때문이다.
(cross entropy를 줄이려면 극단적으로 만들어야 하는데, 얘는 하한선이 있어서 일정 수준 이하로는 작아지지 않음)

LSR은 cross-entropy 방식으로 쓸 수 있다.

H(q,p)=k=1Klogp(k)q(k)=(1ϵ)H(q,p)+ϵH(u,p)H(q', p) = -\sum_{k=1}^Klogp(k)q'(k) = (1-\epsilon)H(q,p) + \epsilon H(u,p)

(수식 설명, H(a, b)는 cross-entropy 식으로 a와 b의 차이를 나타낸다.
q(k)=q(k)×(1ϵ)+ϵu(k)q'(k) = q(k)\times(1-\epsilon) + \epsilon u(k)이므로 대입하면

H(q,p)=k=1Klogp(k)((1ϵ)q(k)+ϵu(k))=(1ϵ)H(q,p)+ϵ(k=1Klogp(k)u(k))=(1ϵ)H(q,p)+ϵH(u,p)H(q', p) = -\sum_{k=1}^Klogp(k)((1-\epsilon)q(k)+\epsilon u(k)) \\= (1-\epsilon)H(q,p)+\epsilon(-\sum_{k=1}^Klogp(k)u(k)) \\=(1-\epsilon)H(q,p) + \epsilon H(u,p)

이다.

그러므로, LSR은 single cross-entropy loss H(q,p)H(q,p)를 pair of loss H(q,p),H(u,p)H(q,p), H(u,p)로 대체할 수 있다.
두번째 loss(H(u,p)H(u,p))는 prior u의 분포 p로 penalized된다.
(즉 u와 p 분포 차이만큼 패널티 받는다고 생각하면 될듯,
여기서 u는 uniform-distribution으로 설정했으니 p(모델이 계산한 확률분포)가 한 곳에 몰리면 큰 패널티를 받음)

이는 KL divergence로도 동일하게 측정 가능하다.

H(u,p)=DKL(up)+H(u)H(u,p) = D_{KL}(u||p)+H(u)

이고, H(u)H(u)가 고정되어 있어 DKL(up)D_{KL}(u||p)로만 평가된다.
(KL divergence는 대충 두개의 차이를 나타내는 지표라고 생각하면 된다)

실험에서 K=1000, u(k)=11000,ϵ=0.1u(k)=\frac{1}{1000}, \epsilon=0.1로 평가했다.
ILSVRC 데이터셋으로 top-1/top-5 error에서 약 0.2%의 발전을 볼 수 있었다.
(Table 3 참고)

8. Training Methodology

학습 방법은 다음과 같다.

  • Tensorflow의 distributed machine learning system으로 NVidia Kepler GPU에서 50 replica를 stochastic gradient로 학습했다.
  • Batch size = 32, epochs = 100
  • 초기에는 momentum(decay=0.9) -> 최고 성능은 RMSProp(decay=0.9, ϵ=1.0\epsilon=1.0)으로 달성
  • Learning rate = 0.045, 2 epoch마다 0.94의 비율로 지수적 감소
  • 2.0을 threshold로 gradient clipping -> 학습 안정화
  • 평가는 parameter의 running average로 했다

9. Performance on Lower Resolution Input

대표적 vision network의 사용은 detection의 classification이다(ex. Multibox).

Patch의 center part가 어떤 물체에 해당하는지 찾고, 그 물체의 class를 찾는 것이다.
어려운 점은 물체가 보통 작고 low-resolution라는 것이다.

일반적 방법은 higher resolution receptive field를 사용해 성능을 높이는 것이다.
그러나 큰 모델의 용량, 계산량의 효과와 resolution이 커져서 얻는 효과의 차이를 잘 알아야 한다.
모델 수정없이 input resolution만 바꾼다면 결국 컴퓨팅적으로 더 저렴한 모델을 더 어려운 과제에 사용하는 것이다.
이 경우 계산량이 줄어 느슨해진다(정확도가 낮아짐).

여기까지 요약.
보통 사용하는 과제가 물체 위치 파악 + 분류이다.
근데 물체가 일반적으로 작고 low-resolution이라 쉽지 않다.
한가지 해결책은 높은 resolution을 가진 receptive field로 성능 높이기.
근데 높은 resolution receptive field -> 용량 커짐
즉 모델이 커져서 좋은건지, receptive field가 커져서 좋은건지를 구분해야함.
이걸 모르고 그냥 high resolution 이미지를 쓰면 물체 더 잘 찾겠네? 하고
input resolution만 바꾸면 모델은 그대론데 resolution만 높아져서 모델이 혹사함.

여전히 계산량을 유지한채 어느정도까지 input resolution을 높이는게 도움될지 의문이다.
따라서 아래의 3가지 실험을 했다.
Input resolution은 바꾸면서 계산량은 유지했다.

    1. 299x299 receptive field, stride=2, max-pooling
    1. 151x151 receptive field, stride=1, max-pooling
    1. 79x79 receptive field, stride=1, pooling x

(여기서 말하는 것은 저 크기의 input을 의미하는 듯 하다.
Conv라기엔 79x79 conv는 너무 크다.
그냥 input을 3개의 크기로 한 후 결과를 분석한 듯 하다. 용어 설명좀 ㅠㅠ)

세 네트워크의 컴퓨팅 비용은 비슷하다(3번이 조금 더 저렴하지만, pooling은 1% 내외라 무시).


Small resolution network도 high resolution에 근접한 결과를 냈다.
다만 학습이 조금 더 오래 걸리긴 햇다.
만일 단순히 input resolution에 맞춰 네트워크를 줄이면 성능은 더 떨어질 것이다.
(근데 이건 parameter가 16배 적어져서 불공평)

10. Experimental Results and Comparisons

Table 3는 Section 6에 설명된 Inception-v2의 성능이다.
Table의 한 행은 위의 내용들을 축적해 적용한 것이다.


Table 3
예를 들어, 여기서 Inception-v2 Label Smoothing은
위의 RMSProp + Label Smoothing이다.
그래서 맨 아래의 행은 모두 다 적용된 "Inception-v3"이다.
이 결과는 single crop으로 평가되었다.


Table 4, Multi-crop 적용해서 single-model로 평가한 것

Label Smoothing, Factorized 7x7, BN-auxiliary(BN이 conv뿐만 아니라 FC에도) 등이 적용된 것이다.

모든 평가는 ILSVRC의 non-blackedlist 48238개로 했다.

50000개의 example(아마 test set인듯)에 대해서도 평가했고 결과는 top-5 error에서 0.1% 낮고, top-1 error에서는 0.2% 낮았다(worse).


Table 5, Multi-model ensemble을 multi-crop으로 평가한 것.

11. Conclusions

이 논문에서 저자는 design principle을 제시하고, Inception 구조를 연구했다.
그 결과 Inception-v3는 single crop으로 top-1/top-5 error를 21.2%/5.6%로 달성했다(SOTA).
4개의 Inception-v3 ensemble은 multi-crop 평가에서 top-5 error가 3.5%였다.
이는 타 논문들에 비해 획기적인 수치이다.

또 receptive field를 낮춰도(79x79) 높은 성능에 도달할 수 있었고, 이는 small object 감지하는 시스템에 도움될 것이다.
Convolution을 factorizing하는 법, 그리고 aggressive dimension reduction은 컴퓨팅 비용을 낮추며 동시에 성능도 높일 수 있음을 알게 되었다.

BN-auxiliary classifer로 규제하는 것, 그리고 label-smoothing은 또한 높은 성능을 가질 수 있게 해준다.

Reference

Paper
[1] https://sike6054.github.io/blog/paper/third-post/
[2] https://deep-learning-study.tistory.com/517
[3] https://imlim0813.tistory.com/33
[4] https://www.youtube.com/watch?v=YE1RDmymxkE

profile
개발 폐관수련중, ML, DL 무림 초보

0개의 댓글