世界を動かす技術を、日本語で。

重要な機械学習の方程式

概要

機械学習 の核心となる数式を厳選し、理論的な解説と Python実装例 をセットで紹介。 確率論・情報理論 から線形代数、最適化、先端ML概念まで幅広くカバー。 実践的な数式 の意味や用途を明確に説明し、実装で理解を深める構成。 初学者から中級者 まで、ML数式の理解を深めたい人向けのガイド。 @goyal__pramod氏のツイート から着想を得た、体系的まとめ。


機械学習を支える「最強」数式まとめ

  • 数学 は機械学習の「言語」
  • 確率論・線形代数・最適化 がMLアルゴリズムの基礎
  • 本記事 では重要数式の理論・実装・用途を簡潔に整理
  • NumPy, scikit-learn, TensorFlow, PyTorch などのPythonライブラリ例を掲載
  • 初心者・実務者 どちらにも役立つ体系的な数式リファレンス

確率論・情報理論

  • 不確実性の推論や分布の違いの測定 に不可欠な理論群

Bayesの定理

  • 数式: [P(A|B) = \frac{P(B|A) P(A)}{P(B)}]
  • 新しい証拠 Bを得たときの 仮説Aの確率 の更新式
  • 分類・推論 など多くのML手法の基礎
  • Naive Bayes分類器・ベイズ最適化 で活用
  • Python例:
    def bayes_theorem(p_d, p_t_given_d, p_t_given_not_d):
        p_not_d = 1 - p_d
        p_t = p_t_given_d * p_d + p_t_given_not_d * p_not_d
        return (p_t_given_d * p_d) / p_t
    

エントロピー

  • 数式: [H(X) = -\sum_{x \in X} P(x) \log P(x)]
  • 分布の不確実性・ランダム性 の定量化
  • 情報利得・決定木 などで基本指標
  • Python例:
    import numpy as np
    def entropy(p):
        return -np.sum(p * np.log(p, where=p > 0))
    

同時確率・条件付き確率

  • 数式:
    • 同時確率: [P(A, B) = P(A|B) P(B)]
    • 条件付き確率: [P(A|B) = \frac{P(A, B)}{P(B)}]
  • 2つの事象の関係性・依存性 の記述
  • ベイズモデル・ナイーブベイズ などで利用
  • Python例(GaussianNB):
    from sklearn.naive_bayes import GaussianNB
    import numpy as np
    X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]])
    y = np.array([0, 0, 1, 1])
    model = GaussianNB().fit(X, y)
    

Kullback-Leibler Divergence (KLダイバージェンス)

  • 数式: [D_{KL}(P | Q) = \sum_{x} P(x) \log \left( \frac{P(x)}{Q(x)} \right)]
  • 分布PとQの乖離度合い を測定
  • VAE・モデル評価 などで用いられる
  • Python例:
    import numpy as np
    P = np.array([0.7, 0.3])
    Q = np.array([0.5, 0.5])
    kl_div = np.sum(P * np.log(P / Q))
    

クロスエントロピー

  • 数式: [H(P, Q) = -\sum_{x} P(x) \log Q(x)]
  • 真の分布Pと予測分布Qの違い を測定
  • 分類問題の損失関数 で広く利用
  • Python例:
    import numpy as np
    y_true = np.array([1, 0, 1])
    y_pred = np.array([0.9, 0.1, 0.8])
    cross_entropy = -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
    

線形代数

  • データ変換・構造把握 のための必須理論

線形変換

  • 数式: [y = Ax + b]
  • 入力xを行列Aとバイアスbで変換
  • 線形回帰・ニューラルネット の基本演算
  • Python例:
    import numpy as np
    A = np.array([[2, 1], [1, 3]])
    x = np.array([1, 2])
    b = np.array([0, 1])
    y = A @ x + b
    

固有値・固有ベクトル

  • 数式: [Av = \lambda v]
  • 行列Aによる空間のスケーリング・回転方向 を示す
  • PCA(主成分分析) などで活用
  • Python例:
    import numpy as np
    A = np.array([[4, 2], [1, 3]])
    eigenvalues, eigenvectors = np.linalg.eig(A)
    

特異値分解(SVD)

  • 数式: [A = U \Sigma V^T]
  • 行列Aを直交行列と特異値に分解
  • 次元削減・レコメンドシステム などで利用
  • Python例:
    import numpy as np
    A = np.array([[1, 2], [3, 4], [5, 6]])
    U, S, Vt = np.linalg.svd(A)
    

最適化

  • モデルがデータから学習するための仕組み

