視覚におけるオートエンコーダと表現学習

Dev.to / 2026/4/22

💬 オピニオンIdeas & Deep AnalysisModels & Research

要点

  • オートエンコーダは入力データを低次元の潜在空間に圧縮し、その表現から元の入力を復元します。
  • PCAの線形な射影とは異なり、オートエンコーダはニューラルネットワークを用いてデータの非線形構造を学習します。
  • 線形オートエンコーダは特定の単純な条件下ではPCAと同様の振る舞いをし得ますが、深さと非線形性を加えることでより豊かな非線形表現を獲得できます。
  • モデルは2つの段階で構成され、前半(エンコーダ)が潜在特徴を作り、後半(復元を担うデコーダ)がそれを入力空間へ戻します。
  • エンコーダの目的は、冗長性やノイズを捨てつつ、元データを効率よく表すのに必要な最も有益な特徴を保持することです。

オートエンコーダは、データを低次元の空間に圧縮し、その圧縮表現から元の入力を復元するタイプのニューラルネットワークです。

プリンシパル成分分析(PCA)に出会ったことがあるなら、これはどのように機能するかについて直感をすでに持っているはずです。主な違いは、PCAが線形な射影手法であるのに対して、オートエンコーダはニューラルネットワークを用いることで、データ中の非線形な構造を学習できる点です。

理論上は、隠れ層が1つの線形オートエンコーダは、1次元におけるPCAと同様に振る舞います。しかし、深さ(階層)と非線形性を導入すると、モデルは線形部分空間のはるか先まで及ぶ、より豊かな表現を学習し始めます。

オートエンコーダはどのように動作しますか?

オートエンコーダは、2段階のコンポーネント設計に従います。

1. エンコーダ

エンコーダはオートエンコーダの最初のコンポーネントです。入力データを低次元の潜在空間に射影することで圧縮します。

目的は、冗長性やノイズを捨てる一方で、元のデータを効率よく表現するために必要な最も情報量の多い特徴を抽出することです。

形式的には:

z=fθ(x) z = f_{\theta}(x) z=fθ(x)

ここで:

  • xx x = 入力データ
  • fθf_{\theta} fθ = エンコーダネットワーク( θ\theta θ によってパラメータ化されたもの)
  • zz z = 潜在表現

これは線形な場合のPCAに相当します。すなわち、モデルがデータを主成分へ射影するという点です。ただしPCAと異なり、エンコーダは非線形な表現を学習します。

2. デコーダ

デコーダはオートエンコーダの2つ目のコンポーネントです。圧縮された潜在表現から元の入力を復元します。

x^=gϕ(z) \hat{x} = g_{\phi}(z) x^=gϕ(z)

ここで:

  • gϕg_{\phi} gϕ = デコーダネットワーク
  • x^\hat{x} x^ = 復元された出力

全体の処理パイプラインは次のようになります:

x^=gϕ(fθ(x)) \hat{x} = g_{\phi}(f_{\theta}(x)) x^=gϕ(fθ(x))

オートエンコーダの目的は、再構成誤差を最小化することです:

L=∣x−x^∣22 \mathcal{L} = | x - \hat{x} |_2^2 L=xx^2

したがって、モデルは、再構成に必要な情報を保持し、それ以外のすべてを捨てるよう明示的に学習されます。

import torch
import torch.nn as nn
import torch.nn.functional as F

class TinyAE(nn.Module):
    def __init__(self):
        super().__init__()
        self.enc = nn.Sequential(
            nn.Linear(784, 256),
            nn.ReLU(),
            nn.Linear(256, 64)
        )
        self.dec = nn.Sequential(
            nn.Linear(64, 256),
            nn.ReLU(),
            nn.Linear(256, 784),
            nn.Sigmoid()
        )

    def forward(self, x):
        z = self.enc(x)
        return self.dec(z)

model = TinyAE()
opt = torch.optim.Adam(model.parameters(), 1e-3)

