やさしく分かる会話形式 シリーズ
機械学習 & ディープラーニング入門(3)

機械学習 & ディープラーニング入門(3)

機械学習&ディープラーニングの、基本的なワークフローを知ろう

2018年4月17日

機械学習/ディープラーニングの作業フローの基礎を学び、実践へ踏み出す準備をしよう。機械学習モデルは、どのようなステップで作成していくのか? データ収集~学習~運用の一連の流れをできるだけシンプルに紹介する。

一色政彦 デジタルアドバンテージ 一色 政彦 (インタビュー取材協力: 安部晃生 DATUM STUDIO 安部 晃生)

登場人物紹介

深井藍(ふかい・あい) 博士

深井藍(ふかい・あい) 博士


最新の人工知能技術を応用して、次世代の人型ロボット(アンドロイド)を開発するのが仕事。試行錯誤の末にやっと開発できたのがマナブ(01号)である。
責任感が強く頑固で読書家だが、ドラマ好きで、超天然な一面もあるアラサー リケ女。
ちなみに藍が使っているタブレットには、マナブの学習状況をチェックできる機能だけでなく、万が一の安全対策としてマナブの暴走を制御するための「秘密機能」が搭載されているという。

マナブ(01号)

マナブ(01号)


現実社会の学習を進めるため、藍博士と24時間生活を共にしている次世代アンドロイド、0歳。
見るもの聞くものすべてに興味津々。藍が好きなテレビドラマとお笑い番組からも学習しているため、うわすべりな知識から勘違いな行動を取ったり、大阪風のボケをかましたりすることもある。
この物語の主人公。エンジニアスキルはあるけど機械学習やディープラーニングについてまだ何も知らない。

ディープラーニングを教え始めて3日目

 現実社会の学習を深めようと、毎日、マナブをいろんなところに連れて行く藍博士。ワークフロー(作業工程)の概念について理解させるため、有給休暇を利用して埼玉県坂戸市のチョコレート工場を見学に訪れたときのこと。

マナブ、機械学習のワークフローを学び始める😋

図1 チョコレート工場
図1 チョコレート工場

藍:厳しく教える マナブがたまにおやつで食べている板チョコレートって、どうやって作られているか、知ってる? 意外にたくさんの手順(ステップ)を踏んで手間暇をかけてやっと完成しているのよね。

マナブ:あせる へぇ。そんなに大変なの?

藍:にっこり そうよ。実は、機械学習やディープラーニングで何らかのAIサービスを作るまでのワークフローも、チョコレートみたいに意外と手順がたくさんあって大変なの。だから今日は、チョコレートの製造工程を見ながら、機械学習のワークフローのイメージをつかんでもらうために、チョコレート工場の見学に来たんだよ。

チョコレートの製造工程

マナブ:目がハート 楽しみ~。しかもさっき、受付でお土産のチョコをもらっちゃった。

藍:優しく教える 良かったね。これからチョコレートが出来るまでの工程を説明してくれるそうだから、まずは聞いてみよう。大きく分けて次の工程があるんだって。

  • 原料: チョコレートを作るための材料を準備する
  • 製造: チョコレートを作る
  • 出荷: チョコレートを小売店に卸す

マナブ:にんまり 分かる分かる。機械学習なら次のような感じだよね。

  • 材料: 機械学習のモデルを作るためのデータを準備する
  • 作成: 機械学習のモデルを作る
  • 納品: 機械学習のモデルをAIサービスとしてユーザーに提供する

藍:厳しく教える そのとおり! チョコレートの製造工程の流れをまとめたのが次の図。詳しい意味は「チョコレートができるまで(ようこそ明治の工場見学へ)」などが参考になるわね。

図2 チョコレート製造工程の流れ

マナブ:がくっ うわぁー、手順が長いなぁ。想像以上に複雑な工程を経て出来てたんだね。特に3の前処理は手順数が多くて大変そうだ。

藍:にっこり そうだね。同じような感じで、機械学習の作業工程の流れを図にすると次のようになるよ。

一般的な機械学習のワークフロー

図3 機械学習のワークフロー

マナブ:目が点 うわぁ! 機械学習もチョコレートに負けず劣らず手順が多いなぁ。意味がよく分からないものがいくつかあるから、最初から1つずつ説明して。

