Slide 1

Slide 1 text

Convolutionの数理とアルゴリズム 2017/08/31 中村晃一 (@9_ties)

Slide 2

Slide 2 text

Convolutional Neural Network • Convolutional Neural Network (CNN)はDeep Neural Networkの主要なアーキテク チャの一つ 画像: http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/

Slide 3

Slide 3 text

代表的なアルゴリズム 1. Direct: 定義通り 2. im2col, col2im: 行列乗算(GEMM)に帰着 3. 高速畳み込みアルゴリズム • FFT • Winograd • など • テンソルのレイアウトや 具体的な実装方法も考えると 多数の選択肢がある • DIRECT • IMPLICIT_GEMM • IMPLICIT_PRECOMP_GEM M • GEMM • FFT • FFT_TILING • WINOGRAD • WINOGRAD_NONFUSED 例: cuDNN v7で実装されているForward propagation http://docs.nvidia.com/deeplearning/sdk/pdf/cuDNN-Library- User-Guide.pdf, P18

Slide 4

Slide 4 text

トレードオフ • 演算器の性能、メモリ・キャッシュの性能 によって最適なアルゴリズムが変わる cuDNNの場合 http://docs.nvidia.com/deeplearning/sdk/ pdf/cuDNN-Library-User-Guide.pdf, P18

Slide 5

Slide 5 text

トレードオフ • 場面によっても最適なアルゴリズムが変わる • 学習時: • バッチサイズ大きめ • Input Dataは固定 • Weightは頻繁に更新 • 推論時: • バッチサイズ小さめ(1とか) • Input Dataは毎回変わる • Weightは固定 入口側 • inputサイズ大きめ • チャンネル少なめ 出口側 • inputサイズ小さい • チャンネル多め 同じConvolutionでも層によって特徴が異なる(resnetの場合) https://wiseodd.github.io/techblog/2016/10/13/residual-net/

Slide 6

Slide 6 text

本日の内容 • 下記4種のアルゴリズムについて数学的な所の解説をします 1. Direct 2. Im2col 3. FFT 4. Winograd • Forward Propagationについてのみ解説します • Convolution層のbackpropagationもconvolution計算が主になるので大体同じ

Slide 7

Slide 7 text

1-D convolution • (注: 数学的なよくあるconvolutionとはちょっと異なります。後述。) × × × Σ input weight output

Slide 8

Slide 8 text

1-D convolution • (注: 数学的なよくあるconvolutionとはちょっと異なります。後述。) × × × Σ input weight output

Slide 9

Slide 9 text

1-D convolution • (注: 数学的なよくあるconvolutionとはちょっと異なります。後述。) × × × Σ input weight output

Slide 10

Slide 10 text

1-D convolution • (注: 数学的なよくあるconvolutionとはちょっと異なります。後述。) × × × Σ input weight output

Slide 11

Slide 11 text

padding • 端を0 (など) で埋める。入出力サイズを同じにする等の目的で使用 0 × × × Σ input weight output 0

Slide 12

Slide 12 text

stride • 入力サイズを小さくする為に使用 0 × × × Σ input weight output 0 stride=2

Slide 13

Slide 13 text

2-D convolution × Σ

Slide 14

Slide 14 text

2-D convolution × Σ

Slide 15

Slide 15 text

2-D convolution × Σ

Slide 16

Slide 16 text

2-D convolution • 3-D, 4-D, …も同様。 × Σ

Slide 17

Slide 17 text

CNNのConvolution層 • これにBatch, Input Channel, Output Channel, Biasが加わる ×N ×N

Slide 18

Slide 18 text

CNNのConvolution層 • (話を簡単にする為、以後Padding=(FH-1,FW-1), stride=1とします) ×N ×N , , , = ෍ =0 −1 ෍ =0 −1 ෍ =0 −1 , + , + , [ , , , ] + [ ]

Slide 19

Slide 19 text

Direct Algorithm: 定義通りの計算 O[:, :, :, :] = 0 for n = 0..N-1 for y = 0..H-1 for x = 0..W-1 for cout = 0..Cout-1 for fy = 0..FH-1 for fx = 0..FW-1 for cin = 0..Cin-1 O[n, y, x, cout] += I[n, y+fy, x+fx, cin] * W[cout, cin, fy, fx] O[n, y, x, cout] += b[cout] , , , = ෍ =0 −1 ෍ =0 −1 ෍ =0 −1 , + , + , [ , , , ] + [ ]

