一歩ふみ込むAIの仕組み ～AIの学習を体験する～

# 0.はじめに
　この記事は、専門ではない方向けにAIの中身について解説することを試みたものです。AIという言葉はすでに当たり前に使われており、まったく知識がないという方は少ないと思います。また、「AIとは？」などと検索すれば、ざっくりとしたイメージを解説した記事がたくさん出てくると思います。本記事は、そこからもう一歩ふみ込み、AIが中でいったいどんなことをしているのか、その根幹となる部分のイメージを説明します。

　なお、分かりやすさを重視するために厳密ではない説明や正確でない表現となっている箇所がいくつかあります。また、筆者の主観を多分に含む説明も見受けられるかもしれません。可能な限り脚注で補足しますが、あらかじめご了承ください。

# 1. AIとは？
### AIという言葉のイメージ
　まずはAIという言葉について認識を合わせたいと思います。「AI」とは「Artificial Intelligence」の略であり、日本語にすると「人工知能」です。筆者の偏見も入りますが、「こちらの意図を汲んで最適な回答をしてくれるもの」、「大量のデータから確度の高い予測をしてくれるもの」などのイメージを持たれている方が多いかと思います。例えば、Amazonのようにユーザーの購買履歴から自動で「あなたへのおすすめ」を提示してくれたり、雨雲レーダーのように過去の気象データから数時間後の雨雲の動きを正確に予測してくれたりします。
　また、「知能」と言うからには、思考や心があるようなイメージもあるかもしれません。OpenAIのChatGPTは、我々が打った文章に対してまるで人間のような回答を返してくれます。


### AIの「学習」とは？
　AIに携わっていれば、「学習」という言葉や「機械学習（Machine Learning）」という言葉を耳にすると思います。AIには、サービスとして利用できる状態になる前に「学習」というフェーズがあります。要は、我々が望むことを返してくれるようにAIに勉強させるフェーズです。

![創作＿AIの学習イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959513/d4a1b381-f85b-6668-cb0e-edce27e38299.png)


我々人間は、仕事ができるようになるためには、まずは勉強して知識・技術を身に付ける必要があります。AIも同じように、学習して知識を獲得して初めて商品のおすすめや雨雲の予測などの仕事ができるようになるのです。

# 2. 一歩踏み込んで、「学習」とは？
　さて、セクション1のような認識は必ずしも間違いではありませんが、一歩踏み込んだ理解をするためには次のことを心に留めてください。それは、<b>「AIは所詮、計算機である」</b>ということです。商品のおすすめも雨雲の予測も、入力されたデータをあらかじめ定めた式に当てはめて計算しているだけです。[^1]セクション1で述べた「学習」も、言葉だけ聞くと非常に高度で人間的なことのように思えますが、やっていることは数字をいじっているだけです。以降では学習に焦点を当て、「どんな仕組みの計算機なのか？」を説明していきたいと思います。

[^1]: 本記事では教師あり学習を想定して説明しており、このような表現をとっています。クラスタリングなどように明示的にモデル（式）を置かない手法もあるため、この表現は不正確になりますが、初学者の方に分かりやすく説明するために、このような表現を取りました。

### AIの学習を体験してみる
　さて、ここからはAIの学習とはどういったものなのか、実際に体験してみましょう。
　学習とは「大量のデータから傾向を掴む」ということだとご説明しました。特に「傾向を掴む」ということが学習の根幹にあたります。
　では、傾向を掴むとは具体的にどういうことでしょうか？あるECサイトにおけるユーザーごとの利用額のデータを使って考えてみましょう。このECサイトでは、アカウント登録時に自身の月収を登録します（少し無理がある設定かもしれませんが…）。ユーザーの月収と、毎月の平均利用額を一覧化したのが、以下の表になります。
　このうち、Fさんは月末に新規登録したユーザーなので、利用額のデータがありませんでした。この時、他の5人のデータから、Fさんの平均利用額を予測してみましょう。5人のデータから、月収と利用額の間にどのような関係があると言えそうでしょうか？（ぜひ、実際に考えてみてください）

