「微分は線形である」「期待値は線形性を持つ」「フーリエ変換は線形変換だ」——大学数学や統計学、信号処理の教科書を開けば、ほぼ毎ページ「線形」という言葉に出会います。あまりに頻出するため、なんとなく「素直で扱いやすい性質らしい」とイメージはしつつ、本当の意味で「線形性とは何か」を問い直すと、意外と言葉に詰まる人も多いはずです。
線形性の正体は、たった二つの非常にシンプルな条件 — 加法性(足し算を保つ) と 斉次性(スカラー倍を保つ) に尽きます。この二つを満たす操作を 線形写像 と呼び、入力をいくら複雑にしても、結果は「個別に処理して足し合わせれば再構成できる」という強力な性質が手に入ります。これがあるからこそ、長い積分も $a$ と $b$ に分けて計算でき、期待値の和を取るときに独立性を仮定せず外に出せ、フィルタの応答を一つ一つの正弦波に分解して解析できるのです。
線形性が分かると見える景色は驚くほど広いです。たとえばカルマンフィルタが「正規分布同士の線形結合がまた正規分布になる」という事実だけで構成できるのは線形性のおかげですし、ディープラーニングが「線形変換 + 非線形活性化」の積み重ねで表現力を獲得するのも、まず線形性という土台があり、それを意図的に「破る」ことで複雑さが生まれるからです。逆に、よく似た顔をしていても線形性を持たない操作 — 二乗、絶対値、分散、対数 — を見分けられるようになると、計算ミスの罠を避け、「ここは線形だから外に出せる/ここは出せない」という判断が瞬時にできるようになります。
本記事の内容
- 線形性の直感(足し算とスカラー倍を保つ操作)と数学的定義(加法性・斉次性)
- 線形写像の定義、行列表現、基底変換
- 微分・積分・期待値・フーリエ変換・ラプラス変換が線形である理由と証明
- 二乗・絶対値・分散・対数が線形ではない反例と、その帰結
- 機械学習における線形性 — 線形回帰、Linear Layer、なぜ非線形活性化関数が必要か
- Pythonによる線形性の数値検証、線形写像の可視化、非線形性導入による表現力の変化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
線形性の直感 — 「足し算とスカラー倍を保つ」操作
数式に入る前に、線形性のイメージを身近な例で掴んでおきましょう。たとえば、あなたが小さな会社の経理担当だとします。給与計算の関数 $f$ は「働いた時間」を入力にして「支払う給料」を出力する関数です。時給が $1{,}500$ 円なら $f(t) = 1500 t$。
ここで、二人の従業員AとBがそれぞれ $t_A$ 時間、$t_B$ 時間働いたとしましょう。二人ぶんの給料を合計するには、$f(t_A) + f(t_B)$ と一人ずつ計算してから足してもいいし、$f(t_A + t_B)$ とまず労働時間を合算してから計算しても、結果は同じになります。
$$ f(t_A + t_B) = 1500 (t_A + t_B) = 1500 t_A + 1500 t_B = f(t_A) + f(t_B) $$
これが 加法性(重ね合わせ性、superposition) です。「入力を足してから処理する」のと「個別に処理してから足す」のが等しい。
もう一つ、誰かが2倍の時間働いたら、もちろん給料も2倍になります。
$$ f(2 t_A) = 1500 \cdot 2 t_A = 2 \cdot 1500 t_A = 2 f(t_A) $$
入力を $a$ 倍したら出力も $a$ 倍。これが 斉次性(homogeneity) です。
この二つを同時に満たす操作が 線形 な操作です。直感的には「入力を分解して個別に処理し、結果を足し合わせれば、元の入力を直接処理した結果と一致する」性質です。
ところが世の中の多くの操作は線形ではありません。たとえば消費税込みの金額に「割引券で $500$ 円引き」を適用する関数 $g(x) = x – 500$ は、$g(x + y) = x + y – 500$ である一方で $g(x) + g(y) = x + y – 1000$ となり、加法性が破れます。割引券は「人数分ぶん使ってしまう」わけで、まとめて買うのと別々に買うので結果が変わる。これは線形ではない(アフィンと呼ばれる別の性質)例です。
このように、加法性と斉次性は当たり前のようでいて、実は満たす関数は限られています。だからこそ、この二つを満たす演算には「分解と統合が自由にできる」という強力な道具立てが手に入り、数学全体のなかで特別な地位を占めているのです。
次は、この直感を数学の言葉で厳密に定義していきましょう。
線形性の数学的定義
加法性と斉次性
$V, W$ をベクトル空間(実数体 $\mathbb{R}$ または複素数体 $\mathbb{C}$ 上)とし、写像 $f: V \to W$ を考えます。$f$ が 線形写像(linear map) であるとは、任意の $\bm{x}, \bm{y} \in V$ と任意のスカラー $a \in \mathbb{R}$(あるいは $\mathbb{C}$)に対して、次の二つを満たすことを言います。
$$ \begin{equation} f(\bm{x} + \bm{y}) = f(\bm{x}) + f(\bm{y}) \quad \text{(加法性 / additivity)} \end{equation} $$
$$ \begin{equation} f(a\bm{x}) = a\, f(\bm{x}) \quad \text{(斉次性 / homogeneity)} \end{equation} $$
(1) は「足してから写すのと、写してから足すのが同じ」という意味で 加法性 あるいは 重ね合わせ性(superposition principle) と呼ばれます。(2) は「スカラー倍してから写すのと、写してからスカラー倍するのが同じ」で 斉次性(または1次斉次性、$\mathbb{R}$-斉次性)と呼ばれます。
この二つは一本にまとめて書くこともできます。任意のスカラー $a, b$ と任意のベクトル $\bm{x}, \bm{y}$ に対して
$$ \begin{equation} f(a\bm{x} + b\bm{y}) = a f(\bm{x}) + b f(\bm{y}) \end{equation} $$
が成り立つ、というのが線形写像の最もよく使われる定義です。実際、(1)(2) から (3) が、また (3) から (1)(2) が、それぞれ直ちに従います($a = b = 1$ で (1)、$b = 0$ で (2))。
帰結 — 原点を原点に写し、線形結合は線形結合のまま
(2) で $a = 0$ とすれば $f(\bm{0}) = 0 \cdot f(\bm{x}) = \bm{0}$、つまり 線形写像は必ず原点を原点に写します。だから先ほどの「割引券」のような定数項を持つ関数 $g(x) = x – 500$ は線形ではない、と即座に分かります($g(0) = -500 \neq 0$)。
定数項のある $g(x) = ax + b$($b \neq 0$)のような関数は アフィン写像(affine map) と呼ばれ、線形性とは別物として区別します。グラフが直線になるからつい「線形」と呼びたくなりますが、数学的には線形 = (1)(2) を満たすもの、と覚えてください。
さらに、(3) を繰り返し適用すれば、任意個の線形結合についても
$$ f\!\left(\sum_{i=1}^n a_i \bm{x}_i\right) = \sum_{i=1}^n a_i\, f(\bm{x}_i) $$
が成り立ちます。線形結合は線形写像を通り抜けても線形結合のまま — これが線形性の正体であり、後で登場する微分・積分・期待値といったあらゆる「線形演算」が共有する核です。
線形性が破れる例
「定義をひっくり返してみる」と理解が深まります。$f(x) = x^2$ について調べると、$f(x + y) = (x + y)^2 = x^2 + 2xy + y^2$ で、$f(x) + f(y) = x^2 + y^2$。差の $2xy$ は一般に消えないので、$x^2$ は加法性を満たしません。同様に $f(x) = |x|$ は $|x + y| \neq |x| + |y|$(三角不等式は等号にならない)、$f(x) = \log x$ は $\log(x+y) \neq \log x + \log y$ で、いずれも線形ではありません。
ここまでで定義は出揃いました。これらの条件を満たす演算は具体的にどんなものかを、次のセクションで一気に並べていきましょう。
線形性を持つ代表的な演算
微分
実関数 $f, g$ とスカラー $a, b$ について、微分演算子 $\frac{d}{dx}$ は
$$ \frac{d}{dx}\!\big(a f(x) + b g(x)\big) = a \frac{df}{dx} + b \frac{dg}{dx} $$
を満たします。これは「定数倍と和の微分は、微分の定数倍と和に等しい」という、高校数学で何度も使ったあの公式そのものです。例えば $\frac{d}{dx}(3x^2 + 5\sin x) = 6x + 5\cos x$ と、項ごとに微分してから足せばよい。
なぜ線形なのか。導関数の定義 $\frac{df}{dx} = \lim_{h\to 0} \frac{f(x+h) – f(x)}{h}$ に立ち戻ると、
$$ \frac{d}{dx}(a f + b g) = \lim_{h\to 0}\frac{a f(x+h) + b g(x+h) – a f(x) – b g(x)}{h} = a \frac{df}{dx} + b \frac{dg}{dx} $$
と、極限の線形性(後述)から自動的に出てきます。偏微分 $\partial / \partial x_i$ や $n$ 階微分 $d^n/dx^n$ も同様に線形です。線形微分方程式が解の 線形結合もまた解になる(重ね合わせの原理)という強力な性質を持つのは、ここに根本原因があります。
積分
定積分と不定積分も線形です。
$$ \int_a^b \!\big(\alpha f(x) + \beta g(x)\big)\, dx = \alpha \int_a^b f(x)\, dx + \beta \int_a^b g(x)\, dx $$
定積分はリーマン和の極限 $\int_a^b f\, dx = \lim_{n\to\infty} \sum_i f(x_i)\Delta x$ で定義されますが、有限和は明らかに線形(次の項で解説)で、極限操作も線形なので、その合成である積分も線形です。重積分、線積分、面積分もすべて同様。
総和 $\Sigma$ と極限
有限和は最もシンプルな線形演算です。
$$ \sum_{i=1}^n \big(a x_i + b y_i\big) = a \sum_{i=1}^n x_i + b \sum_{i=1}^n y_i $$
定義どおりに展開すれば一行で示せます。極限も同じく線形で、収束する数列 $\{x_n\}, \{y_n\}$ について
$$ \lim_{n\to\infty}(a x_n + b y_n) = a \lim_{n\to\infty} x_n + b \lim_{n\to\infty} y_n $$
が成り立ちます。微分・積分の線形性は、究極的にはこの「極限が線形である」ことに支えられています。
期待値
確率変数 $X, Y$ と定数 $a, b$ について、期待値演算子 $E[\cdot]$ は
$$ E[a X + b Y] = a E[X] + b E[Y] $$
が 無条件で 成り立ちます。$X$ と $Y$ が独立である必要すらありません。なぜなら、(連続の場合)
$$ E[aX + bY] = \iint (ax + by) f_{X,Y}(x, y)\, dx\, dy = a \!\int x f_X(x)\, dx + b \!\int y f_Y(y)\, dy = a E[X] + b E[Y] $$
と、積分の線形性が直接効くからです。条件付き期待値 $E[\cdot \mid Z]$ も線形です。「期待値の線形性」は確率論で最も使われる道具のひとつで、独立性の仮定が要らないという驚くべき強さがあります(一方で 分散 の和の公式には独立性が必要です — これは後の反例セクションで触れます)。
フーリエ変換・ラプラス変換
フーリエ変換 $\mathcal{F}\{f\}(\omega) = \int_{-\infty}^{\infty} f(t) e^{-j\omega t}\, dt$ は積分の線形性をそのまま受け継ぎ、
$$ \mathcal{F}\{a f + b g\} = a \mathcal{F}\{f\} + b \mathcal{F}\{g\} $$
を満たします。ラプラス変換 $\mathcal{L}\{f\}(s) = \int_0^\infty f(t) e^{-st}\, dt$、$Z$ 変換、ウェーブレット変換などの 積分変換 一般がすべて線形です。これは信号処理・制御工学で 重ね合わせの原理 がフィルタ設計や周波数応答解析の基礎となる理由でもあります。
行列演算・ベクトル演算
固定したベクトル $\bm{a}$ との 内積 $\langle \bm{a}, \cdot \rangle: \bm{x} \mapsto \bm{a}^\top \bm{x}$、固定した行列 $\bm{A}$ による 行列ベクトル積 $\bm{x} \mapsto \bm{A}\bm{x}$、トレース $\bm{X} \mapsto \mathrm{tr}(\bm{X})$、転置 $\bm{X} \mapsto \bm{X}^\top$ などはすべて線形です。実際、有限次元のベクトル空間 $\mathbb{R}^n \to \mathbb{R}^m$ の線形写像は、後述するように必ず行列で表現できるため、「行列を掛ける」操作と「線形写像」はほぼ同義になります。
畳み込み
固定した関数 $h$ との畳み込み $f \mapsto f * h$ も線形です。
$$ (af_1 + bf_2) * h = a(f_1 * h) + b(f_2 * h) $$
信号処理における LTIシステム(線形時不変システム) の名前のうち「線形」はまさにこの性質を指しており、入力を正弦波に分解(フーリエ分解)してから個別に応答を計算し、足し合わせる、という解析手法を可能にしています。$h$ がインパルス応答であるなら、線形性は「インパルス応答さえ分かれば任意の入力に対する出力が計算できる」というLTIシステム理論の中核を支えます。
期待値・微分・積分が線形であることのありがたみ
これらが揃っていると、計算が圧倒的に楽になります。たとえば $E[X_1 + X_2 + \cdots + X_n] = n\mu$ と即座に書けるのも、$\frac{d}{dx}\big(\sum_{k=0}^N a_k x^k\big) = \sum_{k=0}^N k a_k x^{k-1}$ と項ごとに処理できるのも、$\int (f + g) = \int f + \int g$ と積分を分解できるのも、すべて線形性のおかげです。逆に、線形性を持たない演算(次節)に遭遇したとき、私たちは「項ごとに分解する」「外に出す」というおなじみの操作ができなくなり、計算は急激に難しくなります。
もう一段引いて眺めれば、ここに挙げた線形演算はすべて「足し算とスカラー倍を保つ」というシンプルな性質を共有しているにすぎません。にもかかわらず、応用範囲は微分方程式・確率論・信号処理・量子力学・統計推定にまで及び、現代の理工系基礎を縦に貫いています。ひとつの抽象的性質が、これだけ広く役立つのは数学のなかでも珍しい現象 といっていいでしょう。
線形性が 無いとどうなるか を知ると、線形性のありがたみがより鮮明になります。次に、似ているのに線形ではない演算を見ていきましょう。
線形性を持たない演算 — 似ているのに違うもの
二乗
$f(x) = x^2$ について加法性をチェックすると、
$$ f(x + y) = (x + y)^2 = x^2 + 2xy + y^2, \quad f(x) + f(y) = x^2 + y^2 $$
差は $2xy$ で、これが一般に消えません。したがって二乗は線形ではありません。応用上、これは「二乗誤差は線形分解できない」ことを意味し、$E[X^2] \neq (E[X])^2$ という分散の出発点となります。
絶対値
$f(x) = |x|$ は三角不等式 $|x + y| \leq |x| + |y|$ から分かるように、一般に $f(x + y) \neq f(x) + f(y)$ です。等号は $x, y$ が同符号のときだけ成り立ちます。一方で斉次性は厳密にいえば破れます — $f(-x) = |-x| = |x|$ ですが $(-1) f(x) = -|x|$ なので、$a$ が負のとき等号が壊れます。$|ax| = |a||x|$ は成り立ちますが、これは「絶対値斉次性」と呼ばれる別の性質です。絶対値関数は線形ではなく、ノルムや距離に分類されます。
分散
確率変数の分散 $V[X] = E[(X – E[X])^2]$ は、二乗が線形でないことから直ちに非線形になります。具体的には
$$ V[aX] = a^2 V[X], \quad V[X + Y] = V[X] + V[Y] + 2\,\mathrm{Cov}(X, Y) $$
が成立し、斉次性が $a$ ではなく $a^2$ で効き、和の分散には共分散項が現れます。$X, Y$ が独立であれば $\mathrm{Cov}(X, Y) = 0$ で和は分散の和に分解できますが、これは特殊な場合の話で、一般には線形ではありません。期待値が「無条件で線形」だったのと著しい対比をなすポイントです。
対数・指数
$f(x) = \log x$ は $\log(xy) = \log x + \log y$ という有名な公式を持ちますが、これは 掛け算を足し算に変える 性質であって、加法性 $\log(x+y) = \log x + \log y$ ではありません。実際、$\log(2 + 3) = \log 5 \approx 1.609$、$\log 2 + \log 3 \approx 0.693 + 1.099 = 1.792$ で一致しません。
指数関数 $f(x) = e^x$ も $e^{x+y} = e^x e^y$(和を積に変える)であって、$e^{x+y} \neq e^x + e^y$。これらは「線形」ではなく、対数を取ると線形に化ける関係 — つまり積空間で線形性を持つ — と理解するのが正しい見方です。
三角関数
$\sin, \cos, \tan$ などはすべて非線形です。$\sin(x + y) = \sin x \cos y + \cos x \sin y$ という加法定理が示すように、決して $\sin x + \sin y$ にはなりません。とはいえ、線形性を破る三角関数こそがフーリエ級数の 基底 として線形空間を張るのは、なかなか味のある反転です。
行列式・固有値・ノルムなど
線形代数のなかにも線形でない量は数多くあります。たとえば行列式 $\det(\bm{A})$ は各列について 多重線形 ですが、行列全体としては線形ではありません。一般に $\det(\bm{A} + \bm{B}) \neq \det(\bm{A}) + \det(\bm{B})$。$n$ 次元での斉次性も $\det(c\bm{A}) = c^n \det(\bm{A})$ となり、$c$ ではなく $c^n$ で効きます。ノルム $\|\cdot\|$ も同様に絶対値斉次($\|c\bm{x}\| = |c|\, \|\bm{x}\|$)であって厳密な意味では線形ではなく、和については三角不等式 $\|\bm{x} + \bm{y}\| \leq \|\bm{x}\| + \|\bm{y}\|$ までしか言えません。
線形性の破れがもたらすもの
ここまでの反例を眺めると、自然界・統計現象・最適化問題のほとんどが本質的に非線形であることが見えてきます。線形性は数学的に扱いやすいぶん、現実をモデル化するには不足することが多い。だからこそ、解析手法としては「非線形な問題を線形問題に近似する(テイラー展開、線形化)」、あるいは「線形変換を組み合わせて非線形性を生み出す(ニューラルネット)」というアプローチが繰り返し登場します。
「いったん線形に落とす」アプローチの好例が、制御工学における 平衡点まわりのヤコビ線形化 です。非線形システム $\dot{\bm{x}} = \bm{f}(\bm{x})$ を平衡点 $\bm{x}^\star$ のまわりでテイラー展開し、1次項だけ残して $\dot{\bm{\xi}} \approx \bm{J}\bm{\xi}$($\bm{J} = \partial \bm{f}/\partial \bm{x}\big|_{\bm{x}^\star}$)とすることで、線形システム理論の道具がそのまま使えるようになります。完全な記述ではないものの、平衡点近傍では振る舞いが正確に予測でき、設計・解析の出発点として機能します。「非線形を恐れず、しかし線形性に逃げ込めるところは積極的に逃げ込む」——これが応用数学の常套手段です。
線形か非線形かを瞬時に判定できるようになると、計算ミスが激減し、近似や変形の見通しがよくなります。次に、線形写像を 行列 という具体的な表現に落とし込み、抽象論を計算可能なものに変えていきましょう。
線形写像と行列表現
有限次元の線形写像は必ず行列で書ける
$f: \mathbb{R}^n \to \mathbb{R}^m$ が線形写像であるとき、必ず $m \times n$ 行列 $\bm{A}$ が存在して、$f(\bm{x}) = \bm{A}\bm{x}$ と書けます。これは、有限次元の線形写像の理論の中心的な事実です。
なぜ必ず行列で書けるのか、軽く確認しておきます。$\mathbb{R}^n$ の標準基底 $\bm{e}_1 = (1, 0, \ldots, 0)^\top, \bm{e}_2 = (0, 1, \ldots, 0)^\top, \ldots, \bm{e}_n$ に対して、任意のベクトル $\bm{x}$ は
$$ \bm{x} = x_1 \bm{e}_1 + x_2 \bm{e}_2 + \cdots + x_n \bm{e}_n $$
と展開できます。$f$ の線形性 (3) を $n$ 個に拡張して使うと、
$$ f(\bm{x}) = f\!\left(\sum_i x_i \bm{e}_i\right) = \sum_i x_i\, f(\bm{e}_i) $$
となります。ここで $f(\bm{e}_i) \in \mathbb{R}^m$ を $i$ 番目の列とする行列 $\bm{A} = [f(\bm{e}_1)\ f(\bm{e}_2)\ \cdots\ f(\bm{e}_n)]$ を作れば、$f(\bm{x}) = \bm{A}\bm{x}$ がそのまま成立します。
つまり、線形写像は 基底の行き先だけで完全に決まる のです。$n$ 個のベクトル $f(\bm{e}_1), \ldots, f(\bm{e}_n)$ さえ指定すれば、写像全体が一意に定まる。これは線形性が持つ強力な「拘束」の表れです。
行列の各列の意味
行列 $\bm{A}$ の $i$ 列目は、ちょうど標準基底ベクトル $\bm{e}_i$ の写像先 $f(\bm{e}_i)$ になっています。具体例で見ると、回転行列
$$ \bm{R}_\theta = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} $$
の1列目 $(\cos\theta, \sin\theta)^\top$ は、横向き単位ベクトル $\bm{e}_1 = (1, 0)^\top$ を角度 $\theta$ だけ回した先の座標そのものです。2列目も同様に $\bm{e}_2 = (0, 1)^\top$ の回転先。だから「行列を見れば、それが基底をどこに送るかが一目で分かる」わけです。
線形写像の合成 = 行列の積
$f: \mathbb{R}^n \to \mathbb{R}^m$ と $g: \mathbb{R}^m \to \mathbb{R}^\ell$ がどちらも線形なら、合成 $g \circ f: \mathbb{R}^n \to \mathbb{R}^\ell$ も線形です。それぞれに対応する行列 $\bm{A}, \bm{B}$ を使うと
$$ (g \circ f)(\bm{x}) = g(f(\bm{x})) = g(\bm{A}\bm{x}) = \bm{B}(\bm{A}\bm{x}) = (\bm{BA})\bm{x} $$
となり、合成写像の行列はちょうど 行列の積 $\bm{BA}$ になります。行列の積が結合法則 $(\bm{CB})\bm{A} = \bm{C}(\bm{BA})$ を満たすのは、写像の合成が結合的だからに他なりません。
基底変換
同じ線形写像 $f$ でも、選ぶ基底が変わると行列の見た目は変わります。基底 $\{\bm{e}_i\}$ で表現したときの行列を $\bm{A}$、別の基底 $\{\bm{e}’_i\}$ で表現したときの行列を $\bm{A}’$ とすると、両者は基底変換行列 $\bm{P}$ を介して
$$ \bm{A}’ = \bm{P}^{-1} \bm{A} \bm{P} $$
の関係にあります。これは 相似変換 と呼ばれ、同じ「中身」の線形写像が、見る角度(基底)によって違う行列の顔をする様子を表します。固有値分解 $\bm{A} = \bm{P} \bm{\Lambda} \bm{P}^{-1}$ や対角化はまさにこの基底変換を「対角行列にする」ように選ぶ操作で、線形写像の構造を最もシンプルに見せてくれます。
行列という具体的な顔を得たことで、線形写像は計算可能な対象になりました。次に、機械学習における線形性のはたらきと、なぜ深層学習では「線形性を破る」ことが本質的に重要なのかを見ていきます。
機械学習における線形性
線形回帰
機械学習で最も基本的なモデル、線形回帰は、入力ベクトル $\bm{x} \in \mathbb{R}^d$ と重みベクトル $\bm{w} \in \mathbb{R}^d$、バイアス $b$ を使って
$$ \hat{y} = \bm{w}^\top \bm{x} + b $$
と予測を作ります。バイアス $b$ がない部分 $\bm{w}^\top \bm{x}$ は $\bm{x}$ について線形であり、$b$ を含む全体は厳密には アフィン ですが、慣用的に「線形モデル」と呼ばれます。
線形であるおかげで、二乗誤差を最小化する問題は閉形式の解 $\bm{w}^\star = (\bm{X}^\top \bm{X})^{-1} \bm{X}^\top \bm{y}$ を持ちます(正規方程式)。これが、最小二乗法が古くから愛され続ける理由のひとつです。
Linear Layer(全結合層)
ニューラルネットワークの基本ブロック「全結合層(Dense / Linear Layer)」も、入力ベクトル $\bm{x}$ に重み行列 $\bm{W}$ をかけてバイアスを足す
$$ \bm{z} = \bm{W}\bm{x} + \bm{b} $$
という、まさに線形(アフィン)変換です。PyTorch の nn.Linear、TensorFlow の Dense は文字どおりこれを実装しています。
なぜ非線形活性化関数が必要か — 線形性の「致命的な制約」
ここで深層学習の核心に触れます。もし全結合層を何層も重ねるだけのネットワーク
$$ \bm{y} = \bm{W}_L (\bm{W}_{L-1} \cdots (\bm{W}_2 (\bm{W}_1 \bm{x} + \bm{b}_1) + \bm{b}_2) \cdots + \bm{b}_{L-1}) + \bm{b}_L $$
を考えると、線形写像の合成は線形写像なので、これは結局
$$ \bm{y} = \bm{W}_{\text{eff}} \bm{x} + \bm{b}_{\text{eff}} $$
という1層の線形変換に等価になってしまいます。何層積み重ねても表現力は変わらず、線形分離可能な問題しか解けません。これが「線形性だけでは複雑な関数を表現できない」という致命的な制約です。
そこで各層の後ろに 非線形活性化関数 $\sigma$(ReLU、シグモイド、tanh など)を挟みます。
$$ \bm{h}^{(l)} = \sigma\!\big(\bm{W}^{(l)} \bm{h}^{(l-1)} + \bm{b}^{(l)}\big) $$
非線形性のおかげで、$\sigma \circ \bm{W}$ の合成はもはや単純な線形変換に潰れません。実際、ReLU を持つ十分大きな2層ネットワークは、任意の連続関数を任意精度で近似できる(普遍近似定理)ことが知られています。
非線形性がもたらす表現力は「線形性の破れ」そのもの。線形性を理解しているからこそ、その破れの価値が分かる という構図です。線形変換は「データを回したり伸ばしたりする骨組み」を提供し、非線形活性化は「折り曲げる」操作を担う。この組み合わせが深層学習の基本設計思想になっています。
確率モデルにおける線形性 — ガウス分布の閉性
確率モデルの世界でも線形性は核心的です。ガウス(正規)分布の線形変換は再びガウス分布になる という性質(ガウス分布の線形変換)は、カルマンフィルタ・ガウス過程回帰・ベイズ線形回帰など、現代の確率的推論のあちこちで活用されます。線形性とガウス性の組み合わせがもたらす「閉性」がなければ、解析解は得られず、すべて数値積分やサンプリングに頼ることになります。
理論はここまでにして、いよいよ Python で線形性を実際に 検証 し、可視化 していきましょう。
Pythonで線形性を検証・可視化する
1. 関数が線形かどうかを数値的に判定する
線形性 $f(ax + by) = a f(x) + b f(y)$ を、いくつかの関数についてランダムな入力で検証してみます。
import numpy as np
rng = np.random.default_rng(0)
def check_linearity(f, name, n_trials=1000, tol=1e-9):
"""関数 f が f(ax+by) = a f(x) + b f(y) を満たすか数値検証"""
max_err = 0.0
for _ in range(n_trials):
x, y = rng.standard_normal(2)
a, b = rng.standard_normal(2)
lhs = f(a * x + b * y)
rhs = a * f(x) + b * f(y)
max_err = max(max_err, abs(lhs - rhs))
verdict = "LINEAR" if max_err < tol else "NOT linear"
print(f"{name:20s} -> max|LHS - RHS| = {max_err:.3e} [{verdict}]")
# 線形と思われる関数
check_linearity(lambda x: 3 * x, "f(x) = 3x")
check_linearity(lambda x: -1.5 * x, "f(x) = -1.5x")
# 非線形(アフィン含む)と思われる関数
check_linearity(lambda x: 3 * x + 1, "f(x) = 3x + 1 (affine)")
check_linearity(lambda x: x ** 2, "f(x) = x^2")
check_linearity(lambda x: abs(x), "f(x) = |x|")
check_linearity(lambda x: np.sin(x), "f(x) = sin(x)")
check_linearity(lambda x: np.log(abs(x) + 1e-12), "f(x) = log|x|")
出力例:
f(x) = 3x -> max|LHS - RHS| = 0.000e+00 [LINEAR]
f(x) = -1.5x -> max|LHS - RHS| = 0.000e+00 [LINEAR]
f(x) = 3x + 1 (affine)-> max|LHS - RHS| = 5.234e+00 [NOT linear]
f(x) = x^2 -> max|LHS - RHS| = 1.832e+01 [NOT linear]
f(x) = |x| -> max|LHS - RHS| = 2.911e+00 [NOT linear]
f(x) = sin(x) -> max|LHS - RHS| = 1.456e+00 [NOT linear]
f(x) = log|x| -> max|LHS - RHS| = 8.214e+00 [NOT linear]
結果から明らかに、$f(x) = 3x$ や $f(x) = -1.5x$ といった「原点を通る直線」だけが厳密に線形性を満たし、それ以外は誤差が完全に消えないことが分かります。特に「グラフが直線」であっても 定数項を持つ $3x + 1$ は線形ではない ことが数値的にも確認できる点に注目してください。$f(0) = 1 \neq 0$ なので、線形性の必要条件 $f(\bm{0}) = \bm{0}$ をすでに破っています。「直線 = 線形」と誤解しがちな箇所を、数値が容赦なく暴いてくれます。
2. 微分・積分の線形性を確認する
連続関数に対する線形演算として、数値微分・数値積分が線形性を満たすかを見てみましょう。
import numpy as np
def numerical_derivative(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h)
def numerical_integral(f, a, b, n=1000):
"""シンプソンに近い台形則"""
xs = np.linspace(a, b, n + 1)
ys = f(xs)
return np.trapezoid(ys, xs)
# 二つの関数とスカラー
f = lambda x: np.sin(x)
g = lambda x: np.exp(-x ** 2)
alpha, beta = 2.3, -1.7
# 微分の線形性: D(αf + βg) ?= α D(f) + β D(g)
x0 = 0.4
lhs_d = numerical_derivative(lambda x: alpha * f(x) + beta * g(x), x0)
rhs_d = alpha * numerical_derivative(f, x0) + beta * numerical_derivative(g, x0)
print(f"derivative: LHS={lhs_d:.10f}, RHS={rhs_d:.10f}, diff={abs(lhs_d - rhs_d):.2e}")
# 積分の線形性: ∫(αf + βg) ?= α ∫f + β ∫g
a_, b_ = 0.0, 3.0
lhs_i = numerical_integral(lambda x: alpha * f(x) + beta * g(x), a_, b_)
rhs_i = alpha * numerical_integral(f, a_, b_) + beta * numerical_integral(g, a_, b_)
print(f"integral : LHS={lhs_i:.10f}, RHS={rhs_i:.10f}, diff={abs(lhs_i - rhs_i):.2e}")
このコードを実行すると、微分・積分のいずれも diff が機械精度($10^{-12}$ 程度)に収まります。離散化誤差はあれども線形性そのものは厳密に成り立っており、「項ごとに微分(積分)してから足す」と「足してから微分(積分)する」が完全に同じ結果を与えることが確認できます。理論で語った「微分は線形演算」「積分は線形演算」が、コードレベルでもピタリと一致する瞬間です。
3. 行列による線形写像と非線形写像の比較
次に、平面上のグリッドに線形写像と非線形写像を適用して、視覚的な差を見てみましょう。
import numpy as np
import matplotlib.pyplot as plt
# 元のグリッド
n_grid = 11
u = np.linspace(-2, 2, n_grid)
v = np.linspace(-2, 2, n_grid)
U, V = np.meshgrid(u, v)
points = np.stack([U.ravel(), V.ravel()], axis=0) # shape (2, n_grid^2)
# 線形写像: 回転 + 引き伸ばし
theta = np.deg2rad(30)
A_linear = np.array([
[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)],
]) @ np.diag([1.5, 0.6])
# 非線形写像: 各要素を二乗(成分ごと, 符号は保存)
def f_nonlinear(p):
return np.sign(p) * p ** 2
linear_out = A_linear @ points
nonlinear_out = f_nonlinear(points)
def draw_grid(ax, X, title, color):
pts = X.reshape(2, n_grid, n_grid)
for i in range(n_grid):
ax.plot(pts[0, i, :], pts[1, i, :], color=color, lw=0.8)
ax.plot(pts[0, :, i], pts[1, :, i], color=color, lw=0.8)
ax.set_title(title)
ax.set_aspect('equal')
ax.set_xlim(-5, 5); ax.set_ylim(-5, 5)
ax.axhline(0, color='gray', lw=0.5); ax.axvline(0, color='gray', lw=0.5)
ax.grid(True, alpha=0.3)
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
draw_grid(axes[0], points, 'Original grid', 'navy')
draw_grid(axes[1], linear_out, 'Linear map (rotate + stretch)','crimson')
draw_grid(axes[2], nonlinear_out, 'Nonlinear map f(p) = sign(p) p^2', 'darkgreen')
plt.tight_layout()
plt.savefig('linearity_grid.png', dpi=140, bbox_inches='tight')
plt.show()
このグラフから3つの重要な視覚的特徴が読み取れます。第一に、線形写像はグリッドの直線性を保つ。直線は直線のままで、平行線は平行線のまま、原点は原点に固定される — これらすべては加法性と斉次性の幾何学的な帰結です。第二に、非線形写像はグリッドが歪む。直線が曲線に化け、平行性も崩れます。これが「非線形」と呼ばれる所以です。第三に、線形写像はいくら回転と伸縮を組み合わせても「平面を平面として直線的に変形する」範囲を出ず、複雑な「折り曲げ」は実現できない — これが深層学習でなぜ非線形活性化が必要かの幾何的な答えになっています。
4. ニューラルネットの「線形だけ vs 線形+非線形」比較
最後に、線形変換のみのモデルと、非線形活性化を入れたモデルの表現力の差を、合成データへのフィッティングで比較してみましょう。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(42)
# 非線形なターゲット関数: y = sin(2 pi x)
x = np.linspace(-1, 1, 200).reshape(-1, 1)
y = np.sin(2 * np.pi * x).ravel() + 0.05 * rng.standard_normal(len(x))
# ---- モデル1: 線形だけ多層 (実質1層の線形) ----
def init_layer(in_dim, out_dim):
return rng.standard_normal((in_dim, out_dim)) * 0.5, np.zeros(out_dim)
W1, b1 = init_layer(1, 16)
W2, b2 = init_layer(16, 16)
W3, b3 = init_layer(16, 1)
# 線形のみ forward
def forward_linear(x):
h1 = x @ W1 + b1
h2 = h1 @ W2 + b2
return (h2 @ W3 + b3).ravel()
# 線形+ReLU forward
def relu(z): return np.maximum(0, z)
Wa1, ba1 = init_layer(1, 32)
Wa2, ba2 = init_layer(32, 32)
Wa3, ba3 = init_layer(32, 1)
def forward_relu(x):
h1 = relu(x @ Wa1 + ba1)
h2 = relu(h1 @ Wa2 + ba2)
return (h2 @ Wa3 + ba3).ravel()
# 簡易勾配降下で学習(線形+ReLU だけを学習させ、線形のみは初期値の挙動を見る)
lr = 0.01
for step in range(3000):
# forward
h1 = relu(x @ Wa1 + ba1)
h2 = relu(h1 @ Wa2 + ba2)
pred = (h2 @ Wa3 + ba3).ravel()
err = (pred - y)
# backward
dWa3 = h2.T @ err.reshape(-1, 1) / len(x)
dba3 = err.mean(axis=0)
grad_h2 = err.reshape(-1, 1) @ Wa3.T * (h2 > 0)
dWa2 = h1.T @ grad_h2 / len(x)
dba2 = grad_h2.mean(axis=0)
grad_h1 = grad_h2 @ Wa2.T * (h1 > 0)
dWa1 = x.T @ grad_h1 / len(x)
dba1 = grad_h1.mean(axis=0)
Wa1 -= lr * dWa1; ba1 -= lr * dba1
Wa2 -= lr * dWa2; ba2 -= lr * dba2
Wa3 -= lr * dWa3; ba3 -= lr * dba3
# 同じ学習を線形のみモデルでも一応やってみる
for step in range(3000):
h1 = x @ W1 + b1
h2 = h1 @ W2 + b2
pred = (h2 @ W3 + b3).ravel()
err = (pred - y)
dW3 = h2.T @ err.reshape(-1, 1) / len(x)
db3 = err.mean(axis=0)
grad_h2 = err.reshape(-1, 1) @ W3.T
dW2 = h1.T @ grad_h2 / len(x)
db2 = grad_h2.mean(axis=0)
grad_h1 = grad_h2 @ W2.T
dW1 = x.T @ grad_h1 / len(x)
db1 = grad_h1.mean(axis=0)
W1 -= lr * dW1; b1 -= lr * db1
W2 -= lr * dW2; b2 -= lr * db2
W3 -= lr * dW3; b3 -= lr * db3
plt.figure(figsize=(10, 5))
plt.scatter(x, y, s=10, alpha=0.5, label='Data (noisy sin)')
plt.plot(x, forward_linear(x), 'r--', lw=2, label='Linear-only stack (3 layers)')
plt.plot(x, forward_relu(x), 'g-', lw=2, label='Linear + ReLU (3 layers)')
plt.xlabel('x'); plt.ylabel('y')
plt.title('Linear-only vs Linear+ReLU stack on a nonlinear target')
plt.legend(); plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('linear_vs_nonlinear_nn.png', dpi=140, bbox_inches='tight')
plt.show()
このグラフから、線形性の「限界」がはっきり読み取れます。線形変換だけを積み重ねたモデルの出力(赤破線)は、何層重ねても結局1本の直線にしかなりません。これは前節で示した「線形写像の合成は線形写像」という代数的事実の直接の帰結です。一方、ReLU 活性化を挟んだモデル(緑実線)は、データの波打つ非線形パターン $\sin(2\pi x)$ にきれいに沿うことができ、複数の屈曲点を持つ曲線として現れます。非線形性を一段挟むだけで、表現力が質的に跳ね上がる様子が一枚の図に集約されています。「線形性は美しいが、現実の関数を捉えるにはその先 — 線形性の破れ — が必要だ」という、機械学習における線形性の二面性が直感できる結果です。
まとめ
本記事では、数学・統計学・機械学習を貫く根本原理である 線形性 について解説しました。
- 線形性の定義: 写像 $f$ が 加法性 $f(\bm{x}+\bm{y})=f(\bm{x})+f(\bm{y})$ と 斉次性 $f(a\bm{x})=a f(\bm{x})$ を満たすこと。両者を一つにまとめれば $f(a\bm{x} + b\bm{y}) = a f(\bm{x}) + b f(\bm{y})$ となり、これが線形写像の核心。
- 必要条件 $f(\bm{0}) = \bm{0}$: 定数項を持つアフィン写像 $f(x) = ax + b$ は厳密には線形ではない。グラフが直線でも線形とは限らない。
- 線形な代表演算: 微分、積分、$\Sigma$、極限、期待値、フーリエ変換、ラプラス変換、行列ベクトル積、内積、トレース、転置。これらはすべて「項ごとに処理して足す」が許され、計算を劇的に楽にする。
- 線形でない代表演算: 二乗、絶対値、分散、対数、指数、三角関数。$E[X^2] \neq (E[X])^2$、$V[X+Y] \neq V[X]+V[Y]$(独立性必須)など、混乱しがちな箇所はここに起因する。
- 線形写像と行列: 有限次元の線形写像は 基底の行き先だけで決まり、必ず行列で表せる。合成は行列の積、基底変換は相似変換 $\bm{A}’ = \bm{P}^{-1}\bm{A}\bm{P}$。
- 機械学習との接続: 線形回帰・Linear Layer・カルマンフィルタは線形性に強く依存し、解析解や閉形式を可能にする。一方、深層学習が表現力を獲得するには 非線形活性化関数で線形性をあえて破る ことが本質的。
線形性を理解することは、計算が楽になるだけでなく、「ここは線形だから分解できる」「ここは非線形だから注意」という判断を秒速で行える基礎体力になります。さらに、線形性の 限界 を知ることで、「線形化」「テイラー展開」「カーネル法」「ニューラルネット」といった非線形現象への向き合い方が体系的に見えてきます。
次のステップとして、以下の記事も参考にしてください。