大生成AI時代に学ぶAIのしくみ基礎の基礎

こんにちは!エンジニアの藤井(touyou)です! この記事はGoodpatch Advent Calendar 2023の二日目の記事になります。

今回テーマにするのは昨年末のChatGPTリリースに始まり全世界を巻き込む社会現象となった「AI」についてのお話です。 ChatGPTの影響が大きかった一番の要因はチャット形式かつその性能の高さが今までAIに直接触ってなかった層を巻き込めるようになったから、というのはわりとメジャーな見方かと思いますが、一方でこれによってAIもとい機械学習がどういう仕組みで動いているのかという理解があまりないまま生成AIを触っている人も増えてきたのかなと思います。

自分は以前にChatGPTに書かせた技術記事に赤入れしてみた - Goodpatch Tech Blogという記事を書いたように、ただ生成AIに盲目的に乗っかっていくだけの動きには比較的懐疑的な立場をとっています。このスタンスになった一因として、自分が大学時代にコンピュータ科学を専攻しており機械学習の基礎を学んでいたというのも大きいのではないかと思いました。そこで社内で機械学習の仕組みをできる限り噛み砕いて解説したところ好評いただいたので、アドベントカレンダーという機会に外向けに再編集したものを公開しようとなったのがこの記事になります。

前置きが長くなってしまっていますが、これから解説を始めるにあたって最後に自分のスキルセットとこの記事の目的を改めて明示しておこうと思います。

筆者のスキルセット

  • 普段はiOSやWebフロントエンドのエンジニア
  • 大学・大学院でコンピュータ科学を専攻、研究分野はUI(HCI)
  • 機械学習については大学の授業で基礎を習った他、機械学習を用いたアプリケーションを研究や個人開発で作っていた
  • 生成AIについては積極的には触れていないが、その仕組みやルーツなどは調べたことがある

この記事の目的

  • 生成AIには興味があるが機械学習についてはあまり知らないという人が機械学習というものの原理の概要を把握できること
  • 上記の状態をエンジニアだけでなくデザイナーなど非エンジニアも達成できるようにする
  • 正確性よりもイメージを掴むことを優先する

以上踏まえた上で読んでいただければと思います。 目次も出しておくので、自分の理解レベルに合わせて適宜飛ばしながら読んでみてください。

理解のためのステップ0:コンピュータを知る

まずここから書くことを理解しやすいようにコンピュータが結局何をやっているのか、というところを説明しておこうと思います。

現代において、コンピュータというのは様々なところに出てきますよね。いわゆるパソコンはもちろんのこと、スマートフォンやタブレット、スマートスピーカーやAI機能を搭載したエアコン・冷蔵庫などなど。

ざっくり言えばあらゆるところにコンピュータが入っています。 ではこのコンピュータ、具体的に何をしているんでしょうか?アプリやAIがその上で動いているよ程度の解像度であれば把握している人も多いと思いますが、それ以上を想像したことはあまりないと思います。

なぜアプリやAIは動いているのでしょうか?なぜ大半のコンピュータは電気を必要としているのでしょうか?なぜ元々なかった機能もアプリをインストールすると使えるようになるのでしょうか?

実はコンピュータというのは、直訳した時の「計算機」という名前の通り、その上でどんなに複雑な処理をしているように見えても実際のところやっているのは「計算」だけなのです。 もっとミクロな視点で言えば、コンピュータというのは無数のスイッチのON/OFFを切り替えることで計算をする機械になります。

え?となりますよね。ですが実際、それ以上複雑なことをハードウェアだけでやろうとするとコンピュータはもっと限定的な使い道にとどまってしまうと思います*1

単純な原理の上で複雑な処理を実行するために、論理回路というものが編み出され、オートマトンという考え方が誕生し、それらを人間でも作りやすいようにプログラミング言語が生み出され、OSやアプリケーションへとつながっていきました。

これらの細かい部分は本筋ではないので省きますが、面白い本などもあるのでこの記事の最後に紹介しておきます。興味のある方はそちらを読んでみてください。

このステップでつまるところ何が言いたかったのかというと、コンピュータ上の全ての処理は、それがどんなに複雑であれ何かしらの「計算」に落とし込まれるということを、まずイメージとして持って欲しいということです。従来のAIも生成AIも全てそうです。まずはこれを大前提としておきましょう。

