ニューラルネットの学習は「損失を小さくする方向へパラメータを動かす」の繰り返しです。ところが、あるモジュールに対しては わざと損失を大きくする方向へ動かしたい ——そんな天邪鬼な要求が、敵対的学習では出てきます。たとえば「ソースとターゲットのデータを見分けられないような特徴を学びたい(ドメイン適応)」「性別や人種を予測できないような公平な表現を学びたい」といった場面です。判別器は一生懸命見分けようとする一方で、特徴抽出器はその判別器を騙す方向に動いてほしい。
この「一方は最小化、もう一方は最大化」という min-max(敵対的)最適化 を、GANのような込み入った交互学習なしに、たった1回の逆伝播で実現してしまう驚くほど簡単な仕掛けが 勾配反転層(Gradient Reversal Layer, GRL) です。
GRLの正体は拍子抜けするほどシンプルです。
順伝播では入力をそのまま通す(恒等写像)。逆伝播のときだけ、流れてくる勾配の符号を反転する。
たったこれだけ。この記事では、なぜこの単純な操作で敵対的なmin-maxが解けるのか、姉妹概念の stop-gradient とどう対をなすのか、そしてドメイン適応(DANN)以外にどこで使えるのかを、PyTorch実装と実測を交えて解き明かします。
本記事の内容
- GRLの定義(順伝播恒等・逆伝播反転)
- なぜ勾配の反転で敵対的min-maxが解けるのか
- 「疑似関数」としてのGRLとPyTorch実装
- 反転の強さ λ のスケジュール
- stop-gradientとの対比(勾配手術の一族)
- DANNでの実測と、GRLの一般的な応用
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
DANNはGRLを使う代表的な手法ですが、本記事はGRLという「層」そのものに焦点を当て、DANNはその一応用として扱います。
GRLとは — 順伝播恒等・逆伝播反転
GRLは、入力 $\bm{x}$ に対して順伝播では何もしません。数式で書くと恒等写像です。
$$ R_\lambda(\bm{x}) = \bm{x} $$
ところが逆伝播のときだけ、後ろから流れてくる勾配に $-\lambda$ を掛けて前へ渡します。つまり「見かけ上の微分」を次のようにわざと定義します。
$$ \frac{dR_\lambda}{d\bm{x}} = -\lambda \bm{I} $$
$\lambda>0$ は反転の強さを決める係数(ハイパーパラメータ)です。

図のとおり、順伝播(上向きの流れ)ではGRLは透明な窓のように振る舞い、入力をそのまま出力に通します。逆伝播(下向きの流れ)では、通過する勾配の向きをくるりと反転させます。順伝播と逆伝播で振る舞いが「食い違っている」——ここが普通の層と決定的に違う点です。数学的に厳密な関数なら、順伝播が恒等 $R(\bm{x})=\bm{x}$ なら微分は $+\bm{I}$ のはずです。GRLはそれを嘘の微分 $-\lambda\bm{I}$ に置き換えています。だからGRLは正確には関数ではなく「疑似関数(pseudo-function)」と呼ばれます。
「嘘の微分」と聞くと不安になるかもしれませんが、最適化としてはきちんと正当化できます。後で見るように、GRLを挟んだネットワークを普通に勾配降下することは、目的関数 $L_y – \lambda L_d$ に対する鞍点(サドルポイント)を探すことと等価になります。GRLは「この鞍点最適化の勾配を、自動微分の枠組みの中で正しく生成するための実装トリック」なのです。つまり、層としては疑似関数でも、それが実現する最適化は明確に定義された敵対的目的関数の最適化であり、数学的な根拠はきちんとあります。順伝播の値(=損失の計算に使う特徴)は恒等のまま正しく、逆伝播の向きだけを目的に合わせて設計している、と理解すると腑に落ちます。
では、この「嘘の微分」がなぜ役に立つのでしょうか。それを理解するには、敵対的な目的関数の構造を見る必要があります。
なぜ勾配の反転で min-max が解けるのか
ドメイン適応を例にします。登場人物は3つです。
- 特徴抽出器 $G_f$:入力から特徴を取り出す
- ラベル分類器 $G_y$:特徴からクラスラベルを当てる(ラベル損失 $L_y$ を最小化したい)
- ドメイン判別器 $G_d$:特徴が「ソース」か「ターゲット」かを当てる(ドメイン損失 $L_d$ を最小化したい)

ここでの狙いは、ドメインを見分けられないような特徴を $G_f$ に学ばせることです。そういう特徴なら、ソースで学んだ分類器がターゲットにもそのまま通用するからです。これを最適化の言葉にすると、次の矛盾した要求になります。
- ドメイン判別器 $G_d$ は、ドメイン損失 $L_d$ を 最小化 したい(できるだけ正確に見分けたい)
- 特徴抽出器 $G_f$ は、ドメイン損失 $L_d$ を 最大化 したい(判別器を困らせたい)
同じ $L_d$ を、一方は下げたく、もう一方は上げたい。これが敵対的なmin-max $\min_{G_f}\max_{G_d}$ です。

