こんにちは、blackawaです。
何年か「はじめたいなー」と思いながらも全然始められずに数年経った機械学習を、さすがに始めようと決心し、実際に手を動かしてみました。
弊社はPHP、Rubyが中心の会社ですが、わたし自身はJVM言語が好きなので今回はJava製の機械学習ライブラリ、DL4Jを使って機械学習に入門してみます。
目標
クイックスタートをキメる
まずはクイックスタートをキメます。
が、自分はsdkmanでOpenJDKを入れており、OpenJDKにはJavaFXが含まれないのでいきなりビルドが落ちました。
同様のIssueが経っていたので、まずはOpenJFXを使えるようにします。
ちょっとググってみたらOpenJDKでOpenJFXをビルドする記事が出てきたのでビビってOracle JDKを使うようにしたら解決しました。(examplesのpom.xmlに、oracleのjavafxを依存に追加するプロファイルがあったから、こっちを使ってもよかったのかも。)
言われるがままに MLPClassifierLinear
を起動するとコンソールに学習中のログがガーッと走って、JavaFXで描画されたグラフが表示されます。
これは何をやっているんだ...?
機械学習の基礎知識がゼロなので何を学んでいるのか全くわからないのですが、雰囲気は味わえてます。楽しんでいきましょう。
とはいえこのままだと本当に雰囲気でやっているだけになってしまうのでちょっと調べてみます。
クイックスタートいわく、これは「多層パーセプトロン(MLP)」によってデータを分類するサンプルのようです。これは学習中にエラースコアを表示できて、それがある程度まで下がると学習が完了したと判断するようです。
高卒でもわかる機械学習 (3) 多層パーセプトロン | 頭の中に思い浮かべた時には、ニューラルネットワークとパーセプトロン | Sideswipe、多層パーセプトロン | Wikipediaあたりを雑読みした感じ、MLPとは、ニューロンをモデル化してどのパラメータにどんな重み付けをすべきか学習させる方法のようです。ふんわりしすぎていて恥ずかしいですが、わからないなりに進めないと話が終わらないので先に進みます。
MNIST for Beginners
次に、クイックスタートに促されるままにDL4JでMNISTを試すことにします。MNISTはさすがに聞いたことがあります。手書きの数字を認識できるようになる機械学習界のHello worldですね。
サンプルのClassには学習に使う設定値が定義されていて、これを変えると精度が向上したり学習速度が上がったりするようです。
では実際に動かしてみます。
数分間の学習の後に結果が表示されました。
- Accuray(正答率 = テストデータセットに何%正解したか): 97.3%
- Precision(適合率 = 正解したケース数 ÷ 間違ってある文字だと判定したケース数): 97.3%
- Recall(再現率 = 正解したケース数 ÷ 間違ってある文字でないと判定したケース数): 97.27%
- F1 Score(適合率と再現率の加重平均): 97.28%
のようです。ここの解説には「真陽性」「偽陰性」などの統計用語が出てきており、理解が正確でない気がします。
明日からやること
とりあえずDL4Jを触ってみましたが、まだ何がなんだか全然わかりません。
統計も数学も機械学習アルゴリズムへの理解も足りないので当然ですね。
とはいえ「とりあえず」で動かしてみる環境がある今の時代には感謝して、ここからどこまでいけるか勉強を始めていきます。
まずは仕事で始める機械学習をとりあえず一周読むのと、12/11から始まるCoursera Machine Learningを3度目の正直で制覇してみようと思います。