2」を機械学習で解かせるには?はじめにみなさんこんにちは。エンジニアの佐藤です。今回はTensorflowの話を書かせていただきたいと思います。みなさんもきっと既にご存知でしょう「Tensorflow」、ディープラーニングのフレームワークとして最もポピュラーなもののひとつで、昨今のAIブームの折、その応用技術を身に着けたいと思っている方もきっと多いことでしょう。ポピュラーでありますから、ちょっとググればさまざまな事例や解説が山のように出てきます。このいくつかを読めば、だいたい勘所がわかるだろう。筆者は思っていました。ところが、、、読めども読めども今ひとつよくわからないのでした。いえ、大体はわかるのですよ。筆者は機械学習についての基本的概念は理解しているつもりで、ニューラルネットワークも、業務で取り組んできた経験があります。Tensorflowの事例も、概念や考え方については何の疑問もありません。わからないのは、Tensorflowがどうやって、人間の思考をコードに落としているかです。プログラムがはいスタートとなってから、CPUがどういう順番でライブラリの中を駆け巡って、最終的なゴールにたどり着くのか。その実行フローのイメージが、まるでつかめなかった。公式サイトをほとんど読了したある日、ようやくわかったような気がしました。Tensorflowの世界に足を踏み入れた時、私と同じ悩みを抱えるシステム開発系の開発技術者は結構多いのでは?と思い、このブログを書かせていただきました。ミニマムで考えてみる私の理解では、機械学習とは「データでアルゴリズムを削り出す」作業です。難しい話は他へ譲るとして、ミニマムな事例を考えてみましょう。言うまでもなく、答えは1です。我々はすぐにわかります。「データでアルゴリズムを削りだす」ポリシーを貫くとすると、どうでしょうか。「何かを足すが、それはいくつなのか?」というのが課題で、データとはすなわち「足す相手が1だった場合、足し算の結果は2になる。」という事前情報です。この事前情報があれば、試行錯誤が可能になります。「10を足すのかな?」「0.5を足すのかな?」というトライアルが計画でき、このトライアルと事前情報を比較することで、「2であるべき足し算の結果が、12になってしまった。」「同、1.5になってしまった。」という評価があり、評価を繰り返しフィードバックすることで、「答えは1」に近づくことができます。少々くどいですが、機械学習のミニマムストーリーができました。機械学習のフレームワークであるTensorflowで、やってみましょう。「やってみる」とはつまり、以下のような処理計画の実行のことです。この課題と事前情報をインプットして、トライアルと評価結果のフィードバックを繰り返し行うプログラムフローを記述し実行して動作の過程と結果を観察すること。プログラム開発の経験がある皆さんなら、プログラムの構想はすぐに立つでしょう。終了条件を定めてループで回せばいいのですよ。Tensorflowでこのミニマムストーリーを記述すると、こうなります。「わかるような、わからないような」と感じられる方も多いのではないでしょうか。私も今でこそ課題設定とコードの対応関係がはっきりわかりますが、初めはさっぱりわかりませんでした。疑問の中心は、「試行錯誤の過程では、事前情報の参照とトライアル結果の評価があり、想定値(この場合は1へ近づいていく数)の修正があるはずだが、唯一のループ処理(15行目〜)の中にはこれらを実行している気配がない」点です。そんなはずはありません。順番に見ていきましょう。参照された時、常に数値1.0を供給する約束をするが、その供給処理の実行はこの時点では保留」という意味を持っています(y_trueについても同様)。してこんなに回りくどいことになっているのか。それはその後を見ていくと徐々にわかると思います。?なことを言ってしまったかもしれませんが、次も結構敷居の高い内容です。shape=())get_variableだから、wは変数です。ただのプログラム言語の変数ではありません。「オプティマイザが調整できる変数」なのです。オプティマイザについてはこのあと解説します。次が、Tensorflowの中でもCoreと呼ばれる基本機能のひとつで、Tensorflowを理解する上での肝(と筆者が思う部分)です。wこの行は、「足してみる」というトライアル内容に相当する部分です。ここで足し算が実行されるわけではなく、y_predに計算結果が代入されるわけでもありません。y_predに代入されるのは、上記の通り固定的に1.0が返されるxと、他から調整されるwとの足し算を「将来実行する約束」です。「+」演算子はPython言語の機能で再定義され、元々の算術演算子とは違うものになっているのです。次の行は関数実行で、その役割はトライアル結果の数値化を「将来実行する約束」を返すことです。square」ですから、簡単に言えば、その数値化方法は正解とトライアル結果の距離の計測であり、引数もその通りの内容となっています。引数はいずれも「数字を出力する約束」のオブジェクトで、なので結果は必然的に、変数lossに代入されるのは、またしても「評価を将来実行する約束」です。次の行はアルゴリズムの選択です。tf.train.GradientDescentOptimizer(0.1)まぁ、よくあるまともなアルゴリズムですということで、これ以上は追求しないことにしたいと思います。これまで「約束、約束」と連鎖してきましたが、次でようやく終着点です。次の行は直前行で選択したアルゴリズム(GradientDescentOptimizer)で、「最適化」を「実行する約束を」するメソッド呼び出しです。optimizer.minimize(loss)ところで、何を最適化するのでしょうか?それは試しに足してみる数値「w」以外にありません。オブジェクトoptimizerは、変数wを参照できるのでしょうか?普通にプログラムを見ているとできないような気がしますが、それが可能なのです。これまでつないできた「約束の連鎖」が、optimizerとxをつないでいるのです。この部分がTensorflowのサンプルを読むときの一つの重要留意点と筆者は思っています。終端変数には、これまで代入されてきた変数がすべて、背後で紐づけられているのです。約束の連鎖を駆動するのはいつなのか?Session.runがそれにあたります。このメソッドの引数に列挙された「約束」が、紐解かれ、実行されるのです。Session.runは2箇所で実行されています。w))14行目はTensorflowで実際の計算処理をスタートする際のおまじないと思ってスキップしてください。いずれも何らかの計算を実行する「約束」です。Session.runでは、その約束を実際に実行し、最後の計算結果を戻り値で出力します。この場合trainはopitimizer.minimizeを実行し、loss値を小さくするためにloss値に関する唯一の変数wを変更します。(戻り値は捨てられます)lossは、この変更されたwでloss値を計算した結果を出力(loss_value)し、wは、この変更されたw自身を、戻り値として出力(val_w)します。いうのが、いわゆる「機械学習モデルのトレーニング」そのものなのです。このコードを実行すると、結果は以下のようになります。(実際の数値はwの初期値によって異なり、この場合初期値はランダムですので、場合によって違います。0.01)近づいたところでプログラム終了です。これまでの過程で、Tensorflowが計算する約束を「一旦実行保留のまま配置」し、のちにそれらの約束を実行することで目的の計算処理を実行していることがおわかりいただけたと思います。実際には機械学習の課題はもっともっと複雑なのが普通ですし、実装も様々に高抽象度化されていますから、ここまでコードフローを細かく気にする必要は無いことが多いのが現実でしょう。それらの場合も、地下で動いている仕掛けの基本は同じはずです。この基本を押さえておくことで、目に見えているコードの実行順序をより的確に判断できるようになるのではないかと思います。ところで、なぜこんな回りくどい実装になっているのでしょうか。筆者の考えでは、それは「実装を変更することなく分散処理環境へ移行するため」だと思います。機械学習モデルのトレーニングは、今日ではGPU上で実行することが一般的です。小規模な試行錯誤はCPU上で実行されるでしょうから、これまで見てきたように計算の約束をTensorflowのオブジェクトの相互参照という形で一旦表現し、Session.runとなったところで適切な実行環境へそれぞれ「展開」できるようになったのでしょう。最後まで読んでいただき、ありがとうございました。2」を機械学習で解かせるには?Tweet関連記事2019-06-28video要素の再生中のシーンを印刷するこんにちは、エンジニアの藤野です。3はじめまして、CI事業部の金子です。18コンテナイメージにmanページがインストールされなくて困ったという話エンジニアの佐藤です。Gatewayに握りつぶされていたエンジニアの佐藤です。今回はネットワークインフ...2018-06-28あなたの身近にもあるかもしれない『ダブりデータ』みなさんこんにちは。エンジニアの佐藤です。専門知識に合格しました月別アーカイブはてなブログをはじめよう!flect_techさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。