転移学習はなぜ効くのか — 転移可能性の理論と負の転移(Negative Transfer)

機械学習を学んでいると「大規模データで事前学習したモデルを流用すれば、手元の少ないデータでも高精度が出る」という話を必ず聞きます。実際、画像認識でも自然言語処理でも、ゼロから学習するのではなく事前学習済みモデルを再利用するのが当たり前になりました。これが 転移学習(Transfer Learning) です。

ところが、現場で転移学習を使うと、ときどき「事前学習モデルを使ったら、むしろゼロから学習したときより精度が下がった」という不可解な現象に出くわします。これが 負の転移(Negative Transfer) です。転移学習は「とりあえず事前学習モデルを持ってくればよい」という万能薬ではありません。効くときと効かないときがあり、その境目を分けるのは「ソースとターゲットがどれだけ似ているか」という、定量化できる量です。

この記事では「転移学習はなぜ効くのか」「いつ失敗するのか」を、感覚論ではなく理論から理解することを目指します。具体的には次の2つの問いに答えます。

  • 問い1: 別のタスクで学習した知識が、なぜ手元のタスクの役に立つのか? その効果はどんな量で決まるのか?
  • 問い2: 転移がかえって害になる「負の転移」は、どんな条件で起き、どう防げばよいのか?

この理解は実務に直結します。たとえば 医療画像診断では、ImageNetで事前学習したモデルをレントゲン画像に転移しますが、自然画像と医療画像は見た目がかなり違うため「どこまで転移してよいか」の判断が性能を左右します。また リモートセンシングによる土地被覆分類でも、ある地域・季節で学習したモデルを別の地域に適用すると、地表の見え方の違い(ドメインシフト)で性能が落ちることがあり、転移可能性の見極めが欠かせません。

前提として、転移学習の実践的な戦略(特徴抽出器としての利用・ファインチューニングの手順)は別記事で扱っています。本記事はその「なぜ効くのか/なぜ失敗するのか」という理論的な土台に焦点を当てます。

画像なし
転移学習の理論と実践 — 事前学習モデルの活用戦略
特徴抽出器としての利用、ファインチューニング、ドメインシフトへの対処を実践的に解説

転移学習の全体像:ソースの知識をターゲットへ移す模式図

上の図のように、転移学習はソース(大量データ)で学んだ特徴や重みを、データの少ないターゲットへ移して高精度なモデルを作る枠組みです。鍵になるのは中央の「知識を移転」の矢印です。本記事ではこの矢印がいつ機能し、いつ逆効果(負の転移)になるのかを、理論と実験の両面から突き詰めていきます。

前提知識

この記事を読むにあたって、以下を知っているとスムーズです。

  • 教師あり学習と汎化誤差(訓練誤差とテスト誤差の違い)
  • 確率分布と期待値の基本
  • ロジスティック回帰または線形分類器の考え方

これらに不安があれば、まず以下の記事に目を通しておくとよいでしょう。

ゼロショット学習 — 見たことのないクラスを当てる
属性空間を介してクラス間の知識を転移する枠組みを解説

それでは、まず「転移学習とは何か」を曖昧さなく定義するところから始めます。日常語の「知識の使い回し」を数式に落とすと、効く・効かないの条件が一気に見通しよくなります。

転移学習の形式的な定義

ドメインとタスク

転移学習を厳密に語るには、ドメイン(domain)タスク(task) を分けて定義する必要があります。直感的には、ドメインは「どんなデータが来るか」、タスクは「そのデータに対して何を予測するか」です。

ドメインを $\mathcal{D} = \{\mathcal{X}, P(X)\}$ と書きます。ここで $\mathcal{X}$ は特徴空間(入力がとりうる値の集合)、$P(X)$ は入力の周辺分布です。たとえば「日中に撮影した街の写真」と「夜間に撮影した街の写真」は、同じ特徴空間(画素値)を持っていても $P(X)$ が違うので、別のドメインだと考えます。