勾配降下法(Gradient Descent)

  • 数式: [\theta_{t+1} = \theta_t - \eta \nabla_{\theta} L(\theta)]
  • 損失関数Lの勾配方向にパラメータθを更新
  • ニューラルネット・線形回帰 などの学習の根幹
  • Python例:
    import numpy as np
    def gradient_descent(X, y, lr=0.01, epochs=1000):
        m, n = X.shape
        theta = np.zeros(n)
        for _ in range(epochs):
            gradient = (1/m) * X.T @ (X @ theta - y)
            theta -= lr * gradient
        return theta
    

バックプロパゲーション

  • 数式: [\frac{\partial L}{\partial w_{ij}} = \frac{\partial L}{\partial a_j} \cdot \frac{\partial a_j}{\partial z_j} \cdot \frac{\partial z_j}{\partial w_{ij}}]
  • 損失Lの重みw_{ij}への勾配を連鎖律で計算
  • 深層学習の効率的な学習 を実現
  • Python例 (PyTorch):
    import torch
    import torch.nn as nn
    model = nn.Sequential(nn.Linear(2, 1), nn.Sigmoid())
    loss_fn = nn.MSELoss()
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    X = torch.tensor([[0., 0.], [1., 1.]], dtype=torch.float32)
    y = torch.tensor([[0.], [1.]], dtype=torch.float32)
    optimizer.zero_grad()
    output = model(X)
    loss = loss_fn(output, y)
    loss.backward()
    optimizer.step()
    

損失関数

  • モデル性能の評価・最適化の指針

平均二乗誤差(MSE)

  • 数式: [\text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2]
  • 予測値と正解値の二乗誤差の平均
  • 回帰問題の標準的指標
  • Python例:
    import numpy as np
    y_true = np.array([1, 2, 3])
    y_pred = np.array([1.1, 1.9, 3.2])
    mse = np.mean((y_true - y_pred)**2)
    

クロスエントロピー損失

  • ※上記「クロスエントロピー」参照

先端ML概念

  • 現代機械学習をリードする数式群

拡散過程(Diffusion Process)

  • 数式: [x_t = \sqrt{\alpha_t} x_0 + \sqrt{1 - \alpha_t} \epsilon]
  • データx_0にノイズを加える時間発展式
  • 生成AI(画像生成等) で注目
  • Python例:
    import torch
    x_0 = torch.tensor([1.0])
    alpha_t = 0.9
    noise = torch.randn_like(x_0)
    x_t = torch.sqrt(torch.tensor(alpha_t)) * x_0 + torch.sqrt(torch.tensor(1 - alpha_t)) * noise
    

畳み込み演算(Convolution)

  • 数式: [(f * g)(t) = \int f(\tau) g(t - \tau) d\tau]
  • 関数fとgを重ね合わせて特徴抽出
  • CNN(畳み込みニューラルネット) の基礎
  • Python例 (PyTorch):
    import torch
    import torch.nn as nn
    conv = nn.Conv2d(1, 1, kernel_size=3)
    image = torch.randn(1, 1, 28, 28)
    output = conv(image)
    

ソフトマックス関数(Softmax)

  • 数式: [\sigma(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}]
  • スコアz_iを確率値へ変換
  • 多クラス分類の出力層 で利用
  • Python例:
    import numpy as np
    z = np.array([1.0, 2.0, 3.0])
    softmax = np.exp(z) / np.sum(np.exp(z))
    

アテンション機構(Attention)

  • 数式: [\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{Q K^T}{\sqrt{d_k}} \right) V]
  • クエリQとキーKの類似度で値Vを重み付け集約
  • Transformer・NLPモデルの中核
  • Python例:
    import torch
    def attention(Q, K, V):
        d_k = Q.size(-1)
        scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
        attn = torch.softmax(scores, dim=-1)
        return torch.matmul(attn, V)
    

まとめ・さらなる学び

  • 本記事の数式 を理解・実装することで、ML理論の基礎体力向上
  • 公式ドキュメント・論文・専門書 でさらに深掘り推奨
  • MLの根本的な仕組み を数式から捉える姿勢が重要
  • 実装と理論の往復 で応用力を高める

参考文献・おすすめリソース

  • Deep Learning Book (Ian Goodfellow他)
  • Pattern Recognition and Machine Learning (Christopher Bishop)
  • 公式ドキュメント (NumPy, scikit-learn, TensorFlow, PyTorch)
  • arXiv論文・ML解説ブログ

Hackerたちの意見

エントロピーの実装についてだけど、return -np.sum(p * np.log(p, where=p > 0))だと、条件を満たさない場所で出力が未初期化(未定義)になるんだよね。あの配列を合計すると、絶対に間違った結果が出る。だから、例えばreturn -np.sum((p * np.log(p))[p > 0])の方がいいと思う。それに、クロスエントロピーのコードも式に合ってないし、投稿の下のコメントでも説明されてるけど、Ax+bは線形操作じゃなくてアフィン(+bがあるから)なんだ。全体的に見て、ちょっと不正確な投稿だと思う。悪くはないけど、参考にするには厳密さが足りないかな。