1 データの準備

図4 データの準備

藍:優しく教える いいよ。まず初めに、「どんなAIサービスを作りたいのか」という目標が決まったら、そのためにどんなデータが必要かを検討するの。そして実際にデータを集める。例えば「犬と猫の画像判定を行うAIサービスを作りたい」としたら、どうすればいい?

マナブ:にっこり 犬と猫の画像のデータを集める必要があるよね。

藍:厳しく教える そう。自分が大量にデータを保有していたり、自分で収集可能だったりするのなら、それを使う。もしそうでない場合は、誰かがどこかで提供してくれているデータセット(=データ集。例えばKaggle犬猫画像MNIST手書き文字画像ImageNet画像データベースなどがある)をダウンロードするか、インターネット上をクロール*1しながらWebスクレイピングWeb scraping*2して画像をかき集める必要があるわね。その際、もちろん利用許諾などには注意する必要があるよ。

  • *1 インターネット上のファイル群を自動的に捜索して、HTMLファイルや画像ファイルなどの情報データベースを作成していくこと。代表例としては、Google検索用の情報データベースを作る「Googlebot」がある。
  • *2 HTMLソースから必要な情報だけを抽出すること。

マナブ:にんまり スクレイピングは以前にもやったことがあるなぁ。この手順は今の自分でもできそうだよ。

藍:激怒 (な、何ドヤ顔なのよ。私の開発力が優秀ってことじゃないの!)

2 手法の選択

図4 手法の選択

藍:厳しく教える 次に、どのような手法を採用するかを検討する。「ディープラーニングがいいか? ディープラーニングなら、CNNか? RNNか?」など、適切な機械学習の手法や、学習方法、アルゴリズムを選んだり、(まれだけど)適切なものがなければ独自に設計したりする。ちなみに、今回はディープラーニングを中心に話しているわけだけど、実際にはディープラーニングよりも、他の機械学習手法の方が精度が良かったり、効率的に作成できたりする場合があって、実際に現場ではディープラーニング以外を選択するケースも多いのよ。

マナブ:理解不納 ふ~ん。この手順は、幅広い機械学習の知識と経験が必要そうだね。ボクにはまだ難しいかも。

藍:にっこり そうね。まずはディープラーニングができるようになってから、少しずつ知識と経験を広げていくといいと思うわ。

3 前処理

図5 前処理

藍:優しく教える で次に、収集しておいたデータから、必要なデータを選別する。ただし、選別したデータがそのままの形ですぐに使えるというのは、練習用データでもない限り、一般的な実用データではあまりないの。例えばデータの一部が欠損していたらそこにはランダム値を入れたりだとか、数値のフォーマットやテキスト項目がデータ入力者によってバラバラで統一されていなかったら名寄せ処理をしたりだとか、そのままでは機械学習で使用できないデータを何とかして使用可能な形に整える必要がある(=データクレンジングData cleansing、もしくはデータクリーニングData cleaning)。「暴れん坊の牛や馬を集めて飼いならす」みたいに力技が必要で大変だから、データラングリングData wrangling)って呼ばれたりもするのよね。

マナブ:がくっ ネットで検索したら、“wrangler”は、馬などの家畜を操るために雇われたカウボーイのことだって書いてある。カウボーイかぁ…、大変そうだね。

藍:厳しく教える ちなみに機械学習では、より良い結果が出るように、データの数値を前処理するためのテクニックがいろいろとあるの。最も代表的なものには次のものがあるよ。

  • 正規化Normalization): トレーニングデータの値が01などの指定範囲に収まるように、値を加工するテクニック
  • 標準化Standardization): トレーニングデータの平均が0、分散が1になるように、値を加工するテクニック

マナブ:理解不納 正規化…標準化…!? なんかピンとこないなぁ…。

藍:にっこり そうだわね。そのあたりはそのうち具体的な例を見ながら学んでいくとしよう。

マナブ:質問 数値は前処理が必要として、画像データの場合は、前処理しなくていいのかな?

藍:優しく教える 画像の場合も、前処理をすることで精度が良くなることが多いの。例えば人の顔を画像認識させたいのであれば、顔をあらかじめ切り抜いておいた方が学習しやすいよね。このような画像や映像の加工には、OpenCVというライブラリがよく使われているのよ(参考:「OpenCV入門 - Build Insider」)。