タスクを $\mathcal{T} = \{\mathcal{Y}, f(\cdot)\}$ と書きます。ここで $\mathcal{Y}$ はラベル空間、$f$ は入力からラベルを予測する目的関数で、確率的には条件付き分布 $P(Y \mid X)$ に対応します。

転移学習では、ソースドメイン $\mathcal{D}_S$ と ソースタスク $\mathcal{T}_S$(知識を持っている側)から、ターゲットドメイン $\mathcal{D}_T$ と ターゲットタスク $\mathcal{T}_T$(解きたい側)への知識の移転を考えます。

ドメインとタスクの分解(入力の世界と予測の中身)

図のように、ドメインは「どんなデータが来るか」(特徴空間 $\mathcal{X}$ と入力分布 $P(X)$)、タスクは「そのデータに何を予測するか」(ラベル空間 $\mathcal{Y}$ と条件付き分布 $P(Y\mid X)$)を表します。転移ではこのどちらか、または両方がソースとターゲットでズレており、どの軸がどれだけズレているかで転移の難しさが変わります。

転移学習の定義

これらを使うと、転移学習は次のように定義できます。

$$ \begin{equation} \text{ソース } (\mathcal{D}_S, \mathcal{T}_S) \text{ の知識を用いて、ターゲット } (\mathcal{D}_T, \mathcal{T}_T) \text{ の目的関数 } f_T \text{ の学習を改善すること} \end{equation} $$

ただし $\mathcal{D}_S \neq \mathcal{D}_T$ または $\mathcal{T}_S \neq \mathcal{T}_T$ の少なくとも一方が成り立つ(=ソースとターゲットが完全には一致しない)状況を指します。完全に一致するなら、それはただの「同じ問題を解いている」だけで転移ではありません。

ここから、転移には2つの「ズレ」のパターンがあることがわかります。

  1. ドメインのズレ $\mathcal{D}_S \neq \mathcal{D}_T$: 特徴空間が違う($\mathcal{X}_S \neq \mathcal{X}_T$)か、入力分布が違う($P_S(X) \neq P_T(X)$)。後者は特に ドメインシフト と呼ばれ、ドメイン適応(Domain Adaptation)の主戦場です。
  2. タスクのズレ $\mathcal{T}_S \neq \mathcal{T}_T$: ラベル空間が違う($\mathcal{Y}_S \neq \mathcal{Y}_T$)か、条件付き分布が違う($P_S(Y\mid X) \neq P_T(Y\mid X)$)。
画像なし
ファインチューニングと転移学習の理論と実装
事前学習済みモデルの活用方法と全体/部分ファインチューニングの違い

定義ができたので、次は核心の問い「なぜ別タスクの知識が役に立つのか」に進みます。鍵は、生のデータではなく特徴表現を共有している点にあります。

なぜ転移が効くのか — 表現の共有という直感

転移学習が効く根本的な理由は、多くのタスクが共通の中間表現を必要とすることにあります。

たとえば画像分類を考えましょう。「犬か猫か」を判定するにも「車かトラックか」を判定するにも、その前段では「エッジを検出する」「テクスチャを捉える」「形状の部品を組み立てる」といった共通の処理が必要です。深層ニューラルネットワークでは、低層がエッジや色などの汎用的な特徴を、高層がタスク固有の特徴を学ぶことが知られています。

この階層性が転移の源泉です。ソースタスクで大量のデータから学んだ「低層〜中層の汎用特徴」は、ターゲットタスクでもそのまま流用できます。ターゲットでは、すでに出来上がった良い特徴の上に、最後の分類層だけを少量データで学習すればよいのです。少ないパラメータを少ないデータで学ぶので、過学習しにくく、データが乏しくても高精度が出ます。

特徴の階層性:低層ほど汎用的で転移しやすい

