AIをシステムに実装する方法


### はじめに

ABEJA Advent Calendar 2019の最終日の投稿です。

- https://qiita.com/advent-calendar/2019/abeja
- https://abejainc.com/ja/

ABEJAという会社でマネジメントをしている菊池(@yutakikuc)と申します。よろしくお願いいたします。本投稿のタイトルは**「AIをシステムに実装する方法」**としており、読んでいただきたい対象は下記を想定しています。

- **AIを活用したいが、何から始めたら良いか困っているシステムエンジニアの方**

ちなみに弊社代表の岡田が**「AIをビジネスに実装する方法」**というタイトルで本を出版しております。本投稿はこちらの非常にわかりやすいという本に対しての敬意も含めてタイトルをオマージュしております。

- https://www.amazon.co.jp/dp/B07K1Z8WRS/

私は学生時代にパターン認識の研究をやっていたので、社会人になってからAIをゼロから勉強した人間ではありませんが、AIをシステムに実装する上での様々な知識は大学卒業後に所属した企業の研究機関、その中でも特に業務外で調査して身につけたものが95%です。今はAIを実装するための開発ツールやライブラリもそこら中に転がっているので、システムに実装する環境も日々進歩しているため、AIをシステムに実装することの挑戦も簡単にできる状況です。システムエンジニアの多くの方が新しく吸収したことをすぐに成果として出すことが得意であると思うので、**AIを試したい意欲さえあれば**、少しの勉強だけでも十分に効果が出せるレベルに達することが可能です。

今後ありとあらゆる産業課題に対してAIが浸透することは確実であると言えます。AIの民主化を本当に推し進める上では、**今までAIを活用していなかったシステムエンジニアの方々が一番のキーパーソン**であると断言できます。何から始めて良いか分からないという方が少しでもこのドキュメントが参考になれば幸いです。

### 程よい難易度の課題を自分で定義し、簡単に実装して解いてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25002/8bb605c1-3701-bafc-3a88-824989173854.png)
図) ABEJAが定義するAIに必要な実行プロセスとその課題

繰り返しになりますが、この投稿は「AIを活用したいが、何から始めたら良いか困っている」状態から始める場合を想定しています。AIを活用することでできるのは、データから賢くした人工物の脳で、Yes or Noの判断を高度化したい(離散値予測)、対象のデータに対して複数のラベルやカテゴリを自動的に割り振りたい(離散値予測)、テーブルデータなど特定のカラムの数値を適切な値として予測したい(連続値予測)といった課題に対して解決手段を作ることが可能です。AIを活用するためのステップとして大まかに下記の手順を踏みます。なお、本投稿のタイトルはAIをシステムに実装する方法となっていますが、下記No.5以外にも焦点を当てた内容になっています。

1. 課題を定義する
1. データを集め、教師データを作る
1. AI(モデル)の中身であるアルゴリズムを選定、開発する
1. モデルを評価する
1. システムに実装し、モデルを推論可能する
1. <モデルを賢くするために、上記No.2以降のプロセスを繰り返す>

**※上図の中では更に細分化されたプロセスを定義しています。**

このプロセスの中でも `1. 課題を定義する` がシステム実装において一番重要なポイントとなります。初めての方がいきなり専門性を持った熟練者をAIによって置き換える問題を解いてしまおうとするとAIと人間の精緻な能力との比較で躓くと思いますし、かと言ってif文5行で実装できる簡単な制御コードを1ヶ月掛けてAIにより置き換えるというのも費用対効果が合わないものになります。

では、これからAIを活用したい方が、課題を定義するためには何が重要か。それは程よい難易度の課題を自分で定義することが重要です。この程良さが許容できるか否か。データをもとに学習したAIで判定の対象となる数多くのデータに対して正解率100%を実現することはまず無理です。そのためにAIが間違える、判断を誤ったとしてもそれが**システムのバグや障害に影響を及ぼさない**ということが必要になります。とくかく最初の課題としては始めやすさを追求すべきです。そして**始めやすい課題をいくつか個人・組織で経験し、成功体験として掴む**。その中で徐々に課題を複雑なものに向けていく。その他、考慮すべきポイントを下記に記載します。