||月収|平均利用額（月ごと）|
|:---:|:---:|:---:|
|Aさん|24万|1万2,000円|
|Bさん|32万|1万6,000円|
|Cさん|22万|1万1,000円|
|Dさん|18万|9,000円|
|Eさん|28万|1万4,000円|
|Fさん|30万|－|

　全員、ぴったり0.05倍だとわかります。ということは、おそらくFさんも月収の0.05倍、すなわち「1万5,000円」分利用してくれると予測できます。
　この関係を、中学で習う比例の式に落とし込んでみましょう。月収を$x$、利用額を$y$とすると、「$x$の0.05倍が$y$」なので、
$$y = 0.05 \times x$$
となります。
　「比例の式を考える」ということは、「直線のグラフを考える」ということです。各ユーザーのデータを点でうち、「$y = 0.05 \times x$」の直線を引いたものが以下になります。

![graph_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959513/cf041de6-c744-c018-4b4c-8fcca1461c1d.png)

### 体験の総括
　セクション3の体験を総括しましょう。5人の月収と利用額から傾向をつかみ、6人目の利用額を予測することができました。具体的には、「月収を何倍すれば利用額になるのか」の「何倍」の部分を「学習」したということです。
　式から考えてみましょう。我々はまず、
$$y = ？ \times x$$
という、「何倍すればよいか」が不明な式を頭に浮かべました。そこから5人のデータを分析することで「0.05」という方向きを導き出し、
$$y = 0.05 \times x$$
という関係を導き出したのです。

　実は、AIが行っている「学習」も、究極的には「式の傾きをいくつにすればよいか」を決めているにすぎません。そしてこの導き出した式に当てはめて、「Fさんの月収は30万円だから、利用額はおそらく1万5,000円」のような予測を行っているだけなのです。[^1]

### 用語の整理
　ここで、セクション3の体験に紐づけてAIの学習（機械学習）の用語を整理します。
- 「<b>モデル</b>」　

　導き出された
```math
y = 0.05 \times x
```
という式のことを「<b>モデル</b>」と呼びます。[^2]ここでいう「モデル」は、職業の「モデル」ではなく、「プラモデル」などの「モデル」の意味に近いかと思います。実際のデータの傾向を再現する模型のような意味を持っています。
- 「<b>目的変数</b>」

　本セクションの例では、Fさんの利用額を予測しました。利用額は、式で言えば左側（左辺）の「$y$」です。このような予測したい項目のことを「<b>目的変数</b>」と呼びます。[^3]我々がモデルを作ったのは、利用額を予測するためでした。モデルを作る目的となる変数なので、目的変数です。
- 「<b>特徴量</b>」

　目的変数の予測のもとになった月収、つまり式中の「$x$」のことを「<b>特徴量</b>」と呼びます。[^4]月収はユーザーの特徴だと言えるので、特徴量です。
- 「<b>パラメータ</b>」

　最後に、式中の「何倍か」にあたる「?」のことを「<b>パラメータ</b>」と呼びます。[^5]つまり、AIにおける学習とは、「パラメータを調整する」ことと言えます。このことを特に「チューニング」と呼ぶこともあります。「学習」と「パラメータのチューニング」は、大枠ではほぼ同じ意味と思っていただいて大丈夫です。

　なお、「変数」や「量」という言葉は専門用語であり、特に「量」は一般的な意味の「量」とは異なります。ここではどちらも「項目」くらいの意味でとらえてください。

![創作_数式イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959513/d52aa384-a294-0bea-8afa-0ba8f9588d69.png)


[^2]:厳密には傾きが「？」の状態でもモデルと呼びます。「？」の値が具体的に定まったモデルを特に「学習済みモデル」と呼ぶこともあります。
[^3]:他にも、被説明変数や従属変数などの呼び方もあります。
[^4]:機械学習以外の分野では、説明変数、独立変数などの呼び方もあります。
[^5]:パラメータとは機械学習の用語というよりはもう少し一般的な用語で、「調整対象である未知の値」のような意味です。筆者はあまり好きではないですが、日本語では「母数」という訳語が付されています。また、機械学習におけるモデルのパラメータのことは特に「重み（weight）」と呼ぶこともあります。

