論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
自己教師あり学習
Self-Supervised Learning
深層学習
別称: SSL

🔖 キーワード索引

プレテキストタスク対比学習BERTMLMSimCLRMoCoBYOLCLIPDINO表現学習事前学習ラベルフリー

別名・略称: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 の都道府県データを使った具体例つきで掘り下げる。

pretext task contrastive learning NT-Xent loss positive pair negative pair data augmentation projection head SimCLR MoCo BYOL DINO linear probe embedding 空間

💡 30秒で分かる結論

🍰 まずはやさしく

自分で問題を作る学習方法です。

ラベルのない大量のデータを活用します。

スマホにある写真や文章をそのまま使います。

この手法の結論を短くまとめます。

自己教師あり学習(Self-Supervised Learning):ラベル無しデータから自分でラベルを作って学習する手法

📍 あなたが今見ているもの

🍰 まずはやさしく

AIの常識を変えた新しい仕組みです。

人の手でラベルを付ける手間を減らします。

ネット上の膨大な情報を学習に使い切ります。

なぜ今この技術が必要なのかを説明します。

大規模事前学習モデル(Foundation Model)の登場で AI の常識が変わりました。 鍵が 自己教師あり学習。 ラベル付けは高コストですが、 ラベル無しテキスト・画像は無尽蔵。 「文の一部を隠す」「画像の 2 view を作る」だけで学習信号を作れる発想が、 GPT-4・Gemini・LLaMA の基盤になっています。

📍 文脈ボックス(深掘り):なぜ今 SSL なのか

2010 年代の深層学習は「大量のラベル付きデータが命」だった。 ImageNet のように人手で 100 万枚に「猫」「犬」「飛行機」とラベルを貼り、 教師あり学習でモデルを鍛えてきた。 しかし、 ラベル付け作業は高コストで、 医療画像・音声・専門ドメインではほぼ不可能である。 一方、 ラベル無しデータは Web に無尽蔵に存在する。 ここに目をつけたのが SSL である。

SSL は GPT / BERT / SimCLR / CLIP / DINOv2 / DINOv3 / MAE などの基盤モデル時代を支える中核技術となった。 「データ自身を切り貼り・マスク・変形して、 元に戻す or 比較するタスクを解かせる」ことで、 ラベルなしに汎用表現を獲得する。 これにより、 下流タスク(分類・検出・セグメンテーション・回帰)は 少数のラベルで fine-tuning するだけで高性能を達成できるようになった。

🎨 直感で掴む

🍰 まずはやさしく

パズルや穴埋め問題のような学習です。

データの構造を自然に理解させます。

文章の一部を隠して当てる練習に似ています。

直感的にわかる例で仕組みを解説します。

教師ありとの違い

観点教師あり学習自己教師あり学習
ラベル人手で付与データから自動生成
スケールラベル数で制限Web 全部・10B 画像級
代表モデルResNet(ImageNet)BERT, GPT, CLIP, DINO
転移性タスク固有汎用表現として下流に転移

プレテキストタスクの例

  • マスク言語モデル(MLM):単語の 15% を [MASK] にして当てる(BERT)。
  • 因果言語モデル(CLM):次の単語を当てる(GPT)。
  • 対比学習:データ拡張で作った 2 view を「同じ」と認識させる(SimCLR)。
  • ジグソーパズル:画像をシャッフルして元順序を当てる。
  • 回転予測:0/90/180/270 度回転を当てる。

🎨 直感で掴む(深掘り):3 つのメタファ

メタファ 1:パズルゲーム

画像を 9 枚のジグソーピースに切って、 並べ替えて元の配置を当てる pretext task(Jigsaw Puzzle)。 これを解くにはモデルは「画像内の物体の構造」を理解する必要があり、 結果として「物体検出に使える表現」が副産物として得られる。

メタファ 2:穴埋め問題

BERT は文の 15% の単語を [MASK] で隠し、 周辺の単語から復元させる。 これを解くには「文法」「意味」「常識」が必要なので、 結果として汎用言語理解能力が育つ。 MAE(Masked AutoEncoder)はこれを画像で行い、 75% のパッチをマスクして復元する。

メタファ 3:双子の見分け

同じ画像に違う augmentation(切り抜き・色変・ぼかし)をかけて作った 2 枚を「同じもの(positive pair)」とし、 別の画像の augmentation を「違うもの(negative pair)」として、 同じ同士は近づけ、 違うもの同士は遠ざける。 これが contrastive learning の核である。 SimCLR / MoCo はこの枠組み。

🎮 擬似タスク体験ラボ:正解は自分で作れる

これは教材デモです(実モデルは動きません)。 自己教師あり学習の核心は「ラベルなしデータなのに、隠した一部を"正解"として自分で作り出せる」こと。 下の 2 つのミニ体験で、(a) 擬似タスク(pretext)で教師信号を自動生成する感覚、(b) 予測が当たると特徴表現が育つ直感、(c) 事前学習→下流タスクへの転移を体感します。

📈 特徴表現の質(擬似タスクを解くほど育つ)
獲得した擬似ラベル数:0 / 質 0%

A. マスク穴埋め (BERT 風・架空の短文)

下の架空の短文の一部が [MASK] で隠れています。人手ラベルは一切ありません—— 隠した単語こそが「自動生成された正解」。文脈から推測して当ててみましょう。

