CapsNet
従来はスカラーを流していたものをCapsulesという「ベクトル」にした
層間のCapsulesの結合をできるようにした
データ拡張なしにMNISTのテストエラー0.25%を達成した Capsuleとは
画像内のオブジェクトの情報
オブジェクトの形や位置を示す
ベクトルのようなもの
大きさや向きでオブジェクトの存在や向きを表現
ベクトルが流れるニューラルネット内のニューロン
ニューロンの集合
カプセルには仮想からの空間情報が保存される
画像特徴の場所が変化する時、認識の結果は変わらないが、空間情報が変わる
プセルのおかげ得たもの
capsule → オブジェクト
大きさ → 存在確率
向き → 特徴のプロパティ(方向やスケール、照明条件など、特徴の状態)
位置 → 位置
例えば以下の画像ではCNNはどちらも「人間」と分類する
なぜならどちらにも目や鼻があるから
しかし、CapsNetは左は人間とは答えない
https://gyazo.com/5f61b38ab2e1aa3c24ffa95522cdd42b
https://gyazo.com/d22e89fde9d08eed710009c1b77b25ea
各ニューロンがベクトルになっている
バイアス項を用いていない
プーリング層をdynamic routingというものに置き換えている
従来の関数と違い、squash関数を入れ、データを圧縮している
Affine変換で、低いレベルのカプセル(目鼻口)と、高いレベル(顔)のカプセルを結びつけている(?)
と、書かれていることが多いが数式を見てもよくわからないmrsekut.icon
バイアス項がないのはなぜか
疑問
バイアス項がないと表現の幅が狭まりそうだがどうなのか
ベクトル*スカラーより、ベクトル*ベクトルの方が良さそうだがなぜそうしないのか
ベクトル×スカラーより、ベクトル(アダマール積)ベクトルの方が良さそうだがなぜそうしないのか
ベクトルに個別の値をかけると、ベクトルの向きや大きさも変わってしまうので、一つのベクトルには一つのスカラーをかける
weightingのところは似た者同士の場合、値が大きくなる
似た者同士とはベクトルの向きが似ている。
内積を取ると大きくなる
結びつきが強そうなcupsule間の係数cがどんどん1に、そうでない係数は0に近づく
dynamic routingとは
小カプセルの出力に重みをかけたものと親カプセルの出力の内積を取り、カプセルが揃っている親の方へ出力を受け渡すようにするもの
重みに関しては誤差逆伝播法で学習
小カプセルと親カプセルの結びつきに関しては自動的にupdateされる
モデル
入力層
Primary Capsule Layer
際にオブジェクトが存在している位置のカプセルが大きくなる(ちょっとイミフだが出典はGIGAZINE)
Routing Capsule Layer
復数のカプセルを組み合わせて、複雑なオブジェクトを検出する層
Routing by Agreementと呼ばれるアルゴリズムを用いる
inとoutの内積値で低次カプセルから高次カプセルへの値の受け渡しを記述
https://gyazo.com/e00ff37a69ce9d441c2871cc5d84fb80
wにはLow-Layerから入力された特徴の空間情報を保存する
カプセルの重みcは、従来のCNNの重みのイメージ
cの学習は誤差逆伝播法ではなく、DynamicRoutingの新しい手法を用いている
Convolution
Caps Net
digit caps
output
Loss
margin loss
Tkは正解の場合は1,不正解の場合はわからないけど多分0~0.999のなかのどれか
入力xはvノルム
出力はmargin loss
λがあるおかげで「オブジェクトがある方向に自信がある場合」の方が「オブジェクトがない方向に自信がある場合」よりもlossを小さくしようとしている
reconstruction loss
MSE
affNistデータセットを用いた検証の結果、CapsNetの方が変換に対してロバストである
数字が重なったデータセットMultiMNISTを用いた検証の結果、良い感じにらべるづけできた →なんで?
データ量は少なくても良い精度が出るが、計算は時間がかかる?
CIFAR10はよい精度がでなかったらしい→ 論文
疑問
gigazineの矢印の図は1ピクセルごとにあるの?
CapsNetでは画像のかさ増し時に回転させるとおかしくなるの?
実装
TensorFlow
PyTorch
参考
コレ以外の参考
勉強会時のスライド
黒いノート
参加した論文輪読会