for step in range(500):
    x = torch.rand(16, 784)

    recon = model(x)
    loss = F.mse_loss(recon, x)opt.zero_grad()
    loss.backward()
    opt.step()

    if step % 100 == 0:
        print(step, loss.item())

表現学習とは何ですか?

多くの場合、コンピュータビジョンでは、モデルに欠けた情報を予測するよう強制したときに、モデルが世界についてどのような内部構造を学習するのかを知りたいと考えます。この種の課題は表現学習と呼ばれます。この問いに答えるために、エンジニアはさまざまな自己教師あり学習の手法を用います。答えの種類によって、モデルがテクスチャ、真の意味論、あるいは局所的な連続性のどれを学習するかが決まります。これは特に、意味がピクセルに符号化されるのではなく、動物の身体の解剖の3D構成にあるような医用画像分野では重要です
技術的な観点では、表現学習は次のことを問います。

潜在空間(z)は、入力について実際にどのような構造を符号化しているのですか?

形式的には:

z=fθ(x) z = f_\theta(x) z=fθ(x)

私たちは(z)に:

  • ノイズを捨てる
  • 意味論的な構造を保持する
  • 下流の課題(セグメンテーション、検出、分類)へ汎化する

再構成ベースの手法はすべて、この同じ課題を共有しています。つまり、入力から何が欠けているのかを再構成することです。ただし、欠けているものの性質が、学習ダイナミクスをまったく変えてしまいます。

これをより理解するために、重要な3つの概念を見てみましょう。

再構成の難しさの3つのレベル

1. 素朴な再構成(恒等写像の学習)

ここでは、モデルは出力に対して入力全体を再構成します。入力から何も取り除かず、圧縮だけが行われるなら、モデルは最小の誤差で出力全体を再構成できるでしょうか?これは、恒等の圧縮と呼ばれる、表現学習の自明なケースです。

fθ(x)≈x f_\theta(x) \approx x fθ(x)x

期待される典型的な挙動は単純です。モデルは恒等写像を学習し、異なるピクセル同士の関係を記憶します。抽象化は何も学習しません。
これは厳密には表現学習ではありません。制約のない圧縮です。

2. ランダムマスキング(弱い構造学習)

ランダムマスキングでは、画像データから独立なピクセルを取り除き、それらが欠けているピクセルがそのままの状態で埋まるように、モデルに画像を再構成させます。これにより補間が強制され、モデルは近傍のピクセルデータを使って値を代入できるようになります。その結果、モデルは局所的なテクスチャ、平滑化、短距離の連続性を学習できます。

xmasked=x⊙m,m∼Bernoulli(p) x_{masked} = x \odot m, \quad m \sim \text{Bernoulli}(p) xmasked=xm,mBernoulli(p)

各ピクセルが独立に取り除かれる、というのがこの考え方です。これにより、モデルは局所的な補間を使って欠けたピクセル値を予測したり埋めたりできます。これによって、テクスチャの連続性や短距離の相関が可能になります。ただし制限もあります。欠け方が非構造的であるため、モデルは次に頼ることができます:

  • 近くのピクセル
  • 局所的な勾配
  • 平滑化の事前知識(プリオリ)

したがって、グローバルな推論を必要としません。

3. ブロックマスキング(構造的推論)

ブロックマスキングは、点やピクセルではなく領域全体を取り除くことで、ゲームの前提を根本から変えます。その結果、モデルは不完全なデータから欠けた領域を再現することを強いられます。この種類のマスキングは、病理が領域ベースであってピクセルベースではないCTのような医用画像において、とても関連性が高いです。

def block_mask(x, patch=8, ratio=0.5):
    B, C, H, W = x.shape
    mask = torch.zeros_like(x)

    for i in range(0, H, patch):
        for j in range(0, W, patch):
            if torch.rand(1) < ratio:
                mask[:, :, i:i+patch, j:j+patch] = 1

    return x * (1 - mask), mask