B. ジグソー復元 (画像パッチのシャッフルを戻す)

1 枚の絵を 3×3 に切ってシャッフルしました。正しい並び順(=隠した正解)も、元画像から自動で分かります。 タイルをドラッグ(タップ移動も可)して入れ替え、元の絵に戻しましょう。並びを覚える過程で「画像の構造」を学ぶ——それが表現学習の副産物です。

シャッフルされたパッチ(ドラッグで入替)
お手本(隠した正解)

C. 事前学習 → 下流タスクへ転移

擬似タスクで育てた表現を、少量ラベルの下流タスク(例:文の感情分類)に転移します。事前学習が進むほど、少ないラベルでも精度が上がる——これが SSL の狙いです。

スクラッチ学習
(事前学習なし)
SSL 事前学習を転移

※ 精度の数値は事前学習量から計算する教材用の擬似値で、実データの測定値ではありません。実際の SSL では fine-tuning転移学習を経て 基盤モデルLLMCLIP 等)を下流に適応させます。

📐 定義 / 数式

🍰 まずはやさしく

学習のルールを数式で表したものです。

正解とのズレを計算して精度を高めます。

テストの点数を計算するように数式を使います。

具体的な計算方法について詳しく読みます。

【MLM の損失】
$$\mathcal{L}_{\text{MLM}} = -\sum_{i \in \mathcal{M}} \log P(x_i \mid x_{\setminus \mathcal{M}}; \theta)$$
【InfoNCE(対比学習)】
$$\mathcal{L}_{\text{NCE}} = -\log \frac{\exp(\text{sim}(z_i, z_j)/\tau)}{\sum_{k=1}^{2N} \mathbb{1}_{k \ne i} \exp(\text{sim}(z_i, z_k)/\tau)}$$
$z_i, z_j$ は同じデータの 2 view, $\tau$ は温度パラメータ。

📐 数式(深掘り):NT-Xent loss と InfoNCE

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 を使う)。

📐 SSL の損失関数ファミリー:数式まとめ

1. NT-Xent(SimCLR)

$$\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 も全て分母に入る。

2. InfoNCE(CPC、 CLIP)

$$\mathcal{L} = -\mathbb{E}\left[\log \frac{f(x, c)}{\sum_{x' \in X} f(x', c)}\right]$$

NT-Xent と同形式。 mutual information の下界を最大化する解釈。

3. BYOL 損失

$$\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 不要。

4. DINO 損失(cross entropy with sharpening)

$$\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$)で崩壊回避。

5. MAE 損失(pixel-wise MSE)

$$\mathcal{L} = \frac{1}{|M|}\sum_{i \in M} (x_i - \hat{x}_i)^2$$

マスクされたパッチ $M$ の予測誤差のみを最小化。

6. BERT 損失(masked LM)

$$\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 参照

📑 重要論文一覧(読書ガイド)

📘 SSL 用語ミニ辞典

用語意味
pretext taskSSL における「口実タスク」。 表現学習の手段として解かせる。 jigsaw、 rotation、 colorization 等。
downstream taskSSL 事前学習の後、 実際に解きたい分類・検出・回帰タスク。
positive pair同じデータ由来の 2 view。 embedding を近づける対象。
negative pair異なるデータ由来。 embedding を遠ざける対象。 contrastive 系で必須。
viewaugmentation で生成されたデータの別表現。 同じデータから複数 view を作る。
projection headbackbone の出力を contrastive loss 用空間に射影する小型 MLP。 推論時は捨てる。
predictorBYOL/SimSiam で online → target 予測に使う小型 MLP。 非対称性の鍵。
EMA encodermomentum 更新される encoder。 MoCo/BYOL/DINO で安定化に使う。
memory bankMoCo の queue。 過去 batch の embedding を保持し、 擬似的に大 batch を実現。
collapse全 embedding が同じになる自明解。 non-contrastive 系での主要な失敗モード。
linear probebackbone を凍結し線形分類器のみ学習。 SSL 表現の評価指標。
k-NN classifierembedding 空間で最近傍検索による分類。 学習不要、 即座に使える。
stop-gradient片側の勾配を切る操作。 BYOL/SimSiam で collapse 回避の中核。
temperature τsoftmax の鋭さを制御するハイパラ。 contrastive loss の挙動を決める。
augmentationdata 変換。 crop, flip, color, blur, mask, noise 等。 SSL の質を決める最重要要素。

🗾 日本のデータサイエンスにおける SSL の意義

日本の公的統計データ(SSDSE、 e-Stat、 RESAS 等)は大規模だがラベル付きの「目的変数」が限定的。 SSL は「ラベルなしの大量データから先に表現を学び、 限定的なラベル付きデータで応用」という形で日本のデータ環境にフィットする。

活用シナリオ

教育的価値

SSL を学ぶことで、 学生は「ラベル無しデータの価値」「事前学習と fine-tuning の連結」「embedding 空間という抽象操作」という、 現代 AI を理解する 3 つの鍵を一度に獲得できる。 SSDSE-B-2026 のような身近なデータで体験することが、 大規模基盤モデルへの橋渡しになる。

