機械学習とは何か — 「学習」を数式なしで理解する
「プログラムを書く」と「学習させる」は何が違うのか。ルールベースとの対比、丸暗記と汎化の差、教師あり・教師なし・強化学習の地図までを、数式をほぼ使わずに整理する入門記事。
ルールを書く仕事から、例を見せる仕事へ
迷惑メールを見分けるソフトを作るとします。まず思いつくのは、条件を書き並べる方法です。
「件名に『当選』が入っていたら迷惑メール」「知らないアドレスからで、URLが3つ以上あれば迷惑メール」——こうした条件を人間が1つずつ書いていく作り方をルールベースと呼びます。最初の数十件はうまくいきます。しかし送信者は表現を変えてきます。「当選」が「ご当選」になり、次は全角と半角が混ざり、やがてルールは数千行に膨れ上がり、どれが何のためのルールか誰も分からなくなります。
機械学習はここで発想を裏返します。ルールを書く代わりに、答え付きの例を大量に見せて、見分け方そのものを機械に作らせるのです。迷惑メール1万通と普通のメール1万通を渡し、「この2つの山を分ける基準を自分で見つけて」と指示する。人間はルールではなく、例と評価基準を用意する係になります。
この違いは、入力と出力の向きで整理すると一目で分かります。
| 与えるもの | 出てくるもの | |
|---|---|---|
| 普通のプログラミング | データ + ルール | 答え |
| 機械学習 | データ + 答え | ルール |
「答えからルールを逆算する」——これが学習の正体です。
直感: 機械学習は「関数当てゲーム」
もう少し噛み砕きます。世の中には、メール本文を入れると「迷惑/普通」が返ってくる真の関数があるとします。人間はその中身を知りません。手元にあるのは、その関数が吐いた入出力のペア(例)の山だけです。
機械がやることは単純です。まずつまみ(パラメータ)がたくさん付いた、形の決まった関数を用意します。最初はつまみの位置がでたらめなので、予測もでたらめです。そこで例を1つずつ見せ、答えとズレていたらズレが小さくなる方向へつまみを回す。これを何万回も繰り返すと、関数は真の関数に近づいていきます。
数式で言えば、 となる を、データから探す作業です( が入力、 が答え)。この記事で使う数式はこれだけです。「学習」とは、つまみを回して例に合わせ込む作業のこと——まずはこの一文だけ持ち帰ってください。
つまみをどちらに、どれだけ回せばいいのかを決める仕組みが、次の記事のテーマである損失関数と勾配降下法です(損失関数と最適化)。
丸暗記と汎化は違う
ここで最重要の概念が登場します。汎化(はんか、generalization)です。
過去問だけを丸暗記した受験生を想像してください。過去問なら満点。しかし数字が少し変わった初見の問題は解けません。機械学習でもまったく同じことが起きます。見せた例だけを完璧に再現し、初めて見るデータではまるで当たらないモデルは、実務では価値がゼロです。
だから機械学習が目指すのは、見せた例の再現ではなく、見せていないデータでの正解率です。この目的から、鉄則が1つ導かれます。
評価は、必ず学習に使っていないデータで行う。
訓練に使ったデータでの精度は、学生に「暗記した過去問」を解かせた点数と同じで、実力の証拠になりません。この落とし穴とその防ぎ方は過学習と評価設計で詳しく扱います。
3つの学習の地図
機械学習は、与えるデータの形で大きく3つに分かれます。
教師あり学習(supervised learning)は、入力と正解がペアで揃っている場合です。「この画像は猫」「この物件は3200万円」のように、人間(教師役)が付けた正解ラベルがあります。答えがカテゴリなら分類、答えが連続した数値なら回帰と呼びます。実務で最も多いのがこの形です。
教師なし学習(unsupervised learning)は、正解ラベルがないデータから構造だけを見つけます。顧客を似た者どうしのグループに自動で分けるクラスタリング、高次元のデータを2次元に押し込んで眺める次元削減などです。「正解が何か」を人間が決めていないので、結果が良いかどうかの判断も人間側に残ります。
なお、大規模言語モデルの事前学習は「文の続きの単語を当てる」課題を解いていますが、この正解は人間が付けたのではなく文章そのものから自動的に作られています。これを自己教師あり学習(self-supervised learning)と呼び、ラベル付けのコストなしに膨大なデータを使えることが、近年のモデル巨大化を支えました。
強化学習(reinforcement learning)は、正解の代わりに報酬が返ってくる設定です。囲碁で言えば、一手ごとの正解は誰も知らないが、最後に勝てば+1、負ければ-1が返る。試行錯誤を繰り返し、長期的な報酬の合計が大きくなる行動方針を学びます。ロボット制御やゲーム、そしてLLMを人間の好みに合わせるRLHFがこの系統です。
| 種類 | データ | 典型タスク |
|---|---|---|
| 教師あり | 入力+正解ラベル | 分類・回帰・翻訳 |
| 教師なし/自己教師あり | 入力のみ | クラスタリング・次元削減・LLMの事前学習 |
| 強化学習 | 行動に対する報酬 | ゲーム・ロボット制御・RLHF |
数を「向き」で比べる — 類似度という考え方
機械は文章も画像も、最終的には数値の並び(ベクトル)に変換して扱います。すると「似ている/似ていない」を計算で測れるようになります。その最も基本的な道具が内積です。
2本の矢印を思い浮かべてください。向きが揃っているほど内積は大きく、直角なら0、逆向きなら負になります。矢印の長さの影響を取り除いて「向きの一致度」だけを取り出したものが余弦(コサイン)類似度です。下の部品で2本のベクトルを回して、数値がどう動くか確かめてください。
「似ているものは近くに置く」——この単純な発想が、検索、推薦、埋め込み、そしてTransformerの注意機構まで、驚くほど広い範囲の土台になっています。
コードで見る、最小の機械学習
つまみを回さない、いちばん素朴な学習器を書いてみます。最近傍法——新しいデータが来たら、手持ちのデータの中で最も似ている1件を探し、その答えをそのまま返すだけの手法です。
import numpy as np
def cosine(a, b):
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
def predict(x, X_train, y_train):
sims = [cosine(x, xi) for xi in X_train] # 全ての訓練データとの似ている度
return y_train[int(np.argmax(sims))] # 一番似た1件の答えを返す
これでも立派に「データから答えを出す」プログラムです。ただし訓練データを丸ごと覚えているだけなので、データが増えるほど遅くなり、少しノイズが混ざると答えが揺れます。ここから「例を要約したつまみ(パラメータ)を持つモデル」へ進むのが、機械学習の歴史そのものです。
実務で効く3つのポイント
1. まず「ルールで書けないか」を疑う 条件10個で8割解けるなら、機械学習は不要かもしれません。学習させる側にはデータ収集・ラベル付け・評価・再学習という継続的なコストが乗ります。ルールベースは説明可能で、修正が即座に効くという強みもあります。
2. ラベルの付け方が、問題の定義そのもの 「迷惑メール」の基準が人によってブレていれば、モデルの上限もそこで決まります。データはコードより雄弁な仕様書です。精度が伸びないとき、モデルより先にラベルを疑う価値があります。
3. 精度の数字は、単体では意味を持たない 「正解率95%」が良いかどうかは、何もしないベースラインと比べて初めて分かります。95%が普通のメールなら、「全部『普通』と答えるだけのプログラム」も95%です。この罠は3本目の記事で詳しく解剖します。
まとめ
- 機械学習は「ルールを書く」代わりに「答え付きの例からルールを作らせる」やり方
- 学習の実体は、つまみ(パラメータ)を回して関数をデータに合わせ込む作業
- 目的は訓練データの再現ではなく汎化——見ていないデータで当てること
- 教師あり/教師なし・自己教師あり/強化学習は、与えるデータの形の違い
次回は、そのつまみを「どちらに、どれだけ」回すのかを決める仕組み——損失関数と勾配降下法を、式とコードと動く図で分解します。
コメント
コメントにはログインが必要です