図のように、低層はエッジや色のような汎用的な特徴を学ぶため、別のタスクへもそのまま流用できます。逆に高層ほどタスク固有(物体カテゴリなど)になり、ターゲットでは作り直す必要があります。転移が効くのは、この「低層の汎用性」を再利用できるからだ、という点を押さえておきましょう。

統計的に言い換えると、転移学習は 「良い仮説空間への事前情報(事前分布)」 をソースから持ち込んでいます。ゼロから学習するときは広大なパラメータ空間をさまよう必要がありますが、事前学習済みの重みで初期化すれば、最初から「良い解の近く」から探索を始められます。これがサンプル効率を劇的に改善します。

しかしこの説明には決定的な前提が隠れています。それは 「ソースで学んだ特徴がターゲットでも良い特徴である」 という仮定です。もしソースとターゲットがかけ離れていて、ソースの特徴がターゲットでは的外れなら、この前提は崩れます。崩れたときに何が起きるのか — それを定量的に語るのが、次の汎化バウンドです。

転移可能性の理論 — H△H-divergence による汎化バウンド

何を測りたいのか

転移が効くかどうかは「ソースとターゲットがどれだけ似ているか」で決まる、と述べました。これを定量化したのが Ben-David らによるドメイン適応の理論です。ここでは、ソースとターゲットでラベル空間が共通($\mathcal{Y}_S = \mathcal{Y}_T$)の二値分類を考え、入力分布だけがズレている(ドメインシフト)状況を扱います。

仮説 $h$(分類器)の各ドメインでの誤差を次のように書きます。

$$ \begin{equation} \epsilon_S(h) = \mathbb{E}_{x \sim \mathcal{D}_S}\big[\,|h(x) – f_S(x)|\,\big], \qquad \epsilon_T(h) = \mathbb{E}_{x \sim \mathcal{D}_T}\big[\,|h(x) – f_T(x)|\,\big] \end{equation} $$

私たちが本当に小さくしたいのはターゲット誤差 $\epsilon_T(h)$ ですが、ターゲットのラベル付きデータは乏しい。一方ソース誤差 $\epsilon_S(h)$ は大量データで小さくできます。問題は「ソースで小さくした誤差が、ターゲットでも小さい保証はあるのか」です。

ドメイン間の距離をどう測るか

2つの分布の距離としては KL ダイバージェンスなどが有名ですが、分類の文脈では「今考えている分類器の集合 $\mathcal{H}$ で見分けられる範囲での距離」を測るのが自然です。これを $\mathcal{H}\triangle\mathcal{H}$-divergence といい、次で定義します。

$$ \begin{equation} d_{\mathcal{H}\triangle\mathcal{H}}(\mathcal{D}_S, \mathcal{D}_T) = 2 \sup_{h, h’ \in \mathcal{H}} \big| \Pr_{x\sim\mathcal{D}_S}[h(x)\neq h'(x)] – \Pr_{x\sim\mathcal{D}_T}[h(x)\neq h'(x)] \big| \end{equation} $$

式の気持ちを読み解きましょう。$h, h’$ という2つの分類器が「食い違う領域」を考えます。その食い違いの確率が、ソースとターゲットで大きく違うなら、2つのドメインは(この分類器集合から見て)遠い、と判定します。逆に、どんな分類器ペアを持ってきても食い違い確率がソースとターゲットでほぼ同じなら、2つのドメインは近い、というわけです。重要なのは、この距離が実際にデータから推定できる点です(後の実験では、ドメインを見分ける分類器の精度として近似します)。

H△H-divergence:分類器から見た2ドメインの距離

左の近いドメインでは2つの分布がほぼ重なり、分類器が食い違う領域(灰色帯)の確率もソース・ターゲットでほとんど変わりません。右の遠いドメインでは分布が大きくずれ、食い違いの差が広がります。この差の最大値が $\mathcal{H}\triangle\mathcal{H}$-divergence で、大きいほど「分類器から見て2つのドメインが遠い=転移が効きにくい」ことを意味します。

