いいよ。まず初めに、「どんなAIサービスを作りたいのか」という目標が決まったら、そのためにどんなデータが必要かを検討するの。そして実際にデータを集める。例えば「犬と猫の画像判定を行うAIサービスを作りたい」としたら、どうすればいい?
犬と猫の画像のデータを集める必要があるよね。
そう。自分が大量にデータを保有していたり、自分で収集可能だったりするのなら、それを使う。もしそうでない場合は、誰かがどこかで提供してくれているデータセット(=データ集。例えばKaggle犬猫画像/MNIST手書き文字画像/ImageNet画像データベースなどがある)をダウンロードするか、インターネット上をクロール*1しながらWebスクレイピング(Web scraping)*2して画像をかき集める必要があるわね。その際、もちろん利用許諾などには注意する必要があるよ。
*1 インターネット上のファイル群を自動的に捜索して、HTMLファイルや画像ファイルなどの情報データベースを作成していくこと。代表例としては、Google検索用の情報データベースを作る「Googlebot」がある。
*2 HTMLソースから必要な情報だけを抽出すること。
スクレイピングは以前にもやったことがあるなぁ。この手順は今の自分でもできそうだよ。
(な、何ドヤ顔なのよ。私の開発力が優秀ってことじゃないの!)
次に、どのような手法を採用するかを検討する。「ディープラーニングがいいか? ディープラーニングなら、CNNか? RNNか?」など、適切な機械学習の手法や、学習方法、アルゴリズムを選んだり、(まれだけど)適切なものがなければ独自に設計したりする。ちなみに、今回はディープラーニングを中心に話しているわけだけど、実際にはディープラーニングよりも、他の機械学習手法の方が精度が良かったり、効率的に作成できたりする場合があって、実際に現場ではディープラーニング以外を選択するケースも多いのよ。
ふ〜ん。この手順は、幅広い機械学習の知識と経験が必要そうだね。ボクにはまだ難しいかも。
そうね。まずはディープラーニングができるようになってから、少しずつ知識と経験を広げていくといいと思うわ。
で次に、収集しておいたデータから、必要なデータを選別する。ただし、選別したデータがそのままの形ですぐに使えるというのは、練習用データでもない限り、一般的な実用データではあまりないの。例えばデータの一部が欠損していたらそこにはランダム値を入れたりだとか、数値のフォーマットやテキスト項目がデータ入力者によってバラバラで統一されていなかったら名寄せ処理をしたりだとか、そのままでは機械学習で使用できないデータを何とかして使用可能な形に整える必要がある(=データクレンジング:Data cleansing、もしくはデータクリーニング:Data cleaning)。「暴れん坊の牛や馬を集めて飼いならす」みたいに力技が必要で大変だから、データラングリング(Data wrangling)って呼ばれたりもするのよね。
ネットで検索したら、“wrangler”は、馬などの家畜を操るために雇われたカウボーイのことだって書いてある。カウボーイかぁ…、大変そうだね。
ちなみに機械学習では、より良い結果が出るように、データの数値を前処理するためのテクニックがいろいろとあるの。最も代表的なものには次のものがあるよ。
正規化…標準化…!? なんかピンとこないなぁ…。
そうだわね。そのあたりはそのうち具体的な例を見ながら学んでいくとしよう。
数値は前処理が必要として、画像データの場合は、前処理しなくていいのかな?
画像の場合も、前処理をすることで精度が良くなることが多いの。例えば人の顔を画像認識させたいのであれば、顔をあらかじめ切り抜いておいた方が学習しやすいよね。このような画像や映像の加工には、OpenCVというライブラリがよく使われているのよ(参考:「OpenCV入門」)。
じゃ、文章データの場合は?
自然言語のテキストデータを、品詞情報に基づき、意味の最小単位である「形態素(けいたいそ)」に分解する技術を形態素解析(Morphological Analysis)と呼ぶんだけど、まずはデータの前処理として形態素を切り出しておくの。日本語の形態素解析では、MeCabというライブラリがよく使われているよ。
OpenCVとMeCabは、暇なときに試してみるよ。あと「データ拡張」というのは?
主に、不足する画像データを補うために使われるテクニックで、その内容は次のとおり。自前で用意するデータは不足しがちなので、最近では頻繁に利用されているのを見かけるわね。
なーるほど。画像を加工して、たくさんの画像があるものとして学習させるわけだ。それにしても、データを学習する前には、いろんなことをやるんだね。
前処理で学習結果が変わってくるから、意外に重要なのよね。手順(5)からここに戻ってきて、試行錯誤しながら機械学習モデルの再作成を何回も繰り返すこともあるので、意外にこの手順(3)の作業時間が一番長かったりするのよ。
「学習・評価用にデータを分割」とあるけど、データを分けるの?
教師あり学習では、何度も登場しているトレーニングデータとは別にあと2つ、合わせて下記の3つのデータセットに分ける必要があるの。
教師あり学習以外は?
教師なし学習や強化学習は、正解ラベルと一致するかチェックしてパフォーマンス(性能)を評価する必要がないから、精度検証データは用意せずに、
の2つのデータセットに分割すればいいよ。
精度検証データとテストデータは何が違うの?
精度検証データは、手順(5)の「モデルの評価」で使うチューニング用データのことだよ。一方、テストデータは、同じく手順(5)で完成候補のモデルに対して使う最終テスト用のデータね。学習やチューニングに使ったデータは良い結果が出るようにバイアスがかかっている可能性があるので、そういったバイアス問題などを回避するためにも、最終テストには全く未使用のデータを使った方がいいから、この2つは分けておくの。
確かに、学習に使っていないデータが全く残っていないと、本番環境のAIサービスをチェックする際にも困りそうだもんね。気を付けないと。で、全てのデータに対して、どれくらいの割合で分割すればいいの?
それはケース・バイ・ケースなので一概に言えないよね。強いて目安を挙げるとすると、3つのデータセットに分割する場合は、
ぐらい。2つのデータセットに分割する場合は、
ぐらいがよいと思うよ。でも、データ量がかなり多いとき、例えば数百万のデータがあるなら、テストデータに数十万も必要ないだろうから、通常は精度検証データやテストデータの割合をもっと減らして、その分、トレーニングデータの割合を増やした方がいいわね。
Copyright© Digital Advantage Corp. All Rights Reserved.