# 3. もう一歩ふみ込んで、「学習」とは？　
　もう少し体験を続けましょう。今度はGさん〜Lさんの月収・利用額のデータを持ってきました。セクション2と同様に、Lさんは新規ユーザーでまだ利用額のデータがありません。Lさんの平均利用額を予測するためには、どのようなモデルを考えればよいでしょうか？

||月収|平均利用額（月ごと）|
|:---:|:---:|:---:|
|Gさん|30万|1万5,000円|
|Hさん|14万|1万円|
|Iさん|27万|1万3,000円|
|Jさん|37万|1万3,000円|
|Kさん|21万|1万4,000円|
|Lさん|35万|－|

　セクション2とは違い、全員に対してぴったりのパラメータが見つからないと思います。当然、現実のデータではこのような状況が普通です。
　では、どのようにしてパラメータを調整すればよいでしょうか？今回は、先にグラフから考えてみましょう。以下にGさん～Kさんの点を打った図を用意しました。この図に、セクション2のように比例の直線を引くことを考えます。どのような直線を引けそうか考えて見てください。

![graph_2_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959513/5dbbd085-0eb7-3e7b-8ac2-9d2ff0eca532.png)

　もちろん、セクション2のように全点を通る直線を引くことは不可能です。そのため、「全員にちょうど良い直線」を引くことを考えます。例えば、筆者の方で青と赤の2つの候補を引いてみました。青と赤のうち、どちらの線がよさそうでしょうか？

![graph_2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959513/88199ede-b434-d514-9c60-1e24b04db502.png)

　今回は、青い線の方が良さそうと言えます。なぜなら、点と線のずれが、全体で見た時に青い線の方が小さいからです。以下の図で確認してみましょう。

![graph_2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959513/c9f8deda-c77d-ca73-0e1b-d4648974cd3a.png)

　先ほど不可能であると言いましたが、理想は「全部の点を通る直線」であることに変わりはありません。そのため、「各点と直線のずれがなるべく小さくなるような直線」を見つけることを目指します。ここで言う「ずれ」とは、<b>「あるユーザーの$x$で見た時に、直線上の$y$と実際の$y$とのずれ」</b>のことです。例えば、Hさんのデータで見た時、Hさんの$x$（月収）は14万円で、実際の$y$（利用額）は10千円です。青い線の方は、直線上の$y$（利用額）が12千円あたりにあるので、ずれは2千円です。赤い線の方は、直線上の$y$（利用額）が10千円（ぴったり直線上）なので、ずれは0千円です。このようにして、青い線、赤い線のずれの大きさをざっくり合計してみると、
- 青い線
    - Hさん：12 - 10 → 2
    - Kさん：12 - 14 → 2
    - Iさん：13 - 13 → 0
    - Gさん：13 - 15 → 2
    - Jさん：14 - 13 → 1
    - <b> 合計：7 </b>
- 赤い線
    - Hさん：10 - 10 → 0
    - Kさん：11 - 14 → 3
    - Iさん：11 - 13 → 2
    - Jさん：12 - 13 → 0
    - Gさん：12 - 15 → 3
    - <b> 合計：8 </b>
    
となり、青い線の方が全体としてのずれが小さいことが分かります（少々おおざっぱすぎるかもしれませんが、ご容赦ください）。つまり、青い線になるような比例式が良いモデルということになります。[^6]
　ちなみに、青い線を使ってLさんの利用額を予測するなら、Lさんの月収である「35（万円）」の時のグラフ上の利用額を求めればよく、だいたい「1万4,000円」と予測することができます。
[^6]:ここでは絶対値（予測値と実際の値の差の大きさ）を使って誤差を求めましたが、パラメータの調整においては「予測値と実際の値の差の2乗」を利用する方が一般的です。