Slide 20

Slide 20 text

計算量 • 入力サイズ(padding前): • 出力サイズ: • Weightサイズ: • 乗算回数: • 加算回数: F + O[:, :, :, :] = 0 for n = 0..N-1 for y = 0..H-1 for x = 0..W-1 for cout = 0..Cout-1 for fy = 0..FH-1 for fx = 0..FW-1 for cin = 0..Cin-1 O[n, y, x, cout] += I[n, y+fy, x+fx, cin] * W[cout, cin, fy, fx] O[n, y, x, cout] += b[cout]

Slide 21

Slide 21 text

計算例 N H W FH FW Cin Cout InSize OutSize Weight MAC Ops 1 56 56 3 3 64 64 201K 201K 37K 231M 1 28 28 3 3 128 128 100K 100K 147K 231M 1 14 14 3 3 256 256 50K 50K 590K 231M 1 7 7 3 3 512 512 25K 25K 2M 231M 256 56 56 3 3 64 64 51M 51M 37K 59,190M 256 28 28 3 3 128 128 26M 26M 147K 59,190M 256 14 14 3 3 256 256 13M 13M 590K 59,190M 256 7 7 3 3 512 512 6M 6M 2M 59,190M N Input Output InSize OutSize Weight MAC Ops 1 2048 1000 2K 1K 2M 4M 256 2048 1000 524K 256K 2M 1,049M Convolution層 (ResNetから持ってきた例) FC層 (ResNetから持ってきた例)

Slide 22

Slide 22 text

Im2col: 行列乗算に帰着する方法 input weight

Slide 23

Slide 23 text

Im2col: 行列乗算に帰着する方法 input weight

Slide 24

Slide 24 text

Im2col: 行列乗算に帰着する方法 input weight

Slide 25

Slide 25 text

Im2col: 行列乗算に帰着する方法 input weight

Slide 26

Slide 26 text

Im2col: 行列乗算に帰着する方法 input weight

Slide 27

Slide 27 text

Im2col: 行列乗算に帰着する方法 input weight

Slide 28

Slide 28 text

im2col: 行列乗算に帰着する方法 input weight

Slide 29

Slide 29 text

• Pros • チューニングされたGEMM実装が多くの環境で手に入る • Cons • 再配置を行う場合には、Inputサイズが 倍に増加 im2col: 行列乗算に帰着する方法

Slide 30

Slide 30 text

高速畳み込みアルゴリズム • im2colでは演算回数は変化しない • 高速畳み込み(fast convolution)は演算回数を減らす手法 • 信号処理や数式処理システムなどの分野で多数の研究がある • CNNでは以下の特徴があり、依然はあまり使えなかったアルゴリズムが有用にあっ たりする • 小さいサイズ(3x3など)のConvolutionが多用される • 入出力に多数のチャンネルがある

Slide 31

Slide 31 text

畳み込みと多項式乗算 • = 0 + 1 + 2 2 + 3 3と = 0 + 1 + 2 2を掛けると = 0 0 + 0 1 + 1 0 + 0 2 + 1 1 + 2 0 2 + 1 2 + 2 1 + 3 0 3 + 2 2 + 3 1 4 + 3 2 5

Slide 32

Slide 32 text

畳み込みと多項式乗算 • = 0 + 1 + 2 2 + 3 3と = 0 + 1 + 2 2を掛けると = 0 0 + 0 1 + 1 0 + 0 2 + 1 1 + 2 0 2 + 1 2 + 2 1 + 3 0 3 + 2 2 + 3 1 4 + 3 2 5 • これとinput: (0,0, 0 , 1 , 2 , 3 , 0,0)、weight: (2 , 1 , 0 )の畳み込みは等価 × × × Σ input weight output 0 0 0 1 2 3 0 0 2 1 0

Slide 33

Slide 33 text