min-max最適化は、ゲーム理論でいう2人の対戦者がせめぎ合う構図です。特徴抽出器は「ドメインの手がかりを消す」ことで判別器を出し抜こうとし、判別器は「残ったわずかな手がかりから見分ける」ことで応戦する。この追いかけっこが釣り合ったところ(鞍点)で、特徴からドメイン情報がほぼ抜き取られている、という理屈です。
普通なら、GANのように「判別器を更新するステップ」と「特徴抽出器を更新するステップ」を交互に回す必要があります。実装も学習も面倒です。ここでGRLの出番です。$G_f$ と $G_d$ の間にGRLを挟むと、ドメイン損失 $L_d$ の勾配は次のように流れます。
- ドメイン判別器 $G_d$ には、$L_d$ の勾配がそのまま届く → $G_d$ は $L_d$ を最小化する(正しく見分けようとする)
- 特徴抽出器 $G_f$ には、GRLを通った勾配、すなわち符号が反転した $-\lambda\,\partial L_d/\partial \bm{f}$ が届く → $G_f$ は $L_d$ を増やす方向へ動く(判別器を困らせる)
つまり、全体では単一の損失 $L = L_y + L_d$ を普通に勾配降下するだけなのに、GRLのおかげで $G_f$ だけが $L_d$ に関して「逆走」します。1つの損失、1回の逆伝播で、min-maxが自動的に実現されるのです。GANのような交互最適化のループは要りません。これがGRLの魔法の正体です。
勾配で書くと、より明確になります。特徴抽出器のパラメータを $\theta_f$、判別器のパラメータを $\theta_d$ とします。GRLが無ければ、ドメイン損失による $\theta_f$ の更新はチェインルールで $\frac{\partial L_d}{\partial \theta_f}$ に比例します。GRLを挟むと、この経路の勾配だけが符号反転して $-\lambda\frac{\partial L_d}{\partial \theta_f}$ になります。したがって勾配降下 $\theta_f \leftarrow \theta_f – \eta\,\nabla_{\theta_f}L$ を展開すると、
$$ \theta_f \leftarrow \theta_f – \eta\left(\frac{\partial L_y}{\partial \theta_f} – \lambda\frac{\partial L_d}{\partial \theta_f}\right) $$
となります。$L_y$ については普通に下る一方、$L_d$ については符号がひっくり返って登る(最大化する)ことが、この1本の更新式に同居しています。判別器 $\theta_d$ の更新はGRLの外なので通常どおり $L_d$ を最小化します。これはまさに $\min_{\theta_f}\max_{\theta_d}$ を勾配ベースで解く形——目的関数 $L_y – \lambda L_d$ を $\theta_f$ について最小化するのと等価です。GRLは、この「$-\lambda$」を自動微分の裏側にこっそり仕込むための道具だと言えます。
$G_f$ が本当に $L_d$ を増やす向きに更新されるなら、その勾配は「普通に流したときと符号が逆」になっているはずです。実際に確かめてみましょう。
実装 — 「疑似関数」を自動微分でつくる
GRLは順伝播と逆伝播が食い違う疑似関数なので、通常の演算の組み合わせでは作れません。PyTorchでは torch.autograd.Function を継承して、forward と backward を自分で定義します。
from torch.autograd import Function
class GradReverse(Function):
@staticmethod
def forward(ctx, x, lambd):
ctx.lambd = lambd
return x.view_as(x) # 順伝播: 恒等(そのまま返す)
@staticmethod
def backward(ctx, grad_output):
return -ctx.lambd * grad_output, None # 逆伝播: 勾配を反転
forward は入力をそのまま返すだけ、backward は受け取った勾配 grad_output に $-\lambda$ を掛けて返すだけです。この十数行がGRLのすべてです。あとは特徴抽出器の出力をこの層に通してからドメイン判別器へ渡すだけで、敵対的学習が組み上がります。
ここで「わざわざGRLを作らなくても、損失を $L_y – \lambda L_d$ にして普通に最適化すればいいのでは?」という疑問が湧くかもしれません。しかしこれには落とし穴があります。もし損失全体を $L_y – \lambda L_d$ にしてしまうと、その $-\lambda L_d$ の勾配はドメイン判別器 $\theta_d$ にも流れ、判別器が $L_d$ を最大化する(=わざと下手に見分ける)方向に動いてしまいます。これでは判別器が育たず、敵対が成立しません。本当に欲しいのは「判別器は $L_d$ を最小化、特徴抽出器だけ $L_d$ を最大化」というパラメータごとに符号の違う更新です。GRLは、特徴抽出器へ向かう経路にだけ符号反転を仕込むことで、これを自動微分の一本の逆伝播の中でピンポイントに実現します。単純な損失の付け替えでは達成できない「経路ごとの勾配の作り分け」こそ、GRLの存在意義なのです。