汎化バウンド

これらを使うと、Ben-David らの主定理は次の不等式を与えます。任意の $h \in \mathcal{H}$ に対して、

$$ \begin{equation} \epsilon_T(h) \;\le\; \epsilon_S(h) \;+\; \frac{1}{2} d_{\mathcal{H}\triangle\mathcal{H}}(\mathcal{D}_S, \mathcal{D}_T) \;+\; \lambda \end{equation} $$

ここで $\lambda$ は、ソースとターゲットの両方で同時に低誤差を達成できる理想的な仮説の誤差です。

$$ \begin{equation} \lambda = \min_{h^\ast \in \mathcal{H}} \big[\, \epsilon_S(h^\ast) + \epsilon_T(h^\ast) \,\big] \end{equation} $$

この不等式は、転移学習の効き・効かないを完璧に説明する3項に分かれています。順に意味を確認しましょう。

  • 第1項 $\epsilon_S(h)$ — ソース誤差。ソースで良く学習できていれば小さい。大量データがあるソース側は普通これを小さくできます。
  • 第2項 $\frac{1}{2} d_{\mathcal{H}\triangle\mathcal{H}}$ — ドメイン間距離。ソースとターゲットの入力分布が離れているほど大きい。これが転移可能性の本体です。
  • 第3項 $\lambda$ — タスクの両立可能性。ソースとターゲットで「同時に良い」分類器が存在しなければ大きい。条件付き分布 $P(Y\mid X)$ がソースとターゲットで矛盾していると、この $\lambda$ が爆発します。

つまり、ターゲットで良い性能を出す(左辺を小さくする)には、ソース誤差・ドメイン距離・タスク非両立性の3つすべてが小さくなければならないのです。1つでも大きいと、ソースでどれだけ頑張っても、ターゲット誤差の上限は下がりません。

汎化バウンドの3項:ソース誤差・ドメイン距離・タスク非両立性

図は、3項がターゲット誤差の上限にどう寄与するかを表します。左(緑)のように3項すべてが小さければ上限(点線)も低く保たれますが、右(赤)のようにドメイン距離やタスク非両立性が大きいと、ソース誤差をいくら下げても上限は高いままです。この「上限が下がらない状況」こそ、次に述べる負の転移の正体です。

このバウンドこそが、次に説明する「負の転移」が起きる理由を数式で言い当てています。第2項・第3項が大きい状況こそ、転移が害に転じる瞬間なのです。

負の転移(Negative Transfer)とは

定義

負の転移とは、ソースの知識を転移したことで、転移しなかった場合(ターゲットデータだけで学習した場合)よりも性能が悪化する現象を指します。転移学習器の誤差を $\epsilon_T^{\text{transfer}}$、ターゲットのみで学習したベースラインの誤差を $\epsilon_T^{\text{base}}$ と書けば、

$$ \begin{equation} \text{負の転移} \iff \epsilon_T^{\text{transfer}} > \epsilon_T^{\text{base}} \end{equation} $$

転移は本来「ベースラインを改善する」ために行うのに、改善どころか改悪してしまう。これが起きると、転移学習を導入した意味がないどころか、マイナスになります。

なぜ起きるのか

先ほどの汎化バウンドの第2項・第3項が大きいとき、負の転移は起きます。メカニズムを3つに整理します。

  1. ドメイン乖離が大きい($d_{\mathcal{H}\triangle\mathcal{H}}$ 大): ソースの入力分布とターゲットの入力分布が違いすぎると、ソースで学んだ特徴がターゲットでは無意味、あるいは誤解を招く。自然画像で学んだエッジ検出が、レーダー画像ではノイズに反応する、といったケース。
  2. タスクが矛盾する($\lambda$ 大): ソースとターゲットで $P(Y\mid X)$ が食い違うと、ソースが学んだ「入力→ラベルの対応」がターゲットでは逆効果になる。たとえばソースでは「赤信号=止まれ」、ターゲットでは「赤=進め」のような正反対の対応だと、転移は確実に害になる。
  3. ソースへの過適合と容量の浪費: ソースが大きくターゲットが小さいと、モデルがソース固有の特徴に強く適合し、ターゲットの少量データではそれを修正しきれない。事前学習の重みが「強すぎる事前分布」となってターゲットの真の構造を覆い隠す。