参考にするならちょっと注意が必要だと思う。別のブログでは、ライターがこう言ってるからね。「バックプロパゲーション、つまり『誤差の逆伝播』は、深層ニューラルネットワークのトレーニングの基礎です。これは、予測された出力と実際の出力の誤差を最小化するために、ニューラルネットワークの重みとバイアスを最適化する教師あり学習アルゴリズムです。」バックプロパゲーションは教師あり機械学習アルゴリズムだよね?

最近の人気なもの、例えばLLMでは固有値や特異値ってあんまり使われてるのかな?

LoRaは特異値分解を使って低ランクの行列を得てるよね。異なるオプティマイザーでは、固有分解や何らかの近似が使われてるのも見るよ(Shampooがそんな感じのことをしてたと思うけど、ちょっと前のことだから忘れちゃった)。

MSEは、やっぱり距離測定の中で一番好きだな。二次的な性質があって、非線形の問題空間でも役立つし、凸性が保証されてない場合でも使える。一般的なバイナリデータを扱うとき、ハミング距離の方が理論的には理想的だけど、MSEのこの特性のおかげでバイトレベルの値よりもMSEを選ぶことが多い。他のフィットネス測定は収束に時間がかかったり、ブートストラップの方法が信頼できなかったりするからね。MSEは、20層の隠れ層を通しても、最初は何もない状態からでも短時間で作業可能な勾配を出してくれるんだ。

このブログ投稿では、機械学習における最も重要な方程式を探求しています。基礎的な確率や線形代数から、拡散やアテンションのような高度な概念まで。理論的な説明、実践的な実装、視覚化を通じて、ML数学を理解し応用するための包括的なリソースが得られます。コアなML数学について質問する人にはここを指摘してあげてください。彼らは一箇所で必要な95%を学べます!LLMの雑な内容がフロントページにあるのを見ると悲しくなる。

「—」以外に、何がそれを示してるの?非ネイティブの視点から聞いてみたんだけど。

ちょっとした不満はあるけど、全体的には素晴らしいと思う!自分は物理学のバックグラウンドがあって、試験用の公式シートに載ってる方程式を全部理解できたとき、本当に物理を理解したって感じたんだ。包括的であることには大きな価値があって、学習者が自分で深く掘り下げる選択ができるし、経験のある人が自分の知識を確認するのにも役立つ。とはいえ、いくつかの異議を唱えたい:1. マルチレイヤーパセプトロンを省略するのは大きな見落としだね。バックプロパゲーションはあるけど、いわばフォワードプロパゲーションがない。2. カーネルマシンを省略するのも中程度の見落としだと思う。もう「ホット」じゃないかもしれないけど、分野にとっては非常に数学的に重要だよ。3. フォワード拡散の方程式は本当に退屈だ… 構造化データにノイズを徐々に加えていくことができるのはそれほど重要じゃない。重要なのは、ある意味でそれを(条件付きで)逆転できること。つまり、逆拡散の方程式を入れるべきだよ、もちろんそっちの方がずっと洗練されてるから。

現在、機械学習のためのデータ準備の基礎を磨いてるんだけど、この記事は短くて的確で、ほんとに素晴らしい。

情報理論を独立した方程式のシリーズとして提示するのは、学習プロセスにとってあまり良くないと思う。クロスエントロピーとKLダイバージェンスは、情報エントロピーから直接導かれるもので、InformationEntropy(P)は真の分布Pからイベントをエンコードするのに必要な基本的なビット数を表し、CrossEntropy(P, Q)は最適でない分布Qを使ってPをエンコードするのに必要な(平均的な)ビット数を表す。そして、KLダイバージェンス(相対エントロピーとも呼ばれる)は、これら二つの値の違い(Qを使ってPをエンコードするのにどれだけ余分なビットが必要か、つまり非効率を定量化する)を示す。相対エントロピーはこう表せるよ:relative_entropy(p, q) = cross_entropy(p, q) - entropy(p) 情報理論は、機械学習の実践者にとって最もアクセスしやすくて親しみやすい数学の一つで、どこにでも出てくる。私の経験では、公式をただ暗記するのではなく、基礎を掘り下げる価値があると思うよ。(ビットはここで基数2を前提にしてる)

これ、確かにAIのゴミみたいに見えるけど、素晴らしい小さな本を思い出させるな(もっとたくさんの方程式が載ってる):『線形回帰分析と関連行列理論に役立つ公式 - ただの公式だけど、私たちはそれが好き』ってやつ。あの本は表紙に書いてある通りの内容だけど、結構網羅的だから参考にはなるかも。ただ、正直に言うと、私はそのぶっ飛んだタイトルのせいで主に買ったんだよね。 0. https://link.springer.com/book/10.1007/978-3-642-32931-9