同じドメイン損失について、「GRLを通さずに特徴へ届く勾配」と「GRLを通して届く勾配」を並べたものです。両者は完全な鏡像になっており、相関係数はぴったり $-1.0$ です。GRLが確かに勾配の符号だけを反転している(大きさは $\lambda=1$ なので変えていない)ことが実測で確認できます。特徴抽出器は、この反転した勾配を受け取ることで、ドメイン損失を増やす=判別器を騙す方向へ更新されるわけです。
ここで一つ、実務上の勘どころがあります。反転の強さ $\lambda$ をどう設定するかです。
反転の強さ λ のスケジュール
$\lambda$ を最初から大きくすると、まだ何も学べていない未熟なドメイン判別器の勾配を反転して特徴抽出器に叩き込むことになり、特徴が壊れて学習が不安定になります。そこで、学習の序盤は $\lambda$ を小さく(ほぼ0)、進むにつれて徐々に大きくするスケジュールが定石です。原論文(Ganin & Lempitsky)では次の式が使われます。
$$ \lambda_p = \frac{2}{1 + \exp(-\gamma p)} – 1 $$
$p$ は学習の進捗(現在のエポック ÷ 全エポック、$0\to1$)、$\gamma$ は増加の急峻さ(たとえば10)です。

このスケジュールでは、序盤 $\lambda\approx0$ でまず特徴抽出器とラベル分類器・ドメイン判別器を素直に育て、判別器がある程度賢くなってから $\lambda$ を1へ近づけて本格的に敵対させます。「未熟な相手と戦っても意味がない、まず相手を育ててから戦う」という発想です。この地味なスケジューリングが、敵対的学習を安定させる実務上の鍵になります。
GRLは「逆伝播に細工をする層」でした。実は、同じ発想の兄弟がもう一人います。stop-gradientです。
stop-gradient との対比 — 「勾配手術」の一族
stop-gradient は、順伝播はそのまま通し、逆伝播だけ勾配を ゼロにする(遮断する)操作でした。GRLと並べてみると、両者が同じ家系に属することが見えてきます。どちらも「順伝播はいじらず、逆伝播で勾配に細工をする」——いわば 勾配手術(gradient surgery) です。違いは、勾配に掛ける係数だけです。

表のとおり、普通の恒等層は勾配に $\times 1$、stop-gradientは $\times 0$、GRLは $\times(-\lambda)$ を掛けます。
- stop-gradient($\times 0$):あるモジュールへ勾配を流したくないときに使う。自己教師あり学習の表現崩壊防止、ターゲットネットワークの固定、EMAティーチャーなど、「片方を止めて更新する」場面で活躍します。
- GRL($\times(-\lambda)$):あるモジュールに「損失を増やす方向」へ動いてほしいときに使う。敵対的学習、ドメイン不変化など、「片方を敵対させる」場面で活躍します。
$\times 1$ が協調(普通の学習)、$\times 0$ が中立(勾配を断つ)、$\times(-\lambda)$ が敵対(勾配を反転)——係数の符号と大きさだけで、モジュール間の関係を協調から敵対まで自在に設計できるのです。この視点を持つと、逆伝播は「ただ微分を流す仕組み」ではなく「モジュール間の力関係を設計する舞台」として見えてきます。
理屈が揃ったので、GRLが実際に効くところを見てみましょう。
DANNでの実測 — 本当にドメイン不変になるのか
2つの月形(moons)データを用意します。ソースはそのまま、ターゲットは40度回転させたものです。ラベル(上の月/下の月)は共通ですが、分布がずれているため、ソースだけで学んだ分類器はターゲットでうまく働きません。これは「訓練データと本番データの分布が違う」という現実の機械学習で頻出する状況の単純化版です。ここにGRL(DANN)を適用して、特徴・判別器・ターゲット精度がどう変わるかを観察します。

まずドメイン判別器の精度です。GRLなし(青)では、判別器は特徴を見てソースとターゲットを精度0.82で見分けられます。特徴がドメインごとに分かれてしまっている証拠です。GRLあり(赤)では、精度が0.57まで下がり、$0.5$(まったく見分けられない)に近づきます。GRLが特徴抽出器を「ドメインを見分けられない特徴」へと押しやったことがわかります。