- **複雑な課題を最初の課題として設定しないこと**
  - AIが誤った判断をしたとしても、それがサービスに対して影響が小さいこと。
  - 熟練者のような成熟した人間の能力をAIによって置き換えるような課題設定をしないこと。
  - 人間の10歳以下の小学生がアシスタントとして判断した場合でもその課題を解決することが可能であり、その判定レベルで満たされる課題であること。
- **if文でできることはif文で。ただし事前に与えるルールや基準に限界があるものはAIで**
  - if文で十分解決されることはif文で。AIを適用せずに解決されるのであればそれが一番良い選択。
  - if文などの人間が事前にルールを与えた制御よりも、柔軟な判断や曖昧性を持った上で反応させることはAIによって解く。
  - if文だけでは表現できない、例えばルールである判断基準に対して更に重み付けが必要になる場合はAIで。
- **課題を解くために必要なデータが既に存在するか、もしくは作成可能か**
  - システムエンジニアがAIに必要なデータ項目が思いつき、更にはそのデータ項目が現時点で存在するか。例えば「明日の天気が晴れ、曇、雨のいずれかを予測する」という課題をAIにより解きたい場合、AIに必要なデータ項目として、直近1週間の晴れ・曇・雨の実績、気温、雨雲の移り変わりの画像、風速...様々な活用できそうなデータが考えられること。
  - 上記のようなデータが現時点でデジタルなデータとして存在する場合はそれを活用。存在しない場合は収集もしくは作成するというプロセスが必要。
- **その他、費用対効果が望めるか**
  - ビジネスに実装するためにはROIが見合うかどうかも重要な指標。
  - ただ、システムエンジニアの方が最初の課題設定をする場合、その課題を解くことが楽しいかどうかのほうが重要だと考えます。

システムエンジニアの中でも、特にRDBMS、KVS、ログ収集基盤にふれる機会がある方は、少なくとも一度はご自身たちが扱うデータを他の目的での2次利用を考えられたことがあると思います。上のチェック項目では、課題をまずは定義し、それに必要なデータを集めるというステップで記載をしていますが、その逆の今あるデータから現実的に解ける課題を定義するというプロセスもシステムエンジニア視点ではアイディアが出しやすいということもあります。


### システムに実装する方法

課題と必要なデータ項目の定義さえ完了すれば、AIをシステムに実装するための5割は完成。残りの半分は粛々と準備と実装を進めます。まず、AIに必要と定義されたデータを収集および教師データを作成するプロセスを実行します。教師データの作成においては、

- **既存のデータに対して教師データとなる追加データを人間が目視で確認・付与することが必要であるケース**
  - 教師データとして品質を保つことが可能
  - 教師データを作成するための人的リソースが掛かる
  - 例) 特定の製造パーツの異常を画像からDeepLearningによって自動検知したい時、教師データが入手困難である。人間が手作業で異常のパーツを特定するための画像の中の場所の特定、更には異常であることをラベルとして付与する作業が必要。これらの特定された画像の中の異常部分、ラベルが教師データとなる。
- **教師データが暗黙的に既存のデータに含まれていると見做すケース。** 人間は目視で確認・追加データを付与しない
  - 人間が目視で確認・付与ができない程の膨大なデータに対しても適用可能
  - 教師データにノイズとなるデータが含まれる可能性がある
  - 例)画像の中に含まれている一つの動物(犬・猫・その他など)をDeepLearningによって自動的分類したい時、keyword検索でCrawlingすることでkeywordと画像をセットで入手可能な場合。その組み合わせをそのまま教師データとして利用する。

