post Image
MobileNets: CNNのサイズ・計算コストの削減手法_翻訳・要約

Screen Shot 2018-05-17 at 14.31.34.png

TL;DL

MobileNetsはDepthwise Separable Convolutionを用いることで、通常のCNNと比べて軽いネットワークを構築することがでる。また2つのハイパーパラメータである、width multiplierとresolution multiplierを導入することで、latencyとaccuracyを調節することができる。この技術を用いることで、性能や応答時間に制限があるモバイル上のアプリケーションなどにおいても認識や分類モデルへの応用が可能になる。

Screen Shot 2018-05-17 at 19.42.06.png

MobileNet Architecture

Depthwise Separable Convolution

  • depthwise separable convolutions
    • depthwise convolution
    • pointwise convolution (1×1 convolution)

という構造になっている。

たとえば、112 x 112 x 32という入力に対して、通常のCNNでは、3 x 3 x 32 x 64のカーネルを用いて畳み込みを行い、112 x 112 x 64の出力をする。(図1) 一方で、Depthwise Separable Convolutionでは、まず3 x 3 x (1) x 32のフィルタを用いて、depthwise convolutionを行う。この出力は、112 x 112 x 32のままである。次に、1 x 1 x 32 x 64のフィルタを用いて、pointwise convolutionを行う。この出力が56 x 56 x 64になる。(図2)

Screen Shot 2018-05-21 at 22.09.16.png
図1: 通常の畳み込みイメージ

Screen Shot 2018-05-21 at 22.12.44.png
図2: depthwise separable convolutionsのイメージ

また、入力の特徴マップサイズを$D_{F} · D_{F} · M$、出力の特徴マップサイズを$D_{F} · D_{F} · N$、カーネルのサイズを$D_{K} · D_{K} · M · N$とすると、通常の畳み込みの計算コストは、

D_{K} · D_{K} · M · N · D_{F} · D_{F} = D_{K}^2MND_{F}^2

である。一方で、depthwise convolutionでは、チャネル方向への畳み込みを行わないため、$M = 1$であり、計算コストは、

D_{K} · D_{K} · N · D_{F} · D_{F} = D_{K}^2ND_{F}^2

また、pointwise convolutionでは、空間方向の畳み込みを行わないため、$D_{K} = 1$であり、計算コストは、

M · N · D_{F} · D_{F} = MND_{F}^2

よって、Depthwise Separable Convolutionでは、計算コストは、

D_{K}^2ND_{F}^2 + MND_{F}^2 = (D_{K}^2 + M)ND_{F}^2

通常の畳み込みに比べて、Depthwise Separable Convolutionは、

\frac{(D_{K}^2 + M)ND_{F}^2}{D_{K}^2MND_{F}^2} = \frac{1}{M} + \frac{1}{D_{K}^2}

だけ、計算コストが削減できている。上の例では、$M = 32$、$D_{K} = 3$であるから、約9倍ほど計算コストが削減されることがわかる。

このようなやり方を取ることで、通常の畳み込みと比べて計算コストとモデルのサイズをかなりの度合いで小さくすることができる。

NNの構造とtraining

MobileNetの構造はTable1に示されている。全ての層がBatch NormalizationとReLUにしたがっており、最後の層は分類のためにSoftmaxが使われている。

Table2でわかるように、MobileNetはその計算のほとんどpointwise convolutionが占めている。

Figure3で、通常のCNN(左)とMobileNet(右)のNNの層の構成が示されている。

Screen Shot 2018-05-18 at 0.07.39.png

Screen Shot 2018-05-18 at 0.07.44.png

Width Multiplier: Thinner Models

上記で示したような、基本のMobileNetの構造でもすでに小さく、latencyも低いが、さらに小さく、速く動作するような構造が要求される場合もある。このような要求に応えるために、width multiplierと呼ばれるパラメータαを導入する。その結果、それぞれの層で、ネットワークを小さく揃えることが可能になる。

例えば、width multiplierであるαを導入すると、入力チャネル数MαMに、出力チャンネル数NαNになる。また、αα ∈ (0, 1]の範囲を取り、一般的には、1, 0.75, 0.5, 0.25が用いられる。

Resolution Multiplier: Reduced Representation

次に、計算コストを削減するためのハイパーパラメータとしてresolution multiplierと呼ばれるパラメータρを導入する。これにより、各層の入力画像とその内部表現を削減することが可能になる。

例えば、resolution multiplierであるρを導入すると、入力画像の大きさDfρDfに、出力画像の大きさDfρDfになる。また、ρρ ∈ (0, 1]の範囲を取る。

以下のTable3では、入力特徴マップサイズ14 × 14 × 512、カーネルサイズ3×3×512×512の時の、通常のCNNと、MobileNet、さらにハイパーパラメータαρを導入した時の計算量とパラメータ数が比較されている。

Screen Shot 2018-05-18 at 14.00.13.png

Experiments

以下では、MobileNetの性能を様々に比較していく。

Model Choices

Table4では、全てConvolutionを使ったMobileNetとDepthwise Separable Convolutionを一部使ったMobileNetの性能を比較している。後者は、Multi-AddsもMiParametersも大きく減っているのに対して、Accuracyは1%ほどしか減っていないことがわかる。これにより、Depthwise Separable Convolutionを用いることで、通常の計算コストを大きく抑えながら同程度の精度が出せることがわかる。

またTable5では、width multiplierを導入した場合と、Table1のうちある1つの層を取り除いてShallow(浅くした)構造で比較をしている。どちらも計算コストを抑えるが、精度は3%ほど前者の方が高くなっている。

Screen Shot 2018-05-18 at 14.12.43.png

Model Shrinking Hyperparameters

Table6では、width multiplier αによる、精度と計算コストのトレードオフの関係が示されている。αを小さくすればするほど、計算コストは抑えられるが、その分精度は下がっている。

またTable7では、resolution multiplier ρによる精度と計算コストのトレードオフの関係が示されている。これもwidth multiplierと同様に、ρを小さくすればするほど、計算コストは抑えられるが、その分精度は下がっている。

Screen Shot 2018-05-18 at 14.22.02.png

Figure5では、width multiplier α ∈ {1, 0.75, 0.5, 0.25}resolutions {224, 192, 160, 128}とハイパーパラメータを設定した時の精度と計算コストの関係を示している。

Screen Shot 2018-05-18 at 14.27.32.png

Reference


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。