正の転移と負の転移:初期化位置と最適解の関係

図は、転移を「事前学習重みでの初期化」として描いたものです。左の正の転移では、ソース重み(オレンジ)がターゲット最適(青)の近くにあり、少ない学習で最適へ到達できます。右の負の転移では、ソース重みが遠く、悪い初期値から出発するために学習が誤った方向へ引っ張られます。同じ「初期化」でも、それが得になるか損になるかはソースとターゲットの近さ次第なのです。

特に2のタスク矛盾は強烈で、ドメインがどれだけ似ていても($d_{\mathcal{H}\triangle\mathcal{H}}$ が小さくても)、$\lambda$ が大きければ負の転移は避けられません。この記事の実験では、まさにこの「タスクの矛盾度」を連続的に変えて、正の転移が負の転移へ反転する瞬間を観察します。

どう検出するか

実務での負の転移の検出は、定義に忠実に行うのが基本です。

  • ベースラインとの比較: 転移ありモデルと、ターゲットデータのみで学習したモデルを必ず両方評価し、転移ありが下回っていないか確認する。これを省くと、負の転移に気づけません。
  • ドメイン距離の推定: ソースとターゲットを見分ける分類器(ドメイン分類器)を学習し、その精度が高ければドメイン乖離が大きい=転移可能性が低いと判断する(後述の実験で実装します)。
  • 層ごとの転移可能性の確認: 低層だけ転移する、高層は再学習する、など転移する範囲を変えて検証する。一般に低層ほど汎用的で転移しやすく、高層ほどタスク固有で転移しにくい。

検出ができれば、次は緩和です。理論が指し示す3項のどれが大きいかに応じて、打つ手が変わります。

負の転移の緩和策

汎化バウンドの3項に対応させて、緩和策を整理します。

  • ドメイン距離を縮める(第2項対策): ソースとターゲットの特徴分布を揃える ドメイン適応 を行う。敵対的学習でドメイン分類器を騙すように特徴抽出器を学習する DANN(Domain-Adversarial Neural Network)や、分布間距離(MMD など)を直接最小化する手法がある。
  • タスク矛盾を避ける(第3項対策): そもそも関連性の高いソースを選ぶ。複数のソース候補があるなら、ドメイン距離やタスク類似度で転移元を選別する。無関係なソースを混ぜない。
  • 転移の強さを調整する(過適合対策): 事前学習重みを「強すぎる事前分布」にしないため、ファインチューニング時に小さい学習率を使う、低層を凍結する、正則化でソース重みからの逸脱を許す、といった調整を行う。
  • サンプルの再重み付け: ソースサンプルのうち、ターゲットに近いものを重視する重要度重み付け(importance weighting)で、共変量シフトを補正する。

負の転移の緩和策:汎化バウンドの3項への対応

図のように、緩和策は「汎化バウンドのどの項を下げるか」で一対一に整理できます。ドメイン距離が大きいならドメイン適応、タスクが矛盾するなら関連ソースの選別、ソースへの過適合なら低学習率や層凍結、という対応です。これらはすべて「3項のどれを下げるか」という観点で統一的に理解できます。理論が手立ての地図になっているわけです。では、ここまでの議論を実際のコードで体感しましょう。タスクの矛盾度を変えると、正の転移が負の転移へ反転する様子を再現します。

Pythonで負の転移を再現する

実験のアイデア

