Ryuz's tech blog

FPGAなどの技術ブログ

ミップマップを使ったIIRフィルタライクなRNNを考える

はじめに

先日 Twitter に書いた内容ではあるのですが、ミップマップ構造を使ったIIRフィルタライクなRNNネタを備忘録程度にまとめておきます。

ミップマップについてはWikipediaの記事などを見て頂ければと思いますが、CGなどでテクスチャマッピングを行うときにスケールに合わせてエイリアシングが起こりにくいスムーズな補間を行うのに用いられます。

重要な特性として「1/4 + 1/16 + 1/32 + 1/64 + 1/256 + … が1/3に収束する」という部分でして、元画像の処理に対して、余分に1/3のメモリ量と処理量を用意しておけば無限の深さまで処理できることです。

一方で、CNN(Convolutional Neural Network)においては、その本質が畳み込みフィルタなので、フィルタ1個では狭いエリアしか認識できないという事です。この問題を解決するために Pooling 層があり、U-Net に代表されるような階層的に縮小することで広いエリアを認識する機構が提案されていたりもするわけです。

当サイトの提唱するLUT-Netでは、ナノ秒単位で処理できるLUTの積層で高帯域を処理することを目的としていますのでRNN(Recurrent Neural Network)使って、もっとIIRフィルタのような事が出来ないかと考えていとこころ、IIRで保存していくデータをミップマップ構造にすれば、フィルタ1個でマルチサイズの認識ができるのでは?」という着想に至ったわけです。

まあこんなこと既にエライ誰かが考えているかもしれませんが、一般の高度な深層学習は 15~30fps ぐらいで「こんなすごいことができた!」というものも多く、そもそも kHz ~ MHzの帯域でいろいろやっている話もあまり聞かない気がします。

FPGAみたいに固定レートで処理できる世界でサンプリングレートが固定で、高周波数だから成り立つIIRフィルタみたいな事を、最新技術でいろいろやれたら面白いなと思う次第です。

ご存じの通り当サイトではLUT-NetでkHz級の画像認識やってますので 1/1 -> 1/4 -> 1/16 -> 1/32 -> 1/16 -> 1/4 -> 1/1 と 1/32 スケールまで見ても、7ms しかかからないわけで、普通のカメラの1フレーム期間より短い時間で終わるわけです。

そもそもIIRは固定サンプリングレートが基本ですので、この辺が突き詰めていくとFPGAでしか成立しないよりコンパクトでスケーラブルな新しいニューラルネットにならないかなと思ってみたりする次第です。

とりあえずPyTorchでやってみた

残念ながら、当方の BinaryBrain は RNN やることをあまり考えずに作られているので、RNNの学習をやろうとするといろいろ工夫が必要で、メモリ効率も考えるとプラットフォーム自体を改修した方が良さそうです。なので、まずはPyTorch使って普通の FP32 で DenseAffine な深層学習で実験してみます。

試しに作ったネットがこんな感じですね。

f:id:Ryuz88:20210717093655p:plain
イデアの概要図

ミップマップを1段スケールダウンする層と、ミップマップを1段スケールアップする層と、それらを concatenate して新しいミップマップを作る層です。

最上位の 1/1 スケールの層だけ別枠で処理しています。 これは、最終的にFPGAに実装するときの帯域が 1 + 1/3 となるので、どっちみち2並列は必要で、どうせ2並列ならそれぞれ個別に学習した方がお得だろうという考えです。

結果として、MNISTの手書き数字のセマンティックセグメンテーションはできそうです。

f:id:Ryuz88:20210717095722p:plain
PyTorchでの学習結果画像

そもそもの認識の目標を考えると、見た目のサイズの小さいものも大きいものも等しく認識したいわけだから、U-Net 構造の各階層は本質的には同じものの筈で、じゃあ「同じ層を1個学習させて全部のスケールで共通に使おうよ」と言うのは成り立ってもおかしくないと思います。とりあえずMNISTではななんとかなってるようです。

あとは本当は適用する相手は動画で、少しづつ変化していくので、RNNの学習データを少し時系列でランダムウォークさせるとかすると、動き追従するような機能も自動で学習してくれないかなとかも思っていたりします。

FPGA 実装時の構造を考える

FPGAに実装するとしたらこんな感じかなと思っています。もちろん今の PyTorch の FP32 の DenseAffine なんて回路規模が入り切れるわけはないので、バイナリ化+超Sparse化できる LUT-Network への蒸留がうまくいったとしての話ですが、とりあえず絵に描いた餅を貼っておきます。

f:id:Ryuz88:20210717095936p:plain
FPGA実装時の構造案

まだまだ先が長いですが、こんなものができると面白いですね。

おわりに

ViT(Vision Transformer)とかが熱い昨今CNNはオワコン化しかねない(?)ですが、その特性がフィルタなので、IIRフィルタのような使い方をすれば延命ワンチャンあるかも、ってことで、ハードリアルタイム保証の必要な手堅い分野に展開できないかなとか思いながらあれこれ考えを巡らせております。

一方で、最近の新しいネットワークは、いろんな新しいアイデアが次々投入され、どんどん複雑かつ高度になっていますね。ある意味人間の知恵の投入比率がどんどん増えているので、これはもう深層学習を使ったルールベース開発なんじゃなかろうかとも思っています(このアイデアも含めてですね)。

人間が「我こそがSOTA」と言ってネットワーク設計している間はシンギュラリティーは起こらない気がするので、みんなでどんどん新しいアイデア考えたり試したりして楽しみましょう。

追記(参考になりそうな情報)

この手の話を Twitter に書いていた時に @ogawa_tter様にいろいろと情報頂きました。本当にいつも有難うございます。

折角ですので、自分用備忘録に少しリンクだけまとめてさせて頂きます。ニューラルネットFPGAでやる際のメリットを考える上で、いろいろと参考になりそうです。

論文

発表(動画)