<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ベイズ的汎化 :: 確率と確率的計算のチュートリアル（機械翻訳）</title><link>https://josephausterweil.github.io/probintro/ja/structure/generalization/index.html</link><description>ベイズ的汎化 少数の例から概念をどのように学ぶのでしょうか？ある隠れたルールに当てはまる3つの数を見たとき、あるいは金色のシールが貼られたいくつかのお弁当を見たとき、人はどういうわけか他のどのものがそのルールに当てはまるかを知っています。本章では、あなたがすでに知っているベイズの定理が、一つの転換を行うだけで人間の汎化モデルになることを示します：仮説は集合である、という転換です。
自分で試してみよう 付属のノートブックでは、数のゲームとサイズ原理をインタラクティブに構築できます： 📓 Colab で開く: 07_generalization.ipynb
唯一の新しいアイデアは、推論の対象となる未知量がもはや数値（平均 $\mu$）や二値的事実（タクシーは青いか？）ではなく、集合——ある性質を共有するものを定めるルール——だということです。それ以外のすべて（ベイズの定理、事後分布、予測分布）はすでに手元にある道具です。
本章は長いため、4つのパートに分かれています。順番に進んでください：
4つのパート セットアップとフレームワーク — 金色のシールの話、「どの事象か？」から「どの集合か？」へのキーとなる転換、目標となるシェパードの法則、そしてフレームワークの命名（仮説空間、事前分布、尤度、事後分布；メンバーシップ行列）。 数のゲームとサイズ原理 — 事後分布による加重投票としての汎化；弱いサンプリングと強いサンプリング；サイズ原理；そしてテネンバウムの数のゲーム（1つの例で段階的な汎化が生まれ、3つの例でルールに収束する）。 連続的概念とシェパードの法則 — 矩形ゲーム：無限に多くの区間仮説に対して同じフレームワークを適用すると、シェパードの汎化の指数法則がモデルから自然に導かれる。 ノーフリーランチとまとめ — 何も仮定しない学習者は何も学べない理由、すなわち事前分布が不可避であること；章のまとめ；練習問題；そして参考文献。 graph LR P1[1. セットアップとフレームワーク] --&gt; P2[2. 数のゲームとサイズ原理] P2 --&gt; P3[3. 連続的概念とシェパードの法則] P3 --&gt; P4[4. ノーフリーランチとまとめ] classDef part fill:#2c7fb8,stroke:#333,stroke-width:2px,color:#fff class P1,P2,P3,P4 part 一文で表す転換 本章における仮説とはルールであり、ルールとは集合です——そのルールが「その性質を持つ」と言うものの集合です。「仮説は集合である」を心に留めておけば、残りはすべてそこから導かれます。
パート1「セットアップとフレームワーク」から始める →</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Thu, 02 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://josephausterweil.github.io/probintro/ja/structure/generalization/index.xml" rel="self" type="application/rss+xml"/><item><title>セットアップとフレームワーク</title><link>https://josephausterweil.github.io/probintro/ja/structure/generalization/setup-and-framework/index.html</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://josephausterweil.github.io/probintro/ja/structure/generalization/setup-and-framework/index.html</guid><description>これまでに学んできたこと この章では、すでに知っていることからただ一つのことを変えます — そして何が変わらないかをあらかじめ述べておく価値があります。なぜなら、ほとんどすべては変わらないからです。
📦 これらはすべてすでに持っています この章のすべては、以前の章で使ったツールを組み合わせて構築されています：
ベイズの定理（事後分布 ∝ 尤度 × 事前分布）。 学習を含む全章でこれを使ってきました — 事前分布に尤度を掛けて再正規化することで信念を更新する方法です。 ← 第4章で復習する 予測分布 — 「これまで見てきたことを踏まえ、次の観測として何が期待できるか？」第4章で事後予測分布に出会いました（「次の弁当の重さはどのくらいか？」）。 ← 第4章で復習する 条件付け = データと整合するものへの制限。 何かを観察するとそれに矛盾するあらゆる可能性が排除され、生き残ったものの上で再正規化します。 ← GenJAXチュートリアル、第4章で復習する カテゴリ分類 — あるアイテムがいくつかのグループのいずれかに属する場合に P(カテゴリ | 観測) を計算すること。第4章のプレビューとガウスクラスタリングで、二つのガウス分布を使ってこれに出会いました。 ← 第5章で復習する 唯一の新しいアイデア： これらの章のいずれにおいても、推論の対象となる未知量は数値（平均μ）かはい/いいえの事実（この弁当はとんかつか？タクシーは青か？）でした。この章では、未知量が集合 — あるプロパティを共有するものを決めるルール — になります。「どの値か？」から「どの集合か？」へのこの一つの変化が、ベイズ汎化の全内容です。それについて推論するための機構は、すでに持っている機構そのものです。
金のシール Chibany は何ヶ月も弁当を受け取っており、最近ある奇妙なことに気づきました。一部の弁当には側面に小さな金のシールが貼られています。それ以外の弁当には貼られていません。
Chibany はそのシールが何を意味するか全くわかりません。弁当が作られた曜日を示しているのかもしれません。特定のシェフを示しているのかもしれません。価格帯かもしれませんし、ロイヤルティの報酬かもしれませんし、まったく別の何かかもしれません。Chibany にわかるのは、どの弁当にシールがあり、どの弁当にないか、それだけです。
確率論者である Chibany は、唯一できる方法で解明しようと決意します：ルールを推測し、どの推測が生き残るかを観察するのです。シールが従うかもしれないあらゆるもっともらしいルールを書き出します —
「月曜日だけ」 「とんかつ弁当だけ」 「400g以上の弁当だけ」 「すべての弁当」（シールは何も意味しないのかもしれない）
— そして待ちます。シール付きの弁当がさらに届くにつれ、一部のルールは適合し続け、他は除外されるか、ありそうもなく見えてきます。データを見た後もまだ残っているルールが、Chibany が信じるべきものです。
これがこの章の全体的なアイデアであり、それはすでに三つの動く部品を含んでいます：
金のシールは新しいプロパティ — 新しい弁当について予測したいものです。 各ルールは仮説です：そしてルールは実際には弁当の集合に他ならないことに注目してください — 「月曜日だけ」はすべての月曜日の弁当の集合、「すべての弁当」はそれら全部の集合です。 Chibany がいくつかのデータを見た後も残っているルールが、仮説に対する事後分布を形成します。 Chibany が実際に答えたい問いは予測です：金のシール付きの弁当が一つある — 次の弁当にもシールがあると期待すべきか？ まさにその答えを導き出していきます。</description></item><item><title>数字ゲームとサイズ原理</title><link>https://josephausterweil.github.io/probintro/ja/structure/generalization/number-game-size-principle/index.html</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://josephausterweil.github.io/probintro/ja/structure/generalization/number-game-size-principle/index.html</guid><description>汎化は事後分布で重み付けされた投票 いよいよ核心に入ります。新しいアイテム $y$ がその性質を持つかどうかを予測する方法を、一行で表すことができます。その確率は、$y$ を含む仮説に乗っている事後信念の合計です。
$$p(y \in C \mid X) = \sum_{h \in \mathcal{H}} \mathbf{1}[y \in h] \cdot p(h \mid X).$$平易な言葉で読んでみましょう。すべての仮説が一票を投じます。 それぞれの仮説の票は、私たちが今それをどれほど信じているか — 事後分布 $p(h \mid X)$ — で重み付けされており、仮説は $y$ を実際に含んでいる場合にのみ $y$ に「賛成」票を投じます（それが $\mathbf{1}[y \in h]$ です）。賛成票を合計すれば予測が得られます。これは §2 の二規則計算を、任意の数の規則に対して書き直したものです。その中のすべての記号は §4 で定義されました。
列挙による投票の計算 このセクションで唯一の本当に新しいコードのアイデアを紹介します — そしてそれは物事を複雑にするのではなく、シンプルにします。$\mathcal{H}$ は有限なリストであるため、何もサンプリングする必要はありません。すべての仮説を直接スコアリングして正規化できます。それだけです。（§4 で学んだ「行に対する vmap」は、まさに「すべての仮説を一度にスコアリングする」ためのツールです。）
このセクションでは §2 の弱いサンプリングの尤度を使い続けます。ある規則が観測データと一致するのは、それがすべての観測例を含む場合（尤度 1）であり、もし一つでも見逃せば不可能です（尤度 0）。それだけで投票を機能させるには十分です。§6 では、より鋭い尤度 — 強いサンプリング — を導入します。それは一致する規則の中でより小さな規則を優先します。
10 という数字にその性質があると教えられたとして、他のどの数字がその性質を持つか予測したいとします。まず規則に対する事後分布を求めます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import jax.numpy as jnp # (H と prior は §4 で定義された仮説行列と一様事前分布です。) # 数字 10 がその性質を持つことが観測されました。10 は列 9 にあります（数字 n → 列 n-1）。 observed = 9 # 数字 10 の列インデックス # 尤度：規則が観測された数字を含む場合は一致（1）、そうでなければ不可能（0）。 # H[:, observed] は列 `observed` を縦に読む -- すべての規則から、その数字の 0/1 の帰属を # 一度に取り出します（":" は「すべての行」を意味します；行は規則です。つまり、これは # データサンプルごとではなく、規則ごとに一つのエントリです -- GenJAX チュートリアルで # 列がどのように機能したかとは異なります）。 consistent = H[:, observed] # 規則に対する事後分布：事前分布 x 尤度、次に正規化。（ベイズ則、規則ごとにスコアリング。） post = prior * consistent post = post / post.sum() for label, p in zip(labels, post): print(f" P({label:16s} | saw 10) = {round(float(p), 3)}") 出力:</description></item><item><title>連続的概念とシェパードの法則</title><link>https://josephausterweil.github.io/probintro/ja/structure/generalization/continuous-and-shepards-law/index.html</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://josephausterweil.github.io/probintro/ja/structure/generalization/continuous-and-shepards-law/index.html</guid><description>入門3: 連続的概念と長方形ゲーム これまでの仮説空間はすべて有限リスト ── §4〜§6の7つの数値規則 ── でした。だからこそ列挙できたのです。すべての規則にスコアを付け、正規化するだけで完了です。しかし実際の概念の多くは連続スケール上に存在します。「健康的な血糖値」「快適な室温」「だいたいお昼ごろ」── これらはそれぞれある軸上の区間であり、候補となる区間は無限にあります。このフレームワークはそれでも機能するのでしょうか？
機能します。そしてほとんど何も変わりません。テネンバウムの長方形ゲームがこれを具体的に示しています。ある性質が未知の区間内（2次元では未知の長方形内）のアイテムに当てはまるとします。その性質を持つとわかっているいくつかの例を見て、どの位置にその性質があるかを判断しなければなりません。仮説空間 $\mathcal{H}$ は今や「すべての区間 $[\text{lo}, \text{hi}]$」となり、仮説の大きさ $|h|$ はその長さ $\text{hi} - \text{lo}$ です。強サンプリング尤度はそのままで、長さが集合のサイズの役割を果たします。長さ $L$ の区間は各例を $1/L$ の確率にするので、$n$ 個の例の確率は $(1/L)^n$ になります。サイズ原理はそのまま引き継がれます ── 短い区間は密なクラスターの例に長い区間よりはるかによく適合します。
上の図は2次元版（Tenenbaum, 1999）です。点が観測された例であり、それらをすべて囲むすべての長方形が候補仮説です。サイズ原理により、最小の囲む長方形が最も大きな事後確率の重みを得て（明るく表示されます）、汎化がデータの近傍に集中します。人のデータと比較する際に重要になる2つの量があります。$r$（点が広がる範囲）と $d$（長方形または人の判断がその範囲をどれだけ超えて延びるか）です。1次元の区間はこれを1つの軸で行ったものであり、以下で実際に計算するケースです。
仮説が無限にある場合はグリッドを使う すべての実数区間を文字通り列挙することはできませんが、その必要はありません。候補の端点の細かいグリッドを敷き、その間の区間を列挙します ── §5の「すべての仮説にスコアを付けて正規化する」動作と全く同じで、手書きのリストではなくグリッド上で行うだけです。グリッドを細かくすれば、答えは連続的なものに収束します。（これは第2章の「曲線の下の面積」と同じ精神です。細かい離散化によって連続量を近似します。）
区間学習器の構築 コードは §5/§6 の列挙であり、数値規則のリストから区間のグリッドに適応されています。密なクラスターの例 ── たとえば位置9、10、11 ── を観測し、汎化勾配と呼ばれるものを計算します。グリッド上のすべての位置 $y$ について、それを含む区間の事後確率加重投票を求めます。（これは §5 の数値ごとの投票の正確な連続アナログです ── 同じ $\sum_h \mathbf{1}[y\in h] \cdot p(h\mid X)$ を、クエリ位置 $y$ の軸全体に渡って計算します。）</description></item><item><title>ノーフリーランチと章のまとめ</title><link>https://josephausterweil.github.io/probintro/ja/structure/generalization/no-free-lunch-and-summary/index.html</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://josephausterweil.github.io/probintro/ja/structure/generalization/no-free-lunch-and-summary/index.html</guid><description>ノーフリーランチ：事前分布が避けられない理由 これまでの各節では、仮説空間 $\mathcal{H}$ を私たちが選択して使ってきました——七つの合理的な数のルール、「$k$ の倍数」という数のルール、連続ケースにおける区間などです。§4 では、$\mathcal{H}$ の選択そのものが事前分布であることも確認しました：除外されたものは確率ゼロになります。そこに不安を感じるのは自然なことです。$\mathcal{H}$ を選ぶことは「ずる」ではないでしょうか？真に偏りのない学習者ならあらゆる可能なルールを考慮し、データに判断させるべきではないでしょうか？この最終節では、その答えが強く否である理由を示します——そして事前分布は手法の欠点ではなく、学習を可能にする本質そのものであることを示します。
鏡像世界による議論 これは最も明快な形で示せます（Wolpert, 1996 による）。問題を骨格まで削ぎ落とします：あなたは二つのビット $0$、$1$ を観察し、三番目のビット $x_3$ を予測しなければなりません。仮定がなければ、世界はどちらの方向にも続き得ます——$0, 1, \mathbf{0}$ または $0, 1, \mathbf{1}$——そして事前的にどちらかを優遇する根拠はありません。
あなたの予測ルールが何を出力しようとも、その鏡像世界を思い浮かべてください：あなたが見たデータ（$0, 1$）は同じだが、続きが反対の世界です。あなたのルールが $x_3 = 0$ と予測するなら、それは世界 $0,1,\mathbf{0}$ では正解で、その鏡像 $0,1,\mathbf{1}$ では不正解です。この二つの世界は等しく可能なので、ペア全体でルールは2回中1回正解することになります。そしてすべての世界には鏡像があります——したがってあらゆる可能な世界で平均すると、どんなに賢いルールも、ちょうど $1/2$ のスコアを得ます。すべての世界の可能性を平均すると、学習アルゴリズムはどれも他を上回れません。これがノーフリーランチ定理です：事前の仮定がなければ、見てきたデータは見ていないものについて何も語りません。
学習の崩壊を観察する それは抽象的に聞こえるので、実際に起こしてみましょう。仮説空間全体を強引な列挙で扱える程度に小さく保つため、世界を1 から 6 の数だけに縮小します。章全体を通じて、名前付きルールからなる小さく合理的な $\mathcal{H}$ を使ってきました。代わりに「偏りなし」ですべての可能なルールを投入したらどうなるでしょうか——$\{1,2,3,4,5,6\}$ の空でない部分集合すべて $2^6 - 1 = 63$ 個に一様事前分布を与えます。それを構築して予測を再実行できます：
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import itertools import jax import jax.numpy as jnp # The FULL hypothesis space: every non-empty subset of the numbers 1..6, as 0/1 rows. # itertools.product([0,1], repeat=6) is Python's built-in "all combinations" generator: # with two choices (0 or 1) in each of 6 slots, it walks through all 2^6 = 64 patterns. # The list comprehension's `if sum(bits) &gt; 0` keeps only patterns with at least one 1, # dropping the all-zeros "empty rule" -- leaving 2^6 - 1 = 63 rules. rows = [list(bits) for bits in itertools.product([0, 1], repeat=6) if sum(bits) &gt; 0] H_full = jnp.array(rows, dtype=jnp.float32) prior_full = jnp.ones(H_full.shape[0]) / H_full.shape[0] # uniform over all 63 rules print("number of hypotheses:", H_full.shape[0]) def predictive(observed, H, prior, strong): """Posterior-weighted vote over an arbitrary hypothesis matrix H (same machinery as §5/§6).""" def log_like(rule): in_rule = rule[observed] size = rule.sum() per_strong = jnp.where(in_rule &gt; 0, -jnp.log(size), -jnp.inf) per_weak = jnp.where(in_rule &gt; 0, 0.0, -jnp.inf) per = per_strong if strong else per_weak return per.sum() log_post = jnp.log(prior) + jax.vmap(log_like)(H) log_post = log_post - jnp.max(log_post) post = jnp.exp(log_post) post = post / post.sum() # predict each number y, one column at a time (as in §5; number n is column n-1) for n in range(1, 7): p = jnp.sum(post * H[:, n - 1]) print(f" P({n}) = {round(float(p), 3)}") observed = jnp.array([1]) # we saw the number 2 (column index 1) print("WEAK sampling, full 63-rule space:") predictive(observed, H_full, prior_full, strong=False) 出力：</description></item></channel></rss>