重要な考え方は、領域全体を取り除くことです。これにより、モデルは高いレベルで物体の構造を学習することが強制されます。さらに、空間的な一貫性とグローバルな文脈の推論が可能になります。
これは特にCT画像では重要で、次の理由によります:

  • 臓器は連続した3次元構造である
  • 病理は画素ではなく領域にまたがる

本件では、ブロックマスキングの問題がこの質問の中心です。それに対処するために、2つの主要な系統のオートエンコーダを用います:

  1. マスクド・オートエンコーダ(MAE)
  2. デノイジング・オートエンコーダ(DAE)

1. デノイジング・オートエンコーダ(DAE)

DAEは、まずノイズ(ガウスのホワイトノイズ)によって入力を破壊することでこの問題を解決します。つまり、各画素はわずかに破損するものの、構造はまだ視認できるということです。ですが、私たちのDAEには問題があります。DAEは簡単にノイズを取り除いてすべてをそのままにしてしまいがちで、欠けた部分を本当に再構成することは学習していません。構造を学習するというより、複雑なフィルタとして振る舞うだけでした。

xnoisy=x+ϵ,ϵ∼N(0,σ2) x_{noisy} = x + \epsilon, \quad \epsilon \sim \mathcal{N}(0, \sigma^2) xnoisy=x+ϵ,ϵN(0,σ2)

これは何を意味するのか

すべての画素がわずかに撹乱されますが、画像の全体的な構造は完全に見えるままです。その後、モデルはノイズを取り除き、元の信号を復元するように学習します。これの限界は構造的なものです。構造が保持されているため、モデルは局所的な変動を平滑化し、ノイズを平均化して除去することで動作します。

つまり、構造を学習するのではなく、多くの場合学習済みのデノイズ(ノイズ除去)フィルタのように振る舞います。

言い換えると:

それは 理解する方法 ではなく、きれいにする方法 を学習します。

2. マスクド・オートエンコーダ(MAE)

マスクド・オートエンコーダは、マスキングと呼ばれるプロセスで情報を完全に取り除くことで動作します。これは、入力の大部分が完全に欠けており、疎な文脈から再構成が行われることを意味します。
マスクド・オートエンコーダは、バイナリマスクを使って情報を完全に取り除きます:

xmasked=x⊙(1−m),m∈0,1p x_{masked} = x \odot (1 - m), \quad m \in {0,1}^p xmasked=x(1m),m0,1p

この意味

入力の大部分は完全に削除されます(0に設定される、または省略されます)。

DAEとは異なり、ノイズのある信号はなく、そして欠損値の手がかりもありません。したがってモデルは、文脈だけから欠損領域を推測しなければなりません。

モデルの主要な目的は、部分的な観測だけを用いて欠損した構造を再構成することです。これにより、モデルはグローバルな推論と構造的推定を使うことを強制され、長距離依存関係の学習を促します。

鍵となる中間案としてのブロックマスキング

ブロックマスキングは、ランダムなピクセルではなく連続した領域を除去する、MAEスタイルの破壊(コラプション)の構造化版です。

単純な実装は次のようになります:

def block_mask(x, patch=8, ratio=0.5):
    B, C, H, W = x.shape
    mask = torch.zeros_like(x)

    for i in range(0, H, patch):
        for j in range(0, W, patch):
            if torch.rand(1) < ratio:
                mask[:, :, i:i+patch, j:j+patch] = 1

    return x * (1 - mask), mask

なぜこれが重要か

ブロックマスキングにより、モデルは次を行うよう強制されます:

  • ピクセルではなく、欠損した領域を再構成する
  • オブジェクトレベルの構造を推論する
  • グローバルな文脈に依存する

なぜMAEはデノイジング自己符号化器に勝るのか

デノイジング自己符号化器(DAE)

DAEは入力をノイズで破壊(コラプト)します:

xnoisy=x+ϵ,ϵ∼N(0,σ2) x_{noisy} = x + \epsilon, \quad \epsilon \sim \mathcal{N}(0, \sigma^2) xnoisy=x+ϵ,ϵN(0,σ2)