特徴を2次元に投影して見ると、その様子が直感的にわかります。左(GRLなし)ではソース(青)とターゲット(橙)が特徴空間で別々の領域に分かれています。右(GRLあり)では両ドメインが同じ形に重なり合い、「どちらのドメインか区別がつかない」ドメイン不変な特徴になっています。狙いどおりです。

そして肝心の成果です。ターゲットドメインでのラベル分類精度は、GRLなし(ソースのみで学習)では0.59にとどまるのに対し、GRLあり(DANN)では0.92まで跳ね上がりました。ドメイン不変な特徴を学んだことで、ソースで訓練した分類器がターゲットにも通用するようになったのです。勾配を反転するだけの単純な層が、これだけの効果を生みます。
GRLの威力はドメイン適応に限りません。もっと一般的な道具です。
GRLの一般性 — 「ある属性を予測できなくしたい」全般に効く
GRLの本質は「ドメイン適応の道具」ではありません。特徴からある属性を予測できないようにしたい、というあらゆる要求に使える汎用の仕掛けです。予測させたくない属性を当てる判別器を立て、その手前にGRLを挟むだけでよいのです。

- ドメイン適応(DANN):ドメインラベルを予測不能に → ドメイン不変な特徴
- 公平な表現学習:性別・人種などの保護属性を予測不能に → 偏りを取り除いた表現
- テキストのスタイル除去:著者や感情を予測不能に → 内容だけを残した表現
- ドメイン汎化:複数の訓練ドメインを区別不能に → 未知ドメインへ汎化する特徴
いずれも「予測できなくしたい属性 → その判別器 → 手前にGRL」という同じレシピです。GRLは、深層学習で「情報を積極的に消す」ための標準的な道具箱の一つになっています。
たとえば公平な表現学習では、採用スコアや与信スコアを予測するモデルの特徴から、性別という保護属性を予測できないようにしたいとします。性別を当てる判別器を立て、その手前にGRLを挟んで一緒に学習すると、特徴抽出器は「本来のタスクには役立つが、性別の手がかりは残さない」表現へと誘導されます。判別器が性別を当てられなくなる(精度が偶然当てるレベルに落ちる)ほど、その特徴は性別情報を含まなくなった、と解釈できます。DANNのドメインラベルが保護属性に置き換わっただけで、仕掛けはまったく同じです。
注意点 — 万能ではない
GRLは強力ですが、敵対的学習ゆえの難しさもあります。第一に、$\lambda$ が大きすぎると特徴が壊れて本来のタスク(ラベル分類)の精度まで落ちるため、前述のスケジューリングや慎重なチューニングが要ります。第二に、特徴抽出器と判別器の強さのバランスが崩れると学習がうまくいきません。判別器が弱すぎると反転する勾配に意味がなく、強すぎると特徴抽出器が振り回されます。第三に、そもそも2つのドメインの差が大きすぎる場合(先の実測でも回転角を大きくしすぎると)、ドメイン不変化がラベル情報まで削ってしまい、かえって精度が落ちることがあります。「見分けられないようにする」ことと「タスクに必要な情報を残す」ことは、しばしば綱引きの関係にあるのです。GRLはこの綱引きを自動で回す便利な仕掛けですが、綱引きそのものが難しい問題であることは変わりません。
まとめ
本記事では、勾配反転層(GRL)を仕組みから解説しました。
- GRLの定義 — 順伝播は恒等 $R(\bm{x})=\bm{x}$、逆伝播だけ勾配を反転 $\frac{dR}{d\bm{x}}=-\lambda\bm{I}$。順伝播と逆伝播が食い違う「疑似関数」
- min-maxを1回のbackpropで — 判別器には勾配がそのまま、特徴抽出器には反転した勾配が届くので、単一損失の勾配降下だけで敵対的最適化が実現する。GANのような交互学習が不要
- 実装 — PyTorchの
autograd.Functionでforward(恒等)とbackward(反転)を定義するだけ。実測で勾配の符号反転(相関 $-1.0$)を確認 - λスケジュール — 序盤は弱く、判別器が育ってから強めるのが安定化の鍵
- 勾配手術の一族 — stop-gradient($\times 0$)と対をなす($\times(-\lambda)$)。係数で協調・中立・敵対を設計できる
- 一般性 — DANNは一応用。公平表現・スタイル除去など「ある属性を予測不能にしたい」全般に効く
「順伝播と逆伝播を別々に設計してよい」という自由度は、深層学習の隠れた強力な武器です。GRLとstop-gradientは、その自由度を使いこなす2つの基本操作。この視点を持つと、敵対的学習や自己教師あり学習の一見複雑な仕組みが、「勾配をどう流すか」という一段抽象化された目線で見通せるようになります。
次のステップとして、以下の記事も参考にしてください。