コンテンツにスキップするには Enter キーを押してください

AdaNet を動かしてみる

2018年10月30日に、Google が AdaNet の実装を公開 しました。
Github

毎週読ませていただいている、Weekly Machine Learning #96 において、

機械学習APIの中でも重要な技術だと思っていたので、OSSで出してくるのは驚きです。

というコメントと共に紹介されるなど、大きなインパクトを与えました。

今回は、短いですが上述の AdaNet を動かしてみたので、どのように動かすか? などを書いていきたいと思います。
Hello World ぐらいの内容なので、初めて動かしてみる人向けの記事です。

環境

tensorflow のバージョンは、 1.9.0 以上となっています。
今回は、tensorflow-gpu 1.10.1 を使用しました。
また、tensorboard のバージョンは1.10.0で、Python のバージョンは 3.6.5 です。

また、adanet は pip でインストールできるようになっているので、

pip install adanet

を実行します。

これで準備は完了です。

python の環境が手元にない方は、
https://hub.docker.com/r/tensorflow/tensorflow/tags/
からDocker image をとってきて実行すると良いと思います。

また、GTX1080Ti が載ったサーバー上で実験を行いました。
GPUを使うと実行速度が上がるという利点がありますが、なくても動くと思います。

コード

今回は、Jupyter Notebook 上で実行してみました。
参考にしたコードはこちら
少し階層が深いですが、ちゃんとチュートリアルが準備されていていい感じです。

同階層に、adanet_objective.ipynb というファイルも準備されています。
前者は、Fashion Mnist を使ったチュートリアルで、後者はBoston Housing Dataset を使ったチュートリアルです。

どちらも、コピペするとサクッと動かすことができます。
便利!

やったこと

チュートリアルと殆ど変わらないんですが、cifar10の学習を動かしてみました。
上記のJupyter Notebookを数箇所変更します。

画像のサイズを 28 -> 32 に変更する。
画像のチャンネルを3チャンネルとする。
ぐらいです。

例)
before


tf.data.Dataset.from_generator(
	generator(x_train, y_train),
	(tf.float32, tf.int32), 
	((28, 28), ())
	)
	

after


tf.data.Dataset.from_generator(
	generator(x_train, y_train),
	(tf.float32, tf.int32), 
	((32, 32, 3), ())
	)
	

学習準備

AutoML とはいえ、いくつかのパラメータ調整が必要です。

私は、以下のように設定しました。

LEARNING_RATE = 0.003  #@param {type:"number"}
TRAIN_STEPS = 50000  #@param {type:"integer"}
ADANET_ITERATIONS = 10  #@param {type:"integer"}

それぞれのパラメータを説明すると、

  • LEARNING_RATE:
    — 学習率と言われるパラメータです。
    — 学習速度と学習精度を決めます。
    — 大きい値にすればするほど早く学習しますが、雑になります。

  • TRAIN_STEPS:
    — どのぐらいの時間学習をするかを決めるパラメータです。
    — 大きすぎると過学習を引き起こしてしまいます。

  • ADANET_ITERATIONS:
    — AdaNet に特有のパラメータです
    — TRAIN_STEPSの間に何回ネットワークの探索を行うかを決めます。
    — 大きいときと小さい時で、どのように変わるのか正直良くわかってないです。

学習の結果

学習を開始すると、

WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp0x8sqcds

という文字列が現れます。
この、 /tmp/tmp0x8sqcds を使ってTensorboard を起動できます。
Tensorboard というのは、学習の過程や結果を見ることができるツールです。

tensorboard --port 任意のポート --logdir /tmp/tmp0x8sqcds

というふうに起動した後、
http://(localhost or サーバーのIP):任意のポート
にアクセスすると閲覧できます。

以下が、TensorBoardの出力です。

これを見ると、5000回に1回、新しい線が現れている箇所があることが分かります。
これは、AdaNet が新しいネットワークを学習している箇所です。
様々な組み合わせでニューラルネットを学習し、よりよい精度のネットワークを構築していきます。

また、TensorBoard の画像内、上段左から3番目のグラフ(accuracy/adanet/subnetwork) を見ると、
精度が下がったネットワークはそれ以上学習していないことが分かります。
これにより、ネットワークを高速化しているのだと考えられます。

2段目のadanet_loss は、徐々に下がっていっています。
ニューラルネットは、この loss と呼ばれるものを最小化するように学習を行うので、
正しく学習が進んでいるものだと分かります。

ただし、Accuracy と言われるモデルの正答率は、44% 程度と非常に低いものになっています。
ただ動かしただけで満足がいく結果が出るのかな? と期待していたのですが、ちょっとがっかりな結果でした。

Future Work

今後、どうやったら高い精度が出るのかを引き続き調査し、変更すべきパラメータの選定などを行ってみたいと思います。
また、画像の識別以外のタスクにも使ってみようと思います。

I’m a software engineer in Fukuoka, Japan. Recently, I am developing machine learning models using TensorFlow, and also developing Web services by using PHP.

コメントする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です