🔮 今後の展望(2026 以降)

  1. multi-modal SSL の主流化:CLIP 系を超えて、 動画+音声+テキスト+3D の統合 SSL モデルが標準に(V-JEPA 系の発展)。
  2. 世界モデル統合:SSL で得た表現を強化学習・ロボティクスに繋ぎ、 環境を物理的に理解する agent が登場。
  3. 少サンプル SSL:従来「数百万規模」が必要だった SSL を、 数千~数万規模の限定データでも有効化する研究(contrastive で hard negative マイニング等)。
  4. ドメイン特化基盤モデル:医療(MedCLIP、 BiomedGPT)、 法律、 製造の各領域で「自前 SSL pretraining」が現実的に。
  5. SSL × 物理シミュレーション:物理法則を制約に組み込んだ SSL(physics-informed SSL)。 流体・材料解析へ。
  6. SSL の解釈性:embedding 空間の意味的構造を可視化・編集する研究。 sparse autoencoder + SSL の組合せが注目。
  7. edge SSL:スマホ上で動く軽量 SSL(MobileDINO 等)。 プライバシー保護学習に直結。

🎓 ワンページまとめ(試験対策)

✅ SSL プロジェクト実行チェックリスト

フェーズ 1:問題設定

フェーズ 2:手法選定

フェーズ 3:実装と訓練

フェーズ 4:評価

フェーズ 5:本番

📖 ストーリーで理解:SSL を「映画」に喩えると

第 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 の真の強さだ。

🧪 追加実験:47 都道府県クラスタリング

🎯 このコードでやること: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 ""}')

📤 実行結果(例):

クラスタ 0 (37 県): ['青森県', '岩手県', '宮城県', '秋田県', '山形県']... クラスタ 1 (4 県): ['埼玉県', '神奈川県', '愛知県', '大阪府'] クラスタ 2 (5 県): ['北海道', '千葉県', '静岡県', '兵庫県', '福岡県'] クラスタ 3 (1 県): ['東京都']

💬 SSL 表現に基づく自然なクラスタが現れる:東京都(単独)、 大都市圏 4 県(埼玉・神奈川・愛知・大阪)、 大規模地方圏 5 県(北海道・千葉・静岡・兵庫・福岡)、 その他 37 県。 これが「ラベルなしクラスタリング」の真価。 行政的なグループ分け(道州制等)との対応も検証可能。

📊 まとめ表:SSL の選択指針

あなたの状況推奨アプローチ理由
画像分類タスクでラベル少DINOv2 + linear probe公開モデルで即高精度
テキスト分類タスクBERT/RoBERTa fine-tuneSSL 済み公開モデル豊富
画像とテキストのマッチングCLIP zero-shot or fine-tunemultimodal SSL の本領
音声認識wav2vec 2.0 / WhisperSSL 事前学習の恩恵大
医療画像 / 衛星画像SimCLR/MoCo を自前 pretrainingドメイン特化が効く
統計表データ本ページのミニ contrastive教育・概念実証用途
ラベル豊富で十分supervised をまず試すSSL が必ず勝つわけではない

🔬 記号・式を言葉で読み解く

$\mathcal{M}$ — マスク位置集合
系列中で予測対象としてマスクする位置の集合。 BERT では 15%。
$x_{\setminus \mathcal{M}}$ — 文脈
マスクされていない残りのトークン。 これを条件にマスク部分を予測。
$\text{sim}(z_i, z_j)$ — 類似度
通常はコサイン類似度。 ペア表現が近いほど大。
$\tau$ — 温度
softmax のシャープさを制御。 小さいほどハードネガティブを強調。
2 view
同じ画像/文に異なるデータ拡張(クロップ・色変換・マスク)をかけたもの。
事前学習 → ファインチューニング
大規模データで SSL → 小さな下流データで微調整。 少量ラベルで高精度。

🔬 代表 SSL 手法の詳細比較

SimCLR(Chen et al., 2020)

最もシンプルな contrastive 学習。 augmentation × encoder × projection head × NT-Xent loss の 4 段構成。 batch 4096 + ImageNet で linear probe 76.5%(ResNet-50)。 batch を大きくしないと性能が出ない弱点。

MoCo v1/v2/v3(He et al., 2020-)

大 batch を memory queue で代替。 過去 batch の embedding を 65,536 件キャッシュし negative プールに。 momentum encoder(EMA 更新)で安定化。 中小 GPU でも訓練可能。

BYOL(Grill et al., 2020)

negative なしでも崩壊しない衝撃。 online network と target network(EMA)を用意し、 online → predictor → target を予測する非対称構造。 stop-gradient が崩壊回避の鍵。

DINO(Caron et al., 2021)

ViT + 自己蒸留。 teacher の出力分布を student が softmax で模倣。 centering + sharpening で崩壊回避。 attention map が物体セグメントを自動発見する emergent property が話題に。

MAE(He et al., 2022)

画像パッチの 75% を mask し、 軽量 decoder で復元。 ViT のみで動作。 encoder は mask 部分を見ないので計算効率良好。 ImageNet pretraining → fine-tune で 87.8%。

DINOv2 / DINOv3(Meta, 2023-2025)

DINO を 142M~1B 画像で大規模化。 公開モデルは linear probe で multiple SOTA。 セグメンテーション・depth・semantic correspondence など多用途。 2025 年現在、 画像 SSL の事実上の標準。

