3周年のご挨拶
このたび、Neural Network Librariesは先月末で3周年を迎えることができました!
この3周年のタイミングで、Neural Architecture Search(ネットワーク構造探索)の新しいフレームワークであるNNabla-NASを公開しました。詳しくはブログ記事をご覧ください。
ディープラーニングはこの1年の間でもかつてないほどの速さで進化を続けており、研究・開発のどちらにも使うことができる高性能かつ新しいフレームワークに対する需要が再認識されています。そのため、2年目に達成することができた世界最高速での大規模分散学習だけで満足することなく、Neural Network Librariesはチャレンジングな機能追加・変更・改善を重ねてきました。
昨年は、映画やゲームなどのへの応用も期待されるディープラーニングによるコンテンツクリエーション向け手法のサポートの強化として、Self-attention GAN、InstaGAN、StarGAN 、SPADEなど、数多くの生成モデルの学習実装を追加しました。さらに、機械学習やプログラミングの知識の少ないクリエーターでも最先端の手法を体験できるインタラクティブなデモの追加も開始しています。
また、[音源分離]((https://github.com/sigsep/open-unmix-nnabla)やネットワーク量子化などの様々な先端的な研究の取り組みを強化しています。
Neural Network Librariesへのあらゆる興味、フィードバック、助言、批判、貢献に感謝するとともに、ユーザーの支援に最善を尽くしていきます。
この1年での主要なアップデート
ここからは、過去1年で行われた機能追加について振り返っていきたいと思います。
まず、以前からご要望の多かった日本語のドキュメントがついに公開されました。これにより、日本のユーザーの皆様には、より快適にNeural Network Librariesをお使いいただけるようになるとともに、より多くの方に触れていただけるようになったと期待しています。
さらに、重要な構成要素として、Double Backward、Transformer、Weight Normalizationなどが追加され、 利便性を改善するNanInfTracerやDALI Iteratorも追加されました。先ほど述べた数多くの生成モデルの追加に加え、Mixup、MAMLなどの先端的なモデルも追加されました。
最後に、過去1年の主要の更新を以下にリストアップいたしました。
レイヤー
Double Backward
Double Backwardを使うことで、入力に関する出力の二階微分に相当する計算が可能です。一例を挙げると、勾配の微分値(勾配自身が微分値であるので、二階微分に相当)の算出などに用いられます。これを利用した手法としては、メタラーニングの手法の1つであるMAMLや、WGAN-GP(Gradient Penalty)などが挙げられ、多くの最先端ディープラーニングモデルを実装する際に必要不可欠な機能となっています。
バージョン1.1.0においては70以上の関数でdouble backwardが実行可能となっており、Neural Network Librariesはますます「使える」ライブラリとなりました!
grads = nn.grad(outputs, inputs)
# Manipulate {grads} as usual variables.
MultiHead AttentionとTransformer
言語モデルなど数多くのタスクにおいてSOTAを達成しているトランスフォーマーの設計に欠かせないマルチヘッドアテンションレイヤーが追加されました!
これは近年様々なコンピュータビジョンタスクにおいても利用されています。
Transformer (Vaswani et al., NIPS 2017)はマルチヘッドアテンション機構を用いたモデルであり、機械学習の様々なタスク、特に自然言語処理や音声認識において強力な性能を発揮することが知られています。近年のSOTAモデルであるBERTにおいてもTransformerが重要な役割を果たしています。
Weight Normalization
Weight normalization (Salimans and Kingma, NIPS 2016)はニューラルネットワーク内の重みに関するreparametrizationの手法の1つであり、収束が速くなることが報告されています。
RNN/GRU/LSTMのCPU版が実装されました!
これまでRNN系の関数はGPUでしか使うことができませんでしたが、本バージョンからCPU実装が追加されました!これによって限られたリソースをもつような軽量・低消費電力のデバイスでもRNNなどが使えるようになりました!
Adaptive Separable Convolution
こちらの論文で提案された動画のフレーム補完に用いられる2D Adaptive Separable Convolutionが追加されました!入力サンプル/ピクセルに依存する2Dカーネルを生成し、それを用いてConvolution演算を行います。すべての入力に対するBackward演算もサポートしています。
ユーティリティ
NanInfTracer
任意のネットワークの演算実行時に発生したNanやInfを検出し、その発生個所を教えてくれるNanInfTracerを新しく追加しました。
以下のように、数行の追加で簡単に利用することが可能です。
pred = model(...)
from nnabla.utils.inspection import NanInfTracer
nit = NanInfTracer(trace_inf=True, trace_nan=True, need_details=True)
with nit.trace():
...
pred.forward(function_post_hook=nit.forward_post_hook)
pred.backward(function_post_hook=nit.backward_post_hook)
...
NanやInfの発生時には以下のようなメッセージが出力されます。
Error during forward propagation
Convolution
Convolution
Constant
Reshape
Div2 <-- ERROR
ValueError: The 0th output of the function 'Div2' (rank: 3) has nan or inf as its values.
Function details:
function type: Div2
shapes of inputs: ['(2, 4, 10, 10)', '(1, 1, 1, 1)']
shapes of outputs: ['(2, 4, 10, 10)']
function args: {}
ご自身でニューラルネットワークの構築を行う際に、どの関数の付近で想定外の演算が発生しているのか、今までよりも簡単にデバッグすることができます。
Daliイテレータ
DALIはNVIDIA製のData Loading Libraryであり、GPUを利用した高速な前処理を可能にします。今回のリリースでこのDALIを利用したイテレータが使用可能になりました。以下のようにバージョンを指定してDALIをインストールしてください。
pip install --extra-index-url https://developer.download.nvidia.com/compute/redist/cuda/10.0 \
nvidia-dali==0.14
ドキュメント
日本語マニュアルの追加
Neural Network Librariesの日本語版ドキュメントが公開されました。上記のリンクから日本語版のドキュメントが閲覧可能となっています。一部未翻訳の部分が残っている状態ではありますが、今後のリリースにあわせてより充実したものになっていきます。
モデル
ImageNet ExampleでMobileNet V1, V2, V3が使用可能に
ImageNetのExampleでMobileNetV1, V2, V3が利用可能になりました!また、それぞれの学習済みモデルもダウンロード可能になっています。
Example: EfficientNetの追加
2019年にGoogleの研究者たちによって考案されたモデルであるEfficientNetがExampleとして追加されました!このモデルは新たな手法でCNNの解像度や特徴マップ数、層数をスケーリングさせ、軽量かつ高精度である効率的なネットワークを実現したものになっています。EfficientNetはパラメータ数やFLOPsに応じてさまざまな構造が定義されていますが、今回追加されたものはその一部(B0, B1, B2, B3)となっています。また、これらのモデルを用いてImageNetを学習させた結果や学習済みパラメータも公開していますので、ぜひご活用ください!
学習済みモデルにDeepLabV3+を追加!
DeepLabV3+はセマンティックセグメンテーションに用いられる最新のDNNモデルです。他の学習済みモデルと同様の方法でこのモデルを利用することが可能です。
import nnabla as nn
from nnabla.models.semantic_segmentation.deeplabv3plus import DeepLabV3plus
model = DeepLabV3plus()
x = nn.Variable(...) # input variable
y = model(x) # create graph
y.forward()
モデル
NNabla TutorialがColabで試せるようになりました
これまでNotebookとして公開していたNNablaのチュートリアルがColabを利用して簡単に試せるようになりました!NNablaの基本的な特徴がわかるチュートリアルや、CIFAR10の分類、DCGANを用いた画像生成などを試すことができます。これからNNablaを使ってみようという方に特におすすめです。
Pix2PixHD /SPADE
Pix2PixHD (Wang et al., CVPR 2018)は高解像度のImage-to-Image Translationが可能なモデルです。図にあるように、セマンティックラベルを実写のようなリアルな画像に変換することができます。
ExampleとしてSPADEのNNabla実装が追加されました!
これはセマンティックマップを入力として画像を生成するモデルです。
ラフなレイアウト画像をリアルな道路や風景へと変えることができます。
入力 | 出力 |
---|---|
StarGAN / InstaGAN /ESRGAN
GANを用いた画像生成の1つであるImage-to-Image TranslationのモデルとしてStarGANとInstaGANがExampleとして追加されました!
StarGANは画像のアトリビュート変換ができるモデルです。CycleGANとは異なり、多対多のドメイン変換が可能なモデルとなっているのが大きなポイントです。
InstaGANは画像内のインスタンス変換ができるモデルとなっており、マスク情報を利用する事でインスタンスのみを変換させることに特化したモデルとなります。
いずれも使い方や結果などはそれぞれのページをご覧ください!
StarGAN | InstaGAN | ||
---|---|---|---|
入力:黒髪/女性 | 出力:金髪/女性 | ||
入力:黒髪/男性 | 出力:金髪/女性 | 入力画像(ジーンズ) | 出力画像(スカート) |
また、StarGANにはDouble-backwardを使ったGradient Penaltyの利用、InstaGANには今回のアップデートによって追加されたInstance Normalizationのno_scale/no_biasオプションを用いた最適化やチュートリアルブログで説明されていた部分グラフの実行/unlinked variableの利用時のbackwardによる勾配計算などのテクニックが用いられていますので、実装の際の参考としてもチェックしてみてください。
ESRGAN (Enhanced Super-Resolution Generative Adversarial Network) (Wang et al, ECCV 2018 Workshop)はGANを用いて画像の超解像を行うモデルです。著者らによって提供されている学習済みパラメータを変換することでNeural Network LibrariesでもESRGANを用いた超解像の実行が可能です。変換に必要なコードやその手順はこのページをご覧ください。
Data Augmentation Example
MixUpやCutMix, そしてVH-MixUpといった近年提案された有用なData Augmentationの実装・利用例をまとめたExampleが追加されました。
Image 1 | Image 2 | Mixup | CutMix | VH-Mixup |
---|---|---|---|---|
詳しい利用方法は新たに追加されたdata_augmentationのExampleをチェックしてみてください。
顔ランドマーク検出モデルFANのInference Example
Face Alignment Network (FAN)のInferenceスクリプト/学習済みパラメータを公開しました。
Result by 2D-FAN | Result by 3D-FAN |
---|---|
これによって簡単に顔のランドマーク検出ができるようになりました。ぜひ試してみてください。
DQN (Deep Q-Network)
DQNは広く用いられる深層強化学習(RL) アルゴリズムの1つです。使い方など詳細はこちらの記事にまとめられていますので、ぜひご覧ください。
MAML
MAML (Model-Agnostic Meta-Learning) (Finn et al., ICML 2017)はメタ学習において有望な研究であり、モデルに対し「学習方法を学習させる」ことを目的とした手法です。これを用いて訓練されたモデルは限られた学習サンプルだけで新しいタスクに適応できるようになることが期待されています。