はじめての機械学習 ~Google Developers ML Summit~

2019年6月3日

こんにちは、ヤマレコ エンジニアのKJです。

前回の記事で軽く触れたのですが、ヤマレコエンジニアの技術向上の一環として、
機械学習のイベントである『Google Developers ML Summit』に参加してきました!

せっかくなので、その体験をみなさんと共有したいと思います。

1. そもそも機械学習って何?

みなさんは『機械学習』という単語を耳にしたことはありますか?
私は存在こそは知っていたものの、イベントに参加するまでは、

  • AIを作る技術
  • 高度な数学レベルが要求されそう
  • なんか難しそう
  • 山の画像分析とかできれば、ヤマレコに役立てられそう
  • いつかちゃんと勉強したい

などなど、漠然と考えていただけでした。

上で軽く触れたように、機械学習とはAIを作る技術のうちの一つです。
AI(人工知能)であれば、なんとなくイメージがつきませんか?

例えば『AIのアルファ碁(AlphaGo)、プロ棋士に勝利!』など、AIの活躍がニュースになったりしますよね。
身近なところでいえば『迷惑メールフィルター』や、スマートフォンユーザーなら使ったことがあるかもしれない『Siri』や『Googleアシスタント』などの音声アシスト機能がAIと言われています。

2. AIとロボットの違い

AIについてなんとなく分かった気になっている私ですが、もし「ロボットとは何が違うんですか?」と聞かれたら、口がモゴモゴしちゃうかもしれません。
違いの説明としてよく言われているのが、

  • 人間のプログラム通りに動くのがロボット
  • 自分で学習し発展していくことができるのがAI

です。
よし!分かった!次に質問されたら、こう答えるようにします。
しかし追撃がきます。
AIが自分で学習するって、つまりどーいうことですか?
えっと………。
AIが自分で学習するということ……。

『Google Developers ML Summit』の機械学習の概要で受けた説明では、確か…。

———

例えば、アジサイとヒマワリを判別するAIを作りたいと思います。

 

みなさんは上の写真をみて、どちらの写真がアジサイか分かりますか?
分かるとして(ほとんどの人が分かると思います)、何を基準にアジサイとヒマワリを見分けていますか?

花の真ん中に小さなつぶつぶがたくさんあったらアジサイ?
花びらの色が黄色だったらヒマワリ?
葉っぱのフチがギザギザしてたらアジサイ?
茎がまっすぐ伸びていたらヒマワリ?

多くの人はこの写真を見せられたら、一瞬でアジサイなのかヒマワリなのか答えられると思います。
それはなんらかの「見分け方」を持っているからですよね。

その「見分け方」を人間が機械に教えてあげる…「花びらが黄色で茎がまっすぐならヒマワリだよ」「真ん中に小さな蕾状のものがあって葉っぱの周りがギザギザだったらアジサイだよ」と機会にあらかじめ教えてあげるのは………AIではありません!

機械自身が写真をみて「花びらが黄色で茎がまっすぐならヒマワリ」という「見分け方」をみつけられるのがAIであり、そのためのお膳立てをするのが「機械学習」です。
「機械学習」にもいろいろなやり方があるのですが、「これがヒマワリの写真だよ」「これがアジサイの写真だよ」と、事前に正解の写真(データ)を教えてあげる手法のことを「教師あり学習」と呼んでいます。

———-

「AIが自分で学習するって、つまりどーいうことですか?」という質問に対して、もし自分の言葉で説明するとしたら、
「正解データの分析をして、何らかの基準、ルールを見つけ出すことだよ。これ以外の学習方法もあるよ」でしょうか。

3. Google Developers ML Summit とは

AIと機械学習について分かったところで、『Google Developers ML Summit』について紹介したいと思います。
『Google Developers ML Summit』とは、Googleが主催する機械学習に特化している無料イベントです。
Googleは「TensorFlow」「Cloud ML」「ML Kit」「Actions on Google」などなど、機械学習に役立つツールやデータなどを数多く提供してます。
日本ではまだまだ機械学習エンジニアが不足しているそうで、その人材育成とGoogleの機械学習サービスの普及のために、当イベントのような、初学者向けのサポートをしてくれているのだと思います。