“ノイズを取り除きつつ、他はすべてそのままにする”

そのため、洗練された平滑化(スムージング)のフィルタのように振る舞います。

マスク付き自己符号化器(MAE)

MAEは情報を完全に取り除きます:

xmasked=x⊙(1−m),m∈0,1p x_{masked} = x \odot (1 - m), \quad m \in {0,1}^p xmasked=x(1m),m0,1p

これにより、真の表現学習が実現されます。

まとめ テーブル

特性 DAE MAE
破壊(Corruption) ノイズ 欠落した領域
可視性 完全な構造 部分的な構造
学習シグナル 弱い 強い
ショートカット学習 容易 困難
表現 局所的 大域的

MAEが失敗する場合

その強力さにもかかわらず、MAEは常に普遍的に最適というわけではありません。

1. 過剰なマスキングによる崩壊

マスク比率が高すぎると、モデルは見るべき文脈が少なすぎて、再構成が曖昧になります。これにより、学習シグナルがノイズまみれになります。

2. 低解像度または小さな物体

物体がマスキング用のブロックに比べて小さい場合、物体全体が取り除かれ、再構成は推測(当てずっぽう)になります。

これは、病変検出やCTにおける微細構造でよく見られます。

3. 分布シフトへの感度

MAEは構造に関する強い事前知識(プライア)を学習します。

もしテストデータが大きく異なる場合、この学習済みの事前知識が再構成を誤らせ、モデルが誤った構造を“作ってしまう”(ハルシネーション)可能性があります。

4. 計算の非効率性(3Dの場合)

ボリュームデータでは、デコーダのコストは完全な再構成空間に比例して増大し、メモリ使用量がボトルネックになります。

このため、多くの3D MAEシステムでは次が必要になります:

  • パッチベースのデコーディング
  • 潜在空間での再構成
  • またはハイブリッドなCNN-トランスフォーマ設計

まとめ

オートエンコーダは、ラベルなしで表現を学習するためのシンプルでありながら強力な枠組みを提供します。入力データを潜在空間に圧縮し、それを再構成することで、モデルに「何が本質的な情報で、何を捨てられるのか」を発見させます。

ただし、再構成タスクをどのように定式化するかによって、モデルが学ぶ内容が決まります。

  • 素朴な再構成は恒等写像の学習につながります。モデルは理解するのではなく、単に記憶します。
  • ランダムマスキングはモデルを局所的な補間へと押し込みます。テクスチャや短距離の連続性を学習します。
  • ブロックマスキングは真の推論を強制します。モデルは大域的な文脈から欠けた構造を推定しなければなりません。

ここで、ノイズ除去オートエンコーダ(DAE)マスク付きオートエンコーダ(MAE)の違いが重要になります:

  • DAEは破壊(corruption)のもとで動作する → 情報は劣化するが、なお存在する
  • MAEは除去(removal)のもとで動作する → 情報が欠落し、それを推定する必要がある

MAEは入力の大きな部分を取り除くため、不確実性の高い学習問題を作り出します。これによりショートカット解への誘惑が抑えられ、意味的・構造的な表現の出現が促されます。

コンピュータビジョンや医用画像といった領域では、この違いは単なる理論上の話ではなく、決定的です。現実世界の信号(例:CTスキャン)は、局所的なピクセル値というより、空間的な関係性や大域的な構造によって定義されます。MAEはこの要件に自然に整合するため、下流タスクのより強固な基盤になります。

とはいえ、MAEは常に万能で完璧というわけではありません。以下の場合に失敗することがあります:

  • マスキングが強すぎる場合、
  • データに大域的な構造が欠けている場合、
  • またはデコーダが強力すぎて、エンコーダを迂回してしまう場合。

最終的に重要な洞察は次の通りです:

表現学習は再構成そのものの話ではなく、適切な情報ボトルネックを設計することにある。

返却形式: {"translated": "翻訳されたHTML"}