if文から機械学習への道
if文から
機械学習への道 2017-09-26 BPStudy#121
サイボウズラボ/ BeProud技術顧問理学博士/技術経営学修士
西尾泰和
ver.2 2017-09-29公開
ver.3 2018-06-22図の清書
ver.4 2023-06-10OCR結果の清書と加筆
機械学習って今書いてるプログラムから遠い世界だと思ってませんか?
このスライドの目的
みんなのよく知っているif文と機械学習の橋渡しをすることで地続きにし、実務で機械学習を使えるようにする。
また、機械学習のビジネス導入の進め方を4ステップに分けて一歩一歩解説する。
if文4 if( 条件
){ …}
if文の仕組み
条件がTrueの時に、中身を実行
条件が複数ある時
条件x1と条件x2のどちらかがTrueの時に実行したいなら、どうする?
or
if(x1 or x2){ …}
条件が複数ある時
条件x1と条件x2の両方がTrueの時に実行したいなら、どうする?
and
if(x1 and x2){ …}
条件が複数ある時
条件x1, x2, x3の内、2つ以上がTrueの時に実行したいなら、どうする?
複雑!
if((x1 and x2) or (x1 and x3) or (x2 and x3)){ …}
条件が複数ある時
条件x1, x2, …, x5の内、3つ以上がTrueの時に実行したいなら、どうする?
複雑!
if((x1 and x2 and x3) or (x1 and x2 and x4) or (x1 and x2 and x5) or…){ …}
もっと良い方法がある!
Trueを1、Falseを0に変換すると「3つ以上がTrue」は「足したら3以上」に変わる。
if((x1 + x2 + x3 + x4 + x5) >= 3){ …}
andもorも同じ形にできる
x1 and x2 and x3 and x4 and x5
=条件x1, x2, …, x5の、すべてがTrue =足したら5以上
x1 or x2 or x3 or x4 or x5
=条件x1, x2, …, x5の、どれかがTrue =足したら1以上
andもorも同じ形にできる
条件x1, x2, …, x5の、すべてがTrue
(x1 + x2 + x3 + x4 + x5) >= 5
条件x1, x2, …, x5のうち3つ以上True
(x1 + x2 + x3 + x4 + x5) >= 3
条件x1, x2, …, x5の、どれかがTrue
(x1 + x2 + x3 + x4 + x5) >= 1
右辺をそろえてみる
条件x1, x2, …, x5の、すべてがTrue(弱い)
(1/5 *x1 + …) >= 1
条件x1, x2, …, x5のうち3つ以上True
(1/3 *x1 + …) >= 1
条件x1, x2, …, x5の、どれかがTrue(強い)
(1 *x1 + …) >= 1
強さ=重み
条件の「強さ」のようなものが係数(
重み)の大きさで表現される。
問
条件x1, x2, …, x5の、すべてがTrueまたは条件x6, x7, …, x10のうち3つ以上Trueまたは条件x11, x12, …, x15の、どれかがTrueを表現するにはどうすればよい?
重みは条件ごとに異なってもよい
1 *x1 + ... + 1/3 * x6 + … + 1 * x11 >= 1
重み付き和の方法
真偽値のTrueを1、Falseを0にし、条件の強さを重みにして掛け合わせ、足し合わせる
これによってandやorの組み合わせでは苦労するような複雑な条件を記述することができる。
否定が負の重みで実現できることと、xorが表現できないことは割愛
重みはどうやって調整する?
1:今やったみたいに人間が決める
2:大量のデータを元に機械が決める=機械学習
具体的なコード
from sklearn.linear_model import LogisticRegression
ってやって fit(X, y)
を呼べば重みが自動調整されて predict(X)
を呼べば重み付き和を計算して判断してくれる。楽ちん。
ロジスティック回帰についてくわしく知りたい人は、サイボウズラボの中谷秀洋さんが技術評論社のサイトで連載しているのがおススメ
まとめ
複雑な条件はand/orで書くのが大変。
重み付き和で置きかえると楽になる。
重みはデータが十分あれば機械学習で決められる。
今回説明した程度のことはscikit-learnを使えば数行でできる。
ここまで機械学習の技術
ここから機械学習のビジネス4つのステップ
アカデミアとビジネスの違い
データが公開されている
枯れた技術はとっくの昔に調査済み
新しい手法を考案して精度を競い合う
ビジネス
データが公開されてない
(枯れた技術を使う)
ビジネスの目的
顧客価値を体感するための小問
ある宝石の原石は、割ると1/2の確率で宝石が入っていて2万円で売れる。
原石は1つ9500円で買える。原石は硬いので1日に20個しか割れない
Q1: 1日に稼げる収益の期待値はいくらか
A1収益の期待値
A1: 1/2の確率で20000円手に入るので、1個あたりの収入の期待値は10000円。
1個あたりの仕入れ価格は9500なので、1個あたりの収益は500円。
1日に20個処理できるので、1日あたりの収益は10000円。
Q2 加工速度二倍の装置
Q2:原石を人間の2倍の速度で割る機械を手に入れたとする。
つまり、1日に割ることができる原石の数が20個から40個に増えたとする。
収益の期待値はいくら増えるか?
A2 加工速度二倍の装置
A2:原石1個あたり500円の利益なのは変わらない。
1日に処理できる量が20個から40個に増える。
20個増えるので、利益は1万円増える。
Q3 60%の識別器
Q3: 60%の確率で宝石の入った原石を当てる識別器*が買えるとする。
*原石を買う前に使うことで「60%の確率で宝石が入っている原石」を9500円で手に入れられるようになるとします。
お店の人が嫌がりそう、という点は今回は気にません。
またQ2の機械は手に入っておらず、1日に割れる数は20個のままとします。
収益の期待値はいくら増えるか?
A3: 60%の識別器
60%の確率で20000円手に入るので、1個あたりの収入の期待値は12000円。
1個あたりの仕入れ価格は9500円なので、1個あたりの収益は2500円。
1日に20個処理できるので1日あたりの収益は5万円。
4万円増える。
つまりこの問題設定では
「加工速度を2倍にする装置」は顧客の利益を1万円増やし、
「精度60%の識別器」は顧客の利益を4万円増やす。
教訓
この問題設定では「精度60%の識別器」が「加工速度を2倍にする装置」の4倍の顧客価値を持っている。
どの程度の精度でどの程度の顧客価値を生み出すことができるかは
ビジネス要件によって決まる。
精度は必ずしも重要ではない
ビジネス要件
最新の論文に書かれた手法を実装しても、その手法が要求する量のデータを顧客が用意できないのであれば、その実装は顧客価値を持たない。
顧客は専門家ではない
多くの場合顧客は機械学習の専門家ではないので、必要な精度も、満たすべき制約条件も、明確に言語化することができない。
なので、これを高速に学び取ることが必要。
ITベンチャー経営の方法論「リーン・スタートアップ」で提唱された考え方。
ベンチャーは資金に限りがあるので素早く顧客ニーズを理解しなければならない。
そこで、最小限のコストで雑な製品を作り、それを実際に顧客に見せてみることで、顧客のニーズがどこにあるのかを探る。
最小限の実装=実装しない
ステップ1
人間がやると想定して次の質問に答えよう
②
人がやる方法: それを人間がやるならどうやってやるか(既にやっている人間がいるのか?いないのか?)
(2)人間がどうやってやるか
既にやっている人がいる、または、やり方はわかる。
しかし時間や労力が掛かりすぎる。
→チャンス!機械化で時間や労力を減らすことが顧客価値になる!
(2)人間がどうやってやるか
顧客側などでやっている人がいる、しかし、自分はやり方がわからない。
→何か重要な情報の伝達漏れが発生している。
(2)人間がどうやってやるか
人間がやる方法を、顧客も自分もわからない
→そもそも無茶なことを妄想している可能性。
例:スパムフィルタ
Q1 顧客は何がどうなると嬉しいのか
A1 顧客はメールボックスにスパムメールがたくさんあって困っている、スパムがなくなるとうれしい
Q2 それを人間がやるならどうやってやるか
A2 メールの本文を見て、スパムかどうか判定して、スパムは別のフォルダに移動する
ステップ2
人間を箱に入れる。
この箱には電子データしか出し入れできない。
(リモートワークと考えてもよい)
ステップ2
③入力データ: 人間が(2)をするために、箱にどんなデータを入れるのか?
④出力データ: 人間が(2)をすることで、箱からどんな出力データが出てくるのか?
ステップ2
⑤得る方法: 入力データ(3)はどうやって入手するのか? (最初の一歩と継続的にやる方法)
⑥与える方法: 出力データ(4)をどうやって顧客価値(1)につなげるのか?
この4つの質問の答える順番は問わない。
例1:顧客に〜をするために(6)、〜を出力する(4)、そのため入力〜を入れる(3)、これをどうやって入手しようか?(5)
例2:今データが入手できている(5, 3)ここから顧客価値を生むにはどうするか?(6)そのためにはどういう出力が必要か?(4)
例:スパムフィルタ
Q2それを人間がやるならどうやってやるか
A2人間がやるなら、メールの本文を見て、スパムかどうか判定して、スパムは別のフォルダに移動する
Q3人間が(2)するために、どんなデータを入れる必要があるか?
A3メールの本文の情報が必要。タイトルや送信者も貰えるなら貰いたい
例:スパムフィルタ
Q4人間が(2)をすることで、箱からどんな出力データが出てくるのか?
A4各メールに対して「スパムである、スパムでない」のラベルを出力
例:スパムフィルタ
Q5 入力データ(3)はどうやって入手するのか?
A5 最初の一歩としてはとりあえずメールをエクスポートしてもらえれば。
継続的にやるにはメーラからデータを取る方法を作るか、メールサーバの側に手を加えるかが必要そう。
追記: 最初の一歩のデータをもらって実験をすることと、メールサーバに手を加えて継続的にデータが得られるようにすることのどちらの優先度が高いか
基本的には「機械学習で識別できるかどうか」は不確実性が高いので早く検証するのが良い
状況によるのでどちらから先にやるか、それとも並列にやるのか、ケースバイケースで判断する必要がある
例:スパムフィルタ
Q6出力データ(4)をどうやって顧客価値(1)につなげるのか?
A6スパムである/ないのラベルを見て、メールを振り分けする
追記: 「顧客価値」につながるためには「メールを振り分ける」が必要だ、と言語化されたら、次は「その振り分けはどのようにすれば可能なのか?」と掘り下げていける
メールを表示するプログラムの側に手を加えることができるのか?
例えばスパムと判定されたことを示す特定の文字列をヘッダに入れて、ユーザに振り分けの設定をやってもらうか?
アルバイト
(7)箱の中の人が、まったく知識のないアルバイトだとしたら、どんなマニュアルを用意する必要があるか?これを考えておくと次のステップが楽になる。
ステップ3
ステップ1:人間がやる
ステップ2:箱の中の人間がやる
ステップ3:箱の中の機械がやる
箱の中の人をコンピュータに置き換える。
最初のプログラム
(8)箱の中のコンピュータが(2)をするためのプログラムを書く
完璧である必要はない
高度なアルゴリズムである必要はない
精度は低くてよい
「とりあえず動く」ぐらいでよい
実行してみて顧客に見せる
(9)プログラム(8)に実際にデータを入れて振る舞いを観察する。(精度はどう?速度は?)
(10)顧客はこれで満足する?
顧客に見せるのが怖い?
精度が出ていないのに顧客に見せるのは怖い?
しかし顧客が何を重視するかは顧客にしかわからない。
低品質だと顧客に言われたとしても、それは顧客が何を重視するかを知るチャンスになる。see「
リーン・スタートアップ」
顧客が満足しないなら
(どういう入力の時にはどういう出力が出てほしいのか?これを
教師データという)
ステップ4
ようやく機械学習!
科学的方法論
教師データが充実すると、アルゴリズムの良し悪しが定量的に測れるようになる。
(教師データの一部を検証用のデータに使う)
機械学習にしたからと言ってよくなるとは限らないのでプログラム(8)とキチンと比較する。
仮説・実験・検証・修正のサイクルを回す。
改善の具体的方法
「現時点のアルゴリズムが正しく分類できてないデータ」を抽出して眺め、それらを正しく分類するためにはどうすれば良いかを考える。(特徴量の追加など)
ロジスティック回帰などの「判断の自信」を返してくれるアルゴリズムなら、「自信のない結果」を見て教師データの追加を行う。(
能動学習)
間違えないように何度も言う
ビジネス上重要なのは顧客価値。精度ではない。
例え精度が99%でも、間違う1%が顧客にとって致命的なら、精度60%でその間違いをしないプログラムの方が顧客価値が高い。
まとめ
ビジネスでは顧客価値が重要
顧客もあなたも何が顧客価値か正確に理解していない
素早く理解するために最小限の工数で実験を繰り返す(Minimum Viable Prodict)
実験によって不満点や顧客価値が徐々に具体化されていく
改善を繰り返して顧客価値を増やしていく
以下補足と質問・回答
補足
これは「顧客の要求が明瞭でない、仕様書がない状態でのソフトウェア開発」に似ている。
違う点は、顧客が不満な場合に「ソフトウェアを作り直す」ではなく「学習データにその情報を追加」で解決できる可能性があるところ。
とはいえ常にデータで解決できるわけではないので、やはり最小限の実装で実験するのは大事。
補足:バッドパターン
①手軽な方法
②テキトーなデータ
③スゴイ機械学習
ココで時間を使いきる
④精度高い出力データ
⑤雑にぶつける
⑥ミスマッチ: 顧客「コレじゃない」
⑦ゆきばのない不満
これを避けるためにも実験を繰り返せる形にすることが大事
Q&Aマニュアル書き
(7)と(8)についての質問: “アルバイトのためのマニュアルが書けるならプログラムも書けるはずでは"
はい。「アルバイトのためのマニュアルが書けないぐらい仕様が曖昧だったらプログラムを書くのは無理だよね」が言いたいことでした。
「マニュアルをどう書くか?」を考えることでまだ言語化されていないものに気付き、言語化が促されるのです。(次ページに具体例)
例:スパムフィルタ
実現したいこと: >(2)“メールの本文を見て、スパムかどうか判定し、スパムは別のフォルダに移動する"
あなた「本文を見てスパムかどうか判断して」
バイト「どうやって判断するんですか?」
あなた「例えば○○って単語が入ってたらスパム」
気付き: 最初の一歩のプログラム(8)を「NGキーワードが含まれてるか判定」にしたらよい
補足の補足:アルバイト向けマニュアルの作成は「最初のプアなプログラム」を書く上での助けになることが目的なので、さらさらプログラムを書けるなら飛ばしてもよい。
工数
Q: どれくらいの工数がかかると思えばいいか?
A: ケースバイケース。
例えば枯れた技術、ロジスティック回帰にデータを入れてみて、サクッと精度が出て顧客から一発OKもらえることもあるし、逆にぜんぜんダメということもある。「実験」するしかない。
工数を見積もることは困難なので、決まった時間で成果を確約するような契約を結ぶのは危険。
精度
Q:顧客に精度保証を求められたら
A:「どのくらいの精度になるかは実験してみないとわからない」ということを顧客との共通認識にしていく必要がある。
精度を確約するのではなく「良いものができるかもしれない試行錯誤」に対してお支払いを頂く形の契約が良い。
なるべく小さい単位で実験をして顧客とのコミュニケーションを密にしていく必要がある。
判断のコストと精度
知識のある「専門家」が判断
知識のない「アルバイト」が判断
機械が判断
判断の精度もコストも上が高い
機械は24時間働かせても疲れないし労基署に怒られることもない。
精度は必ずしも高くない*が、コストの低下でビジネス上の価値が生まれる。(*頑張り次第)
2023年追記: GPT-3.5が広いタスクに対して人間を超えた
つまり「機械」が「知識のないアルバイト」と比べて精度が高くなったわけだ
「クラウドソーシングで知識もやる気もない素人の人間に教師データを作らせるよりGPT-3.5を使った方がよい」という時代になった
Deep Learning
Q: “人間が条件を明確化できてなくてもDeep Learningなら自動でできるのでは?"
A:半分正しい。
画像処理の分野では、例えば100x100のモノクロ画像でも「入力の値が10000個ある」という辛い状態になる。こういう入力をうまく扱おうと専門家が何十年もの間、色々な条件を考案してきた。
畳みこみを繰り返す特殊な形のニューラルネットを作って、大量のデータで学習してみたら、意外なことに専門家が工夫して実装したものより良い精度が出た。
これが正しい半分。正しくない半分は次のページ。
Deep Learning
この成功によりDeep Leaningに注目が集まり文脈を抜かして「Deep Learningを使うと人間より精度の高い判断をするプログラムが作れる」と伝言ゲームがゆがむ。
その結果、全然違う条件の問題に対して「これもDeep Learningでなんとかなるのでは」と考える人が増えた。
問題条件が変われば手法の有効性も変わるので、基本は「枯れた手法から順に小さい実験を繰り返す」しかない。
能動学習
A:ナイーブベイズもロジスティック回帰同様に信頼度を出せる手法なので、ナイーブベイズで能動学習したらいい。
補足:今回は割愛したけども、ロジスティック回帰もナイーブベイズも「
確率モデル」であって、「この入力がクラス1になる確率は0.8だな」みたいな出力を出すモデルです。これをこの発表では「
判断の自信」って表現していました。
微分
Twitterの感想「行列も微分も出てこない」
機械が重みを調整する時に「正解とのずれが小さくなる方向に重みをちょっと変更しよう」ってやる
これを数学語で言うと「『正解とのずれ』を重みで微分して勾配を求め、勾配方向に重みをちょっと変更しよう」になるわけです。
行列
ロジスティック回帰では、例えば条件が15個あったら「重み」という値が15個できる。
これを数学語で言うと「ベクトル」になる。
ニューラルネットはロジスティック回帰的なものが複数個集まってるので、仮に10個集まってるとしたら15x10個の値ができる。
これを数学語で言えば「行列」になる。
あいまいな判断
「P21は、例えばx1,x2,x3,x4,x6がTrueだと17/15になり、Trueになる。数学的には正しくない」
そう、そこが重要なところ(強調し忘れました)
元の式と、重み付き和の式は等価ではない。
しかし機械学習を使おうという時「どういう条件式なら顧客価値が生み出されるか」がそもそもわかっていない。
なので「元式と等価であること」には顧客価値がない。
論理的にきちんと記述することを手放して、雑であいまいな条件式で表現し、それがちゃんと機能するかどうかは、論理ではなく実データでのテストで担保する。これが機械学習の基本的スタンス。
補足(宣伝)
「データを観察することが大事」と明記・強調することを忘れていました。
僕が監修したPyQの「はじめての機械学習」ではデータを観察してif文を作るところからロジスティック回帰までを小さいステップで一歩一歩解説しています
機械学習の基本をif文から学ぼう
しきい値を見つけよう
可視化してしきい値を見つける
しきい値が決められないデータの扱い方
2次元のデータから分類
2次元データをプロット
1次方程式を用いた分類
はじめての機械学習:ロジスティック回帰