今回、私が受講したプログラムは下記のとおりです。

<<午前の部>>

  • 機械学習の概要
  • TensorFlow 2.0: Machine Learning Made Easy
  • Cloud ML API 入門
  • ML Kit 事例紹介 (仮)
  • Actions on Google 事例紹介

<<午後の部>>

  • TensorFlow コードラボ

この記事で触れているのは、「機械学習の概要」と「TensorFlow コードラボ」のさわりの部分のみです。
私が受講したのは3月20日でしたが第二回目で、また開催されるかもしれません。
興味がある人はGoogleの公式ブログなどをチェックしてみてくださいね!

Google Developers Japan(Google開発者向けブログ)

美味しいお弁当もいただけますよ♪

こちらももう終わってしまっているのですが、無料オンライン学習を開催されていたり、
ML Study Jams

機械学習を学ぶにあたって、有益でお得な情報が盛り沢山です。

4. ヤマレコで機械学習を活かすには??

Google Developers ML Summitに参加したことで機械学習が何をやっているのか多少は分かった気がします。
まだまだ、機械学習のほんの入り口の部分を聞いてきただけなのですが、
いつかは、ヤマレコで機械学習を利用したサービスを作りたいです。

お問い合わせの自動返信とか…(味気ない?)
ヤマレコMAPで動植物判定や山座同定ができるようにするとか…
(すでに類似アプリはありますが、正確性がイマイチで)
気象予知とか…

がんばるぞ!

5. 機械学習の流れ

ここからは、今までより、もう少し専門的な技術に関しての共有をしたいと思います。
知識が無くても、自分の手を動かして機械学習を体験できるようになっているので、よかったら最後まで読んでくださいね。

———-

『2. AIとロボットの違い』の復習になりますが、機械学習は次のステップで進んでいきます。

STEP
1. データ準備 アジサイとヒマワリの写真を大量に用意する
2. モデルの学習 ↑の画像を取り込み、アジサイとヒマワリの分析をさせる
3. モデルの利用 ↑の分析結果を利用して、新しい写真の判定をさせる

上記を踏まえまして、今度は身長、体重から子供か大人を判断させるAIを作りたいと思います。
さっそく子供と大人の身長、体重データを用意しました。

機械学習の前に、まず人としてどう仕訳ければいいか考えてみましょうか。
このデータだと身長150㎝以上と以下で分ければ大人と子供の仕分けができちゃいますが(サンプルとして良くなかったです、ゴメンナサイ)、実際は150cm以上の子供も150cm以下の大人もたくさんいますので、もう少し精度を高めたいと思います。

同じ身長でも成長期を迎える前の子供の方が一般的に体重は軽いです。
その点を利用して、身長と体重の合計が200を超えるか、超えないかを基準に大人と子供の分類をしてみましょう。

身長 + 体重 > 200

身長と体重の合計が200になる点をつないだものがピンクの線になります。
ピンクの線の上が大人、ピンクの線の下が子供と判断する…………と、何件かハズレがでてしまいましたね。
もう少し、正確に判断できるようにしたい。

ピンクの線の角度をこんなふうに調節すれば、ハズレがでなくなる(精度があがる)んですが。
直線の傾きを変えるために、身長・体重に重みづけをしてあげます。

w1×身長 + w2×体重 > 200

でもw1とw2にどんな数字を当てはめれば上のようなピンクの線になるのかは、分かりませんよね。
機械学習ではこのw1とw2に当てはめる数字の調整をAIに任せます。

関数を作ってxという入力値をyという結果を出力し、yと教師データとの誤差が少なくなるまでw1、w2の重みを繰り返し変更していくイメージです。
この動きをGoogleが提供している『Tensorflow Playground』という教育コンテンツで、視覚的に見ることができます。

Tensorflow Playgroundにアクセスすると、