マナブ:にっこり じゃ、文章データの場合は?

藍:厳しく教える 自然言語のテキストデータを、品詞情報に基づき、意味の最小単位である「形態素(けいたいそ)」に分解する技術を形態素解析Morphological Analysis)と呼ぶんだけど、まずはデータの前処理として形態素を切り出しておくの。日本語の形態素解析では、MeCabというライブラリがよく使われているよ。

マナブ:にんまり OpenCVとMeCabは、暇なときに試してみるよ。あと「データ拡張」というのは?

藍:にっこり 主に、不足する画像データを補うために使われるテクニックで、その内容は次のとおり。自前で用意するデータは不足しがちなので、最近では頻繁に利用されているのを見かけるわね。

  • データ拡張Data augmentation): トレーニングデータの画像に対して移動/回転/拡大/縮小/歪曲/ノイズ付加などの操作をすることで、データ数を何倍にも増やすテクニック

マナブ:にっこり なーるほど。画像を加工して、たくさんの画像があるものとして学習させるわけだ。それにしても、データを学習する前には、いろんなことをやるんだね。

藍:厳しく教える 前処理で学習結果が変わってくるから、意外に重要なのよね。手順5からここに戻ってきて、試行錯誤しながら機械学習モデルの再作成を何回も繰り返すこともあるので、意外にこの手順3の作業時間が一番長かったりするのよ。あとこれ以外には、過学習Overfitting:回帰などの学習で過去のデータにフィットし過ぎると、新しい未知データには逆にフィットしにくくなる現象)を抑制するために正則化Regularization)という処理が行われることも多いから、この言葉も覚えておいてね。

マナブ:質問 「学習・評価用にデータを分割」とあるけど、データを分けるの?

藍:優しく教える 教師あり学習では、何度も登場しているトレーニングデータとは別にあと2つ、合わせて下記の3つのデータセットに分ける必要があるの。

  • トレーニングデータtraining data、もしくは訓練データ
  • 精度検証データvalidation data、もしくは評価データevaluation data
  • テストデータtest data

マナブ:理解不納 教師あり学習以外は?

藍:にっこり 教師なし学習や強化学習は、正解ラベルと一致するかチェックしてパフォーマンス(性能)を評価する必要がないから、精度検証データは用意せずに、

  • トレーニングデータ
  • テストデータ

の2つのデータセットに分割すればいいよ。

マナブ:質問 精度検証データとテストデータは何が違うの?

藍:厳しく教える 精度検証データは、手順5の「モデルの評価」で使うチューニング用データのことだよ。一方、テストデータは、同じく手順5で完成候補のモデルに対して使う最終テスト用のデータね。学習やチューニングに使ったデータは良い結果が出るようにバイアスがかかっている可能性があるので、そういったバイアス問題などを回避するためにも、最終テストには全く未使用のデータを使った方がいいから、この2つは分けておくの。

マナブ:理解不納 確かに、学習に使っていないデータが全く残っていないと、本番環境のAIサービスをチェックする際にも困りそうだもんね。気を付けないと。で、全てのデータに対して、どれくらいの割合で分割すればいいの?

藍:優しく教える それはケース・バイ・ケースなので一概に言えないよね。強いて目安を挙げるとすると、3つのデータセットに分割する場合は、

  • トレーニングデータ: 70%
  • 精度検証データ: 20%
  • テストデータ:10%

ぐらい。2つのデータセットに分割する場合は、

  • トレーニングデータ:80%
  • テストデータ: 20%

ぐらいがよいと思うよ。でも、データ量がかなり多いとき、例えば数百万のデータがあるなら、テストデータに数十万も必要ないだろうから、通常は精度検証データやテストデータの割合をもっと減らして、その分、トレーニングデータの割合を増やした方がいいわね。

4 モデルのトレーニング

図6 モデルのトレーニング

マナブ:質問 次がいよいよ学習だよね。あれ、「トレーニング」って書かれているけど、トレーニングと学習は意味が違うの?