畳み込みと多項式乗算 • = 0 + 1 + 2 2 + 3 3と = 0 + 1 + 2 2を掛けると = 0 0 + 0 1 + 1 0 + 0 2 + 1 1 + 2 0 2 + 1 2 + 2 1 + 3 0 3 + 2 2 + 3 1 4 + 3 2 5 • これとinput: (0,0, 0 , 1 , 2 , 3 , 0,0)、weight: (2 , 1 , 0 )の畳み込みは等価 input weight output 0 0 0 1 2 3 0 0 × × × Σ 2 1 0

Slide 34

Slide 34 text

畳み込みと多項式乗算 • = 0 + 1 + 2 2 + 3 3と = 0 + 1 + 2 2を掛けると = 0 0 + 0 1 + 1 0 + 0 2 + 1 1 + 2 0 2 + 1 2 + 2 1 + 3 0 3 + 2 2 + 3 1 4 + 3 2 5 • これとinput: (0,0, 0 , 1 , 2 , 3 , 0,0)、weight: (2 , 1 , 0 )の畳み込みは等価 input weight output 0 0 0 1 2 3 0 0 × × × Σ 2 1 0

Slide 35

Slide 35 text

Discrete Convolution 有限列に対する1D discrete linear convolution 複素数列 = 0 , 1 , … , , = (0 , 1 , … , )のDiscrete Convolution ∗ を以下によって定める ∗ = ෍ += ( = 0, … , + ) 例: = 1,2,3 , = (1, −1)の時 ∗ = 1 ⋅ 1,1 ⋅ −1 + 2 ⋅ 1, 2 ⋅ −1 + 3 ⋅ 1, 3 ⋅ −1 = (1, 1, 1, −3)

Slide 36

Slide 36 text

高速畳み込みアルゴリズムとは • つまり 多項式 , ()の積 ()を高速に計算するにはどうすれば良いか? という問題

Slide 37

Slide 37 text

Coefficient Representation • 多項式を係数列で表現する 例 = 1 − − 22 + 3 + 24のCoefficient Representationは (1, −1, −2, 1, 2)

Slide 38

Slide 38 text

Point-Value Representation • 点と値の組で表現する • 点の取り方によって無数の表現がある 例 = 1 − − 22 + 3 + 24の = 0, 1, −1, 1 2 , − 1 2 に関する Point-Value Representationは (1, 1, 1,1/4, 1) Unisolvence定理 相異なる0 , 1 , … , に対して標本点 0 , 0 , … , ( , )が与 えられた時、 = 0, … , に対して = を満たす次以下の多項式は常に存在し、一意である

Slide 39

Slide 39 text

Coefficient Representationでの積は大変 • Coefficient Representation (0, 1 , 2 , 3 ) と(0 , 1 , 2 ) の積は (0 0 , 0 1 + 1 0 , 0 2 + 1 1 + 2 0 , 1 2 + 2 1 + 3 0 , 2 2 + 3 1 , 3 2 ) • 次式と次式に対して( + 1)( + 1)回の掛け算 = 0 + 1 + 2 2 + 3 3, = 0 + 1 + 2 2 = 0 0 + 0 1 + 1 0 + 0 2 + 1 1 + 2 0 2 + 1 2 + 2 1 + 3 0 3 + 2 2 + 3 1 4 + 3 2 5

Slide 40

Slide 40 text

Point-Value Representationでの積は簡単 • = 0 , 1 , 2 , 3 , 4 , 5 でのPoint-Value Representation (0 , 1 , 2 , 3 , 4 , 5 )と(0 , 1 , 2 , 3 , 4 , 5 ) • の積は (0 0 , 1 1 , 2 2 , 3 3 , 4 4 , 5 5 ) • 次式と次式に対して + + 1回の掛け算

Slide 41

Slide 41 text

Point-Value Representationを用いた高速乗算法 Coefficient Representation Coefficient Representation Point-Value Representation Point-Value Representation Evaluation Interpolation Element-Wise Multiplication Convolution

Slide 42

Slide 42 text

Point-Value Representationを用いた高速乗算法 Coefficient Representation Coefficient Representation Point-Value Representation Point-Value Representation Evaluation Interpolation Element-Wise Multiplication Convolution 表現間の変換を高速にできるならば、Direct Convolutionよりも高速になる (ここでの”高速”は演算回数という意味で)

Slide 43

Slide 43 text

Coefficient Rep. → Point-Value Rep. • = 0 + 1 + 2 2→ 0 , 1 , 2 , 3 = ( 0 , 1 , 2 , 3 ) Point-Value Representation Coefficient Representation Vandermonde Matrix

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

