機械学習TensorFlowが登場して早いことで3年近く経とうとしています。Learning自体がブームになってからだと、それ以上の月日が経っているわけで、人工知能ブームも以外と続いているなあというのが正直な感想です。Theanoやtorch、chainerに遅れをとって立ち上がったTensorFlowでしたが、はじめのうちはチュートリアルコードですらこのようなありさまで、とてもではありませんが簡単に誰もが使えるというような状態ではありませんでした。オブジェクトの導入などで、少し凝ったことをする場合でもかなり簡単に書けるようになってきました。解決できるようなシンプルな実装が多く、実践的にはどう書くとかゆい所に手が届きやすくなるのかがイマイチ掴みづらいところがあります。学習処理を記述しているかを晒してみることにします。今回のソースコードは以下にアップしています。学習処理を大まかに分けると、データの読み込み、モデルと学習処理の定義、学習環境の定義および学習の実行の3つに分けることができます。一つずつどのような要件があれば良さそうかを考えてみます。「データの読み込み」で必要になるのは、様々な形式で保存されているデータセットを、適切な形に前処理しながらバッチ単位で読み出すというのがもりもりの要件になるかと思います。形式に変更する際に実行したり、ファイルやDBへの書き込み内容そのものを事前に処理する方法もありますが、今回はそのような処理もまとめて学習時に実行する場合を想定します。様々な形式からの読み込み、ストリーム処理による前処理、バッチサイズの指定やデータセットの繰り返しなど、データの読み込み時に発生する様々な処理をシームレスに実行する事ができます。次に、「モデルと学習処理の定義」では、モデルグラフの定義および、ロスと学習処理の定義を行います。モデルグラフの定義は、CNNやRNNなど実際に組むことになります。利用して自身でスクラッチで計算グラフを組んでいく必要もあります。利用した勾配学習の定義を行える必要があります。このあたりは、ニューラルネット系のフレームワークではクリティカルな部分でもあるので、簡単に実装できるようになっており、変わったレイヤー定義でもしない限りそこまで難しい部分ではなくなっています。最後に、「学習環境の定義および実行」ですが、こちらを以下にシンプルに使いまわしやすく書いておくかが、学習処理をとっつきやすく開始できるかの鍵になるのではないでしょうか。必要なのは、学習の実行だけでなく、学習時のサマリーの記録、モデルの定期的な保存、定期的な学習ログの出力など学習処理に紐づく細かい実装が必要になります。活用することでわかりやすく実現することができます。上であげたように、データの読み込みパイプラインに必要な要素は以下のようになります。実現するかを一個ずつ見てみましょう。ファイルからのデータの読み込みまず、ファイルからのデータの読み込みは下記のようになります。データセットを読み込んでいる箇所になります。MNISTのデータはイメージデータとラベルデータがバラバラのファイルで管理され、それぞれにバイナリ形式で一定のバイト単位でデータが保存されています。このクラスはまさに一定のバイト単位で保存されているデータを切り取って順番に読み出すことができます。MNISTでは画像とラベルが別々のファイルに分かれているため実際の処理を行う前に結合しておく必要があります。オブジェクトを返してくれます。メソッドを利用してそれらを実現している例です。呼び出し自体は、それぞれ実際の処理を行う関数を渡すだけで実現できます。場合は変換したデータを出力する必要があります。まとめていますので、処理を行う関数の引数は2つになっています。メソッドで事前に変換しています。関数を呼び出すようにしています。今回の実装では、必要な処理ではないですが、このようにしておくと処理をいくらでも柔軟に組み替えることが可能になります(ただしCPUパワーが必要になってきますが)。オブジェクトと出力する型を指定して、処理を行った関数の出力を戻り値として受け取ります。設定しておく必要があります。内の処理の組み方によっては、入力データを複数に分割して出力するような処理も実現することができます。shuffle、repeat、batch(padded_batch)の3つのメソッドで実現します。分のデータを返すような挙動になります。値が大きければ大きいほど、基本的にはランダムの質はよくなります(ファイルの前の方のデータと後ろの方のデータが混ざりやすくなります)。値を増やすことを検討してみるべきです。メソッドは、それこそそのままでデータを繰り返し読み出してくれます。引数に回数を指定した場合その回数分、何も指定しない場合エンドレスでデータを読み出し続けてくれます。分の値を各ステップで読み出してくれます。メソッドは、バッチ単位でデータの不揃いを整形してくれます。する値も引数で指定することができます。一部の数値計算用のメソッドを使用することでほぼ問題なく実装することができます。構成され、それぞれパラメーターやレイヤーの定義と計算グラフの構築を担当します。計算用のメソッドと学習処理(最適化処理)を構築するメソッド、予測を実行するメソッドをインスタンスに含めています。indicescallメソッドでどこまで担当するかいくつ値を返すか、lossやoptimize、predictメソッドの引数に何を取るかはモデルによって変わってしまう構成をとっていますが、大まかな関数の呼び出し順は、どのようなモデルを構築する際もこれをベースに行うことができます。関連付けて返せば良いという実装になります。ここで主に注意する点は、ロスの計算周りと最適化計算処理です。返す可能性が十分にあります。そこまで親切ではないので、その辺りを予防するために必要があればロス関数を自力実装する必要性があります。するのが一般的です(学習率の調整やデータの前処理でどうにかできる場合はそれでも問題ないです)。テクニックで大幅にそのリスクを減らすことができます。学習の実行処理で必要になる処理は細かくも様々です。なんとなしに必要なものを洗い出すと、ただ学習をさせたいだけなのに色々と必要になってきます。学習処理の実行このうち上の2つは、上記の2項目で実装した関数を呼び出すだけで実行できるようにしておくことがベストです。なっていない場合は、該当部分のクラス構造や関数定義を見直してみるほうが良いでしょう。指定したディレクトリにサマリーを保存してくれます。指定することが可能です。渡すことで実現できるようになります。初期化パラメーターで、最大いくつのチェックポイントを残すか(max_to_keep)と、何時間に一回のチェックポイントを残すか(keep_checkpoint_every_n_hours)を指定できます。チェックポイントを保存するディレクトリを指定することができます。わたすことにより実現できます。tf.train.LoggingTensorHook。tf.train.NanTensorHook。tf.train.StopAtStepHook。自体は自作もそこまで難しくありませんので、必要に応じて作ることも可能です。実行するだけですみます。使用した複数サーバーでの分散学習も設定することができます。フレームワークにそれなりに足を突っ込めば、学習時にやりたいことは一通りできるようになってきています。それでも学習コストは十分にあるのですが、以前の時間をかけて理解しても結局よくわからないという状態に比べれば天と地ほどの差があるのは見てのとおりです。この辺りが整理されてよりわかりやすくより使いやすくなることを期待します。(2)〜機械読解質問応答システム〜月別アーカイブはてなブログをはじめよう!KSKSKSKS2さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。