手法系列backboneImageNet linearbatch
SimCLRcontrastiveRN5069.3%4096
MoCo v2contrastiveRN5071.1%256
BYOLnon-contrastiveRN5074.3%4096
DINOdistillationViT-S/879.7%1024
MAEmaskedViT-Hfine-tune 87.8%4096
DINOv2distillationViT-L86.3%3072

🛠 実務 Tips:SSL を仕事で使うとき

  1. 事前学習済みモデルを使え:自前で SSL pretraining は GPU が膨大に必要。 DINOv2 / CLIP / BERT を huggingface から落とせば 3 行で使える。
  2. linear probe で表現の質を測る:自分のデータに対する SSL embedding の有用性は、 まず線形分類で確認。 高ければそのまま、 低ければ fine-tune。
  3. augmentation は domain 依存:医療画像なら回転や反転は不適切な場合あり。 衛星画像なら良い。 augmentation の妥当性をドメイン知識で吟味。
  4. batch size を可能な限り大きく:contrastive 系は batch が小さいと弱い。 gradient accumulation や MoCo の queue でも代替可。
  5. 事後評価は複数指標で:linear probe、 k-NN、 fine-tune、 zero-shot を組合せ。 1 指標だけだと過大評価のリスク。
  6. SSL でも data leakage に注意:augmentation の中にラベル情報が漏れていないか確認(例:顔画像で年齢に応じた色補正をかけると年齢推定タスクが「漏れる」)。

🧪 発展実験:SSDSE-B-2026 で SSL ablation

実験 A:augmentation 強度を変える

🎯 このコードでやること: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}')

📤 実行結果:

n_drop=1: 識別率 0.237 ± 0.040 n_drop=2: 識別率 0.145 ± 0.047 n_drop=3: 識別率 0.114 ± 0.041 n_drop=4: 識別率 0.086 ± 0.036 n_drop=5: 識別率 0.046 ± 0.022

💬 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 があってこそで、 識別率の絶対値は次元数・サンプル数・乱数シードに強く依存する点に注意。

実験 B:temperature τ を変える

🎯 このコードでやること: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}')

📤 実行結果:

tau=0.05: NT-Xent loss = 6.2163, top1 ratio = 0.106 tau= 0.1: NT-Xent loss = 4.0809, top1 ratio = 0.106 tau= 0.5: NT-Xent loss = 3.3440, top1 ratio = 0.106 tau= 1.0: NT-Xent loss = 3.4930, top1 ratio = 0.106 tau= 5.0: NT-Xent loss = 3.7572, top1 ratio = 0.106

💬 top1 ratio は τ で変わらないが loss は変化。 τ が小さいほど勾配が大きくなり、 hard negative(紛らわしい県)の重みが上がる。 SimCLR では τ=0.5 が経験的に最良。

実験 C:embedding の可視化(PCA で 2D 投影)

🎯 このコードでやること: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)}')

📤 実行結果:

北海道: PC1=+2.35, PC2=+0.39 東京都: PC1=+9.32, PC2=-1.48 神奈川県: PC1=+5.45, PC2=-0.19 大阪府: PC1=+5.34, PC2=-0.62 鳥取県: PC1=-1.98, PC2=-0.31 寄与率: [0.964 0.028]

💬 第 1 主成分が「都市規模」を表し(東京がダントツで +9.32)、 第 2 主成分は残差的な地域差(北海道が +0.39 とやや上方)。 これら 6 指標は総人口と強く連動するため第 1 主成分だけで分散の約 96% を説明する。 SSL embedding はこの構造を保持しつつ、 augmentation に頑健になるよう学習される。

実験 D:SSL embedding を使った都道府県類似検索

🎯 このコードでやること:「東京都に最も似ている都道府県 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})')

📤 実行結果:

rank 0: 東京都 (sim=1.000) rank 1: 神奈川県 (sim=0.991) rank 2: 大阪府 (sim=0.975) rank 3: 福岡県 (sim=0.970) rank 4: 兵庫県 (sim=0.954) rank 5: 北海道 (sim=0.909)

💬 「東京っぽい県」として人口規模の大きい県が並ぶ。 SSL embedding の cosine 類似度検索は、 推薦・異常検知・データクラスタリングに直接応用できる。 これが基盤モデル時代の中核機能。

🔬 数式を言葉で読み解く: SimCLR の InfoNCE 損失

自己教師あり学習の中でも対照学習(contrastive learning)は「正解ラベル無しで似た画像どうしを引き寄せ、 違う画像は遠ざける」という素朴な発想を、 数式 1 行に落とし込んだ手法である。 SimCLR の損失関数 InfoNCE は次のように書ける:

$$\mathcal{L}_{i,j} = -\log \frac{\exp(\mathrm{sim}(z_i, z_j) / \tau)}{\sum_{k=1}^{2N} \mathbf{1}_{[k \neq i]} \exp(\mathrm{sim}(z_i, z_k) / \tau)}$$

ここで $z_i, z_j$ は「同じ画像に 2 種類のデータ拡張をかけた埋め込みベクトル(正例ペア)」、 $\mathrm{sim}$ はコサイン類似度、 $\tau$ は温度パラメータ(典型値 0.1〜0.5)、 $2N$ はバッチサイズ $N$ の 2 倍。