ABEJAの中でも解くべき課題に応じて上記2パターンを使い分けています。2つのパターンは追加で教師データの作成を人間がやるか・否かの違いであり、AIのモデルを実装する(アルゴリズムを実装するするための)のプロセスには大きな影響を及ぼしません。

ここからシステムに実装する内容に触れていきたいと思います。システムに実装する部分の説明を書くため、AIのモデル構築の記載は省略します。モデル構築として使用するアルゴリズム(手法)については下記URLのcheatなどを参考にしてもらうのが良いと思いますが、最初に実装する場合はpython scikit-learnで使える機械学習のものが良いと思います。それぞれ選択する手法で、Input・Outputのデータフォーマットが異なるのでそこだけ注意が必要ですが、**システムエンジニアの方の最初の取り組みとしては手法の中身には触れず、どういうデータを入力するとどのような結果が返ってくるかというところに注目して実装を進めるのが良いと思います。**

- [Cheat Sheets for AI, Neural Networks, Machine Learning, Deep Learning & Big Data](https://becominghuman.ai/cheat-sheets-for-ai-neural-networks-machine-learning-deep-learning-big-data-678c51b4b463)
- [Choosing the right estimator](https://scikit-learn.org/stable/tutorial/machine_learning_map/)

システムに実装するための一つの例を紹介します。この例に対する教師データの扱いについては、上記 `教師データが暗黙的に既存のデータに含まれていると見做すケース` になります。またこの例の実装するための前提条件を次に記載します。

- **AIによって解きたい課題** : 300万人が利用するスマートフォンアプリを展開しているが、 サービスにアクセスするユーザー属性(男女)が半分ずつぐらい存在する。その中でも会員登録の中で性別を入力するユーザーは全体の20%ほどであり、残りの80%は男女のどちらかが分からない。残りの80%のユーザーの性別をAIによって推定し、配信するコンテンツを性別に応じて最適化したい。コンテンツを最適化されることでスマートフォンアプリ内全体のPageView数があがり、広告掲載による収益化の機会が増加する。
- **ユーザーを識別するID** : 会員ID、モバイル広告ID
- **求められる処理要件** : 会員登録・性別登録済みの20%ユーザーの性別ラベル、アクセス行動履歴を教師データとして見做し、80%のユーザーが保有する行動履歴から性別がどちらかをAIによって推定する。推定は1日1回の頻度で行われれば良い。推定された性別の情報は会員情報が登録されているRDBMSに記録する。推定の処理としては性別が分からないユーザーのアクセスURLを入力すると、男女のそれぞれの確率値を返す手法が選択されている。
- **使用するコンポーネント・データソース** : 会員情報が登録されているRDBMS、性別を推定するバッチシステム、ユーザー全体がどのURLにアクセスしたかのログ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25002/743d42ff-0521-c8a8-c2be-d1684ab5637a.png)

システム処理の流れを大まかに書くと上のようなイメージになります。
ここで言う教師データは性別がわかっているラベルとその人がアクセスしているURLになります。会員登録・性別登録済みのユーザーがアクセスしているURL(URLの数が多い場合はURLの階層で正規化)を特徴とし、その正解ラベルが性別となります。アクセスログから次のような教師データを作成します。1行目はデータの項目を示し、1会員ごとの行動データを1行で表現する形にします。なお、ここでは単純な説明のためにURLを1個のアクセスログとして作っていますが、例えば30日間のアクセスログを分析すると複数URLにアクセスしている場合が大半です。その場合は複数のアクセスされたURLを配列展開できるような形で渡し、アルゴリズムの方でそれを解釈できる状態を作ります。

- **教師データ(モデルを作るためのデータ)**


```
gender, url
male, /foo/bar
male, /foo/hoge
female, /hoge/fuga
female, /hoge/poke
```
上の教師データをもとに機械学習の手法を適用し、モデルの生成を行います。(上図の③のプロセスに該当)作成されたモデルに対してバッチシステムから生成されたモデルに対してモバイル広告IDは分かるが性別は分からない状態のデータを入力として与え、出力結果として男女それぞれの確率値として得ます。

- **モデルへの入力データ(予測をする対象データ)**

```
device-id, url
a, /foo/bar
b, /foo/hoge
```

- **モデルからの出力データ(予測の結果)**

```
device-id, p_gender, p_score
a, male, 95%
b, female, 100%
```

モデルからの出力データをもとに、RDBMSの中にdevice_idに紐付けて未登録のユーザーでも性別が分かるように予測された値をp_gender, p_scoreのような別のカラムに登録してあげると、次のコンテンツ配信時にgenderカラムにデータが無いユーザーはp_gender, p_scoreのカラムの値を参照すると、どれぐらいの確率で男性なのかの判別ができることになります。コンテンツ配信時に性別が分かる状態が作れたことにより、上の前提条件に上げた `AIによって解きたい課題`を解決することができたと言えます。

p_scoreのように予測されたスコアを保存しておく意図としては、モデルが予測された結果、50%ずつ男女の可能性があるような場合、そのユーザーに対しての性別に最適化したコンテンツ配信が意図しない結果を生み出す可能性があるので、どちらかの性別確率が例えば80%を超えない場合は最適化されたコンテンツを配信しないというようなロジックを組むための閾値として利用することができます。

ここでは詳しく説明しませんが、**モデル生成の後に必ず精度検証が必要になります。** 教師データを複数の束に分割し、分割された束の組み合わせにより正しい精度を評価し、精度に問題が無ければ全てが自動で回るようなシステムを構築するのが通常の開発プロセスになると思います。

AIをシステムに実装するパートの説明は如何でしたでしょうか？ 結構面倒だと思われた方も多いと思いますが、ABEJAはモデル構築をスムーズに行うための製品開発をしております。それが次章の**ABEJA Platform**になります。

### ABEJA Platformの紹介

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25002/360817d8-4232-a327-63ab-52b66fde4749.png)