### 体験の総括
　セクション3の体験を総括します。まず重要なことは、「モデル」というのは「特徴量（月収）と目的変数（利用額）の関係を"完璧に捉える"もの」ではなく、「特徴量（月収）の値から目的変数の値（利用額）を"だいたいで予測する"もの」ということです。このセクションの体験では、「特徴量（月収）を何倍したら目的変数の値（利用額）になるか」を考えた時に、全員に対してぴったりの「何倍」がないということから始まりました。セクション2のように全員にぴったりのモデルが作れる状況は、現実にはほとんどありえないということは想像できるかと思います。そこで、そもそものゴールを「ぴったり」ではなく「できるだけ良いもの」として、モデルをできるだけ良くするためにパラメータをチューニングすることになります。
　そして、「良いモデル」とは「予測した値と実際の値のずれが、全体的に小さいモデル」のことです。言い換えるならば、AIの学習とは、<b>ずれが小さい直線になるようモデルのパラメータをチューニングすること</b>であると言えます。

### 用語の整理
　最後に、もう少し用語を整理しましょう。
- 「<b>予測値</b>」

　AIの学習とは、「予測した値と実際の値のずれが、全体的に小さくなるようにモデルをチューニングすること」だと言いました。この文脈における「予測した値」、つまり「直線上の$y$」のことを「<b>予測値</b>」と呼びます。特徴量（月収）の値から、モデル（比例式）によって予測された値であるため、予測値です。
- 「<b>正解データ</b>」

　上記の文脈において「実際の$y$」のことを「<b>正解データ</b>」と呼びます。モデルの予測値が当たっているか否かの指標になる値なので、正解データです。
- 「<b>誤差</b>」

　そして、予測値と正解データの「ずれ」のことを「<b>誤差</b>」と呼びます。明確に決まりはないですが、多くの場合は全体的なずれの大きさのことを誤差と呼びます。つまり、AIの「学習」とは、「<b>誤差を最小化するようにモデルのパラメータをチューニングすること</b>」であると言えます。

![創作＿正誤から学ぶAI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959513/ab2e14bc-a157-d0b9-3d81-56606399ddf0.png)


### 参考：青い直線のモデルについて
　さて、勘の良い方はお気づきかもしれませんが、本セクションにおいて筆者は頑なにモデルを式で表そうとしませんでした。本セクションの体験の最後で採用した青い直線の比例式は、以下になります。
$$ y = 9.72 + 0.127 \times x $$

比例の直線を決める要素は、直線の「傾き」の他に「切片」があります。つまり、比例式をモデルとした場合、チューニングするパラメータは本来2つあるのです。

![graph_dummy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959513/4dcb485b-e9a5-faf6-482b-f28b39e36cf0.png)


切片は$x=0$の時の$y$の値であり、今回の問題設定では「月収が0円のユーザでも9,729円は利用する」という無理な設定をおく必要があります。また、モデル自体も「月収を0.127倍して、9,720円足すと利用額になる」という直観的に解釈が難しい式になってしまうため、途中での説明は割愛していました。
　ただし、切片を導入すること自体は不自然なことではありません。直観的には、例えば「社会人歴の長さから年収を予測する」というAIを考えれば、「社会人歴0年 ＝ 入社1年目」であっても年収はあるので、切片を考慮することが自然です。学習の観点では、今回のように直線を引いてみた結果データへの当てはまりが良さそう（誤差が小さそう）なのであれば、解釈上で違和感があったとしても切片を考慮したモデルをの方が妥当です（AIはあくまで全体的な予測が良くなることが重要なのです）。

# 4. おわりに
　以上3セクションを通し、AIの中身について説明しました。「AIがこんなに単純なはずがない」という感想や「AIはブラックボックスで中身が分からないと聞いた」というご意見もあるかと思います。それらご指摘はその通りで、現実のサービスにはこんな単純な式で作られているAIはありません。実際にはもっと高度な数学理論や高度なコンピューティングによって成り立っています。しかし、今回の式を高度化したものがAIであるということは、必ずしも誤りではないです。「AIエンジニア」という職業があるように、AIは人間が作り出しているものであり、それを日々調整している人がいるのです。AIは「よく分からないすごいもの」ではなく「人間が調整して作り上げている数式である」ということ（すごいものであることには変わりないですが）、そして人間が行っている調整とは「数式のパラメータの調整」であるということをお伝え出来たのであれば幸いです。