数式を言葉で読み解く: 分子は「正例ペアの類似度を exp で増幅したもの」、 分母は「バッチ内のすべての他サンプル(負例)との類似度の合計」。 つまり「正例ペアの類似度が、 負例たちより相対的に大きくなるほど損失が小さい」。 ラベルを使わずに「同じ起源かどうか」だけで学習信号を作る、 これが自己教師あり対照学習の核心である。

🧮 SSDSE-B-2026 を擬似的な「画像」として対照学習

47 都道府県の特徴ベクトル(総人口・65歳以上人口・出生数など)を「画像」に見立て、 各都道府県に対して 2 種類の拡張(ガウシアンノイズ付加、 ランダムマスク)を施したペアを正例として、 sentence-transformers を流用した対照学習を実演する。

🎯 このコードでやること: SSDSE-B-2026 の 47 都道府県を sentence-transformers の埋め込み空間に投影し、 同じ都道府県名のテキスト表現どうしが近いことを確認する(contrastive な距離学習の片鱗)。

📥 入力データ (SSDSE-B-2026 抜粋):

SSDSE-B-2026 Prefecture A1101(総人口) A1303(65歳以上人口) 2023 北海道 5092000 1681000 2023 東京都 14086000 3205000 2023 大阪府 8763000 2424000 ...(47 都道府県)
 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}')

📤 実行例:

同一都道府県ペア(正例)の平均類似度: 0.812 別都道府県ペア(負例)の平均類似度: 0.541 マージン: 0.271

💬 結果の読み方: 同じ都道府県の「総人口の表現」と「65歳以上人口の表現」が、 別都道府県との組み合わせよりも 0.27 ポイント類似度が高い。 これは「正例ペアを引き寄せ負例を遠ざける」対照学習が、 ラベル無しでも機能していることを示す。 SimCLR / MoCo / DINO はこの仕組みを画像の augmentation 版に拡張したものである。

⚠️ 対照学習の落とし穴

🧮 実値で計算してみる(SSDSE-B-2026・47 都道府県)

SSDSE-B-2026 の都道府県データで マスク予測タスク を疑似的に体験します。 「総人口・65歳以上人口・出生数のうち 1 つをマスク → 残り 2 つから予測」を学習させると、 マスクされた値を残り 2 つから推定できるようになり、 これが SSL の原理です。

都道府県人口 A1101(千人)65歳以上人口 A1303(千人)出生数 A4101
北海道5092168124430
東京都14086320586348
大阪府8763242455292
愛知県7477192348402
神奈川県9229239053991

「人口だけ隠す → 残り 2 つから予測」モデルが学習できれば、 ラベル無しでも 47 都道府県の構造を理解したことになります。 これが 下流タスクへの転移 の元になります。

🧮 実値で確認(深掘り):SSDSE-B-2026 で自己教師あり学習をシミュレート

画像でなく、 SSDSE-B-2026 の 47 都道府県 × 多次元統計指標を「データ点」と見立てて、 SSL の中核である「同じデータの 2 view を近づける」枠組みを実演する。 augmentation は「2 つの特徴をランダムにマスクする(noise injection)」とし、 contrastive loss で都道府県の embedding を学ぶ。

素材:人口(A1101)、 65 歳以上人口(A1303)、 出生数(A4101)、 死亡数(A4200)、 婚姻件数(A9101)、 着工新設持家数(H1801)の 6 指標。

📥 入力データ(実測、 抜粋):

Prefecture 人口A1101 65歳以上A1303 出生A4101 死亡A4200 着工H1801 北海道 5,092,000 1,681,000 24,430 75,120 8,168 東京都 14,086,000 3,205,000 86,348 137,241 13,289 神奈川県 9,229,000 2,390,000 53,991 98,744 11,120 大阪府 8,763,000 2,424,000 55,292 104,964 9,425 愛知県 7,477,000 1,923,000 48,402 80,557 15,361 鳥取県 537,000 179,000 3,263 8,290 1,242 (47 都道府県全部、 1 つの行 = 1 データ点)

この 47 × 6 行列を z-score 正規化し、 「都道府県ベクトル」と見なす。 augmentation = 6 次元のうち 2 次元をランダムに 0 にする(= ドロップアウト)。 同じ都道府県の 2 view を近づけ、 他県の view を遠ざける contrastive loss を計算する。

🧮 数式に値を入れて手で計算する: ラベルなしデータの活用

合成データで自己教師あり学習の精度向上を計算する。

Step 1: 戦略別精度

戦略ラベル数精度
教師あり (少ラベル)1000.65
SSL pre-train + 微調整1000.85
大量ラベルあり (理想)10,0000.92

Step 2: SSL の効果

SSL は 100 ラベルで 0.85 達成 教師あり (100 ラベル) は 0.65 → SSL +0.20 理想 (10000 ラベル) の 92% を 1% のラベルで達成

🐍 Python で再現

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}")

📤 実行結果

SSL ゲイン: +0.20 理想との比: 0.924

💬 手計算 (Step 2) と Python 出力が完全一致。

🐍 Python 実装

SSDSE-B-2026(47 都道府県・2023 年)の実データを使った最小コード:

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) 北海道 5,092,000 1,681,000 24,430 東京都 14,086,000 3,205,000 86,348 沖縄県 1,468,000 350,000 12,549 …(全 47 行)
 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())

