AI活用PJを実施する際に知っておいた方がよいこと

## はじめに 
昨今、日本でも相当のレベルでAIを実践的に利用する動きがでてきたと感じてます。
これは大手企業が手を出せるくらいまで市場に浸透してきたおかげですが（適当）、
AIの話をしているとどうも話が合わないことが多く、どうやら市場には強すぎる期待と弱すぎる期待があるようです。

なので、こんなことは知っているとAI活用がスムーズにできると思いますよってことを書いてみました。

ツッコミ・コメント大歓迎です。
## 目次
1.AIで何ができて何ができないのか
　1.1　そもそもシステムとは何か
　1.2　AIとはなにか　
　1.3　AIの2種類について
2.AI導入PJの全体概要について
　2.1　フェーズを2つにわけるべき
　2.2　大切なのは運用フェーズ
3.モデル作成について
　3.1モデル作成は3つのフェーズに分かれる
　3.2モデルは簡単に作れる
　3.3大切なのは前処理
4.AI活用PJを行ってはならないこと
　4.1抽象的な話
　4.2具体的な話
5.どのような人材が必要か
　5.1　必要なのは3種類の人材
　5.2　人材をどう確保すべきか

##1.AIで何ができて何ができないのか
###1.1　そもそもシステムとは何か
AIはシステムである。
なのでシステムとは何であるのかを理解することが必要です。