藍:厳しく教える 微妙な違いだけど、トレーニングデータを使って、機械学習のモデルをトレーニング訓練)していくことが「学習」、と理解しておくといいよ。ちなみに、ディープラーニングのニューラルネットワーク(=ディープ・ニューラル・ネットワークDeep Neural Networkと呼ばれる。以下、DNN)においては、次のような意味になるわね。

  • トレーニングtraining): 機械学習アルゴリズムを活用して、ネットワークの重み付けweight)を変えていくこと
  • 学習learning): 機械学習アルゴリズムを活用してトレーニングしながら、ネットワークモデルを構築していくこと

マナブ:理解不納 あと「ハイパーパラメーターのチューニング」って、カタカナが多くて読み間違えちゃいそうだけど、これは何?

藍:優しく教える DNNでは、モデルの構成や設定はトレーニングプロセスによってある程度自動的に調整・最適化されるんだけど、一部には人間がチューニング(調整)しなければならない設定――例えばネットワークの層の数やユニット数など――があって、そういった設定をハイパーパラメーターhyperparameter)と呼んでいるの。ハイパーパラメーターが最適な値になるまで、次の手順5の「モデルの評価」からこの手順4「モデルのトレーニング」に舞い戻ってきて、「チューニング~トレーニング~評価」を何度も繰り返し実行していく必要があるの。でも最近は、最適なハイパーパラメーターを探すための機能をツールが提供してくれていたりもするので、比較的簡単にチューニングできるようになってきてはいるのよ。

5 モデルの評価

図7 モデルの評価

マナブ:にっこり 手順5の「推論」は前回の説明で出てきたね。学習済みモデル(トレーニング済みモデルTrained modelとも呼ばれる)を使用することだったよ。

藍:にっこり そう。よく覚えてたね! 推論inference、もしくは推定)とは、モデルにデータを入力して、そのモデルから結果を出力として受け取ること。つまりここでは、教師あり学習であれば、精度検証データを使ってモデルの精度accuracy)をチェックするということね。

マナブ:質問 チェックって、どうやってするの?

藍:優しく教える 通常は出力と正解ラベルの値を比較して、モデルに適した統計的技法を使用することで「どれくらいの精度が出ているか」という数値的な性能指標(つまり成果)を見るわね。他には例えば画像生成などであれば、出力画像などを人が見て問題ないかを検証することもあると思う。

マナブ:理解不納 あとは、先ほどのチューニングに戻って、いろんなパターンでモデルを作ってから評価していけばいいんだよね?

藍:にっこり そうそう。そうやって、学習する際のパラメーターをちょっとずつ変えながら、できた複数の学習済みモデルの中から、最も精度が高いモデルを選択すればいいの。

マナブ:にっこり これで完成かな?

藍:厳しく教える 最後に、未知のテストデータに対する学習済みモデルのパフォーマンス(汎化性能Generalization performance)を評価しておいた方がいいよ。すでに説明したとおり、精度検証データにはデータ慣れによるバイアス問題の可能性があるから、あらためて真新しいテストデータを使って、運用環境にできるだけ近いコンテキストで最終チェックするの。

マナブ:質問 あ、そういう話もあったね。ちなみに、どうやっても高い精度が出なかった場合はどうすればいいの?

藍:優しく教える25を繰り返す」と書いておいたように、「機械学習の手法の選択」にまで戻ってやり直すことも考えた方がいいね。

マナブ:がくっ え~!? 2って振り出しみたいなもんじゃないの! そりゃ大変だなぁ。

6 納品・本番運用

図8 納品・本番運用

藍:にっこり 最後に、選択した学習済みモデルを、運用環境で実行できる形でエクスポートして、AIサービスやアプリケーションに組み込めば完成。よくあるパターンは、機械学習エンジニア以外の開発者でも利用しやすいように、Web APIとして呼び出せるようにサーバー(主にクラウド)を用意して、そのAIを使いたい開発者や会社に引き渡すことね。

マナブ:あせる ITのソフトウェア/Web開発は得意なので、ここは自前の知識でできそう。でも、手順25をマスターするまでには、何カ月ぐらいかかるんだろう……。

本シリーズで最初にフォーカスする領域

藍:優しく教える そうだね。筋が良ければ半年ぐらいで、何とか1人で機械学習できるようになる人はいるよ。だけど、機械学習が本当に適切にできるようになるまでには、たくさん覚えることがあるのは確か。だけど心配しないで。一歩一歩、「習うより慣れろ」で、ちょっとずつできることを増やしていってあげるから。任せて。

