2016Spark機械学習Hadoop2016年12月20日じょんすみす(125)4この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。こんにちは、小澤です。20日目のものとなります。Developers.IO前回はZeppelinについて書かせていただきました。LearningのライブラリであるDeeplearning4JをSparkから利用してみたいと思います。Learningについてはその名前を聞いたことがあるという方も多いかもしれません。現在の人工知能やAIのブームを代表する技術であるため、「どんなものか詳しくは知らないけどすごいことができる」と認識してる方も多かと思います。Learningとは何者なのかについて簡単に解説したいと思います。Learningは活用事例だけでなく研究領域においても現在活発に新しいものが実現されており非常に流れの速い領域です。そのため、ここで書かせていただく内容がすぐに古い情報になってしまう可能性があることをご了承ください。Learningはニューラルネットワークという手法を発展させたものになります。このニューラルネットワークは、人間の脳の仕組みを...という解説をよく見かけますが、機械学習におけるニューラルネットワーク(区別するために人工ニューラルネットワークと呼ぶこともあります)を理解する上で、脳のニューラルネットワークの仕組みを知っていなければ全く理解できないというわけではないのでそちらの話に関しては割愛します。そのため、これ以降ニューラルネットワーク(ニューラルネット、NN)は全てこの人工ニューラルネットワークを指します。ニューラルネットではニューロンと呼ばれるものを複数組み合わせて実現されています。これ自体は特に難しいことを行っているわけではなく、各入力とウエイトを足し合わせたものを活性化関数というものに入れてやることで出力を求めるものになります。下の図は1つのニューロンを表すのものになります。簡単な構造の単純パーセプトロンと呼ばれるものは、この1つのニューロンのみで成り立っており、活性化関数も入力が一定の値以上であれば1、そうでなければ0を返すというものでした。これを拡張すると、複数個をニューロンを複数段積み重ねることができます。下の図は3層の構造となっています。この真ん中の層のように入出力以外の間の層を挟むことで、内部的に様々な表現が可能になっています。あとは、データを利用して入出力の組み合わせを学習し適切なウエイトの値を求めれば利用可能となります。学習のさせ方はバックプロパゲーション(誤差逆伝播)という方法によって行なわれます。次にその値を利用して中間層と入力層との間のwを更新するというやり方となります。これを何度も繰り返すうちに学習データの入出力のペアに近い値が予測できるようになっていきます。Learningへの発展このような形式を取れるということは、理論上は入出力の間の中間層をいくらでも増やすことができます。中間の層を増やすということは、その分だけ内部で様々な表現が可能になりそうです。実際、画像認識では入力に近い層から線などのエッジ検出エッジの組み合わせでの目や鼻の検出さらにそれらの組み合わせで顔を検出といったように層が深くなるほどより複雑な組み合わせを表現するような学習を行っています。層を深くしていくと学習がうまくいかないという問題がありました。学習の性質上、出力に近い層から順に更新していくのですが、この時に層が深くなると入力に近い浅い層までうまく情報を伝えることができなかったのです。それによって、ニューラルネットの研究は下火となってしまいました。Learningというわけです。Learningを行うライブラリの1つです。Learningのためのライブラリは数多く存在し、今もなお増え続けています。それぞれに特徴があるのですが、Deeplearning4Jはその中でも珍しいJavaで実装されたライブラリとなります。そのため、大量のデータを扱い際に、HadoopやSparkなどでの実行が行いやすいものになっています。どのようなものかの説明はこれくらいにして、exampleを例に実際にDeeplearning4Jを使う方法を見ていましょう。Githubにある公式のdl4j-examplesを見ます。dl4j-examples/src/main/java/org/deeplearning4j/examples/feedforward/mnist/MLPMnistSingleLayerExample.javaを例にしたいと思います。このexampleを見ていただくとわかる通り、mainメソッドで学習処理を実行するjavaのプログラムとなっています。やっていることはMNISTという手書きの数字(0から9のいずれか)の画像からどの数値が描かれているかを予測するものになっています。.build();これは何をしているかというとネットワークの構造を定義しています。このようにメソッドチェーンを使って全体の定義をしているわけです。Learningはこのように設定すべき項目が非常に多くなりますし、それぞれが何を意味しているかにも知識が必要なります。ある程度知識があれば何を設定しているかわかりやすいメソッド名になっているのですが、このコードの全てを解説するには、それら一つ一つの要素も含めての解説が必要になるため、いくつかの部分のみを簡単に解説します。optimizationAlgoこれは学習に際して、現在の出力結果と正解ラベルとの間にどの程度間違いがあり、それをどのように修正していくかを決めるアルゴリズムとして何を使うかを設定しています。ここではSGD(確率的勾配降下法)というものを利用しています。layerここでニューラルネットの各層の設定を行っています。引数で『0』を渡しているのが入力層です。中間層の数は1000、活性化関数にはReLUというものを利用しています。『1』となっているのが、出力層です。こちらは中間層が1000なので入力は1000、出力は分類対象となるクラス数を渡しています。活性関数はsoftmaxとなっており、これは多値分類を行う際に利用するものになります。jarを作るのと、実行するための設定が既にされているため、実行はmvn:execで行うことができます。finished********************のように出力されます。最後の『Scores』の『Accuracy』を見ると、テストデータに対する正解率がおよそ97%であることがわかります。Sparkを動かしてみるでは、次にこれをSparkで動かしてみたいと思います。Spark上での実行もサンプルコードがdl4j-spark-examples/dl4j-spark/src/main/java/org/deeplearning4j/mlp/MnistMLPExample.javaにあるのでそれを動かしてみます。こちらもSparkで実行するための設定がいくつか含まれていますが、基本的な部分は変わりません。最初のSparkの設定は従来と同じです。その次にローカルで動かすのと違う部分として、Spark上で扱えるようにデータをRDDに変換しています。sc.parallelize(testDataList);ネットワークの設定はローカルと同じです。このサンプルでは中間層を2層にしていますが、それ以外に変わった点はないかと思います。次にSpark上での動作について設定を行っています。1ノードあたりのデータ件数(batchサイズ)や分散させた各ノードでのwの値の全体での平均をとる頻度などを設定します。.build();最後に各種設定を渡して学習の処理を実行します。i);}実行方法はローカルでの設定と同じです。デフォルトではlocal[*]で動くようになっているので、クラスタ上で動かしたい場合は-useSparkLocalオプションを設定してください。今回はローカルで動かすので、オプションは指定していません。実行を行うと、学習を行っている過程がログとして出力され、最後にローカルで動かしたとき同様テストデータに対する予測の評価結果が出力されます。0.998========================================================================中間層の数を増やしているため、結果もよくなっていることがわかります。LearningのライブラリであるDeeplearning4Jについて書かせていだきました。Learning界隈のライブラリは数多く出ており、Tensorflowのようなそれ自体が分散処理なものもありまが、多くの場合Pythonで記述することになります。C++で記述できるものもありますが、javaの実装はあまり多くなく、すでにSpark環境が整っているなどの場合などで有用かと思います。HadoopをDataFrameのように扱うIbisというものについて書かせていただく予定です。ACEの人やってます。機械学習をしたりHadoopをいじったりしてるエンジニア。〜ログ収集、監視、分析を触って体感しよう!〜」を開催しますお申し込み受付は終了しました。ありがとうございました。今後セミナーのお知らせを受け取りたい方は、こちらからご登録をお願いします。CAFEのサービスが「LINEアプリ」として利用できるようになりました。これまではLINEのトークから利用する形でしたが、LINEサービス内から利用できるようになりました。これまでより便利に、シームレスにご利用いただけます。Cafe300件のシェア(そこそこ話題の記事)インフラ未経験の私が内定から入社までに読んだ技術書11冊ブログ記事2020年01月16日Yui300インフラ未経験で入社した私がインフラを勉強するために読んだ技術書11冊を感想とともにまとめました。平野重利123Pythonで、標準入力を変換して標準出力に出すCLIプログラムのテンプレートをご紹介します。菊池修治47こんにちは、菊池です。勉強会#1に登壇しました。サーバのみならずネットワーク機器の仮想化も年々進んでいます。スペックに縛られないこととか、展開のしやすさとか初期考慮点が少なくなるのは嬉しいです。武田隆志1098このエントリは、2018年、2019年に公開したAWS全サービスまとめの2020年版です。これまではいくつかに分割して公開していましたが、1エントリにまとめてほしいという要望をもらっていたため、今年は1エントリに集約してみました。CAFEのサービスが「LINEアプリ」として利用できるようになりました。これまではLINEのトークから利用する形でしたが、LINEサービス内から利用できるようになりました。これまでより便利に、シームレスにご利用いただけます。Cafe300件のシェア(そこそこ話題の記事)インフラ未経験の私が内定から入社までに読んだ技術書11冊ブログ記事2020年01月16日Yui300インフラ未経験で入社した私がインフラを勉強するために読んだ技術書11冊を感想とともにまとめました。悠紀235ShifterはWordPress環境をサーバーレスで立ち上げ、静的なサイトを生成することができるサービスです。FAQサイトをサクッと作ってみました。Takumi227こんにちは。DA事業本部の春田です。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。