NPI(Neural Programmer-Interpreters)で足し算の筆算アルゴリズムを実装する

はじめに

ここにもちょっと書いたのですが、NPI(Neural Programmer-Interpreters) という仕組みがあります。NPIはDeepLearningで「プログラムの実行」を学習させようという試みです。「プログラムの実行」方法を人間がプログラム言語で組み立てるのではなく、「プログラムの実行」をNPIが事例をみて学習するというのが醍醐味かなと思います。
続きを読む

Pythonでベイズ最適化を使ってハイパーパラメータを探索するライブラリ実装のメモ

はじめに

ベイズ最適化(参考:ベイズ最適化入門, 機械学習のためのベイズ最適化入門)を使うと、機械学習の時の各種Try&Errorで決めざるを得ないようなハイパーパラメータの探索を効率よく実施できる可能性があります。

考え方などは最近色々解説記事が増えてきたおかげで理解はできるのですが、GridSearchのライブラリみたいな形ではWeb上で見つけられなかったので、今回作りました。きっと車輪の再発明なのだと思うのですが、まあ再発明は勉強にはなるので良しとします。 続きを読む

Kerasでちょっと難しいModelやTrainingを実装するときのTips

はじめに

※ Keras2 を対象にしています。

Kerasのコードはシンプルでモジュール性が高いのでシンプルに記述可能で、理解しやすく使いやすいです。
ただし、標準で用意されている以外のLayerや学習をさせようとすると、あまりサンプルがなくてどう書いていいかわからなくなることが多いです。

最近いくつか変わったModelを書いた時に学んだTipsを備忘録も兼ねて共有します。

目次

  • Functional APIを使おう
  • Weightを共有したい場合は Container を使うと便利
  • 「LayerのOutput」と「生のTensor」は似て非なるもの
  • Lambdaを使った簡易変換は便利
  • カスタムなLoss FunctionはSample別にLossを返す
  • LayerじゃないところからLoss関数に式を追加したい場合
  • 学習時にパラメータを更新しつつLossに反映した場合

続きを読む

[改良版]KerasでVAT(Virtual Adversarial Training)を使ってMNISTをやってみる

はじめに

遅まきながら、VAT(Virtual Adversarial Training)という学習方法を知ったのですが、Kerasでの実装が見つからなかったので実装してみました。

VATは簡単にいうと、「通常の入力X→出力Y」と「なるべく結果が異なるように入力Xに微小なノイズdを入力に加えた入力(X+d)→出力Y’」から「KL-Divergence(Y, Y’)」を損失関数に余分に加えて学習をする手法です。

これだけだと何言ってるかわからないと思うので、詳しくは元の論文か、この方の解説をご覧になると良いかと思います。

VATは学習における位置づけとしては「正則化」に近いという話で、DropoutやNoiseを加える代わりになる可能性があります。Dropoutとかのパラメータを調整するのも面倒なので、VATで代用できると嬉しい気がします。

Kerasだとコスト関数や正則化関数に入力Xを使うようにするのが少し厄介なのですが、そこさえなんとかなれば、ChainerやTheanoでの実装があるので移植すればOKです。

先日、KerasでVAT(Virtual Adversarial Training)を使ってMNISTをやってみるを投稿したのですが、もう少しマシっぽい実装ができたので共有します。

Version

  • Python: 3.5.3
  • Keras: 1.2.2
  • Theano: 0.8.2

実装

前回からの違いは、

  • 損失関数をカスタマイズするのではなく、Model.losses に VATのLossを付けるようにし、学習時に妙な変換をしなくてよくした(これが大きい違い)
  • 通常の予測値に K.stop_gradient() を付けており、VAT計算から発生する余分な(?)差分の伝播を止めた(ということになると思う)(あまり結果は変わらないけど…)

というところです。
続きを読む

KerasでBEGAN(Boundary Equilibrium Generative Adversarial Networks)を実装する

はじめに

GAN(Generative Adversarial Networks: 敵対的生成ネットワーク)という生成モデルの中でも面白い構造の仕組みを最近よく見かけます。Generator(生成者)とDiscriminator(識別者)が互いに競い合って精度を上げていく構造は、美術界での贋作者(=Generator)と鑑定士(Discriminator)の勝負のようでギャラリーフェイクのような世界を彷彿とさせます。仕組み自体に浪漫を感じます。さらにそれで精度良い生成ができるのだから本当に不思議です。

ただ、GANは学習が難しいというのが課題だったようなのですが、この BEGAN というのは二者の対立のバランスを取りながら学習することでこの課題を解決するとのこと。BEGANは結構内容がシンプルで理解しやすかったので、Kerasで実装してみました。 続きを読む