2次元の二値分類で考えます。ソースタスクとターゲットタスクの決定境界の向き(角度)をずらすことで、「タスクがどれだけ矛盾しているか」を連続的にコントロールします。

  • 角度差 $\theta = 0^\circ$: ソースとターゲットの分類ルールが完全に一致 → 強い正の転移が期待される。
  • 角度差 $\theta = 90^\circ$: 分類ルールが直交(ソースで覚えたルールがターゲットでは無意味〜逆効果)→ 負の転移が起きるはず。

タスク角度差θ:ソースとターゲットの決定境界のズレ

図は角度差 $\theta = 0^\circ, 45^\circ, 90^\circ$ でのデータと決定境界です。$\theta = 0^\circ$ ではソース(緑の破線)とターゲット(赤)の境界が一致し、ソースの知識がそのまま使えます。$\theta$ が大きくなるほど両者の境界が開き、$\theta = 90^\circ$ では直交して、ソースの分類ルールがターゲットでは役に立たなくなります。この角度差が、先ほどの理論でいう「タスク非両立性 $\lambda$」を操作するつまみになっています。

そして2つのモデルを比較します。

  • ベースライン: ターゲットの少量データだけで、ゼロから学習。
  • 転移モデル: まずソースの大量データで学習し、その重みを初期値としてターゲットの少量データでファインチューニング。

角度差 $\theta$ を $0^\circ$ から $90^\circ$ まで動かし、両者のターゲットテスト精度がどう変わるかを見ます。理論通りなら、$\theta$ が大きくなるにつれ転移モデルがベースラインを下回る(負の転移)はずです。

データとモデルの実装

まずは合成データの生成と、勾配降下で学習するロジスティック回帰を NumPy で実装します。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(0)

def make_data(n, angle_deg, noise=0.15):
    """角度 angle_deg の方向の重みベクトルで決まる線形分類タスクのデータを生成"""
    X = rng.normal(size=(n, 2))
    theta = np.deg2rad(angle_deg)
    w_true = np.array([np.cos(theta), np.sin(theta)])  # 決定境界の法線方向
    logits = X @ w_true
    # ラベルにわずかなノイズ(ラベル反転)を加える
    p = 1.0 / (1.0 + np.exp(-logits / noise))
    y = (rng.uniform(size=n) < p).astype(float)
    return X, y

def sigmoid(z):
    return 1.0 / (1.0 + np.exp(-np.clip(z, -30, 30)))

def train_logreg(X, y, w_init=None, lr=0.5, epochs=300, l2=1e-3):
    """フルバッチ勾配降下でロジスティック回帰を学習。w_init で初期化(=転移)できる"""
    n, d = X.shape
    w = np.zeros(d) if w_init is None else w_init.copy()
    b = 0.0
    for _ in range(epochs):
        z = X @ w + b
        p = sigmoid(z)
        grad_w = X.T @ (p - y) / n + l2 * w
        grad_b = np.mean(p - y)
        w -= lr * grad_w
        b -= lr * grad_b
    return w, b

def accuracy(X, y, w, b):
    pred = (sigmoid(X @ w + b) >= 0.5).astype(float)
    return np.mean(pred == y)

make_data は、角度で指定した方向の重みベクトル w_true を法線とする線形境界でラベルを決めます。角度差を変えれば「タスクの矛盾度」を直接操作できる、という仕掛けです。train_logregw_init を渡せば、その重みから学習を始められます。これがソースからの転移(重み初期化)に対応します。

角度差をスイープして正負の転移を観察

ソースは角度 $0^\circ$ 固定・大量データ、ターゲットは角度 $\theta$・少量データとします。$\theta$ を動かしながら、ベースライン(ゼロ初期化)と転移モデル(ソース重みで初期化)のターゲットテスト精度を比較します。

n_source, n_target_train, n_target_test = 2000, 30, 2000
angles = np.arange(0, 91, 10)
n_trials = 30  # ばらつきを抑えるため複数試行の平均