ABEJA PlatformはMLエンジニア・データサイエンティストの方々がコアコンピタンスであるAI(モデル)開発に集中できるよう、その前後のプロセスを簡易的に実行ができる開発・運用基盤としてご利用できます。上で述べてきたAI開発に必要なプロセスを一つのプロダクトで全て完結することができますので、ご利用されたい方は是非下記のリンクの問い合わせフォームよりお願いいたします。

- https://abejainc.com/platform/ja/
- https://abejainc.com/platform/ja/contact/

ABEJA Platformに関するQiitaへの投稿も多数あるので、是非下記一覧を参考にしてください。

- https://qiita.com/tags/abejaplatform

また教師データの作成を支援するAnnotationツールの提供、またはBPOという形でAnnotationの人的リソースの確保と作業の実施・Annotationの質を向上させるためのreviewの仕組みを含めたサービス提供という形も撮っていますので、気になる方は下記のURLを参照してください。

- https://abejainc.com/platform/ja/dataset/

### 最後に

今回は `AIを活用したいが、何から始めたら良いか困っているシステムエンジニアの方` 向けのコンテンツとして記載をしました。AIをシステムに実装する方法について少しは参考になる情報となりましたでしょうか。

ABEJAという会社は今年も多くの社員がAdvent Calendarに登場しました。みなさんに参考になる情報が少しでもあればABEJAメンバー全員が嬉しく思いますし、来年もまたAdvent Calendarに挑戦したいと思います。ABEJAはエンジニア、ビジネスメンバーのどちらの職種も常に仲間を募集中です。Qiita Jobsにも求人内容を登録しているので、気になった方は是非気軽にお声がけください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25002/61408da8-2883-c5a2-40fc-2561ca4ad594.png)

- https://jobs.qiita.com/employers/abeja/development_teams/224
- ([僕のFacebook](https://www.facebook.com/yuta.kikuchi.007)に直接連絡をいただいても良いです。 )