下の画面が表示されますので、再生ボタンをクリックしてみてください。

AIが学習していく流れがイメージできるんじゃないかと思います。

このようにピンクの線が決まったら(=モデルの学習)が終わったら、
AIに新しい身長と体重を渡す、「身長が156cm、体重が43kgの人は大人ですか?」と聞くと「大人です」と答えてくれるようになります(=モデルの利用)

6. コードはどうなっているのか

では実際に開発者は何をするのでしょうか。
『TensorFlow コードラボ』では、Google Colaboratoryというサービスを使って、機械学習のコードとその実行結果をみていきました。
その教材は公開されており、下のリンクからアクセスすることができます。
(Googleアカウントでログインしていることが条件になっていると思います)

Codelabs from #GoogleMLSummit

この教材は、

y = (3 * x) + 1;

という関係にあるxとyという2つの数字の集合から、AIにこの式を導きださせるプログラムの説明をしています。
(“3 * x”の* という記号は、掛け算を表現しています)

では、さっそくコードを実行してみましょう!
コードの左隣に括弧[]がありますね。そこにカーソルを近づけます。

すると[]が再生マークに変わりました。
この再生マークをクリックしてみます。

初回の実行時に下記アラートがでますが、「このまま実行」を選んでください。

上のコードでは、TensorFlowというGoogleが提供している機械学習用のライブラリを読み込んでいます。
コードを実行していくと、Warningメッセージが出力されますが、今回は気にしなくても大丈夫です。

では、TensorFlowのライブラリを利用して、モデルを作り、どのような学習方法をとるかを指定しましょう。

それから、モデルに渡す教師データを作成します。

xsの一番左側の数字が-1.0、ysの一番左側の数字が-2.0になっていますね。
これは

y = (3 * x) + 1;

の関係になっています。
(3 × -1.0 ) + 1 は -2.0 になりますよね。
同じように左側から2番目の数字、0.0と1.0は、(3 × 0.0 ) + 1 = 1.0
同じように左側から3番目の数字、1.0と4.0は、(3 × 1.0 ) + 1 = 4.0
……と全てのxs,xyの組み合わせが、同じ法則になっています。

作成した教師データをモデルに渡しましょう。

教師データを渡すと、データの分析が開始されます。

分析が終了しました。
10.0という数値を渡すと、分析結果を利用して31前後の数値が答えとして帰ってきます。

教材のテキストの末尾にカーソルをあてますと、コードの追加ができます。

分析結果を利用するmodel.predict()に好きな数字を入力すると、

print(model.predict([4.5]))

おお、自分の書いたコードで、モデルの利用ができました。
やったね!

これは『TensorFlow コードラボ』で扱った教材のなかでも、もっともシンプルなものです。
こちらから、他の教材も試せますのでよかったらやってみてください。

2 Comments

  1. shokunpapa より:

    機械学習を活用したヤマレコのサービスについて、こんなのがあればいいなと思うものを挙げてみました。

    (1)撮影した花の写真の画像から、花の名前を判別するサービス。
       これまで、似たような花があるとわかりにくく、違う花の名前を書いていたこともあった。

    (2)過去の山行記録から、おすすめの山を紹介するサービス。
       山コンシュルジュのレコ君をさらにバージョンアップしたもの。
       できるだけいろんな山に行きたい人には、過去に行った山を紹介しないことを学習しているなど。
       また、体力度や危険度について、これまでの記録と似たようなものを紹介するなど。

    • KJ より:

      shokunpapaさん、コメントとご提案ありがとうございます。
      やっぱり花の写真から名前が分かるサービスは需要がありそうですね。
      特に高山植物に特化したものは喜ばれそうです。
      山コンシュルジュも、過去の山行から傾向や登山スタイルを分析すれば、より良い提案ができそうです。(実現は、こちらのほうが簡単そうです)
      ヤマレコはユーザーの皆様のおかげで教師データに恵まれているので、成果をあげられるように頑張りますね。

コメントを残す

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