理解のためのステップ1:入力と出力

続いて紹介するのは「入力と出力」です。コンピュータ上での処理は必ず入力と出力というものが存在しています。

例えば今まさに自分がやっていることがそうです。「キーボードをタイピングする」という入力によって「タイピングされた文字がブログに反映される」という出力を得られています。 今この記事を読んでいただいている人であれば、「リンクをマウスでクリックする」という入力によって「このブログが表示される」という出力を体験していると言えます。

これらが実現されるには多かれ少なかれ誰かがプログラミングをしているわけですが、プログラミングをするにはこの入力と出力を意識することがとても大切になります。プログラマーはある入力をされた時にどういう結果をユーザーに返さなきゃいけないか、という処理の流れを組み立てていっているわけですね。

そしてこれは生成AIに関しても同様です。ChatGPTやMidjourneyといったサービスに対して、みなさんはプロンプトという入力を渡して、その結果を出力として受け取っています。

理解のためのステップ2:関数として見る

さて前のステップで言ったことを端的に表す言葉があります。 それが数学に出てくる「関数」です。数学嫌いの人、ちょっとばかし辛抱してください。イメージを掴むのに手っ取り早い方法なので。

関数とはなんだったでしょうか?よく見るのは以下のような数式ですね。

 f(x)=y

この時 xが入力、 yが出力です。数学といえば計算、なのでこれでステップ0の最後に言及した『生成AIはある「計算」に落としこまれる』というイメージも強められるのではないでしょうか。

よりイメージを深めるために、もっとも単純な「AI」の一例を見てみましょう。それがこちらです。

 f(x)=2x

はい。これは入力された数字の2倍の数字を返す「AI」です。どういうこと?となりますよね。ですがこれも状況を揃えてあげれば立派なAIであるとみなせます。

世間一般のコンピュータだと電卓ですら掛け算はそのままできてしまうので、ここに掛け算の機能を一切持たないコンピュータを仮定します。 このコンピュータで「入力された数字の2倍の数字を返すAI」を動かすにはどうすればいいでしょう。足し算に置き換えてプログラムすればいいはその通りなのですが、それも一旦ここでは考えないことにしましょう。

この状況下でお題のAIを作るには大量の数字と2倍した結果の数字を学習させて、答えを推測させるしかありません。こう書くと立派な機械学習の作り方となんら変わらないという見方ができます。

こうしてできた f(x)をAIの領域ではモデルと呼びます。 そしてこのセクションでは元々 f(x)を関数と呼んでました。つまりAIの領域で出てくるモデルとは一種の関数のことであり、関数であるからには入力と出力を持つ、というわけです。

理解のためのステップ3:行列演算を知る

ここまででAIもとい機械学習におけるモデルが、入力と出力を備えた一種の関数とみなせるということを説明してきました。でもこれだけだと、生成AIのような複雑な処理が本当にこれまで説明してきたような枠組みで表現できるのか、半信半疑な方も多いと思います。 そこで続いて数学における行列という概念を紹介していきます。 もちろんここで計算できるようになる必要はありません。あくまでそういうものがあるのだなぁと受け取ってもらえればいいと思います。

まず行列とは以下のようなものを指します。これは3×3の行列の一例です。

 \left(\begin{array}{ccc}10\quad7\quad3\newline6\quad3\quad1\newline5\quad2\quad8\end{array}\right)

初めて見るかたにとっては数字を羅列したものにしか見えませんよね。一旦の理解としてはそれで十分です。ですがこの数字の羅列が想像以上の働きをすることをここではわかって欲しいです。

まずはその力の一例として回転行列というものを紹介します。それが以下のようなものです。

 \left(\begin{array}$
\cos(\theta)\quad-\sin(\theta)\newline
\sin(\theta)\quad\cos(\theta)
\end{array}\right)

知らない方はこれだけ見ても何が何やらという感じになるかなと思いますが、行列というのはベクトルなどにもかけることができ、この行列をベクトルにかけると文字通り\theta分回転したベクトルが答えとして導けるためにこのような名前がついています。 詳細は省きますが、このように行列を使った演算というのは単なる掛け算以上の意味合いを持たせることができるというところがここでのポイントです。