Coefficient Rep. → Point-Value Rep. • = 0 + 1 + 2 2→ 0 , 1 , 2 , 3 = ( 0 , 1 , 2 , 3 ) 表現長に対して(2)なので速くない

Slide 46

Slide 46 text

高速フーリエ変換 • 標本点として1のn乗根を使用すると Evaluation, Interpolationを高速に計算する事ができる 1の原子n乗根をとすると、1のn乗根は 1, , 2, 3, … , −1

Slide 47

Slide 47 text

高速フーリエ変換の簡単な説明 • 同じ値同士の積が出てくる • これをnが2の冪の時はこれを再帰的にう事ができ演算量を減らす事ができる • 2 → ( log ) • フーリエ逆変換も同様に( log )となる

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

CNN ConvolutionをFFTで行う流れ • Input, WeightをFFT • それぞれ • + − 1 + − 1 • + − 1 + − 1 • 以上に増加 • (Real-Valued FFTを使うとこの半分) • Input, Weightのどちらかは Precomputeしておくことができる • 計算量 • FFT, IFFTは(? log ) のオーダー • Element-Wise Multiplicationは 4 + − 1 + − 1 Inverse FFT + 不要部分の除去 Padding + FFT

Slide 50

Slide 50 text

Tiling • , は小さな値(3など)の事が多いので、メモリ使用量の増大が著しい • 例えば = = 56, = = 3の場合3 × 3が64 × 64 (2べきに切り上げる為)になるので455倍 • 入力側を適当にタイリングして、結合するもしくは重なる部分を足す(Overlap-Add 法) 例えば2x2のタイルずつに区切ってFFTで計算

Slide 51

Slide 51 text

Winograd Algorithm • FFTは複素領域でやるので乗算回数は減るが、 1回の乗算の計算量が4倍になるのであまりうれしくない • WinogradがMinimal Filtering Algorithmという乗算回数が最小になるアルゴリズムを発明

Slide 52

Slide 52 text

別にPoint-Value Representationでなくても良い Coefficient Representation Coefficient Representation 何らかのRepresentation 何らかの Representation 何らかの速く計算できる 線形変換 Element-Wise Multiplication Convolution • 最終的に辻褄が合えば何でも良い • 良い変換を頑張って探す 何らかの速く計算できる 線形変換

Slide 53

Slide 53 text

winograd algorithm: F(2x2, 3x3) • 4x4のタイルから、3x3のカーネルで畳み込んで、2x2のタイルを作る操作を単位とす るアルゴリズム • 6x6タイル、3x3カーネルから4x4タイルを作るF(4x4, 3x3)や 8x8タイル、3x3カーネルから6x6タイルを作るF(6x6, 3x3)など色々ある • 詳しくは→ https://arxiv.org/abs/1509.09308 及び https://github.com/andravin/wincnn

Slide 54

Slide 54 text

• 定義通りにやると、出力1 pixel, 1 channel,の計算に • 3x3xCin = 9Cin回の乗算 • 3x3xCin = 9Cin回の加算 • が必要。 • これが4 pixel, Cout channel分なので • 36CinxCout回の乗算 • 36CinxCout回の加算 • が必要

Slide 55

Slide 55 text

F(2x2, 3x3)のアルゴリズム 1. 事前に、4x3変換行列を使ってをCoutxCinx4x4 テンソル′に変換しておく 2. 入力を4x4変換行列で4x4xCinテンソル′に変換する 3. ′と′の要素毎の積を取り、チャンネルに関して足し込む(4x4のタイルがCout個出来 る) 4. 出来た4x4タイルを4x2変換行列で2x2タイルにする 計算量 ステップ2. 加減算32Cin回で可能 ステップ3. 4x4xCinxCout=16CinxCout回の乗算、 同じ回数の加算 ステップ4. 加減算36Cout回で可能

Slide 56

Slide 56 text

中国剰余定理 • 一般的な定理とは別の形の物を使います を整数、1 , … , を互いに素な整数とした時、 = 1 ⋯ とおくと = ෍ (/ ) (mod M) 但し = mod(, ), = −1 (mod )

Slide 57

Slide 57 text