🐍 Python 実装(深掘り):SSDSE-B-2026 で contrastive learning ミニ実装

コード 1:データ読み込みと前処理

🎯 このコードでやること: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))

📤 実行結果:

shape: (47, 6) mean: [-0. -0. -0. -0. -0. -0.] std : [1. 1. 1. 1. 1. 1.]

💬 47 行 × 6 列の都道府県データが、 各列 mean=0 / std=1 に正規化された。 これが SSL の入力。

コード 2:augmentation(ランダムマスク)

🎯 このコードでやること: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[0]: [0.88 1.33 0.53 0. 0. 1.03] view2[0]: [0.88 0. 0.53 1.45 0.56 0. ]

💬 view1 と view2 は「同じ北海道」由来だが、 マスクされた次元が異なる。 これらを positive pair として近づける。

コード 3:NT-Xent loss の計算

🎯 このコードでやること: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())

📤 実行結果:

NT-Xent loss (mean): 3.4355 最も近い view2 が自分自身である県の割合: 0.0851063829787234

💬 何の学習もせずに raw 特徴で contrastive 行列を取ると、 自分の augmented view を最近傍に当てられる県は 8.5% にとどまる(6 次元中 2 つを 0 にする強い augmentation のため)。 augmentation を強くしすぎると識別が壊れ、 弱すぎると学習信号が消える。 この素朴な設定では識別率は低く、 実際の SSL は大次元・大サンプル・学習済み encoder があって初めて高精度になる。

コード 4:linear probe で表現を評価

🎯 このコードでやること: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))

📤 実行結果:

linear probe accuracy: 0.782 ± 0.157

💬 SSL embedding を凍結したまま線形分類で 78.2% の精度(ただし標準偏差 ±0.16 と 47 サンプルでは振れが大きい)。 fully supervised なら 90% 近く出るが、 ラベル無し前処理だけで 8 割前後に届く。 本番では batch size 4096 + ImageNet で linear probe 73% 程度に達する(SimCLR 論文)。

🐍 BERT の MLM と MAE の Masked Image Modeling

対照学習と並ぶ自己教師あり学習のもう一本柱が マスク予測(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}")

📤 実行例:

--- 東京都 --- 首都 確率=0.412 中心 確率=0.082 都市 確率=0.061 --- 北海道 --- 最北端 確率=0.189 島 確率=0.094 地方 確率=0.073 --- 沖縄県 --- 南端 確率=0.176 島 確率=0.121 最南端 確率=0.087

💬 結果の読み方: 「東京都→首都」「北海道→最北端」「沖縄県→南端」と、 日本の地理常識を MLM だけで習得していることが分かる。 ラベル付きデータ無しで Wikipedia など大規模コーパスを [MASK] 予測で学習しただけで、 ここまでの世界知識が獲得される。 これが SSL(self-supervised learning)が「基盤モデル」と呼ばれる所以である。

🌐 自己教師あり学習の系譜

🧪 追加実例: SSDSE-B-2026 で自己教師あり学習 (Masked Imputation) を体感する

自己教師あり学習 (SSL) の本質は 「データの一部を隠し、 残りから当てる」 という疑似ラベルの作り方にある。 ここでは SSDSE-B-2026 の都道府県データの一部セルをマスクし、 残った特徴量から「マスクされた値」を予測することで SSL を実体験する。 これは BERT の Masked Language Modeling (MLM) と同じ枠組みを、 表形式データに移植したもので、 ビッグデータ で実運用される代表的な SSL の応用パターンである。

📥 入力データ: SSDSE-B-2026 から 47 都道府県 × 5 指標 (総人口・15歳未満人口・65歳以上人口・出生数・死亡数) を取り出し、 全体の 15% のセルをランダムに NaN に置換 (=マスク)。 残ったセルから NaN セルの値を予測する。

SSDSE-B-2026 Code 都道府県 総人口 15歳未満 65歳以上 出生数 死亡数 2023 R01000 北海道 5092000 514000 1681000 24430 75120 2023 R13000 東京都 14086000 1513000 3205000 86348 137241 2023 R27000 大阪府 8763000 984000 2424000 55292 104964 ... (15% のセルを 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}')

📤 実行例:

マスク数 = 25 セル / 全 235 セル R² (再構成) = 0.992 MAE / 真値中央値 = 0.236

💬 結果の読み方: R² = 0.992 は マスクされた値の分散の約 99% を残りの特徴量から復元できた ことを意味する。 ラベル (= 教師信号) は一切使っていない (マスクという自己ラベル化のみ) のに、 都道府県の構造を学習できる。 これが SSL の魅力で、 ラベル付与コストの高いタスク (医療画像・希少言語) で特に有効。 関連: 自己教師あり学習 全体像、 転移学習 でこのモデルを下流タスクに再利用する流れ、 エンベディング を SSL で獲得する典型例。

📊 SSL の代表 5 系統と SSDSE-B-2026 への適合度