base_acc, transfer_acc = [], []
for ang in angles:
    b_list, t_list = [], []
    for _ in range(n_trials):
        # ソース(角度0・大量データ)で事前学習
        Xs, ys = make_data(n_source, angle_deg=0)
        w_src, b_src = train_logreg(Xs, ys)

        # ターゲット(角度ang・少量データ)
        Xt_tr, yt_tr = make_data(n_target_train, angle_deg=ang)
        Xt_te, yt_te = make_data(n_target_test, angle_deg=ang)

        # ベースライン:ゼロから学習
        w_b, b_b = train_logreg(Xt_tr, yt_tr, w_init=None)
        # 転移:ソース重みで初期化してファインチューニング
        w_t, b_t = train_logreg(Xt_tr, yt_tr, w_init=w_src, lr=0.1, epochs=100)

        b_list.append(accuracy(Xt_te, yt_te, w_b, b_b))
        t_list.append(accuracy(Xt_te, yt_te, w_t, b_t))
    base_acc.append(np.mean(b_list))
    transfer_acc.append(np.mean(t_list))

base_acc, transfer_acc = np.array(base_acc), np.array(transfer_acc)

plt.figure(figsize=(8, 5))
plt.plot(angles, base_acc, 'o-', label='ベースライン(ターゲットのみ学習)')
plt.plot(angles, transfer_acc, 's-', label='転移モデル(ソース重みで初期化)')
plt.fill_between(angles, base_acc, transfer_acc,
                 where=(transfer_acc < base_acc), alpha=0.25, color='red',
                 label='負の転移が起きる領域')
plt.xlabel('ソースとターゲットのタスク角度差 θ [度]')
plt.ylabel('ターゲットテスト精度')
plt.title('タスク角度差と転移効果:正の転移から負の転移への反転')
plt.legend()
plt.grid(alpha=0.3)
plt.tight_layout()
plt.savefig('negative_transfer.png', dpi=120)

タスク角度差と転移効果:正の転移から負の転移への反転

このグラフからは、はっきりした傾向が読み取れます。角度差 $\theta$ が小さい(ソースとターゲットのタスクが似ている)うちは、転移モデルがベースラインを上回ります。少量データしか持たないベースラインに対し、ソースで得た良い初期値が効くためです。これが 正の転移 です。ところが $\theta$ が大きくなるにつれ転移の優位は縮小し、ある角度を超えると転移モデルがベースラインを下回ります。赤く塗られた領域がまさに 負の転移 で、ソースの知識がターゲットの学習を妨げている状態です。$\theta = 90^\circ$ 付近では、ソースの重みがターゲットの正解とほぼ直交するため、ゼロから学習した方がよほどましになります。

理論の汎化バウンドで言えば、$\theta$ を大きくする操作は条件付き分布 $P(Y\mid X)$ をソースとターゲットで食い違わせること、すなわち $\lambda$ を増大させることに対応します。$\lambda$ が大きくなるとターゲット誤差の上限が下がらなくなる、という予測が、この実験で目に見える形で現れたわけです。

ドメイン距離を推定して転移可能性を測る

最後に、負の転移を事前に検出する手立てとして、$\mathcal{H}\triangle\mathcal{H}$-divergence の実用的な近似である ドメイン分類器の精度 を計算します。ソースとターゲットの入力にドメインラベル(ソース=0、ターゲット=1)を付け、両者を見分ける分類器を学習します。見分けが簡単(精度が高い)ほどドメインは離れている、という考え方です。

def domain_divergence(Xs, Xt):
    """ソースとターゲットを見分ける分類器の精度からドメイン距離を近似"""
    X = np.vstack([Xs, Xt])
    d = np.concatenate([np.zeros(len(Xs)), np.ones(len(Xt))])
    idx = rng.permutation(len(X))
    X, d = X[idx], d[idx]
    n_tr = len(X) // 2
    w, b = train_logreg(X[:n_tr], d[:n_tr])
    acc = accuracy(X[n_tr:], d[n_tr:], w, b)
    # 精度0.5(見分け不能)→距離0、精度1.0(完全に区別)→距離最大
    return 2 * (acc - 0.5)