例: • = 1234, 1 = 7, 2 = 13, 2 = 16とすると 1 = mod 1234, 7 = 2 2 = mod 1234, 13 = 12 3 = mod(1234, 16)=2 1 = 13 ⋅ 16 −1 = 5−1 = 3 (mod 7) 2 = 7 ⋅ 16 −1 = 8−1 = 5 (mod 13) 3 = 7 ⋅ 13 −1 = 11 = 3 (mod 16) なので 1 1 13 ⋅ 16 + 2 2 7 ⋅ 16 + 3 3 7 ⋅ 13 = 8514 となり8514 = 1234 (mod 7 ⋅ 13 ⋅ 16)だから確かに成立。 modular inverseの計算はmaximaなどの 数式処理系を使えば楽

Slide 58

Slide 58 text

(2,3)の導出 • 今の定理は多項式環でも成立する。 • 例として先程やったconvolution , , , ∗ , , = [ + + , + + ] に対応するwinograd algorithmを導いてみる。 • これは3 pixelのフィルタで2 pixel作り出すので(2,3)と呼ばれる 紹介した論文にあるこれ→ を導出してみる

Slide 59

Slide 59 text

• = + + 2 + 3, = + + 2と置く • ()の2, 3の項を見れば良いのだけど、これは5次で次数が高くて面倒だが = + + + 3と変形して ℎ() = + の部分のみを中国剰余定理で計算すれば良い • 1 = , 2 = − 1, 3 = + 1とおくと ℎ1 = mod(ℎ , ) = ℎ2 = mod(ℎ , − 1) = ( + )(1) ℎ3 = mod(ℎ , + 1) = − (−1) 1 = − 1 + 1 −1 = −1 (mod ) 2 = + 1 −1 = 1/2 (mod − 1) 3 = − 1 −1 = 1/2 (mod + 1) • 従って中国剰余定理より ℎ = ℎ1 1 − 1 + 1 + ℎ2 2 + 1 + ℎ3 3 − 1 = − − 1 + 1 + 1 2 + 1 + 1 + 1 2 − −1 − 1 (mod − 1 ( + 1)) • ℎ()は3次式だから両辺の3の係数を比べると ℎ = − − 1 + 1 + 1 2 + 1 + 1 + 1 2 − −1 − 1 + ( − 1)( + 1) という等式を得る

Slide 60

Slide 60 text

• さて = + ℎ + 3()なので • 2の係数 (出力1つ目)は + 1 2 + 1 − 1 2 − −1 − = − + 1 2 + 1 − 1 2 − (−1) • 3の係数(出力の2つ目)は − + 1 2 + 1 + 1 2 − −1 + = 1 2 + 1 + 1 2 − −1 − − • 1 , (−1)に関する積は2式で共通だからこの右辺は4回の乗算で計算出来る • という事でhttps://arxiv.org/pdf/1509.09308.pdfの式(5)が導出出来た。(終わり) • 先程の“ = + + + 3と変形”の意味だけど、直感的に説明すると 右図の2回の畳み込みにおいて共通して参照されるのが, だから、 この部分とフィルタの積をどう工夫するかを考えれば良いという話。 • だから(3,3) (入力5 pixel,フィルタ3pixel)の場合には = + + + 2 + 4 みたいにして4 = − 2なんかを追加すると(2)に関する項が出てきて 同じような計算が出来る。 • この辺はVandermonde matrixを使うと楽に書けるとか、Cook-Toom Filterで 同じ物が出てくるとかそういう話はあるみたい

Slide 61

Slide 61 text

CNN特有の疑問 • 例えばビット数を減らす量子化技術などがあるが、 Int8や1 bitの空間上で同様の高速畳み込み算を考える事は可能か? • 多項式乗算と異なり、近似計算も許容できる事が多い。 • 多少の近似を許容した場合に更に高速な畳み込みは可能か?

Slide 62

Slide 62 text

まとめ • いくつかのConvolutionの計算法を紹介しました • Direct • Im2col • FFT • Winograd • それぞれトレードオフがあり、状況に応じて使い分けていく事が重要 • Deep Learningの文脈でFast convolution algorithmの研究は まだそんなに行われていないと思います • 計算代数や関数解析などの人達に是非Deep Learning分野に参入していただきたい