SSL 系統代表モデルマスク戦略表データ適合度
Masked ReconstructionBERT, MAE, TabPFNランダム 15-75% 隠す★★★★★ 上記実験そのもの
Contrastive LearningSimCLR, MoCo同一サンプルの拡張版を引き寄せる★★★★☆ 拡張定義が難しい
PredictiveGPT, autoregressive次のトークン/値を当てる★★★☆☆ 列順序の意味づけ必要
GenerativeVAE, DDPM分布全体を再構成★★★☆☆ 高次元で真価
Self-DistillationDINO, BYOLteacher/student の自己一致★★★★☆ ラベルなしクラスタリング向き

🖼 SSL の概念図

SSL で獲得された潜在空間 — クラスター構造が自発的に出現する
図: SSL で学習した埋め込み空間。 ラベルなしでも「都市群 / 地方群」のクラスターが自発的に出現する。 これは DINO/SimCLR で観察される現象と同型。 関連: クラスタリング
マスクと再構成 — SSL のラベル生成プロセス
図: ランダムマスク → 残部から予測 → 真値と比較。 SSL における疑似ラベルの作り方は、 BERT (MLM)・MAE (画像)・SimMIM (画像)・Tabular SSL すべてで同じ枠組み。
SSL 後の特徴量間相関 — 構造的関係を獲得できているかの診断
図: SSL 後の埋め込みベクトル間の相関ヒートマップ。 元の特徴量間の構造 (総人口 ↔ 65歳以上人口の強相関) が保たれていれば、 下流タスク (回帰・分類) に再利用しても性能劣化が小さい。 関連: 転移学習

⚠️ SSL を表データに使うときの落とし穴 5 件

📜 SSL の歴史と発展 (タイムライン整理)

SSL は 2014 年頃から急速に発展し、 2020 年代の基盤モデル革命の土台となった。 各年のマイルストーンを整理し、 SSDSE-B-2026 で再現可能な実験ポイントも併記する。

🔬 SSL と他学習パラダイムの厳密な区別

「教師なし学習」「半教師あり学習」「自己教師あり学習」 はしばしば混同される。 SSDSE-B-2026 を例に厳密な区別を整理する。

学習タイプラベルSSDSE-B-2026 での例
教師あり学習人手で付与「就業者率」を回帰目標として学習
教師なし学習なし47 都道府県を K-means で群分け
半教師あり学習一部のみ15 県のラベル + 32 県の特徴量で学習
自己教師あり学習データから自動生成セル 15% をマスク → 残部から復元 (上述)
弱教師あり学習ノイズ多い間接ラベル県別人口階級ラベルから個別指標推定
強化学習報酬信号予算配分のシミュレーション最適化

📜 ケーススタディ: SSL が大成功 (3 事例) / 失敗 (2 事例)

❓ FAQ

📐 SSL の設計選択 (実装で迷うポイント 6 つ)

SSL モデルを実装する際、 ハイパーパラメータ以外にも「設計上の選択肢」が複数ある。 SSDSE-B-2026 で表データ SSL を試す場合の判断軸を整理する。

設計選択選択肢表データ推奨
マスク戦略ランダム / 構造的 / 列丸ごとランダム 15%
予測タスク再構成 / 対比 / 自己蒸留再構成 (実装簡単)
エンコーダTransformer / MLP / GBT小規模なら MLP
損失関数MSE / Cross-entropy / NT-XentMSE (連続) + CE (カテゴリ)
バッチサイズ32-4096256 (Contrastive なら大きく)
事前学習エポック10-1000100 を上限、 early stopping

🧪 SSL の評価プロトコル: Linear Probing と Few-shot

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 の正しい運用ステップ (ベストプラクティス 10 件)

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 TransformerTransformer機械学習教師なし学習クラスタリングデータ倫理エンベディング (Word2Vec 含む) と相互に参照する。

⚠️ よくある落とし穴

⚠️ プレテキストと下流のミスマッチ
回転予測で学んでも、 下流が物体検出だと有効性が落ちる場合あり。 タスク選びが鍵。
⚠️ 対比学習の負例不足
SimCLR は大バッチサイズが必要。 MoCo はキュー、 BYOL はターゲットネットで回避。
⚠️ 計算コスト
大規模 SSL は GPU 数百台規模。 個人では公開済み Foundation Model 流用が現実的。
⚠️ 評価の落とし穴
SSL の真価は下流転移で測る。 プレテキスト損失だけでは判断できない。
⚠️ ラベル漏れ
Web スクレイピング由来データは下流テストデータと重複する可能性。 厳密な分離が必須。

⚠️ 落とし穴(深掘り、 7 件)

  1. augmentation が弱すぎる:2 view が見分けつかないほど似ていると、 contrastive loss が立たず学習が進まない。 SimCLR は random crop + color jitter + Gaussian blur をかなり強くかける。
  2. augmentation が強すぎる:例えば画像を 90% マスクすると、 元情報が消えて positive pair が成立しない。 augment intensity は最重要ハイパラ。
  3. negative pair の質:同一クラスの異なる画像(猫 A と猫 B)を negative にすると、 「猫を遠ざける」誤学習が起こる。 これは false negative 問題と呼ばれ、 supervised contrastive learning(SupCon)で緩和される。
  4. collapse(崩壊):全データの embedding が同じベクトルに収束する自明解。 BYOL / SimSiam では stop-gradient と predictor で防ぐ。 SimCLR では negative 数を増やすことで防ぐ。
  5. batch size 依存:SimCLR は batch 4096 で最強だが、 一般 GPU では足りない。 MoCo はメモリバンクで擬似的に大 batch を実現。
  6. pretext task の選定ミス:色塗り(Colorization)で学んだ表現は分類に弱い等、 downstream task との相性が悪いと無意味。 contrastive 系は汎用性が高い。
  7. 計算コスト:SimCLR の事前学習は数百 GPU 日。 個人や中小研究室では事前学習済みモデル(DINOv2 等)を使うのが現実解。

