中学生でも多分わかる雑なAIの仕組みの説明
今日は、AIのしくみを、単純化して解説していきます。
前提知識があまりなくても、数学が苦手でもわかるように書いたつもりなので、読んでみてください。
1. AIにおける、機械で『学習する』とはどういうことか
前回の記事で、AIは大量の知識データを学習していると書きましたが、
ここでいう『学習する』とはどういうことなのでしょうか?
学習しさえすれば、何でも解けるのでしょうか?
『学習』には、主に『教師あり学習』と『教師なし学習』の2種類があります。
たまに、「教師がなくても学習できる教師なし学習こそ素晴らしい」とか言う人もいますが、今主流で出回っているディープラーニング等を実装したAIは、世で見聞きするもののほとんどは、基本的には『教師あり学習』です。
ちなみに、『教師』とは、
学習する際に、「Aを入力したらBを出力してほしい、Cを入力したらDを出力してほしい」というような対応関係のことを教えておくことを指しています。
なので、ここでは、『教師あり学習』のことを簡単に説明します。
1.1 基本的な考え方
『教師あり学習』をものすごく雑に説明すると、ズバリ、
『めっちゃ複雑な関数(入出力の関係)を予想すること』
です。
関数y = f(x)ってありますよね。 中高で習う関数。一次関数、二次関数、三角関数、指数関数、対数関数などなど。
xが入力で、yが出力。
電気使用量と電気料金の関係だとしたら、 xが電気使用量で、yが電気料金。 電気使用量がわかれば、大体電気料金がわかります。
やだな、この例え。
子供の身長をxにして、年齢をyにしたら、ある程度年齢が予想できますよね。
いや、難しそうだな。
まぁ、ひとまず図を描きますね!
話を単純にするために、
『画像を入力すると、①犬②猫③ネズミ のいずれかを判定するAI』
を想定します。
点線がy = ax +b だとします。
この場合は、xに何か犬と猫とネズミそれぞれに異なる変数(特徴)を一つだけ入れて、y(犬 or 猫 or ネズミ)を求めます。
例えば、色。 耳の大きさだけで見分ける場合、ネズミは見分けられそうですが、色んな色や模様のある犬と猫は見分けるのが困難であることが予想されます。 また、色だけだと、犬種によっては犬と迷うかもしれません。
しっぽの長さだとどうでしょう。 猫のしっぽが一番長そうですが、長さだけでいうと、ネズミと犬のしっぽはどっちが長いか、ちょっと判断に迷います (※実際には違いはハッキリしているのかもしれませんが、便宜上ハッキリしないテイにします)
グラフの黒い×は、この場合、横軸が色で、縦軸がクラス(この場合、①犬②猫③ネズミの3つのうちいずれか)を表しているイメージです。
でも、実際にはもちろん、色だけで判別できないし、こんなに線形なわけはありません。
だから、実際には、 y = a1x1 + a2x2 + a3x3 + … (※実際には一次式じゃないですけど、変数がたくさんあることが書きたいだけなので、ひとまずはこれで)
x1, x2, x3…に、尻尾の長さ、色、耳の大きさ…といった風に、特徴(変数)をたくさん入れていきます。
a1, a2, a3には、重要度によって重み付けが入れられます。
みたいなイメージ。
大量の、犬、猫、ネズミを大量に集めてきて、×のプロットを大量に打ちます。
そしたら、データの傾向がわかるので、近似式(的なもの)を出します。
この近似式が、AIでいう学習済みモデルに相当するものです。
ChatGPTでいうと、私たちが提供されているのはこの近似式で、チャットに入力する言葉はx、関数f(x)がChatGPTのプラットフォーム、yがChatGPTが出す答え ということになります。
私達がAIに入力して得る答えは、この近似式y = f(x)にxを入れてyを算出していることとほぼ同義なのです。
なので、学習には時間がかかりますが、予測にはほとんど時間がかかりません。
もし「AIってすぐに答えを出すよな」という感想を抱いたのであれば、事前に学習を終えていて、予測は関数に代入してるだけだから早いわけです。
もちろん、実際には、もっともっと難しい問題を解くので、関数の中に関数がいくつも入れ子になったり、関数同士が掛け合わせて足されたり…
この数式は、『ディープラーニング』に限っていうと、神経細胞が信号を伝達する仕組みを数理的に模したものだと言われている、複雑な関数の組み合わせの形で表されます。
でも、ここまででなんとなく、AIがどうやって大量のデータから傾向を学びとっているのか、雰囲気が掴めたのではないかと期待します。
1.2 分類の為の特徴は多いほど良い?
1.1で説明した、動物の分類に話を戻します。
動物を見分けるのに、例えば色、尻尾の長さ、耳の大きさなどが役に立ちそうだと例に挙げました。
これを例示できたのは、動物によって何が違うのかが簡単にわかるからです。
さて、AIを作る際に、この特徴(用語としては『特徴量』)は、どうやって見つけてくるのでしょうか?
……実は、つい最近まで、この特徴量を見つけてくるのは、人間の手作業でした。
つまり、事前に、何を特徴とすれば問題が解けそうなのか、当たりがついていなければ、AIを作れなかったんです。
もちろん、あまり当たりが付けられなくても、ある程度鉄板の特徴量の算出方法というのがあって、その中から何とかモノになりそうな特徴を探してきます。
そこの探索は、事前にある程度探さなければならないんです。
じゃあ、何でもかんでも、とにかくたくさん特徴量を入れてみればいいじゃないか
残念。
話はそんなに簡単ではないのです。
ここは連立方程式で考えてみましょう。
先ほど書いたように、xは尻尾の長さ、yは犬が猫かを示す指標とします。
aは尻尾の長さにかける重みで、bは定数項です。
y = a × x + b
実際のデータ(x, y)の組み合わせを沢山集めて、y = f(x)を求めます。
この場合、aとbを求めます。
今回の場合、(x, y)が
点1(0.1, 0.4)
点2(0.2, 0.7)
の2点を代入して連立方程式を解きます。
これはすんなり求まります。
a = 3, b = 1になるので、y = f(x) = 3x + 1になります。
f(x)(AIでいうと学習済みモデル)を求めるのには、データは2つあれば事足ります。
ここで、xは尻尾の長さ(特徴量)です。
これが、特徴量が増えたらどうでしょうか。
尻尾の長さ(x1)と耳の大きさ(x2)と毛の長さ(x3)と目の大きさ(x4)の4つを使うことにします。
今回の場合、(x1, x2, x3, x4, y)が
点1(0.1, 0.2, 0.3, 0.4)
点2(0.2, 0.1, 0.3, 0.1, 0.7)
の2点を代入して連立方程式を解きます。
……解けないですよね(私解いてないけど)
最低でも、4式ないと解けません(多分)。
つまり、特徴を沢山使いたいなら、それ以上のデータ数がないと、正確な関数(学習済みモデル)は求められないのです!
データ数に比べて無駄に特徴が多いと、逆に性能が悪くなってしまいます。
これが、沢山の特徴を使えば良いというものでもないという理由です。
だから、適切な特徴量を選択するのがまず大変なことでした。
これと同時に、学習データは、めちゃくちゃ沢山ないと良いAIは出来ないことも、なんとなく伝わったのではないかと思います。
データがWEB上で簡単に沢山入力可能(もちろんモノにもよりますが)になったことも、近年急速にAIが発展してきた理由の一つです。
1.3 データは沢山あるほど良い?
さて、データは沢山あればあるほど良いのでしょうか?
これについてはYESだと思います。
でも、ただ沢山あれば良いわけではないと思っています。
色を例に、考えてみましょう。
犬と猫の画像がたくさん集まったとします。
でも、ほとんどの画像がノイズでザラザラだし、ピンぼけしていたら、どうでしょう。
色、変わってしまいませんか?
また、一応犬の画像だけど、風景画の中に豆粒ぐらいしか写っていなければ、もちろん耳の大きさや目の大きさなんて分かりませんから、判別がとってもしづらいので、拡大やクロップが必要です。
猫だけど、頭の上半分しかない場合なども、もちろん見分けづらいです。
目の大きさに着目していたとすると、ピンぼけしていたら、目が小さくなってしまい、見分けづらくなってしまいそうです。
なので、そういう場合は、ノイズを綺麗にしたり、ピンボケを解消したりします。
汚いデータが多ければ多いほど、この、データのお掃除(データクレンジング)に手数がかかり、開発の着手に時間がかかります。
『AI開発』といえば聞こえは多少良いかもしれませんが、この部分に費やす手間は相当大きいです。
そして、こういうことは、データが多いほど大変だし、ある程度自動で出来ることもありますが、手作業も度々伴います。
データは多い方が良いですが、質の高いデータが必要です。
*
2 ディープラーニングのすごいとこ
2.1 複雑な問題が解ける
二次元で描き表せる関数は、シンプルなんですけど、解く問題が複雑であればあるほど、関数も複雑な形になります。
一次関数だけではなく、二次関数や三次関数、指数関数、対数関数なども使えて、なおかつ、これらを組み合わせられた方が、もっともっと、色んな複雑な関係を表す関数になりそうですよね。
この、関数の形を複雑にすることは、AI(の中でも人工ニューラルネットワーク)においては、ディープラーニングの構造を『深層』にすることだったのです。
ディープラーニングの『ディープ』は、人工ニューラルネットワーク(1958年からあった構造)をより深い構造にしたことを指しています。
構造をディープにすれば、より複雑な問題が解けるという概念は昔からあったのですが、技術的な問題がありました。
(※正解と予測値との差を最小化させるための誤差逆伝播が深層にうまく活かせない)
正直、ここの概念は少し難しいので、
『第三次AIブームの時に、ディープな構造にするための画期的な方法ができた』
ということだけ覚えておいてください。
関数に戻って、これがどういうことか、具体的に見ていきましょう。
変数xが一つ(見分けるのに使える特徴が一つしかない)と、複雑には出来ませんよね。
例えば
こんな3つの点がある場合。
関数f(x)はどのような線だと思いますか?
多くの人はこんな線を思い浮かべるんじゃないかな、と思います。
あるいは、
こういうのも考えられますよね。
さらにはこういう線も考えられますよね。
3点しかないので何とも言えませんが、こちらの線の方が、より良くフィッティングしています。
(線の上に点が乗っている)
つまり、複雑な関数を描ける方が、より色々なデータの傾向を表せるというわけです。
人工ニューラルネットワークでいうと、層が深い(深層)方が、より関数の形としては複雑な関数になります。
そして、深層化したのがディープラーニングです。
なので、ディープラーニングは、より複雑なデータの分布をした、分類しにくいものも分類しやすくなるんです。
2.2 でも、ただ単に複雑にすればいいものではない
……ここだけ見たら、関数は複雑であればあるほど良さそうに思えますよね。
でも、先ほどの激キモ合成関数を予測したのだとして、じゃあ実際に関数(学習済みモデル)を他のデータに使ってみよう!となったとします。
実際のデータが★だったらどうでしょう。
実は一番右上の×は外れ値だった場合、★が実際のデータだったら、赤線はとんだ間違いですよね。
だから、データは多ければ多いほど、正確なAIが得られる傾向にあります。
また、学習データに高くフィッティングし過ぎるのも問題で、ディープラーニングには、適度に複雑すぎないように調整する機能もあります。
そこもディープラーニングが高い性能を出せるようになった秘密の一つでもあります。
2.3 ディープラーニングは特徴を自分で探す
1.2で説明した通り、特徴量を探す(特徴量設計)は最近までは人間の仕事でした。
そう、(完全ではないにせよ)過去形です。
ディープラーニングのすごいところは、自分自身で、学習しながら、分類に必要な特徴を自分で探していく点にもあります。
これまでは、例えば、特徴に尻尾の長さを使うとしたら、事前に尻尾の長さを測っておく必要がありましたが、ディープラーニングでは、画像をぶち込めば、自分で特徴量を出してくれます。
(出し方も書こうかと思ったのですが、ディープラーニングの共通項ではないし、大変なので省略)
しかも、自分で特徴の数を適度に絞ってくれます。
2.2の、『構造が複雑になりすぎないようにする』というのは、このこととも繋がるのです。
2.4 データ量は多いほど良い。ただし、猛烈に時間がかかる
ディープラーニングは、学習済みモデル(関数)が出来てしまえば、予測にはそれほど時間はかかりません。
でも、学習には、とてもとても時間がかかります。
データ量が多いなら、なおさらです。
数日とか平気で掛かります。
というか、スペックの低いパソコンだと、計算量が多すぎて、もう無理!というエラーが出ます。
(無茶させすぎてパソコンを壊したこともあります)
決めうちで、使える学習モデルが作れるわけではなく、試行錯誤するので、数日経って結果が悪かったら、もう絶望ものです。
そこでGPUです。
グラフィックのエグいテレビゲームをやっている方にはお馴染みの、グラフィックボードです。
こいつで並列処理をします。
アバウトに説明すると、データを分割して、幾つもの計算場所で計算して、あとで全部の計算結果を参照して考慮するイメージです。
*
さぁ。
いかがでしたか?
もう、長すぎて、誰が読むんだろう?
という疑問は湧いていますが、
誰かが、「そうなんだ!」と思ってくれたら、泣いて喜びます(大袈裟)
この記事が気に入ったらサポートをしてみませんか?