# 入力分布だけずらした例(共変量シフト):平均をシフトしてドメイン距離を作る
Xs = rng.normal(loc=0.0, size=(2000, 2))
Xt_near = rng.normal(loc=0.3, size=(2000, 2))   # 近いドメイン
Xt_far  = rng.normal(loc=3.0, size=(2000, 2))   # 遠いドメイン
print(f"近いドメインとの距離の近似: {domain_divergence(Xs, Xt_near):.3f}")
print(f"遠いドメインとの距離の近似: {domain_divergence(Xs, Xt_far):.3f}")

ドメイン距離の推定:近いドメインと遠いドメイン

このコードを実行すると、近いドメインの距離は約 0.17、遠いドメインの距離は約 0.97 となりました。図のように、平均を大きくずらした「遠いドメイン」(右)はソースとターゲットがほとんど重ならず、見分けるのが簡単なので距離が 1 に近づきます。逆にわずかしかずらしていない「近いドメイン」(左)は重なりが大きく、見分けにくいので距離は 0 に近い小さな値になります。

出力を見ると、入力分布の平均を大きくずらした「遠いドメイン」では距離の近似値が 1 に近づき、わずかしかずらしていない「近いドメイン」では 0 に近い小さな値になります。つまり、このドメイン分類器の精度を見るだけで、ターゲットのラベルがなくても「このソースは転移して大丈夫か」をある程度見積もれるのです。実務では、転移を実行する前にこの指標をチェックし、距離が大きすぎるソースを避けたり、ドメイン適応の併用を検討したりする判断材料に使えます。

ここまでで、理論(汎化バウンドの3項)と実験(角度差による正負の反転、ドメイン距離の推定)が一本の線でつながりました。

まとめ

転移学習が「なぜ効くのか/いつ失敗するのか」を理論から整理しました。要点は次の通りです。

  • 転移学習は ドメイン $\{\mathcal{X}, P(X)\}$ と タスク $\{\mathcal{Y}, P(Y\mid X)\}$ のズレを越えて知識を移転する枠組みであり、効く理由は 共通の特徴表現を再利用できる ことにある。
  • ターゲット誤差は $\epsilon_T(h) \le \epsilon_S(h) + \frac{1}{2} d_{\mathcal{H}\triangle\mathcal{H}}(\mathcal{D}_S,\mathcal{D}_T) + \lambda$ で上から抑えられ、ソース誤差・ドメイン距離・タスク非両立性 の3項すべてが小さいときにのみ転移が効く。
  • 負の転移 は、ドメイン乖離(第2項)やタスク矛盾(第3項)が大きいときに起き、転移がベースラインを下回る。実験では、タスクの角度差を広げると正の転移が負の転移へ反転することを確認した。
  • 緩和策(ドメイン適応・転移元の選別・学習率や凍結による転移強度の調整・サンプル再重み付け)は、いずれも汎化バウンドの3項のどれを下げるかという観点で統一的に理解できる。
  • 負の転移は ベースラインとの比較ドメイン距離の推定 で検出できる。「事前学習モデルを持ってきたら必ず良くなる」という思い込みを捨て、必ず検証することが実務では肝心。

転移学習は強力ですが万能ではありません。ソースとターゲットの関係を定量的に見極める視点を持つことで、「とりあえず事前学習」から「根拠を持って転移する」へと一段深い実践ができるようになります。

次のステップとしては、ドメイン乖離を能動的に縮める ドメイン適応(DANN など敵対的手法)や、複数ソースから最適な転移元を選ぶ ソース選択 を学ぶと、本記事の理論が実装に直結していきます。