もう少し機械学習に寄った事例も紹介しましょう。それが以下のような数式です。

\left(\begin{array}{ccc}
10\quad7\quad-2\newline
6\quad3\quad12
\end{array}\right)
\left(\begin{array}{c}
x\newline
y\newline
z
\end{array}\right)
=\left(\begin{array}{c}
a\newline
b
\end{array}\right)

この式は以下のような連立方程式と同じ意味になります。

10x+7y-2z=a

6x+3y+12z=b

ここで着目してほしいのは「行列をかける」ということが「3つの数を2つの数字に変化させる」という結果に繋がったということです。もっとざっくり捉えると「行列をかける」ということが「入力とは異なる形の出力を返す」操作になりました。

ここまでの流れで気付いた方もいるかもしれませんが、機械学習の、特にモデルと呼ばれるものの正体はまさにこの行列演算*2なんです。

理解のためのステップ4:ここまでをまとめてイメージを持つ

さて下準備的なところができたので、よりイメージを掴むためにここまでをざっくりと振り返ってみましょう。

  • 機械学習のモデルは入力と出力がある、とある関数です
  • 関数の中身は掛け算をするだけでさまざまな操作や意味合いを持たせることができる行列演算が詰まっています
  • 行列演算となれば数字の計算だけでできるのでコンピュータ上で計算が可能になります
  • 関数の中で扱っている行列に並んでいる数字を調整し、入力に対して正しい出力が出る確率の高いものにするのが学習です

というわけで機械学習の全貌が見えてきました。これが現在世の中にある大半のAIの仕組みです。 でもまだ文字や用語が多くてわかりにくい部分がありますよね。そこで登場するのが機械学習、その中でも特にディープラーニングを扱う際に登場する以下のような図です。

この一個一個の丸は数字になっていて、「層」の間を繋ぐ線がここまで説明してきた行列演算に対応します。 ディープラーニング、日本語だと深層学習とはまさにこの「層」がたくさんある様子を指して名付けられた言葉になっています。

これでみなさんは機械学習の解説記事に出てくる図と実際の処理のイメージを結びつけやすくなったのではないでしょうか。

現実の課題に対しての機械学習は画像や文章などかなり複雑な入出力が要求されるため、本当の意味でそのままこの丸と線で繋いだ形で仕組みを表すことはできません。ですので、機械学習の論文ではより簡略化して層の一個一個を立方体や四角でまとめて表現してしまいます。

そうすると、さもとても複雑で高度な処理をその一個一個でしているのではないか?と勘違いしそうになりますが、その実態はここまで解説してきたただの数字の計算であるということを知っておいてもらえればと思います。

理解のためのステップ5:生成AIとAIの違いとは何なのか?

さてここまででAIもとい機械学習が何をしているのか、ということを見てきました。改めて一言で表すと「ある入力に対して正解とする出力を返す確率がなるべく高くなるように中身の数値を調整した関数」がモデルであり、俗にAIと言われているものの正体です。

そしてこれは生成AIにおいても変わりません。ざっくり見ればやってることは何も変わらないのです。ですので直近話題になっているGPTや画像生成AIもAIと同じ性質、「結果は学習データに依存し、正確性が非常に高いだけで100%正しいとは限らない」という性質を持っています。

また結果は確率的であるため、学習データによって傾向を変えたり、中の計算順やデータの受け渡し方を工夫して精度を上げることはできても、最終的にどのような結果が出るかは作り手すらコントロールできません。だからこそ先日AIの作り手たちは生成結果の著作権侵害に関しての責任は使い手に全て帰属するという声明を出したのです。

ではなぜ、こんなにも既存のAIとは比べ物にならないほど生成AIは時代を動かしているのでしょうか? 答えはとてもシンプルだと自分は考えています。何かというと、生成AIは今までのどのAIよりも入力と出力が一般の人たちに扱いやすいものだったから、です。

GPTはさらに自然言語だけで今までAIエンジニアがやってきたような、モデルの改善といったタスクもできるようにしてしまいました。使うハードルを下げただけでなく、作るハードルも下げてしまったのです。これこそが最大の違いであり、逆に言えばそれ以外の違いは本質的にはありません。

まとめ

