脳を模倣したAIでおっぱいの大きさを予測しよう
こんにちは。
リリア・セルケトールです。
今日は人工知能についてお話します。
人工知能の分野の中には機械学習という分野があり、その分野の中には教師あり学習と呼ばれるものがあります。
これは問題と正解データをモデルに学習させて、未知の問題に対して予測させるモデルのことを言います。
教師あり機械学習の中には神経細胞の働きを模倣して作ったニューラルネットワークと呼ばれるモデルがあります。
生物の脳はニューロンと呼ばれる神経細胞が多数つながったもので形成されています。ニューロンは刺激が加わったとき、ある大きさ以上ならば次の神経細胞に刺激を伝えます。
ニューラルネットワークはそれを重みとバイアス、活性化関数で数学的に再現をします。
一見難しそうに見えますが、実はエクセルで作れるほど簡単なのです。
一緒に作ってみましょう。
今回作るモデルは、無機質な物だと面白くないので、年齢・身長・体重からカップ数を予測するモデルを作ってみましょう。
みなさんは年齢・身長・体重は分かるのにスリーサイズが分からないで悶々とした経験があると思います。
まず教師データとして、こちらのサイトからアイマスキャラのデータを取得しました。
http://shizukaki.web.fc2.com/others/cgdatebase.html
こちらのデータから、年齢・身長・体重・カップ数のデータを取り出します。
そして、データには下処理が必要です。
まず、?が入っているデータを消し、カップ数をIF関数等を使って数値化します。
参考までに
=IF(E2="AAA",1,IF(E2="AA",2,IF(E2="A",3,IF(E2="B",4,IF(E2="C",5,IF(E2="D",6,IF(E2="E",7,IF(E2="F",8,IF(E2="G",9,10)))))))))
これらの年齢・身長・体重を標準化処理を行います。標準化とは平均0で標本偏差を1にする処理のことです。
(それぞれのデーター平均)/偏差
で標準化することができます。この処理により、それぞれのスケールを合わせて学習しやすくすることができます。
また、出力先に合わせるため数値化したカップ数を1/10の値にします。
以降、これらの数字を学習に使います。
今回作るニューラルネットワークは三つの入力に対し、五つのユニットがある中間層で処理を行い、最終的に一つの出力になるモデルを構築します。中間層や出力層はシグモイド関数と呼ばれる関数と呼ばれる神経の働きを近似させた活性化関数を利用します。
この活性化関数にかける前に、それぞれの入力値に対して重みとかけ、その数とバイアスの値を足します。この重みとバイアスの初期値はランダムであり、学習によって、これらのパラメーターは最適化されます。=RAND()-RAND()でこれらの初期値をランダムで決定します。
入力値(年齢・身長・体重)に対して重みをかけてバイアスを足していきます。
この足した値をシグモイド関数に代入します。
=1/(1+EXP(-(A2*$P$2+B2*$P$3+C2*$P$4+$P$5)))
中間層2以降も同様に処理を行います。
=1/(1+EXP(-(A2*$Q$2+B2*$Q$3+C2*$Q$4+$Q$5)))
出力層は各中間層の出力結果に対して重みをかけてバイアスを足します。
=1/(1+EXP(-(G2*$U$2+H2*$U$3+I2*$U$4+J2*$U$5+$U$6*K2+$U$7)))
予測精度及び学習状況の指標ため誤差関数を設定します。教師データから出力データを引き二乗します。この誤差が小さければ小さいほどモデルの当てはまりがいいことを示しています。=(E2-M2)^2
カーソルを引っ張って各計算処理を行います。
誤差関数を全て足します。
データの分析にあるソルバーを使い、誤差関数の合計値が最小になるように設定し、中間層と出力層のパラメーターを変更セルに設定します。このソルバー処理が完了すると学習完了です。
ではこの完成したモデルで遊んでみましょう。この時入力したデータは先ほどの標準化処理が必要です。出力した値を四捨五入し、その出力値をもとにカップ数に変換して戻します。
=IF(K2=0.1,"AAA",IF(K2=0.2,"AA",IF(K2=0.3,"A",IF(K2=0.4,"B",IF(K2=0.5,"C",IF(K2=0.6,"D",IF(K2=0.7,"E",IF(K2=0.8,"F",IF(K2=0.9,"G","H")))))))))
まず、キズナアイさんをやってみました。予測カップ数はEカップでした。
しかし、世の中にはごちうさキャラをはじめとした、身長と年齢しか分からないキャラも存在します。体重といったデータの欠損値は重回帰で無理矢理回帰させます。まず、ランダムで値を3つ設定し、それらの値を身長と年齢かけて足します。その値(予測値)と実際の体重の二重誤差を算出します。
ニューラルネットワークの時と同様にソルバーを使ってパラメーターを最適化します。
誤差を足したものを最小になるように、三つのパラメーターを変更セルに設定します。
こうして年齢と身長から体重が予測できるモデルが完成しました。
これらのモデルを使っていろんなキャラの予測を行ってみましょう。
どうだったでしょうか?
本格的にやろうと思うとpythonやRが必要になりますが、簡易的なものだとこんな感じになります。エクセルでも頑張れば流行りのディープラーニングだって実装できちゃいます。興味を持ってくれる人がいたら幸いです。