別名・略称:SSL、 自己教師学習、 プレテキストタスク
自己教師あり学習は データ自身からラベルを自動生成 し事前学習するアプローチ。 BERT、 GPT、 CLIP、 SimCLR の根幹をなします。
自己教師あり学習(Self-Supervised Learning, 略称 SSL)は、 ラベル無しの大量データから「データ自身が出す手がかり」を教師信号として、 役に立つ表現(embedding)を獲得する学習パラダイムである。 本セクションでは、 pretext task(口実タスク)、 contrastive learning(対照学習)、 NT-Xent loss、 SimCLR / MoCo / BYOL / DINO といった代表系列、 そして downstream task(下流タスク)で SSL 表現がどう活用されるかを、 SSDSE-B-2026 の都道府県データを使った具体例つきで掘り下げる。
🍰 まずはやさしく
自分で問題を作る学習方法です。
ラベルのない大量のデータを活用します。
スマホにある写真や文章をそのまま使います。
この手法の結論を短くまとめます。
自己教師あり学習(Self-Supervised Learning):ラベル無しデータから自分でラベルを作って学習する手法
🍰 まずはやさしく
AIの常識を変えた新しい仕組みです。
人の手でラベルを付ける手間を減らします。
ネット上の膨大な情報を学習に使い切ります。
なぜ今この技術が必要なのかを説明します。
2010 年代の深層学習は「大量のラベル付きデータが命」だった。 ImageNet のように人手で 100 万枚に「猫」「犬」「飛行機」とラベルを貼り、 教師あり学習でモデルを鍛えてきた。 しかし、 ラベル付け作業は高コストで、 医療画像・音声・専門ドメインではほぼ不可能である。 一方、 ラベル無しデータは Web に無尽蔵に存在する。 ここに目をつけたのが SSL である。
SSL は GPT / BERT / SimCLR / CLIP / DINOv2 / DINOv3 / MAE などの基盤モデル時代を支える中核技術となった。 「データ自身を切り貼り・マスク・変形して、 元に戻す or 比較するタスクを解かせる」ことで、 ラベルなしに汎用表現を獲得する。 これにより、 下流タスク(分類・検出・セグメンテーション・回帰)は 少数のラベルで fine-tuning するだけで高性能を達成できるようになった。
🍰 まずはやさしく
パズルや穴埋め問題のような学習です。
データの構造を自然に理解させます。
文章の一部を隠して当てる練習に似ています。
直感的にわかる例で仕組みを解説します。
| 観点 | 教師あり学習 | 自己教師あり学習 |
|---|---|---|
| ラベル | 人手で付与 | データから自動生成 |
| スケール | ラベル数で制限 | Web 全部・10B 画像級 |
| 代表モデル | ResNet(ImageNet) | BERT, GPT, CLIP, DINO |
| 転移性 | タスク固有 | 汎用表現として下流に転移 |
画像を 9 枚のジグソーピースに切って、 並べ替えて元の配置を当てる pretext task(Jigsaw Puzzle)。 これを解くにはモデルは「画像内の物体の構造」を理解する必要があり、 結果として「物体検出に使える表現」が副産物として得られる。
BERT は文の 15% の単語を [MASK] で隠し、 周辺の単語から復元させる。 これを解くには「文法」「意味」「常識」が必要なので、 結果として汎用言語理解能力が育つ。 MAE(Masked AutoEncoder)はこれを画像で行い、 75% のパッチをマスクして復元する。
同じ画像に違う augmentation(切り抜き・色変・ぼかし)をかけて作った 2 枚を「同じもの(positive pair)」とし、 別の画像の augmentation を「違うもの(negative pair)」として、 同じ同士は近づけ、 違うもの同士は遠ざける。 これが contrastive learning の核である。 SimCLR / MoCo はこの枠組み。
これは教材デモです(実モデルは動きません)。 自己教師あり学習の核心は「ラベルなしデータなのに、隠した一部を"正解"として自分で作り出せる」こと。 下の 2 つのミニ体験で、(a) 擬似タスク(pretext)で教師信号を自動生成する感覚、(b) 予測が当たると特徴表現が育つ直感、(c) 事前学習→下流タスクへの転移を体感します。
下の架空の短文の一部が [MASK] で隠れています。人手ラベルは一切ありません——
隠した単語こそが「自動生成された正解」。文脈から推測して当ててみましょう。
1 枚の絵を 3×3 に切ってシャッフルしました。正しい並び順(=隠した正解)も、元画像から自動で分かります。 タイルをドラッグ(タップ移動も可)して入れ替え、元の絵に戻しましょう。並びを覚える過程で「画像の構造」を学ぶ——それが表現学習の副産物です。
擬似タスクで育てた表現を、少量ラベルの下流タスク(例:文の感情分類)に転移します。事前学習が進むほど、少ないラベルでも精度が上がる——これが SSL の狙いです。
※ 精度の数値は事前学習量から計算する教材用の擬似値で、実データの測定値ではありません。実際の SSL では fine-tuning・転移学習を経て 基盤モデル(LLM・CLIP 等)を下流に適応させます。
🍰 まずはやさしく
学習のルールを数式で表したものです。
正解とのズレを計算して精度を高めます。
テストの点数を計算するように数式を使います。
具体的な計算方法について詳しく読みます。
SimCLR の中心となる損失関数は NT-Xent(Normalized Temperature-scaled Cross Entropy)とも InfoNCE とも呼ばれる。 バッチサイズ $N$ の中で、 1 枚の画像 $x_i$ から augmentation で作った 2 枚 $\tilde{x}_i, \tilde{x}_j$ を positive pair とし、 残り $2N-2$ 枚を negative とする:
$$\mathcal{L}_{i,j} = -\log \frac{\exp(\mathrm{sim}(z_i, z_j)/\tau)}{\sum_{k=1}^{2N} \mathbf{1}_{[k \ne i]} \exp(\mathrm{sim}(z_i, z_k)/\tau)}$$
ここで $\mathrm{sim}(u,v) = u^\top v / (\|u\|\|v\|)$ は cosine 類似度、 $\tau$ は temperature(典型値 0.1~0.5)、 $z_i = g(f(x_i))$ は projection head $g$ を通した embedding。
本質:「同じ画像から作った 2 view は他のどれよりも自分と似ているべき」を softmax cross entropy で書いただけ。 N が大きいほど negative が増え、 学習信号が強くなる(SimCLR は N=4096 を使う)。
$$\mathcal{L} = -\log \frac{\exp(\mathrm{sim}(z_i, z_j^+)/\tau)}{\sum_{k} \exp(\mathrm{sim}(z_i, z_k)/\tau)}$$
positive pair を softmax 上で確率最大化。 negative も全て分母に入る。
$$\mathcal{L} = -\mathbb{E}\left[\log \frac{f(x, c)}{\sum_{x' \in X} f(x', c)}\right]$$
NT-Xent と同形式。 mutual information の下界を最大化する解釈。
$$\mathcal{L} = 2 - 2 \cdot \frac{\langle q_\theta(z_\theta), z'_\xi \rangle}{\|q_\theta(z_\theta)\| \cdot \|z'_\xi\|}$$
predictor $q_\theta$ で online を予測。 target $\xi$ には stop-gradient。 negative 不要。
$$\mathcal{L} = -\sum_x P_t(x) \log P_s(x), \quad P_t = \mathrm{softmax}((g_t - c)/\tau_t), \quad P_s = \mathrm{softmax}(g_s/\tau_s)$$
teacher 出力に centering($-c$)と sharpening($\tau_t < \tau_s$)で崩壊回避。
$$\mathcal{L} = \frac{1}{|M|}\sum_{i \in M} (x_i - \hat{x}_i)^2$$
マスクされたパッチ $M$ の予測誤差のみを最小化。
$$\mathcal{L} = -\sum_{i \in M} \log P(x_i | x_{\setminus M})$$
マスクされた単語の予測確率を最大化。 文脈から復元するため言語理解が育つ。
全 SSL 損失は「2 view が一致すべき or マスクが復元されるべき」というシンプルな原則の変奏。 違いは「negative を使うか」「対称か非対称か」「pixel か embedding か」の 3 軸で整理できる。
| ドメイン | SSL 手法 | 下流タスク | 効果 |
|---|---|---|---|
| 医療画像 | SimCLR + ChexPert | 胸部 X 線疾患分類 | 10% ラベルで supervised 100% に匹敵 |
| 創薬 | ChemBERTa | 分子物性予測 | SMILES の masked LM で良表現 |
| 音声 | wav2vec 2.0 | 音声認識 | 少資源言語でも高精度 ASR を実現 |
| 推薦システム | contrastive item embedding | 商品類似検索 | cold start アイテムでも品質保持 |
| 衛星画像 | SeCo, MoCo-geo | 土地利用分類 | ラベル無しの長期観測データを活用 |
| 自動運転 | DINO + LiDAR | 点群セグメンテーション | 走行ログ大量化 → ラベル付けせず性能向上 |
| 行政統計 | SSDSE 系のミニ SSL | 類似自治体検索・政策クラスタリング | 本ページの実験 D 参照 |
| 用語 | 意味 |
|---|---|
| pretext task | SSL における「口実タスク」。 表現学習の手段として解かせる。 jigsaw、 rotation、 colorization 等。 |
| downstream task | SSL 事前学習の後、 実際に解きたい分類・検出・回帰タスク。 |
| positive pair | 同じデータ由来の 2 view。 embedding を近づける対象。 |
| negative pair | 異なるデータ由来。 embedding を遠ざける対象。 contrastive 系で必須。 |
| view | augmentation で生成されたデータの別表現。 同じデータから複数 view を作る。 |
| projection head | backbone の出力を contrastive loss 用空間に射影する小型 MLP。 推論時は捨てる。 |
| predictor | BYOL/SimSiam で online → target 予測に使う小型 MLP。 非対称性の鍵。 |
| EMA encoder | momentum 更新される encoder。 MoCo/BYOL/DINO で安定化に使う。 |
| memory bank | MoCo の queue。 過去 batch の embedding を保持し、 擬似的に大 batch を実現。 |
| collapse | 全 embedding が同じになる自明解。 non-contrastive 系での主要な失敗モード。 |
| linear probe | backbone を凍結し線形分類器のみ学習。 SSL 表現の評価指標。 |
| k-NN classifier | embedding 空間で最近傍検索による分類。 学習不要、 即座に使える。 |
| stop-gradient | 片側の勾配を切る操作。 BYOL/SimSiam で collapse 回避の中核。 |
| temperature τ | softmax の鋭さを制御するハイパラ。 contrastive loss の挙動を決める。 |
| augmentation | data 変換。 crop, flip, color, blur, mask, noise 等。 SSL の質を決める最重要要素。 |
日本の公的統計データ(SSDSE、 e-Stat、 RESAS 等)は大規模だがラベル付きの「目的変数」が限定的。 SSL は「ラベルなしの大量データから先に表現を学び、 限定的なラベル付きデータで応用」という形で日本のデータ環境にフィットする。
SSL を学ぶことで、 学生は「ラベル無しデータの価値」「事前学習と fine-tuning の連結」「embedding 空間という抽象操作」という、 現代 AI を理解する 3 つの鍵を一度に獲得できる。 SSDSE-B-2026 のような身近なデータで体験することが、 大規模基盤モデルへの橋渡しになる。
第 1 幕:ラベル飢饉時代(2012-2018)。 ImageNet が AI 革命を起こしたが、 100 万件のラベル付けには年単位の人手を要した。 医療・科学のラベル不足が深刻化。
第 2 幕:BERT の衝撃(2018-2019)。 言語の世界で「単語を隠して当てる」だけで GPT を凌駕する性能が出ることが判明。 「ラベル無しでも学習できる」というパラダイムが定着。
第 3 幕:画像 SSL の爆発(2020-2021)。 SimCLR / MoCo / BYOL が次々と発表され、 ImageNet で supervised に肉薄。 contrastive learning が標準化。
第 4 幕:基盤モデル時代(2021-現在)。 CLIP が image-text の壁を超え、 DINO 系が SSL の事実上標準に。 GPT-4、 DINOv3、 V-JEPA 2 が世界モデルへ進化。
第 5 幕(未来):エージェント時代。 SSL で得た表現が言語モデル・推論モデル・ロボット制御に統合され、 「世界を観察し学習する AI」が実現する。
SSDSE-B-2026 の 47 都道府県データはこの大ドラマの「ミニチュア」。 同じ contrastive 原理が、 画像にもテキストにも統計表にも適用できる普遍性が、 SSL の真の強さだ。
🎯 このコードでやること:SSDSE-B-2026 の SSL 風 embedding に k-means (k=4) を適用し、 都道府県を 4 クラスタに分類して各クラスタの代表県を出力。
📥 入力:X(47×6 正規化済み)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pandas as pd import numpy as np from sklearn.cluster import KMeans df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]); df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) cols = ['A1101', 'A1303', 'A4101', 'A4200', 'A9101', 'H1801'] X = df[cols].astype(float).values X = (X - X.mean(axis=0)) / X.std(axis=0) km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(X) df['cluster'] = km.labels_ for c in range(4): members = df[df['cluster'] == c]['Prefecture'].tolist() print(f'クラスタ {c} ({len(members)} 県): {members[:5]}{"..." if len(members)>5 else ""}') |
📤 実行結果(例):
💬 SSL 表現に基づく自然なクラスタが現れる:東京都(単独)、 大都市圏 4 県(埼玉・神奈川・愛知・大阪)、 大規模地方圏 5 県(北海道・千葉・静岡・兵庫・福岡)、 その他 37 県。 これが「ラベルなしクラスタリング」の真価。 行政的なグループ分け(道州制等)との対応も検証可能。
| あなたの状況 | 推奨アプローチ | 理由 |
|---|---|---|
| 画像分類タスクでラベル少 | DINOv2 + linear probe | 公開モデルで即高精度 |
| テキスト分類タスク | BERT/RoBERTa fine-tune | SSL 済み公開モデル豊富 |
| 画像とテキストのマッチング | CLIP zero-shot or fine-tune | multimodal SSL の本領 |
| 音声認識 | wav2vec 2.0 / Whisper | SSL 事前学習の恩恵大 |
| 医療画像 / 衛星画像 | SimCLR/MoCo を自前 pretraining | ドメイン特化が効く |
| 統計表データ | 本ページのミニ contrastive | 教育・概念実証用途 |
| ラベル豊富で十分 | supervised をまず試す | SSL が必ず勝つわけではない |
最もシンプルな contrastive 学習。 augmentation × encoder × projection head × NT-Xent loss の 4 段構成。 batch 4096 + ImageNet で linear probe 76.5%(ResNet-50)。 batch を大きくしないと性能が出ない弱点。
大 batch を memory queue で代替。 過去 batch の embedding を 65,536 件キャッシュし negative プールに。 momentum encoder(EMA 更新)で安定化。 中小 GPU でも訓練可能。
negative なしでも崩壊しない衝撃。 online network と target network(EMA)を用意し、 online → predictor → target を予測する非対称構造。 stop-gradient が崩壊回避の鍵。
ViT + 自己蒸留。 teacher の出力分布を student が softmax で模倣。 centering + sharpening で崩壊回避。 attention map が物体セグメントを自動発見する emergent property が話題に。
画像パッチの 75% を mask し、 軽量 decoder で復元。 ViT のみで動作。 encoder は mask 部分を見ないので計算効率良好。 ImageNet pretraining → fine-tune で 87.8%。
DINO を 142M~1B 画像で大規模化。 公開モデルは linear probe で multiple SOTA。 セグメンテーション・depth・semantic correspondence など多用途。 2025 年現在、 画像 SSL の事実上の標準。
| 手法 | 系列 | backbone | ImageNet linear | batch |
|---|---|---|---|---|
| SimCLR | contrastive | RN50 | 69.3% | 4096 |
| MoCo v2 | contrastive | RN50 | 71.1% | 256 |
| BYOL | non-contrastive | RN50 | 74.3% | 4096 |
| DINO | distillation | ViT-S/8 | 79.7% | 1024 |
| MAE | masked | ViT-H | fine-tune 87.8% | 4096 |
| DINOv2 | distillation | ViT-L | 86.3% | 3072 |
🎯 このコードでやること:mask 数 n_drop を 1~5 で振り、 contrastive 識別率(自分の augmented view が最近傍に来るか)の変化を観察する。
📥 入力:X(47×6 正規化済み)、 mask 数 n_drop ∈ {1, 2, 3, 4, 5}
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 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]); df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) cols = ['A1101', 'A1303', 'A4101', 'A4200', 'A9101', 'H1801'] X = df[cols].astype(float).values X = (X - X.mean(axis=0)) / X.std(axis=0) rng = np.random.default_rng(42) def augment(x, n_drop): x = x.copy() for i in range(x.shape[0]): drop_idx = rng.choice(x.shape[1], size=n_drop, replace=False) x[i, drop_idx] = 0.0 return x def cosine(a, b): a = a / (np.linalg.norm(a, axis=1, keepdims=True) + 1e-8) b = b / (np.linalg.norm(b, axis=1, keepdims=True) + 1e-8) return a @ b.T for n in range(1, 6): accs = [] for _ in range(20): v1 = augment(X, n); v2 = augment(X, n) sim = cosine(v1, v2) accs.append((sim.argmax(axis=1) == np.arange(47)).mean()) print(f'n_drop={n}: 識別率 {np.mean(accs):.3f} ± {np.std(accs):.3f}') |
📤 実行結果:
💬 augmentation が強い(mask 数大)ほど識別が困難に。 n_drop=5 では 6 次元中 5 つを消すため、 もはや「同じデータ」と見分けがつかず識別率は 5% 前後まで落ちる。 contrastive 学習では「適度に難しい augmentation」が表現学習に効く。
📝 より正確な分析:上のコード(2023 年 47 都道府県・6 次元のみ)を実データで実測すると、 識別率は最も緩い n_drop=1 でも 0.24 程度にとどまり、 マスクを増やすにつれ 0.05 付近まで単調に低下する。 わずか 6 次元・47 サンプルで、 しかも各変数を丸ごと 0 に落とす強い augmentation を掛けると、 2 つの view はほぼ別物になり「自分の相方が最近傍」に来る確率は高くない。 つまり この小さな統計表ミニ実験では SSL 的な自己識別は高精度にはならず、 「augmentation を強めるほど識別が難しくなる」という傾向(単調減少)だけが教育的に有効である。 高い識別率が出るのは ImageNet 級の大次元・大サンプル・学習済み encoder があってこそで、 識別率の絶対値は次元数・サンプル数・乱数シードに強く依存する点に注意。
🎯 このコードでやること:NT-Xent loss の温度 τ を変化させ、 loss 値と分布の鋭さがどう変わるか可視化用に数値出力。
📥 入力:view1, view2(実験 A で使ったもの)、 τ ∈ {0.05, 0.1, 0.5, 1.0, 5.0}
1 2 3 4 5 6 7 | v1 = augment(X, 2); v2 = augment(X, 2) for tau in [0.05, 0.1, 0.5, 1.0, 5.0]: sim = cosine(v1, v2) / tau exp_sim = np.exp(sim - sim.max(axis=1, keepdims=True)) # 数値安定化 loss = -np.log(np.diag(exp_sim) / exp_sim.sum(axis=1) + 1e-12) print(f'tau={tau:>4}: NT-Xent loss = {loss.mean():.4f}, ' f'top1 ratio = {(sim.argmax(axis=1) == np.arange(47)).mean():.3f}') |
📤 実行結果:
💬 top1 ratio は τ で変わらないが loss は変化。 τ が小さいほど勾配が大きくなり、 hard negative(紛らわしい県)の重みが上がる。 SimCLR では τ=0.5 が経験的に最良。
🎯 このコードでやること:47 都道府県の元特徴と augmented embedding を PCA で 2 次元に落とし、 主要 5 県の座標を出力。
📥 入力:X(47×6 正規化済み)
1 2 3 4 5 6 7 8 | from sklearn.decomposition import PCA pca = PCA(n_components=2) emb_2d = pca.fit_transform(X) for i, name in enumerate(df['Prefecture']): if name in ['北海道', '東京都', '神奈川県', '大阪府', '鳥取県']: print(f'{name}: PC1={emb_2d[i,0]:+.2f}, PC2={emb_2d[i,1]:+.2f}') print(f'寄与率: {pca.explained_variance_ratio_.round(3)}') |
📤 実行結果:
💬 第 1 主成分が「都市規模」を表し(東京がダントツで +9.32)、 第 2 主成分は残差的な地域差(北海道が +0.39 とやや上方)。 これら 6 指標は総人口と強く連動するため第 1 主成分だけで分散の約 96% を説明する。 SSL embedding はこの構造を保持しつつ、 augmentation に頑健になるよう学習される。
🎯 このコードでやること:「東京都に最も似ている都道府県 top5」を SSL 風 embedding(augment して平均)で検索。 これは画像検索や Spotify レコメンドと同じ枠組み。
📥 入力:X、 query = 東京都
1 2 3 4 5 6 7 8 | # 簡易 SSL embedding: augment 30 回の平均 emb = np.mean([augment(X, 2) for _ in range(30)], axis=0) emb = emb / (np.linalg.norm(emb, axis=1, keepdims=True) + 1e-8) tokyo_idx = df.index[df['Prefecture'] == '東京都'][0] sims = emb @ emb[tokyo_idx] top5 = np.argsort(-sims)[:6] # 自分含めて 6 for rank, i in enumerate(top5): print(f'rank {rank}: {df["Prefecture"].iloc[i]} (sim={sims[i]:.3f})') |
📤 実行結果:
💬 「東京っぽい県」として人口規模の大きい県が並ぶ。 SSL embedding の cosine 類似度検索は、 推薦・異常検知・データクラスタリングに直接応用できる。 これが基盤モデル時代の中核機能。
自己教師あり学習の中でも対照学習(contrastive learning)は「正解ラベル無しで似た画像どうしを引き寄せ、 違う画像は遠ざける」という素朴な発想を、 数式 1 行に落とし込んだ手法である。 SimCLR の損失関数 InfoNCE は次のように書ける:
ここで $z_i, z_j$ は「同じ画像に 2 種類のデータ拡張をかけた埋め込みベクトル(正例ペア)」、 $\mathrm{sim}$ はコサイン類似度、 $\tau$ は温度パラメータ(典型値 0.1〜0.5)、 $2N$ はバッチサイズ $N$ の 2 倍。
数式を言葉で読み解く: 分子は「正例ペアの類似度を exp で増幅したもの」、 分母は「バッチ内のすべての他サンプル(負例)との類似度の合計」。 つまり「正例ペアの類似度が、 負例たちより相対的に大きくなるほど損失が小さい」。 ラベルを使わずに「同じ起源かどうか」だけで学習信号を作る、 これが自己教師あり対照学習の核心である。
47 都道府県の特徴ベクトル(総人口・65歳以上人口・出生数など)を「画像」に見立て、 各都道府県に対して 2 種類の拡張(ガウシアンノイズ付加、 ランダムマスク)を施したペアを正例として、 sentence-transformers を流用した対照学習を実演する。
🎯 このコードでやること: SSDSE-B-2026 の 47 都道府県を sentence-transformers の埋め込み空間に投影し、 同じ都道府県名のテキスト表現どうしが近いことを確認する(contrastive な距離学習の片鱗)。
📥 入力データ (SSDSE-B-2026 抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd from sentence_transformers import SentenceTransformer from sklearn.metrics.pairwise import cosine_similarity df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023][['Prefecture', 'A1101', 'A1303']].reset_index(drop=True) # 各都道府県を 2 種類の自然文に拡張(正例ペア生成) view_a = [f"{r['Prefecture']}は総人口{r['A1101']}人の都道府県です。" for _, r in df.iterrows()] view_b = [f"{r['Prefecture']}の65歳以上人口は{r['A1303']}人です。" for _, r in df.iterrows()] model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') emb_a = model.encode(view_a) emb_b = model.encode(view_b) # 対角成分(同じ都道府県)と非対角成分(別の都道府県)の類似度を比較 S = cosine_similarity(emb_a, emb_b) diag = S.diagonal().mean() off = (S.sum() - S.trace()) / (S.size - len(S)) print(f'同一都道府県ペア(正例)の平均類似度: {diag:.3f}') print(f'別都道府県ペア(負例)の平均類似度: {off:.3f}') print(f'マージン: {diag - off:.3f}') |
📤 実行例:
💬 結果の読み方: 同じ都道府県の「総人口の表現」と「65歳以上人口の表現」が、 別都道府県との組み合わせよりも 0.27 ポイント類似度が高い。 これは「正例ペアを引き寄せ負例を遠ざける」対照学習が、 ラベル無しでも機能していることを示す。 SimCLR / MoCo / DINO はこの仕組みを画像の augmentation 版に拡張したものである。
SSDSE-B-2026 の都道府県データで マスク予測タスク を疑似的に体験します。 「総人口・65歳以上人口・出生数のうち 1 つをマスク → 残り 2 つから予測」を学習させると、 マスクされた値を残り 2 つから推定できるようになり、 これが SSL の原理です。
| 都道府県 | 人口 A1101(千人) | 65歳以上人口 A1303(千人) | 出生数 A4101 |
|---|---|---|---|
| 北海道 | 5092 | 1681 | 24430 |
| 東京都 | 14086 | 3205 | 86348 |
| 大阪府 | 8763 | 2424 | 55292 |
| 愛知県 | 7477 | 1923 | 48402 |
| 神奈川県 | 9229 | 2390 | 53991 |
「人口だけ隠す → 残り 2 つから予測」モデルが学習できれば、 ラベル無しでも 47 都道府県の構造を理解したことになります。 これが 下流タスクへの転移 の元になります。
画像でなく、 SSDSE-B-2026 の 47 都道府県 × 多次元統計指標を「データ点」と見立てて、 SSL の中核である「同じデータの 2 view を近づける」枠組みを実演する。 augmentation は「2 つの特徴をランダムにマスクする(noise injection)」とし、 contrastive loss で都道府県の embedding を学ぶ。
素材:人口(A1101)、 65 歳以上人口(A1303)、 出生数(A4101)、 死亡数(A4200)、 婚姻件数(A9101)、 着工新設持家数(H1801)の 6 指標。
📥 入力データ(実測、 抜粋):
この 47 × 6 行列を z-score 正規化し、 「都道府県ベクトル」と見なす。 augmentation = 6 次元のうち 2 次元をランダムに 0 にする(= ドロップアウト)。 同じ都道府県の 2 view を近づけ、 他県の view を遠ざける contrastive loss を計算する。
合成データで自己教師あり学習の精度向上を計算する。
| 戦略 | ラベル数 | 精度 |
|---|---|---|
| 教師あり (少ラベル) | 100 | 0.65 |
| SSL pre-train + 微調整 | 100 | 0.85 |
| 大量ラベルあり (理想) | 10,000 | 0.92 |
1 2 3 4 5 | acc = {'sup_small':0.65, 'ssl':0.85, 'sup_full':0.92} gain = acc['ssl'] - acc['sup_small'] ratio = acc['ssl'] / acc['sup_full'] print(f"SSL ゲイン: +{gain}") print(f"理想との比: {ratio:.3f}") |
💬 手計算 (Step 2) と Python 出力が完全一致。
SSDSE-B-2026(47 都道府県・2023 年)の実データを使った最小コード:
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 | # SSDSE-B-2026 で疑似 SSL:3 指標のうち 1 つをマスクして予測 import pandas as pd, numpy as np, torch import torch.nn as nn df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] X = df[['A1101', 'A1303', 'A4101']].astype(float).values # 総人口/65歳以上人口/出生数 X = (X - X.mean(0)) / X.std(0) # 学習:3 列のうち 1 列をランダムにマスクし、 残りから復元 X_t = torch.tensor(X, dtype=torch.float32) model = nn.Sequential(nn.Linear(3, 16), nn.ReLU(), nn.Linear(16, 3)) opt = torch.optim.Adam(model.parameters(), lr=0.01) for epoch in range(1000): mask = torch.zeros_like(X_t) idx = torch.randint(0, 3, (X_t.size(0),)) mask[torch.arange(X_t.size(0)), idx] = 1 X_masked = X_t * (1 - mask) pred = model(X_masked) loss = ((pred - X_t) ** 2 * mask).mean() opt.zero_grad(); loss.backward(); opt.step() print('最終 loss:', loss.item()) |
🎯 このコードでやること:SSDSE-B-2026 を読み込み、 6 指標を抽出して z-score 正規化し、 SSL の入力テンソルを作る。
📥 入力:data/raw/SSDSE-B-2026.csv(cp932、 47 都道府県)
1 2 3 4 5 6 7 8 9 10 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]); df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) cols = ['A1101', 'A1303', 'A4101', 'A4200', 'A9101', 'H1801'] X = df[cols].astype(float).values # shape (47, 6) X = (X - X.mean(axis=0)) / X.std(axis=0) # z-score print('shape:', X.shape) print('mean:', X.mean(axis=0).round(3)) print('std :', X.std(axis=0).round(3)) |
📤 実行結果:
💬 47 行 × 6 列の都道府県データが、 各列 mean=0 / std=1 に正規化された。 これが SSL の入力。
🎯 このコードでやること:6 次元のうち 2 つをランダムに 0 化し、 同じデータから 2 view を作る augmentation を実装。
📥 入力:上で作った X(47×6 の正規化済み行列)
1 2 3 4 5 6 7 8 9 10 11 12 | rng = np.random.default_rng(0) def augment(x, n_drop=2): x = x.copy() drop_idx = rng.choice(x.shape[1], size=n_drop, replace=False) x[:, drop_idx] = 0.0 return x view1 = augment(X) view2 = augment(X) print('view1[0]:', view1[0].round(2)) print('view2[0]:', view2[0].round(2)) |
📤 実行結果:
💬 view1 と view2 は「同じ北海道」由来だが、 マスクされた次元が異なる。 これらを positive pair として近づける。
🎯 このコードでやること:47 × 47 の cosine 類似度行列を作り、 NT-Xent loss を 1 ステップ計算。 同じ県の 2 view が positive、 他県が negative。
📥 入力:view1, view2(各 shape (47, 6))
1 2 3 4 5 6 7 8 9 10 11 12 13 | def cosine(a, b): a = a / (np.linalg.norm(a, axis=1, keepdims=True) + 1e-8) b = b / (np.linalg.norm(b, axis=1, keepdims=True) + 1e-8) return a @ b.T tau = 0.5 sim = cosine(view1, view2) / tau # (47, 47) labels = np.arange(47) # positive = 対角 exp_sim = np.exp(sim) loss = -np.log(np.diag(exp_sim) / exp_sim.sum(axis=1)) print('NT-Xent loss (mean):', round(loss.mean(), 4)) print('最も近い view2 が自分自身である県の割合:', (sim.argmax(axis=1) == labels).mean()) |
📤 実行結果:
💬 何の学習もせずに raw 特徴で contrastive 行列を取ると、 自分の augmented view を最近傍に当てられる県は 8.5% にとどまる(6 次元中 2 つを 0 にする強い augmentation のため)。 augmentation を強くしすぎると識別が壊れ、 弱すぎると学習信号が消える。 この素朴な設定では識別率は低く、 実際の SSL は大次元・大サンプル・学習済み encoder があって初めて高精度になる。
🎯 このコードでやること:SSL で得た 47 県の embedding を使って、 別タスク(人口規模分類)を線形分類で解く。 これが linear probe(表現の質を測る代表手法)。
📥 入力:X(47×6 正規化済み)、 人口を 3 段階に離散化したラベル
1 2 3 4 5 6 7 8 9 10 11 12 | from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score # 人口を 3 ビン(小・中・大)に分けたラベル pop = df['A1101'].astype(float).values y = pd.qcut(pop, 3, labels=[0, 1, 2]).astype(int) # 平均 view を embedding として使用(疑似 SSL) emb = (augment(X) + augment(X) + augment(X)) / 3 clf = LogisticRegression(max_iter=1000, random_state=0) scores = cross_val_score(clf, emb, y, cv=5) print('linear probe accuracy:', round(scores.mean(), 3), '±', round(scores.std(), 3)) |
📤 実行結果:
💬 SSL embedding を凍結したまま線形分類で 78.2% の精度(ただし標準偏差 ±0.16 と 47 サンプルでは振れが大きい)。 fully supervised なら 90% 近く出るが、 ラベル無し前処理だけで 8 割前後に届く。 本番では batch size 4096 + ImageNet で linear probe 73% 程度に達する(SimCLR 論文)。
対照学習と並ぶ自己教師あり学習のもう一本柱が マスク予測(masked prediction)。 BERT は入力トークンの 15% をランダムに [MASK] して当てさせる、 MAE は画像パッチの 75% をマスクして再構成する。 「穴埋めクイズ」を大量に解かせるだけで、 文脈や視覚意味を獲得できるという驚異的な仕掛けである。
🎯 このコードでやること: 日本語 BERT を使って、 SSDSE-B-2026 から作った自然文の一部を [MASK] に置き換え、 BERT に予測させる。 fine-tune なし(ゼロショット)で自己教師あり学習の威力を体感する。
📥 入力: 「東京都は人口 [MASK] 人の都道府県です。」のような MASK 付きテキスト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from transformers import pipeline import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023][['Prefecture', 'A1101']].reset_index(drop=True) fill = pipeline('fill-mask', model='cl-tohoku/bert-base-japanese-v3') for pref in ['東京都', '北海道', '沖縄県']: sentence = f'{pref}は日本の[MASK]です。' preds = fill(sentence, top_k=3) print(f'--- {pref} ---') for p in preds: print(f" {p['token_str']:8s} 確率={p['score']:.3f}") |
📤 実行例:
💬 結果の読み方: 「東京都→首都」「北海道→最北端」「沖縄県→南端」と、 日本の地理常識を MLM だけで習得していることが分かる。 ラベル付きデータ無しで Wikipedia など大規模コーパスを [MASK] 予測で学習しただけで、 ここまでの世界知識が獲得される。 これが SSL(self-supervised learning)が「基盤モデル」と呼ばれる所以である。
自己教師あり学習 (SSL) の本質は 「データの一部を隠し、 残りから当てる」 という疑似ラベルの作り方にある。 ここでは SSDSE-B-2026 の都道府県データの一部セルをマスクし、 残った特徴量から「マスクされた値」を予測することで SSL を実体験する。 これは BERT の Masked Language Modeling (MLM) と同じ枠組みを、 表形式データに移植したもので、 ビッグデータ で実運用される代表的な SSL の応用パターンである。
📥 入力データ: SSDSE-B-2026 から 47 都道府県 × 5 指標 (総人口・15歳未満人口・65歳以上人口・出生数・死亡数) を取り出し、 全体の 15% のセルをランダムに NaN に置換 (=マスク)。 残ったセルから NaN セルの値を予測する。
このコードでやること: scikit-learn の IterativeImputer を SSL の Masked Imputation として使い、 マスクしたセルの真値と予測値を比較する。 これは MLM の縮小再現実験であり、 ラベルなしでも構造的予測が学習できることを示す。
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 | import pandas as pd, numpy as np from sklearn.experimental import enable_iterative_imputer # noqa: F401 from sklearn.impute import IterativeImputer from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import r2_score df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023].copy() cols = ['A1101', 'A1301', 'A1303', 'A4101', 'A4200'] # 総人口/15歳未満/65歳以上/出生数/死亡数 X = df[cols].astype(float).reset_index(drop=True) # 15% のセルをランダムにマスク (=自己教師ラベルの作成) rng = np.random.default_rng(2026) mask = rng.random(X.shape) < 0.15 X_masked = X.mask(mask) # Masked Imputation = SSL の代表的事前学習タスク imp = IterativeImputer(estimator=RandomForestRegressor(n_estimators=80, random_state=0), max_iter=10, random_state=0) X_pred = pd.DataFrame(imp.fit_transform(X_masked), columns=cols) # マスク部分だけで予測精度を計算 y_true = X.values[mask] y_pred = X_pred.values[mask] print(f'マスク数 = {mask.sum()} セル / 全 {X.size} セル') print(f'R² (再構成) = {r2_score(y_true, y_pred):.3f}') print(f'MAE / 真値中央値 = {np.mean(np.abs(y_pred-y_true))/np.median(y_true):.3f}') |
📤 実行例:
💬 結果の読み方: R² = 0.992 は マスクされた値の分散の約 99% を残りの特徴量から復元できた ことを意味する。 ラベル (= 教師信号) は一切使っていない (マスクという自己ラベル化のみ) のに、 都道府県の構造を学習できる。 これが SSL の魅力で、 ラベル付与コストの高いタスク (医療画像・希少言語) で特に有効。 関連: 自己教師あり学習 全体像、 転移学習 でこのモデルを下流タスクに再利用する流れ、 エンベディング を SSL で獲得する典型例。
| SSL 系統 | 代表モデル | マスク戦略 | 表データ適合度 |
|---|---|---|---|
| Masked Reconstruction | BERT, MAE, TabPFN | ランダム 15-75% 隠す | ★★★★★ 上記実験そのもの |
| Contrastive Learning | SimCLR, MoCo | 同一サンプルの拡張版を引き寄せる | ★★★★☆ 拡張定義が難しい |
| Predictive | GPT, autoregressive | 次のトークン/値を当てる | ★★★☆☆ 列順序の意味づけ必要 |
| Generative | VAE, DDPM | 分布全体を再構成 | ★★★☆☆ 高次元で真価 |
| Self-Distillation | DINO, BYOL | teacher/student の自己一致 | ★★★★☆ ラベルなしクラスタリング向き |
SSL は 2014 年頃から急速に発展し、 2020 年代の基盤モデル革命の土台となった。 各年のマイルストーンを整理し、 SSDSE-B-2026 で再現可能な実験ポイントも併記する。
「教師なし学習」「半教師あり学習」「自己教師あり学習」 はしばしば混同される。 SSDSE-B-2026 を例に厳密な区別を整理する。
| 学習タイプ | ラベル | SSDSE-B-2026 での例 |
|---|---|---|
| 教師あり学習 | 人手で付与 | 「就業者率」を回帰目標として学習 |
| 教師なし学習 | なし | 47 都道府県を K-means で群分け |
| 半教師あり学習 | 一部のみ | 15 県のラベル + 32 県の特徴量で学習 |
| 自己教師あり学習 | データから自動生成 | セル 15% をマスク → 残部から復元 (上述) |
| 弱教師あり学習 | ノイズ多い間接ラベル | 県別人口階級ラベルから個別指標推定 |
| 強化学習 | 報酬信号 | 予算配分のシミュレーション最適化 |
SSL モデルを実装する際、 ハイパーパラメータ以外にも「設計上の選択肢」が複数ある。 SSDSE-B-2026 で表データ SSL を試す場合の判断軸を整理する。
| 設計選択 | 選択肢 | 表データ推奨 |
|---|---|---|
| マスク戦略 | ランダム / 構造的 / 列丸ごと | ランダム 15% |
| 予測タスク | 再構成 / 対比 / 自己蒸留 | 再構成 (実装簡単) |
| エンコーダ | Transformer / MLP / GBT | 小規模なら MLP |
| 損失関数 | MSE / Cross-entropy / NT-Xent | MSE (連続) + CE (カテゴリ) |
| バッチサイズ | 32-4096 | 256 (Contrastive なら大きく) |
| 事前学習エポック | 10-1000 | 100 を上限、 early stopping |
SSL で事前学習した表現が「下流タスクで実際に役立つか」を測定する標準プロトコルは 3 つある。 SSDSE-B-2026 の Masked Imputation で得られた特徴量を用いた評価手順を整理する。
→ Linear Probing は「学習時間 1 秒・実装 5 行」と最も低コスト、 Finetuning は最も高性能だが過学習リスクあり。 SSDSE-B-2026 のような小規模 (N=47) なら Linear Probing + Cluster Purity の 2 段評価が現実解。 Foundation Models (GPT-4 等) の評価でも同じ枠組みが使われる。
SSL モデルを実際に運用に乗せる際の「やる順序」を整理する。 順序を間違えると評価指標がリークしたり、 公平性問題が後から発覚したりする。 SSDSE-B-2026 の規模であれば局所基盤モデルを SSL で訓練することも現実的である。
これら 10 ステップは、 SSDSE-B-2026 規模 (N=47) の小規模実験から大規模基盤モデル (BERT、 GPT、 Llama) の事前学習まで、 規模を変えても本質は同じである。 SSL の最大の利点は 「ラベル付与コストの削減」 であり、 これは公共データ・ドメイン特化データ・希少言語コーパスなど、 ラベル付けが現実的に困難な領域で真価を発揮する。 SSDSE-B-2026 のような公的統計データは元々ラベル付きで提供されているため SSL の必要性は薄いが、 「もし都道府県の半数しかラベルが付かなかったら」というシナリオを想像することで SSL の応用可能性が見える。
2024 年以降、 SSL は Foundation Model 革命 の中核技術となり、 ChatGPT、 Claude、 Gemini、 Llama などの大規模言語モデルが全産業に普及した。 SSDSE-B-2026 を題材とした研究でも、 これらの基盤モデルを「特徴量抽出器」として再利用する手法が現実的になりつつある。 ただし基盤モデルは膨大な計算資源で訓練されており、 個人で再現することは事実上不可能なため、 「事前学習済みモデルを呼び出す API 利用」と「ローカルで小規模 SSL を訓練する」 の 2 路線を使い分けることが、 今後の標準スキルセットになると予想される。 SSL の理論面では、 InfoNCE 損失、 Mutual Information 下限、 ロバストな表現学習の理論的保証など、 機械学習理論の最先端トピックと密接に絡んでいる。 表面的な「マスクして再構成する」というアイデアの裏には、 30 年以上の表現学習理論の蓄積があり、 これを正しく理解することで SSL の運用判断はより合理的になる。
最後に、 SSL は「教師あり学習の代替」ではなく「補完」 として位置づけることが重要。 SSDSE-B-2026 のような小規模公的データでは、 標準的な教師あり学習で十分な性能が得られる場合が多く、 SSL を導入する意味は薄い。 一方、 数百万件以上のラベルなしデータと、 数千件程度のラベル付きデータが手元にある場合、 SSL → Linear Probing の枠組みが圧倒的に効率的になる。 「データ規模 / ラベル比率 / 計算資源」の 3 軸で SSL の必要性を判断することが、 実務での正しい意思決定につながる。 学術研究・産業応用・教育のいずれにおいても、 SSL は 2020 年代の機械学習において「使える道具」 として理解しておくことが必須となっている。 SSDSE-B-2026 を題材とした学習プロセスの中でも、 SSL のコンセプトを 1 度は手を動かして体験しておくことが、 将来の実務で大きな差となるだろう。 マスクと再構成というシンプルなアイデアから始まる SSL は、 表現学習の本質を最も直感的に体験できる枠組みであり、 機械学習を学ぶすべての人にとって必修のトピックとなっている。
本節の議論は 転移学習、 エンベディング、 Vision Transformer、 Transformer、 機械学習、 教師なし学習、 クラスタリング、 データ倫理、 エンベディング (Word2Vec 含む) と相互に参照する。
自己教師あり学習の周辺概念をテーマ別ツリーで整理:
機械学習パラダイム ├── 教師あり学習 (supervised) ├── 教師なし学習 (unsupervised) ├── 【自己教師あり学習 (SSL)】 ← ここ │ ├── 対照学習 (SimCLR / MoCo / BYOL) │ ├── マスク予測 (BERT / MAE / SimMIM) │ └── 文脈予測 (Word2Vec / GPT 系) └── 半教師あり学習 (semi-supervised)
この階層構造を頭に入れておくと、 学習や論文読みで「自分が今どこにいるか」を見失わずに済みます。
「自己教師あり学習」を確実にマスターするには、 次の順序で進むのが効率的です:
焦らず、 1 段ずつ確実に。 7 ステップを 1 周すれば、 単に「知っている」から「使える」レベルに到達できます。
機械学習パラダイム
├── 教師あり学習 ──── ラベル付きデータが必要、 ImageNet 等
├── 教師なし学習 ──── クラスタリング・PCA、 明示的タスクなし
└── 自己教師あり学習(SSL)── データ自身が教師
├── 生成系(generative)
│ ├── masked AutoEncoder(MAE)
│ ├── BERT(masked LM)
│ └── GPT(auto-regressive)
└── 識別系(discriminative)
├── pretext task(旧世代:Jigsaw, RotNet)
├── contrastive
│ ├── SimCLR(large batch)
│ ├── MoCo(memory bank)
│ └── CLIP(image-text)
└── non-contrastive
├── BYOL(predictor + EMA)
├── SimSiam(no EMA)
└── DINO 系(teacher-student distillation)
教師なし学習(PCA、 k-means 等)は「明示的なタスクなしで構造を発見」する。 SSL は「データから自動生成したラベルでタスクを定義し、 教師あり風に解く」。 結果として SSL は表現学習に強い。
Yes。 次トークン予測は典型的な SSL タスク(自己回帰型)。 BERT は masked LM(双方向型)。 両方 SSL の一形態。
No。 多くの基盤モデルは「SSL で事前学習 → ラベル付きで fine-tuning」というハイブリッド。 ラベルがあれば使う方が高速・高精度になる場面が大半。
47 行では本格 SSL は無理だが、 本ページのように「概念実証ミニ実装」は教育的に有効。 実務では数万行以上、 画像なら数万枚以上が目安。
画像のみ・テキストのみで完結するなら DINO/MAE/BERT、 画像とテキストの対応を扱うなら CLIP。 zero-shot 分類を狙うなら CLIP 系が圧倒的。
「自己教師あり学習」は ラベルなしデータから擬似タスクを生成して表現を学ぶ アプローチで、 教師なし学習と教師あり学習の中間に位置する。 上流の大量未ラベルデータと下流の少量ラベルタスクを繋ぐ pretrain-finetune パイプラインの中核を担う。
自己教師あり学習は「ラベル不要で良い表現を得る → 少量ラベルで下流タスクへ転移」の二段ロケットで、 BERT・SimCLR・MAE などのモデルがこの設計を共有している。
「自己教師あり学習」を選ぶかは、 ラベルの希少性と事前学習データの量で判断する。
SSDSE-B-2026 の n=47 では SSL は不適 (データが少なすぎる)。 画像 (n>10万) や自然言語 (web scale) で威力を発揮する手法。
本文で見た「一部を隠して残りから当てる」枠組みは、 統計学が昔から扱ってきた欠測値の補完(imputation)と同じ形をしている。 違いは、 SSL では欠測が偶然生じるのではなく、 学習信号を作るためにわざと欠測を発生させる点だけだ。 そして「隠して当てる」ゲームが成立するための必要条件は、 変数どうしに冗長性(相関構造)があること——完全に独立な変数は、 どれだけ隠しても他から復元できない。
SSDSE-B-2026(2023 年・47 都道府県)で実測すると、 この冗長性は圧倒的である。 総人口(A1101)と 65 歳以上人口(A1303)の相関係数は r = 0.991、 出生数(A4101)とは r = 0.995、 65 歳以上人口と死亡数(A4200)に至っては r = 0.999。 着工新設持家数(H1801)でさえ r = 0.908 ある。 実際、 A1303 を A1101 だけの単回帰で予測すると決定係数 R² = 0.982。 「65 歳以上人口を隠しても総人口からほぼ当てられる」——マスク予測タスクが学習可能なのは、 データがこの冗長性を持つからである。 BERT の穴埋めが解けるのも、 言語に文法・共起という強い冗長性があるからで、 原理は同じだ。
上の数字には罠がある。 6 指標の生値どうしの相関がすべて 0.9 前後以上ということは、 マスク予測は「県の規模(サイズ因子)」という 1 本の軸だけでほぼ解けてしまうということだ。 モデルは「大きい県は何でも多い」という近道(shortcut)を覚えれば損失を下げられ、 それ以上の構造を学ぶ動機を失う。 これは画像 SSL で有名な失敗——ジグソーがパッチ境界の色の連続性だけで解けてしまい、 物体の理解が育たない——の表データ版である。
近道が取りこぼすものを実測で確認しよう。 A1101 だけの単回帰(R² = 0.982)の残差を見ると、 東京都は 65 歳以上人口の実測 3,205 千人に対し規模だけの予測は約 3,583 千人(約 378 千人の過大予測)、 逆に北海道は実測 1,681 千人に対し予測約 1,372 千人(約 309 千人の過小予測)。 率に直すと高齢化率は東京都 22.8% から秋田県 39.1% まで大差があり(47 都道府県平均 31.6%)、 さらに人口あたり出生数と高齢化率の相関は r = −0.615(負)——生値どうしの相関 +0.98 とはまったく別の構造が「率の世界」には存在する。 規模ショートカットで解けるプレテキストタスクは、 この構造をほとんど学ばない。
※ 本節の数値(相関係数・R²・残差・高齢化率)はすべて SSDSE-B-2026 の 2023 年・47 都道府県データ(pd.read_csv(encoding='cp932', skiprows=[1]) で読込)からの実測値。 残差の予測値は千人未満を丸めた概数。