システムとは下記。
![スクリーンショット 2018-03-11 10.00.59.png](https://qiita-image-store.s3.amazonaws.com/0/242700/ccd274d8-0029-3d2e-427e-97801c70739f.png)

何かのInputに対して、何かのOutputを出力するものはすべてシステムです。

具体的に例を3つ出すと、
電卓は、「１」「＋」「１」「＝」という4つの入力に対して「２」というOutputを出力するシステムです。

駅にある自動改札機は、Suicaをピッとすることにより、「Suicaのチャージ金額」をInputし、チャージ金額が入場料より多い場合は、「なにもしない」というOutputを出し、チャージ金額が入場料より少ない場合は、「扉を閉める」というOutputを出すシステムです。

ドラえもんは、「のび太の困った問題」というInputに対して、「いい感じの秘密道具を出してそのあとのトラブルもいい感じにする」というOutputを出すシステムです。

###1.2　AIとはなにか　
なにをAIと言ってよいかはかなり議論の必要なところでありますが、
東大の松尾先生は著作の中でこのように記載してます。
「人工的につくられた人間のような知能、ないしはそれをつくる技術」
（抽象的でありますが）
###1.3　AIの分類について
AIの区別の仕方はたくさんあるが「汎用的AI」と「特化型AI」と分けるとわかりやすいです。

汎用的AIとは一言でいうとドラえもん。
なんでも答えてくれて、なんでもできる。

特化型AIとはある一つのことしかできない。
例えば、AlphaGoは囲碁を指すことしかできない。
上記のシステムの説明に基づくと、限られたInput（碁盤の画像）に対して限られたOutput(最善手）しか出せません。

現在のAIのうち、99.9%は後者です。

すなわち現在利用できるAIは「ある特定のことだけができるAI」です。
##2.AI導入PJの全体概要について
###2.1　フェーズを2つにわけるべき
ITシステムは作成する際はV字モデルといって下記の図のようにフェーズを考えることが多いで。
![system_dev.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/242700/a2bd575a-dfcf-88f2-8ce3-7f47e5ff9eeb.jpeg)

**しかし、AI活用においては、そもそも２つのフェーズにわけるべきであると考えます。
それは、モデル作成フェーズと運用フェーズの2つです。**

なぜならば、ビジネス上では環境の変化により、モデルの改修を定期的行わなければならないことが圧倒的に多く、一旦を作ったモデルのメンテが欠かせないからです。

なので、V字モデルの運用のところを切り離して考えるべきであり、運用においてこのV字同じくらいのパワーが必要であるとの認識を持つべきです。

###2.2　大切なのは運用フェーズ
当たり前の話であるが、作成したAIが全然使い物にならないことは避けたい。
しかし、市場環境の変化によって突然使い物にならなくなることは十分にあり得ます。

例えば、
在庫管理をAIを用いて需要と供給を予測し、最適化していたとしよう。
そこに増税により消費税率が8%から10%に変わった場合、この予測モデルは正しいと言えるだろうか。
検証を行う必要ももちろんあるし、改修を行うことも必要であろう。

常に現状を把握し、変化が起きたらそれに対応しなければならない。
なので、何よりも運用フェーズが重要であるのです。
（一般に、KPIを決めて日次か週次でレポーティングを行う。）
##3.モデル作成について
###3.1モデル作成は3つのフェーズに分かれる
モデル作成は「前処理」「モデル作成」「検証」の3つのフェーズに分かれます。
「前処理」はモデルが適切にデータを読み込みための処理。
「モデル作成」は実際にモデルを作成する。
「検証」はどの程度効果があるか検証する。
###3.2モデルは簡単に作れる
もの凄く大切なのは、モデルを作成するだけであれば凄く簡単できる。（精度の話をおいておくと。）
例をあげると、数字の画像データを読み込ませて、その文字が何であるかを判定するソースは下記だけです。
40行のみ。

```python:sample.py
from keras.datasets import mnist
from keras import models, layers
from keras.utils import to_categorical

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
original_test_labels = test_labels
original_test_images = test_images

# 前処理
# MNISTは28x28ピクセルで、各ピクセルは0～255の値を取る。
# ニューラルネットで計算できるように、0～1の範囲の値を持つ1次元ベクトルに変換する。
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

# ニューラルネットのモデル定義
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

# 最適化関数、損失関数、メトリクスの定義
network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',
                metrics=['accuracy'])

# 学習を10回実施
network.fit(train_images, train_labels, epochs=10, batch_size=128)
test_loss, test_acc = network.evaluate(test_images, test_labels)

# テストデータに対する結果を表示
print(test_loss, test_acc)

## 結果の確認
import sklearn.metrics
import matplotlib.pyplot as plt
import numpy as np

predicted_classes = network.predict_classes(test_images)
pred = np.equal(predicted_classes, original_test_labels)
mispred = np.where(pred == False)

# 混同行列を表示
print(sklearn.metrics.confusion_matrix(original_test_labels, predicted_classes))

# 予測に失敗したテストデータを表示。青字が正答、赤字が予測値（誤答）
j = 0
plt.figure(figsize=(10, 10))

for i in mispred[0][0:100]:
    j += 1
    plt.subplot(10, 10, j)
    plt.tick_params(labelbottom='off')
    plt.tick_params(labelleft='off')
    plt.imshow(original_test_images[i], cmap=plt.cm.binary)
    plt.text(0, 5, original_test_labels[i], color="blue")
    plt.text(0, 25, predicted_classes[i], color="red", )

plt.show()
```
上記は下記より引用。
https://gist.github.com/ryoen/21a27720093bb3e82de213f6408faab5
###3.3大切なのは前処理
モデルを作成する上で大切なのは、モデルは簡単に作れるので、逆説的に、大変なのはモデルを作成できるところまで持っていく「前処理」です。
イメージとして、
力の割合は「前処理」「モデル作成」「検証」で7:1:2くらいの配分。
##4.AI活用PJで行ってはならない題材
###4.1抽象的な話
このような題材ではAI活用を考えてはいけない。
「環境の変動が大きく、コストメリットを考えれない場合」
なぜならば、環境の変動が大きいとモデル度々作成し直さなければいけないし、
コストメリットがないにもかかわらず導入するのは費用がかかるだけです。
（当たり前である）
###4.2具体的な話
よく言われるのは「日経平均の予測し自動的に売買するAI」は作成してはならない。
（あくまで、ビジネス上の話ですが）

なぜならば、環境の変化を大きく、そしてどの要因が大きく効いているのか判断できないからである。
例えば、トランプのtwitterだけでトレンドは変わる可能性があります。

そして、コストメリットを判断するのが極めて難しい。
普通、本来コストメリットを算出するためにある状態で検証を行って、その検証の際にコストメリットがあれば本番導入になる。
しかし、日経平均は「世紀の大暴落」みたいなことがしばしば起きている。
（これはおかしな話ではありますが。）
その際モデルを使って自動的に売買を行うことはとてもリスクが高くコストメリットを判断できない可能性が高い。（すなわちモデルを作っただけ無駄）
##5.どのような人材が必要か
###5.1　必要なのは3種類の人材
①PJ全体がマネジメントできる人材
（必ずしもモデルが作成できなくてもよい）
②モデルが作成できる人材
③モデル作成後運用できる人材
###5.2　人材をどう確保すべきか
結論から記載すると下記になる。
**「アントレプレナーシップ持っておりマネジメント経験のあるエンジニアを,少し多くお金を払ってPJにがっつりアサインさせるべき。換言すると、このような人材を気合で探すしかない。」**

理由は2つです。
まず1つ目は重要なスキルセットで話です。
①、②、③の順番で重要です。

まず、上記の①と②の条件を満たせば、③も誰かに頼む形で満たせる。
（マニュアル等を誰かにお願いする形で作れる能力も①に含む）
すなわち、①と②の人材をどう調達してくるかの重要です。

ここで、一般にデータサイエンティストと名前が付くと単価が高くなるが、必ずしも①を満たしているとは限らない。
そのような方々は②のスキルおよび経験を豊富にもっている可能性が高いが、モデルは必ずしも高度な知見が必要とは限らない。
②だけの人材では運用まで回せるとは限らない。

もう1つは、人材市場の話です。
データサイエンティストは本当にいないが、
下記（参考１）の中級以上+マネジメント経験ありのエンジニアは少なく見積もっても30パーセントはいると思われる。
そのうちアントレプレナーシップ持っている方は30%はいる。
すなわち、全体の10%くらいはいると考えれる。
この10%を探し出した方が効率がよい。
(すべての技術に長けているエンジニアはおらず、その都度キャッチアップしていくのは普通のこと)

ここには、市場の不思議な原理が働いており、総合的なビジネススキルは前者の方が高いにも関わらず、凄く優秀なPMは150万で雇えるが、一般的なデータサイエンティストは250万でないと雇えない。

##まとめ
**AI活用PJにおいて、**
**AIってまだまだ限定的なことしかできないけど、導入は簡単にできるから、ちゃんとPJ全体のことを考えれる人材を引っ張ってくると上手くいくよ。（たぶん）**

##おまけ①（参考）

###（参考1）ITエンジニアの相場は？？
日本市場を見るとエンジニアの単価は下記かと。
(すべて1人月)
初級者　40~50万
中級者　60~70万
上級者　70~90万
中級者＋マネジメント経験者　70~90万
上級者＋マネジメント経験者　80~100万

ここに大手になるとプレミアが加算されて、２~５割増になる。

###（参考2）　AIエンジニア・データサイエンティストはどのくらいいる？？
日本にはIT人材が100万人しかおらず（本当か？？）、そのうちデータサイエンティストは0.1%もいない。
(実際にしっかりとデータサイエンティストを雇用できる窓口は500人分くらいしかない気もする。)

（参考２の参考）
「IT人材の最新動向と将来推計に関する調査結果」
http://www.meti.go.jp/policy/it_policy/jinzai/27FY/ITjinzai_report_summary.pdf
「興味がない時には沢山見かけるがいざ欲しい時に限って見つからない：日本のデータサイエンティスト＆機械学習エンジニアブーム」
http://tjo.hatenablog.com/entry/2016/07/08/090000

###（参考3）AIエンジニアに最低限必要なスキル等
下記の3つは必須である。
①大学院に進学できるレベルの数学の知識
（要は大学２年生までに学ぶ数学の知識があればOK）
②新しい技術をキャッチアップしようとするマインド
③心と時間の余裕

①は学歴を見ればわかる。
②がなによりも重要で、②のためには③が必要です。
②の中に、英語の論文だろうがなんだろうが、読む必要があれば読むという英語力。
③に人のことを気遣えるコミュ力を含みます。

あと、データ見せただけで「うひょ、うひょ」言うっていうスキルとかマインドセットがあると良いかと。


##おまけ②（ブックリスト）
この本はマジで凄いよって本。
1.「Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)」
http://amzn.to/2FuBJj2
現在本屋さんで売っている本の中で最もコスパの良い本であると断言できる。
Deeplearning×Pythonの領域についてすべて記載がある。
この内容を全部理解していることが最低限のスキルであると考えている。
2.「統計的学習の基礎 ―データマイニング・推論・予測」
http://amzn.to/2IePwYW
データサイエンティストを雇う際にこの本の名前を出して知っているか、
もしくは内容を見せて「うひょうひょ」言うかを見るのはいい採用基準の方法かと思う。
３．「リーン・スタートアップ」
http://amzn.to/2oXfkks
コストメリットを追求するのであれば、こちらも読んでおいた方がよいかと。

##おまけ③（参考になるブログ等）
1.「足りないのは、データではなくサイエンス」
https://ashibata.com/2017/05/29/science/
AIって、データサイエンスであり、エンジニアリングではなくサイエンスだから、サイエンティストが必要ですよっていう良記事。
2.「六本木で働くデータサイエンティストのブログ」
http://tjo.hatenablog.com
言わずとしれたこの業界の標準的ブログ
3.Chikirinの日記
http://d.hatena.ne.jp/Chikirin/20140411
AIについて文系的に理解したい方はちきりんさんブログがおすすめです

#終わりに
偉そうに書いたので精進します。