🗺 概念マップ

自己教師あり学習の周辺概念をテーマ別ツリーで整理:

機械学習パラダイム
  ├── 教師あり学習 (supervised)
  ├── 教師なし学習 (unsupervised)
  ├── 【自己教師あり学習 (SSL)】 ← ここ
  │     ├── 対照学習 (SimCLR / MoCo / BYOL)
  │     ├── マスク予測 (BERT / MAE / SimMIM)
  │     └── 文脈予測 (Word2Vec / GPT 系)
  └── 半教師あり学習 (semi-supervised)

この階層構造を頭に入れておくと、 学習や論文読みで「自分が今どこにいるか」を見失わずに済みます。

🎓 学習パス(推奨順)

「自己教師あり学習」を確実にマスターするには、 次の順序で進むのが効率的です:

  1. 前提知識の確認 — 上記「🔗 前提となる用語」セクションのリンクを順に読む(30 分〜)
  2. 直感を作る — 本ページの「🎨 直感で掴む」と「🧮 実値で計算」を SSDSE-B で手を動かしてみる
  3. 数式を読み下す — 「📐 定義」と「🔬 数式を言葉で読み解く」で 1 つずつ意味を確認
  4. Python で動かす — 「🐍 Python 実装」のコードをコピペし、 別の指標で実験
  5. 落とし穴を知る — 「⚠️ 落とし穴」を読み、 自分のコードに該当箇所がないか確認
  6. 関連手法を学ぶ — 「🌐 関連手法・派生」で次に学ぶべき派生概念へ
  7. 論文で活用 — 上位「📚 関連グループ教材」のページで実論文の文脈を確認

焦らず、 1 段ずつ確実に。 7 ステップを 1 周すれば、 単に「知っている」から「使える」レベルに到達できます。

🗺 概念マップ:SSL を取り巻く関連概念

機械学習パラダイム
├── 教師あり学習 ──── ラベル付きデータが必要、 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)

❓ FAQ(よくある質問)

Q1. 教師なし学習と SSL は何が違うか?

教師なし学習(PCA、 k-means 等)は「明示的なタスクなしで構造を発見」する。 SSL は「データから自動生成したラベルでタスクを定義し、 教師あり風に解く」。 結果として SSL は表現学習に強い。

Q2. GPT は SSL か?

Yes。 次トークン予測は典型的な SSL タスク(自己回帰型)。 BERT は masked LM(双方向型)。 両方 SSL の一形態。

Q3. SSL は教師あり学習を完全に置き換える?

No。 多くの基盤モデルは「SSL で事前学習 → ラベル付きで fine-tuning」というハイブリッド。 ラベルがあれば使う方が高速・高精度になる場面が大半。

Q4. SSDSE-B-2026 のような小規模データで SSL は意味あるか?

47 行では本格 SSL は無理だが、 本ページのように「概念実証ミニ実装」は教育的に有効。 実務では数万行以上、 画像なら数万枚以上が目安。

Q5. multimodal SSL(CLIP 等)と single-modal SSL の使い分けは?

画像のみ・テキストのみで完結するなら DINO/MAE/BERT、 画像とテキストの対応を扱うなら CLIP。 zero-shot 分類を狙うなら CLIP 系が圧倒的。

自己教師あり学習 BERT(MLM + NSP GPT 系(CLM) SimCLR / MoCo CLIP / ALIGN DINO / iBOT / Wav2Vec 2.0 /

🔗 隣接手法への橋渡し

「自己教師あり学習」は ラベルなしデータから擬似タスクを生成して表現を学ぶ アプローチで、 教師なし学習と教師あり学習の中間に位置する。 上流の大量未ラベルデータと下流の少量ラベルタスクを繋ぐ pretrain-finetune パイプラインの中核を担う。

⬆️ 上流: ラベルなしデータ整備

⬌ 並列: 他の学習パラダイム

⬇️ 下流: 下流タスクへの転移

自己教師あり学習は「ラベル不要で良い表現を得る → 少量ラベルで下流タスクへ転移」の二段ロケットで、 BERT・SimCLR・MAE などのモデルがこの設計を共有している。

🌳 手法選択フロー

「自己教師あり学習」を選ぶかは、 ラベルの希少性と事前学習データの量で判断する。

  1. ラベル付きデータが十分か (>10万)? Yes → 通常の教師あり学習、 No → 次へ
  2. ラベルなしデータが大量にあるか (>100万)? Yes → 自己教師あり (SimCLR/MAE/BERT-style) で事前学習 → ラベル少数で fine-tune、 No → 転移学習 (公開済 pretrained モデル) で代替
  3. ドメインギャップが大きいか? Yes → 自前で SSL pretrain、 No → 公開済 backbone を流用 (HuggingFace 等)

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]) で読込)からの実測値。 残差の予測値は千人未満を丸めた概数。