今回の記事ではコンピュータの簡単な仕組みから、機械学習がやっていること、それがなんでコンピュータ上で動くのかということも絡めて説明していき、最終的に生成AIと今までのAIに本質的な違いがあるのか?というところをなるべく簡単に解説してみました。

もちろん機械学習の中にも学習方法や、層の繋ぎ方など様々な側面で多種多様なものがあるので、生成AIもその中の一つであり違いはあれど本質は同じ、という理解がちょうどいいのかなと思います。より細かい仕組みの違いなどに興味がわいた方はこの後載せる参考記事などで理解を深めてみてください。

ここからは個人的な見解ですが、自分は生成AIとの向き合い方として大事なのは過度に特別視しない、かと言って過小評価もしないということだと思います。生成AIはAIの世界にプロンプトエンジニアリングという一種のプログラミングをもたらしました。

プログラミングはやろうと思えば本当に何でもできる手段です。その限界はあくまで時間・使っているフレームワークやOS・デバイスの処理能力で決められるだけで、理論上は何でもできるからこそコンピュータの世界はここまで発展してきました。

生成AIも同じです。使おうと思えば使い道はいくらでもあります。こういうことやりたいけど難しいだろうな、と従来なっていたところに取り入れられないか考えるのは積極的に取り組んでいくべきだと思います。一方で過度に特別視をして、従来の手法を全部否定するのは違うと思います。可能性の幅が少なく、確実に正確な結果を出さなければいけないのならルールベースの処理を書くべきですし、パターンが多くルールベースでは作れないけど特定の分野に特化しているというのであればもしかしたら生成AI以外のAIの方が得意かもしれないですし、用途がより汎用的になれば生成AIを選択すると実現できるかもしれないのです。ようするに使い分けです。

ぜひ冷静な目で手段の一つとして、より効果的により適切な形で生成AIを使って「流行りに乗ったプロダクト」ではなく「本当にいいプロダクト」を作って未来へと繋げていきましょう。

付録:参考書籍・サイトなど

数学について物語形式で知れるシリーズの中でコンピュータの話をしている一冊です。全てを理解するのは難しいですが、純粋に物語としても楽しめるのでぜひ数学を知るきっかけとして手に取ってみてください。 数学ガールシリーズに関してはどうやら作者の公式サイト上である程度読めるようになっているようです。

白と黒のとびら

白と黒のとびら

Amazon

本文中紹介したオートマトンが魔法の原理として登場する世界の中で繰り広げられるファンタジー小説です。こちらも物語として楽しみながら、オートマトンを知るという点でとてもいい本なので読んでみてください。続編として精霊の箱という本も出ています。

こちらはよりディープラーニングを自分で作ってみたい!という方におすすめの本です。この記事で解説してきたようなところをより専門的な部分も踏まえて解説し、Pythonを使ってじゃあ実際どうやって作るのかというところまで踏み込んで説明してくれます。こちらも続編がいくつか出ており、来春発売予定の5巻では生成モデル、つまり生成AIを扱っているようです。

qiita.com

こちらは検索してすぐに出てくる記事ですが、GPTの仕組みをかなりわかりやすく解説している記事だと感じたため紹介しておきます。特に今回の記事で機械学習のイメージを掴んだ上で読んでみると、かなり理解しやすいのではないかと思います。

2023/12/04 追記:

bbycroft.net

LLMのビジュアライゼーションをしてくれているサイトを見つけたので追記しておきます。 アニメーションでこの記事で説明した計算が、LLMぐらい複雑な機械学習の場合実際どんな感じに動いているのかを見ることができて面白いです。


Goodpatchではデザイン好きなエンジニアの仲間を募集しています。 少しでもご興味を持たれた方は、ぜひ一度カジュアルにお話ししましょう!

*1:ある程度であればハードウェアの段階で目的に特化した処理ができるように作るコンピュータもあります。エアコンや洗濯機など後から機能を付け加える必要のない場合にはこのようなものが組み込まれていることが多いです。

*2:厳密にはベクトルであったりより高次元なもの(例えば立方体の中に数字が規則正しく並んでいるようなもの)もひっくるめて機械学習では扱うので、これをまとめてテンソルと呼んだりします。ですが、そこまでやってしまうと難しくなってしまうので今回はあくまで行列の掛け算が組み合わさっているようなイメージで想像しておきましょう。