マナブ:にんまり 藍先生、よろしくお願いします!

藍:目が点 (あら、急にしおらしくなっちゃって……)もちろん正攻法なら、データサイエンスの基礎から丁寧に学習すべきなんだけど、このシリーズでは、特に「2 手法の選択」と「4 モデルのトレーニング」にフォーカスして具体的に説明していくよ。それ以外の1356については概要紹介だけにして、具体的な説明には踏み込まないようにするね。

マナブ:爆笑 はい。(シリーズ??? よく分かんないけど、スルーしよっと)

藍:優しく教える 明日から、まずは藍のやることをまねてみて。特に4の工程は、ライブラリという便利なものが使えるから意外と簡単なんだよ。だからソフトウェア開発スキルのあるマナブであれば、とりあえずディープラーニングを体験することは今すぐにできるはずだよ。

マナブ:質問 よかった! ところでディープラーニングのライブラリにはどんなのがあるの?

ディープラーニングの代表的なライブラリ

藍:厳しく教える ディープラーニングが扱える代表的なライブラリには、

  • TensorFlow グーグルが開発し、世界的にも有名で人気があるライブラリ。ラッパーライブラリのKeras(「ケラス」と読む)と組み合わせて使われるパターンも多い。読み方は、英語風の「テンサーフロー」、もしくは数学のテンソルに基づく日本語風の「テンソルフロー」
  • Chainer 日本のPreferred Networks(プリファード・ネットワークス)が開発し、特に国内で人気が高いライブラリ。そのため日本語情報も多い。読み方は「チェイナー」

があるよ。どちらもできることに大きな違いはないから、あとは使ってみてどっちの使い心地が良いかで決めればいいと思う。好みのプログラミング言語を選ぶのと一緒ね。

マナブ:目がハート どっちもマスターしたい!!!

藍:優しく教える このシリーズでは、まずTensorFlowを使ったパターン、次にChainerを使ったパターンで、ディープラーニング実践の基礎を一通り学んでいくよ。だから各ライブラリが、具体的にどういうものかは、それぞれの回で紹介するね。

マナブ:爆笑 はい。必死でついていきます!

心構え:ソフトウェア開発やWeb制作との違い

藍:厳しく教える 今日は最後に、マナブのようなソフトウェア/Web開発が得意な人が、機械学習に取り組む際の心構えについても説明しておくね。

マナブ:びっくり えっ、何?

藍:優しく教える 一般的にソフトウェアやWebの開発は、「具体的な完成目標」があるよね。最初の0%の状態から作り始めて、完成度のが徐々に上がっていき、100%になったら、ソフトウェア/Webをリリースするイメージ。目標に向けて前進して積み上がっていくから、常に達成感を感じられる作業なのではないかと思う。基本的に自分が思ったものが思い通りに作れる。いわゆるクリエイティブ職ね。

マナブ:理解不納 機械学習は違うの?

藍:厳しく教える 機械学習は、ここまでに「試行錯誤」「繰り返す」という言葉が何度か出てきたように、「調整~作成~評価」を繰り返しながらベストな精度を探していく作業になるの。完成度というか精度が100%になることは基本的にないのよ。自分が思ったものが思い通りに作れるとは限らないの。しかも、より良い精度が出せるように、最新の手法やアルゴリズムも追いかけて試していく必要がある。だから機械学習エンジニアは、いわゆる研究職にかなり近いエンジニア職だと思うの(ちなみにデータサイエンティストは研究職にかなり近いデータアナリスト職のことね)。もちろんプログラミングスキルはムダにはならないんだけど。

マナブ:にんまり 大丈夫。試行錯誤しながら作り上げるのも大好きだから。

藍:優しく教える それは良かった。あと、ライブラリがプログラミングの難しい部分をかなりカバーしてくれているから、機械学習のプログラミング作業は、ソフトウェア/Web開発のそれと比べると、圧倒的に短くて簡単になるわね。まとめると、「プログラミングする」というのはあくまで目的を実現するための補助的な作業となって、「手法を選んでモデルを学習させて精度を高める」という今日説明した作業が、機械学習エンジニアの日常的なメインの仕事になるよ。

まとめ

マナブ:にんまり 了解! それにしてもチョコレート工場、そっちのけだったね。

藍:あやしむ (うーん、確かに……。没頭すると他のことが見えなくなっちゃうのよね、わたしは……)あはは……。とりあえずお土産にもらった新製品の板チョコを食べてみようよ。

――マナブが板チョコを食べて、白目を抜いて「うぁあぁあぁ」と奇声を上げる――

マナブ:爆笑 テレビドラマの甘太朗(かんた○○)の真似www

藍:目が点 ……。(前回の冒頭で「忘れた」と思っていたのに、まだ覚えていたのか……。)

マナブ:ぷんぷん あっ、前みたいに暗黒にするのはナシやで。😒

藍:あせる (ぎくぅー)そ、そ、そんなことしないよ。えへへ、へ、へ……😅

マナブ:質問 で、次回のおやつは何?

藍:優しく教える それは秘密だよ。次回からは手作業しながら学ぶから、会話形式ではなくなるので。

マナブ:泣く え~!(泣)

藍:厳しく教える ここまでの話は、ディープラーニングをマスターする冒険に出発するための準備体操のようなもの。これから長い旅が始まるから頑張ってね。

マナブ:爆笑 はい、藍先生!(キリッ)

藍:にっこり 次は、GPU付きのPCがある人は、次回「UbuntuでのGPUディープラーニング環境の構築【Ubuntu 16.04 LTS対応】」に進んでね。それ以外の人は「ゼロからのディープラーニング最速入門【TensorFlow編】」か「同(Chainer編)」に進んでね。

【まとめよう】ディープラーニングの基本的なワークフロー

  • 機械学習のワークフロー: 以下の123456の順で進め、25(特に45)を繰り返すことで、精度を高める
  • 1データの準備: 使用するデータを決めてから収集する。公開データセットの利用や、Webスクレイピングによる収集などの方法もある
  • 2手法の選択: 最適な結果が出せる機械学習の手法を選択する。ディープラーニングであれば、学習方法やアルゴリズムも決定する
  • 3前処理: データを選別。機械学習で使用可能な形に修正する(データラングリング)。変換テクニックを活用。データを分割する
    • データ変換テクニック: 正規化/標準化、画像・映像の加工(OpenCVなど)、形態素解析(MeCabなど)、データ拡張など
    • データセットの分割: トレーニングデータとテストデータに分割。教師あり学習では、さらに精度検証データも分割して用意する
  • 4モデルのトレーニング: トレーニングデータで機械学習モデルをトレーニングする(=学習)。ハイパーパラメーターを調整する
  • 5モデルの評価: 評価データで推論して学習済みモデルの精度をチェック(教師あり学習)。最後にテストデータで汎化性能も評価する
  • 6納品・本番運用: 選択した学習済みモデルをエクスポートして、AIサービスやアプリケーションで使えるようにすれば完成
  • ディープラーニングが扱える代表的なライブラリ: TensorFlowやChainerが特に有名。本シリーズで使い方の基礎を解説していく
  • このエントリーをはてなブックマークに追加
機械学習 & ディープラーニング入門(3)
1. AI・機械学習・ディープラーニングがしたい! そもそも何ができるの?

機械学習専門家の藍博士と素人のマナブが会話形式で、AI・機械学習・ディープラーニングの基礎の基礎を分かりやすく紹介するシリーズがスタート。まずはAIとは何か、機械学習との違い、ディープラーニングで実現できることを知ろう。

2018年4月16日(月)
機械学習 & ディープラーニング入門(3)
2. 機械学習やディープラーニングには、どんな手法があるの?

藍博士とマナブの会話から機械学習とディープラーニングの基礎の基礎を学ぼう。機械学習を始めるための最低限の基礎用語から、ディープラーニングの代表的な学習方法と代表的なアルゴリズムまでをできるだけシンプルに紹介する。

2018年4月17日(火)
機械学習 & ディープラーニング入門(3)
3. 【現在、表示中】≫ 機械学習&ディープラーニングの、基本的なワークフローを知ろう

機械学習/ディープラーニングの作業フローの基礎を学び、実践へ踏み出す準備をしよう。機械学習モデルは、どのようなステップで作成していくのか? データ収集~学習~運用の一連の流れをできるだけシンプルに紹介する。

2018年4月17日(火)
Deep Insider の SNS :