📚 関連グループ教材
この用語の全体像を学ぶには、 横断的な教材で文脈を掴むのが効率的です。
🔎 深掘り解説
大域最適化アルゴリズム比較
手法 原理 適性
多スタートGD 異なる初期値で複数回 低次元、 滑らか
焼きなまし(SA) 確率的に悪化も許容 離散・連続OK
遺伝的アルゴリズム 進化に倣う 離散・組合せ
差分進化 群知能 連続、 高次元
ベイズ最適化 代理モデル 評価コスト高
分枝限定 枝刈り探索 離散の厳密解
深層学習での大域最小
意外なことに、 大規模NNでは「大域最小に近い局所最小がたくさんある」ことが理論/実験で示されています:
高次元では「悪い局所最小」より「鞍点」が問題
SGD のノイズが鞍点脱出に役立つ
過パラメータ化したNNは多くの最小が同程度に低い損失
つまり「大域最小に行かなくても十分」というのが現代の実用感覚
✅ 使う前のチェックリスト
☐ 大域最適解 が今のタスクに本当に適切か再確認した
☐ 前提条件(独立性、 正規性、 サンプル数等)を満たしているか確認した
☐ データの尺度・分布・欠損・外れ値を確認した
☐ 結果だけでなく「不確実性」(CI、 標準誤差)も把握した
☐ 解釈と限界を区別して文書化した
☐ 関連する別の手法と比較したうえで本手法を選んだ
☐ 落とし穴(このページの ⚠️ セクション)に該当しないか確認した
☐ 関連グループ教材で全体像と位置付けを把握した
📖 さらに学ぶには
本サイト内
論文一覧に戻る — 大域最適解 を実際に使った再現論文をハンズオン形式で読む
このページ上部の「🔗 関連用語」から派生概念へ
「📚 関連グループ教材」で横断的な学習教材へ
外部リソース
scikit-learn 公式ドキュメント — 標準実装と例
StatQuest with Josh Starmer (YouTube) — 直感的な統計/ML 解説
Cross Validated (Stack Exchange) — 統計/ML の質問サイト
arXiv — 最新の手法論文プレプリント
困ったときは
データの可視化(散布図、 ヒストグラム、 箱ひげ図)で異常を確認
サンプルサイズ・欠損・外れ値を確認
仮定が満たされているか診断(正規性検定、 等分散性検定など)
類似研究での標準的な手法を確認
結果を複数手法でクロスチェック(頑健性確認)
🔗 同カテゴリの他用語
📚 参考文献・出典
Boyd, S., Vandenberghe, L. (2004). Convex Optimization . Cambridge University Press.
Nocedal, J., Wright, S. J. (2006). Numerical Optimization . Springer.
Kingma, D. P., Ba, J. (2015). Adam: A Method for Stochastic Optimization. ICLR .
Kirkpatrick, S., Gelatt, C. D., Vecchi, M. P. (1983). Optimization by Simulated Annealing. Science , 220(4598).
Goodfellow, I., Bengio, Y., Courville, A. (2016). Deep Learning . MIT Press.
Snoek, J., Larochelle, H., Adams, R. P. (2012). Practical Bayesian Optimization of Machine Learning Algorithms. NeurIPS .
独立行政法人統計センター. SSDSE-B-2026. https://www.nstac.go.jp/use/literacy/ssdse/
🌟 拡張ハンドブック
📐 数理最適化の基礎理論
最適化問題は $\min_{x \in \mathcal{X}} f(x) \text{ s.t. } g_i(x) \leq 0, h_j(x) = 0$ の形で書けます。 ここで $f$ は目的関数、 $g_i$ は不等式制約、 $h_j$ は等式制約、 $\mathcal{X}$ は探索空間。 「大域最小」とはこの問題の解 $x^*$ で、 $f(x^*)$ が定義域全体で最小になる点。
凸最適化と非凸最適化の境界
性質 凸問題 非凸問題
大域最小の存在 あり あり(保証されるとは限らない)
大域最小の唯一性 強凸なら唯一 複数の可能性
局所最小=大域最小? ◎ Yes × No
勾配降下の収束 大域収束 局所最小・鞍点に止まる
実例 線形回帰、 ロジスティック回帰、 SVM ニューラルネット、 GMM、 K-means
SSDSE-B 例 「総人口を最小化する都道府県」(離散) 「複合指標で都市を分類」(K-means)
🎢 局所最小・鞍点・プラトーの違い
局所最小(Local Minimum)
定義 :$\nabla f(x) = 0$ かつ Hessian $H = \nabla^2 f(x)$ が正定値(全固有値が正)。 周囲のどの方向に動かしても関数値が増える。 ニューラルネットでは「学習が止まる」現象の典型原因と長らく思われていたが、 近年の研究では高次元では実は鞍点の方が圧倒的に多い ことが分かっている。
鞍点(Saddle Point)
定義 :$\nabla f(x) = 0$ かつ Hessian の固有値が正負混合。 ある方向では最小、 別方向では最大。 高次元(n 個の変数)では、 すべての方向で正になる確率は急激に低下し、 $2^{-n}$ のオーダー。 そのためパラメータ数百万のニューラルネットでは局所最小は事実上存在せず、 鞍点が支配的 。 SGD のノイズや Adam のモメンタムは鞍点脱出に有効。
プラトー(Plateau)
定義 :勾配がほぼゼロの広い領域。 学習が「停滞」する原因。 Sigmoid 関数の飽和領域や、 深層 NN の Vanishing Gradient で発生。 対策:ReLU、 Batch Normalization、 残差接続。
🚀 大域最適化アルゴリズム詳細
1. 確率的最適化(SGD + Momentum / Adam)
SGD(Stochastic Gradient Descent) :勾配を全データではなくミニバッチで推定。 ノイズが浅い局所最小から脱出させる。 Momentum :過去の勾配を蓄積し、 谷底を勢いよく通過。 Adam :Momentum + 適応学習率。 深層学習の標準。
更新式:$v_t = \beta_1 v_{t-1} + (1-\beta_1) \nabla f(x_t)$、 $s_t = \beta_2 s_{t-1} + (1-\beta_2) (\nabla f(x_t))^2$、 $x_{t+1} = x_t - \eta v_t / (\sqrt{s_t} + \epsilon)$。 デフォルト:$\beta_1=0.9, \beta_2=0.999, \eta=0.001$。
2. シミュレーテッドアニーリング(SA)
由来 :金属の徐冷(annealing)からの類推。 高温では結晶構造が動きやすく、 徐々に冷えるとエネルギー最小の構造に落ち着く。 アルゴリズム :初期解からランダムな近傍解を提案、 改善するなら受理、 悪化しても確率 $\exp(-\Delta E / T)$ で受理。 温度 $T$ を徐々に下げる。
保証 :温度を $T_k = c / \log(k)$ で下げれば、 確率 1 で大域最小に収束(Geman & Geman 1984)。 ただし収束は遅い。 現実には指数的冷却 $T_k = T_0 \alpha^k$($\alpha=0.95$)が多用される。
3. 遺伝的アルゴリズム(GA)
由来 :生物進化からの類推。 個体(候補解)の集団を、 選択・交叉・突然変異で世代更新。 適応度の高い個体が生き残る。 パラメータ :集団サイズ(50〜500)、 交叉率(0.6〜0.9)、 突然変異率(0.01〜0.1)。
4. ベイズ最適化
関数 $f$ をガウス過程 GP で確率モデル化し、 獲得関数(Expected Improvement、 UCB) を最大化する点で次の評価。 評価コストの高い関数(ハイパーパラメータ探索、 実験計画)に最適。 数百回程度の評価で大域最小に近づける。
5. 粒子群最適化(PSO)
鳥や魚の群れ行動からの類推。 各粒子が自分の最良点と群全体の最良点に引かれて移動。 連続変数で複雑な目的関数に強い。
6. 微分進化(DE)
3 個体のベクトル演算で次世代候補を生成。 連続最適化で堅牢。 scipy.optimize.differential_evolution に実装。
🧠 深層学習における大域最小の研究
Choromanska et al. (2015) 「The Loss Surfaces of Multilayer Networks」では、 深い NN の損失曲面はスピングラスモデルに似ており、 多数の局所最小が存在するが 大域最小に近いものが多い と示唆。 つまり「悪い局所最小」は実は少ない。
Dauphin et al. (2014) 「Identifying and attacking the saddle point problem」では、 高次元の非凸最適化で問題になるのは局所最小ではなく鞍点 と指摘。 鞍点脱出のための Saddle-Free Newton 法 を提案。
Mode connectivity (Garipov et al. 2018):訓練済みの異なる解は、 損失曲面上の低損失の経路 で繋がっている。 これも「悪い局所最小」が稀であることの証拠。
🎯 SSDSE-B-2026 での実演:複合指標の最適化
問題設定 :47 都道府県の「幸福度指数」を以下の重み付き和で定義:
$$H(w) = w_1 \cdot \text{出生率} + w_2 \cdot \text{雇用率} - w_3 \cdot \text{失業率} + w_4 \cdot \text{消費支出}$$
$w_i \geq 0, \sum w_i = 1$ の制約下で、 「日本全国の幸福度の標準偏差」を最小化 する $w$ を求める問題(地域格差最小化)。 これは制約付き連続最適化問題で、 線形ではないので非凸の可能性あり。 scipy.optimize.minimize で SLSQP 法を使えば解ける。
❓ FAQ・20 問
Q1: 局所最小と大域最小、 どう見分ける?
A: 一般的には不可能。 凸性が保証されているか、 多数の初期値から収束結果を比較。
Q2: 学習が止まったら、 局所最小?
A: 高次元では大半が鞍点。 学習率を一時的に上げる、 モメンタムを使う、 SGD ノイズを入れる。
Q3: マルチスタートとは?
A: 複数の初期値(5〜100 個)から並列に勾配降下を走らせ、 最良を採用。 大域最小を狙う実務テクニック。
Q4: 凸性をどう確認する?
A: Hessian の正定値性を確認(全固有値が非負)。 または、 2 点 $(x_1, x_2)$ で $f(\theta x_1 + (1-\theta) x_2) \leq \theta f(x_1) + (1-\theta) f(x_2)$ を確認。
Q5: シミュレーテッドアニーリングの冷却スケジュール
A: 理論的には対数冷却 $T_k = c/\log k$ で大域収束保証。 実用は指数冷却 $T_k = T_0 \alpha^k$($\alpha=0.95\sim0.99$)。
Q6: 遺伝的アルゴリズムは収束が遅い?
A: 一般に勾配ベース手法より遅い。 微分不可能・離散・組合せ最適化に強み。 連続なら differential_evolution か L-BFGS-B。
Q7: ベイズ最適化はいつ使う?
A: 1 回の関数評価が高コストな場合(実験、 ML ハイパーパラメータ)。 評価回数 50〜500 程度。
Q8: 制約付き最適化の解法
A: 等式制約は Lagrange 乗数法、 不等式制約は KKT 条件 + 内点法 / SQP。 scipy.optimize.minimize で SLSQP / COBYLA を選択。
Q9: 大域最小は必ず一意?
A: いいえ。 同じ最小値を持つ点が複数あり得る。 例:$f(x) = \cos(x)$ は $x = \pi + 2k\pi$ で大域最小(無限個)。
Q10: NN の大域最小に到達することは可能?
A: 理論的には可能(オーバーパラメータ化 NN は損失 0 達成可能)。 ただし実用上はそれを目指す必要なく、 汎化性能の方が重要。
Q11: 学習率(learning rate)はどう選ぶ?
A: ウォームアップ(最初は小さく徐々に大きく) + コサイン減衰や階段減衰。 学習率探索(LR finder)も有効。
Q12: バッチサイズと大域最小
A: 小バッチは「フラットな最小」へ収束(汎化良好)、 大バッチは「シャープな最小」(汎化悪化)の傾向。
Q13: スポット解として大域最小を「ほぼ」見つけるには?
A: 「99% の場合で 1% 以内」程度の確率的保証で十分。 マルチスタート + 局所最適化が現実的解。
Q14: scipy.optimize.minimize の method はどう選ぶ?
A: 滑らかな小規模 → BFGS / L-BFGS-B。 大規模 → L-BFGS-B / trust-constr。 制約付き → SLSQP。 非滑らか → Nelder-Mead。 大域 → differential_evolution / dual_annealing。
Q15: 整数計画問題は?
A: 分枝限定法(Branch-and-Bound)、 切除平面法、 動的計画法。 PuLP、 Pyomo、 Gurobi、 CPLEX で解ける。
Q16: TSP(巡回セールスマン)は大域最小?
A: NP 困難。 小規模(30 都市以内)は厳密解、 大規模はヒューリスティック(2-opt、 SA、 GA、 Concorde)で近似。
Q17: GAN の Nash 均衡と大域最小
A: GAN は min-max ゲームで、 Generator と Discriminator の Nash 均衡を求める。 単純な最小化と違い、 訓練の不安定性が課題。
Q18: 強化学習での大域最適
A: 価値関数の最大化が目標。 ε-greedy で探索、 経験リプレイで効率化。 局所最適に陥る危険は通常の最適化と同じ。
Q19: 凸関数の線形和も凸?
A: 非負係数なら YES。 凸関数 $f_i$ と $\alpha_i \geq 0$ で $\sum \alpha_i f_i$ も凸。
Q20: SSDSE-B-2026 で大域最小を学ぶには?
A: (1) 総人口最小県(鳥取)を全数探索 (2) 線形回帰の係数最適化(凸) (3) K-means クラスタリング(非凸、 初期値依存)の 3 段階で。
🏭 産業界の事例詳細(6 件・各 200 字超)
📘 ケース 1:AlphaFold によるタンパク質構造予測
DeepMind の AlphaFold2(2020)は、 タンパク質のアミノ酸配列から 3 次元構造を予測。 これは原理的には「自由エネルギーを最小化する構造」を探す大域最小問題。 探索空間は天文学的(10^300 通り以上)。
AlphaFold の戦略:(1) 進化情報(同源タンパク質のアラインメント)から物理的制約を学習、 (2) Transformer で構造の事前分布を推定、 (3) 反復改善で局所最適に収束。 結果、 既知の構造の 92% を実験誤差内で予測。 CASP14(2020 年)で従来手法を圧倒 、 構造生物学を一変させました。
📘 ケース 2:物流最適化のヤマト運輸事例
ヤマト運輸の宅配ネットワークは、 全国約 4,000 拠点 × 1 億 9,000 万個/年の配送を最適化。 「最短ルート + 最小燃料 + 時間制約」の多目的・非凸最適化問題 。
解法:(1) 階層的分解(拠点間のハブ&スポーク → 局所配送)、 (2) シミュレーテッドアニーリングで初期解、 (3) 2-opt 法で局所改善、 (4) 機械学習で需要予測(外生変数)。 結果、 走行距離 7% 削減、 CO₂ 排出 7% 削減、 ドライバーの労働時間 5% 削減。 大域最適とは言えなくとも「実用上十分良い解」を高速に得る。
📘 ケース 3:SSDSE-B-2026 で K-means の初期値依存性
SSDSE-B-2026 の都道府県を 4 クラスタに分けたいとき、 K-means クラスタリングを使います。 K-means は「クラスタ内分散の総和」を最小化する問題で、 非凸 です。 ランダム初期化だと毎回違うクラスタになります。
対策:(1) k-means++ で賢い初期化(最遠点を優先)、 (2) n_init=10 で 10 回ランしてベストを採用、 (3) シルエット係数で安定性確認、 (4) 「東京・神奈川・大阪・愛知」が安定して同じクラスタになるか確認。 これが大域最小(の良い近似)に近づく実用テクニック。
📘 ケース 4:金融ポートフォリオ最適化(Markowitz)
現代ポートフォリオ理論(Markowitz 1952、 ノーベル賞 1990)では、 期待リターン制約下でリスク(分散)最小化を解く。 これは凸 2 次計画で、 大域最小が解析的に求まる。
拡張:(1) 取引コスト・税金を加味すると非凸化、 (2) シャープレシオ最大化 は比例性で凸、 (3) 機械学習で期待リターン推定、 共分散行列推定が現代的アプローチ。 SSDSE-B-2026 のような地域経済指標の組合せ でも同様に「地域分散投資」の最適化が解ける。
📘 ケース 5:深層学習の損失曲面の地形
ResNet-50 や Transformer の損失関数は数百万次元の非凸関数 。 直感的には「無数の局所最小に陥りそう」だが、 実際は SGD で良い解が得られる。
理由(最近の研究):(1) 過剰パラメータ化(パラメータ数 > データ数)の領域では、 損失曲面は非常に平坦 、 (2) ほとんどの臨界点は鞍点 で、 SGD のノイズで脱出可能、 (3) Mode connectivity:異なる解が低損失パスで繋がっている。 つまり大域最小に到達せずとも、 「十分良い局所最小」で十分。
📘 ケース 6:シミュレーテッドアニーリングの実装
scipy.optimize.dual_annealing は、 シミュレーテッドアニーリングと局所最適化を組み合わせた強力なアルゴリズム。 例:47 都道府県の「総合幸福度(重み付き和)」を最大化する重みベクトル探索。
コード骨格:from scipy.optimize import dual_annealing; result = dual_annealing(lambda w: -happiness(w, data), bounds=[(0,1)]*4, maxiter=1000); print(result.x)。 1,000 回の評価で大域最大に近い解 を返す。 SSDSE-B-2026 のような中規模問題には十分。
📚 50 連発レシピ集
🧪 50 連発の最適化コードレシピ
from scipy.optimize import minimize — minimize import
res = minimize(lambda x: (x-3)**2, x0=0) — 簡単な凸問題
res.x — 最小点
res.fun — 最小値
res = minimize(f, x0, method='BFGS') — BFGS
res = minimize(f, x0, method='L-BFGS-B', bounds=[(0,10)]) — 制約付き
res = minimize(f, x0, method='Nelder-Mead') — 非滑らか
res = minimize(f, x0, method='SLSQP', constraints={'type':'eq', 'fun':g})
from scipy.optimize import dual_annealing — 焼きなまし
res = dual_annealing(f, bounds=[(-5,5),(-5,5)]) — 大域探索
from scipy.optimize import differential_evolution — DE
res = differential_evolution(f, bounds=[(-5,5)]*4)
from scipy.optimize import basinhopping — Basin Hopping
res = basinhopping(f, x0, niter=100)
import numpy as np; def gd(f, df, x0, lr=0.01, n=1000): x=x0; [x:=x-lr*df(x) for _ in range(n)]; return x
def sgd(grad, X, y, w0, lr=0.01, n=100): w=w0; ... — SGD
from sklearn.linear_model import SGDRegressor
SGDRegressor(loss='squared_error').fit(X, y)
import torch; opt = torch.optim.Adam(params, lr=0.001) — Adam
opt.zero_grad(); loss.backward(); opt.step()
opt = torch.optim.SGD(params, lr=0.01, momentum=0.9) — SGD+M
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=100)
scheduler = torch.optim.lr_scheduler.StepLR(opt, step_size=10, gamma=0.5)
import scipy.optimize as so; so.brute(f, ranges=((-2,2,0.1),)) — グリッド
from skopt import gp_minimize — Bayesian Optimization
res = gp_minimize(f, [(-5.0, 5.0)]*2, n_calls=50)
from hyperopt import fmin, tpe, hp — Hyperopt
best = fmin(f, hp.uniform('x', -5, 5), algo=tpe.suggest, max_evals=100)
import optuna — Optuna
study = optuna.create_study(direction='minimize')
study.optimize(lambda trial: f(trial.suggest_float('x',-5,5)), n_trials=100)
study.best_value; study.best_params
import pulp; prob = pulp.LpProblem('demo', pulp.LpMinimize) — 線形計画
x = pulp.LpVariable('x', 0); prob += 2*x; prob += x >= 1; prob.solve()
from pyomo.environ import * — Pyomo
import cvxpy as cp; x = cp.Variable(); prob = cp.Problem(cp.Minimize((x-3)**2)); prob.solve()
def f_nonconvex(x): return x**2 + 0.5*np.sin(5*x) — テスト関数
def rosenbrock(x): return (1-x[0])**2 + 100*(x[1]-x[0]**2)**2 — Rosenbrock
def himmelblau(x): return (x[0]**2+x[1]-11)**2 + (x[0]+x[1]**2-7)**2 — Himmelblau (大域最小 4 つ)
def ackley(x): n=len(x); ... — Ackley
def rastrigin(x): A=10; return A*len(x) + sum(xi**2 - A*np.cos(2*np.pi*xi) for xi in x)
def levy(x): ... — Levy
def schwefel(x): return 418.9829*len(x) - sum(xi*np.sin(np.sqrt(abs(xi))) for xi in x)
from sklearn.cluster import KMeans — K-means
km = KMeans(n_clusters=4, n_init=10, random_state=42).fit(X)
km.inertia_ — クラスタ内分散の和(最小化対象)
from sklearn.metrics import silhouette_score — シルエット
silhouette_score(X, km.labels_)
import numdifftools as nd; H = nd.Hessian(f)(x_star) — ヘシアン数値計算
np.linalg.eigvalsh(H) — 固有値で凸性判定
📘 体系的解説(拡張版)
📜 大域最適化の歴史
古典最適化(19 世紀)
Lagrange (1797)の乗数法、 Fourier (1826)の線形不等式、 Cauchy (1847)の最急降下法など、 微分積分学の延長で最適化が体系化。 ただし「大域」と「局所」の区別はまだ明確でなく、 ほとんどは凸問題(あるいは局所解が大域解と一致する場合)が対象でした。
線形計画と凸計画(20 世紀前半〜中盤)
Dantzig (1947)のシンプレックス法は線形計画問題に対する大域最適化を初めて実用的に解いた。 Karmarkar (1984)の内点法は多項式時間で解け、 LP の地位を確立。 凸計画は大域最小 = 局所最小 なので、 これらは「大域」を意識する必要がなかった。
非凸大域最適化(1970 年代〜)
Kirkpatrick, Gelatt, Vecchi (1983)「Optimization by Simulated Annealing」Science がシミュレーテッドアニーリングを提唱、 大域最適化を実用化。 Holland (1975)の遺伝的アルゴリズム、 Glover (1986)のタブーサーチ、 Eberhart & Kennedy (1995)の粒子群最適化が続く。 ベイズ最適化は Mockus (1978)が起源で、 Snoek et al. (2012)が機械学習に応用して再評価。
深層学習時代(2010 年代〜)
深層学習の非凸損失曲面の探索手法として、 Adam (Kingma & Ba 2015)、 RMSprop (Hinton 講義 2012)、 SGD with Momentum + Warm Restarts (Loshchilov & Hutter 2016)などが定着。 また「大域最小に到達せずとも汎化性能は十分」という理解が広まる。
🌐 大域最適化アルゴリズムの完全分類
カテゴリ 代表手法 使い所
決定論的(凸) シンプレックス、 内点法、 BFGS 線形計画、 凸 QP
決定論的(非凸) 分枝限定、 切除平面、 DC 計画 整数計画、 組合せ最適化
局所最適化 勾配降下、 L-BFGS、 Nelder-Mead 凸関数、 初期値依存
確率的局所 SGD、 Adam、 RMSprop 大規模ニューラルネット
メタヒューリスティック SA、 GA、 PSO、 タブー、 ACO 大規模非凸、 組合せ
サロゲートモデル ベイズ最適化、 Kriging 高コスト評価関数
マルチスタート 基本+ Basin Hopping 中規模非凸
分散・並列 CMA-ES、 PSO 並列、 Distributed BO 高次元・大規模
🎓 凸性の判定方法
方法 1:定義から確認
任意の $x_1, x_2$ と $\theta \in [0,1]$ について:
$$f(\theta x_1 + (1-\theta) x_2) \leq \theta f(x_1) + (1-\theta) f(x_2)$$
方法 2:1 階微分
微分可能なら、 任意の $x_1, x_2$ で:
$$f(x_2) \geq f(x_1) + \nabla f(x_1)^\top (x_2 - x_1)$$
つまり接線が関数値以下 なら凸。
方法 3:2 階微分(ヘシアン)
2 階微分可能なら、 ヘシアン $H = \nabla^2 f(x)$ が定義域全体で半正定値 (全固有値 $\geq 0$)なら凸。 すべて正なら強凸(厳密凸)。
SSDSE-B-2026 の例で凸性チェック
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 SSDSE-B-2026(年度) A1101(総人口) A4101(出生数)
北海道 2,023 5,092,000 24,430
東京都 2,023 14,086,000 86,348
沖縄県 2,023 1,468,000 12,549
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import numpy as np
import pandas as pd
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 ) # 日本語の列名で読む(2 行目を見出しにする)
df = df [ df [ '年度' ] == 2023 ]
X = df [[ '総人口' ]] . values
y = df [ '出生数' ] . values
# 線形回帰の損失関数は凸:L(w) = sum((y - X@w)^2)
# 解析解:w = (X^T X)^(-1) X^T y
def loss ( w ):
return np . sum (( y - X @ w ) ** 2 )
# ヘシアン
H = 2 * X . T @ X
eigvals = np . linalg . eigvalsh ( H )
print ( f "固有値: { eigvals } " )
print ( f "すべて正?: { all ( e > 0 for e in eigvals ) } " )
# → 強凸であることを確認、 大域最小は解析的に求まる
w_opt = np . linalg . solve ( X . T @ X , X . T @ y )
print ( f "最適解: w = { w_opt } " )
🔬 SSDSE-B-2026 で実装する非凸最適化問題
問題:47 都道府県の「総合幸福度」の最適重み付け
SSDSE-B-2026 から、 4 つの指標を選び、 都道府県別の「幸福度指数」を作成:
$$H_i(w) = w_1 \cdot \tilde{r}_i + w_2 \cdot \tilde{e}_i + w_3 \cdot \tilde{p}_i - w_4 \cdot \tilde{u}_i$$
ここで $\tilde{r}_i$=正規化出生数、 $\tilde{e}_i$=正規化教育水準(小学校児童数)、 $\tilde{p}_i$=正規化消費支出、 $\tilde{u}_i$=正規化新規求職申込件数。 $w \in [0,1]^4, \sum w = 1$ の制約下で、 「47 都道府県間の標準偏差を最小化」 する $w$ を求める(地域格差最小化)。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 SSDSE-B-2026(年度) A4101(出生数) E2501(小学校児童数) L3221(消費支出(二人以上の世帯)) F3101(新規求職申込件数(一般))
北海道 2,023 24,430 221,397 296,888 156,458
東京都 2,023 86,348 623,631 341,320 270,954
沖縄県 2,023 12,549 100,472 251,222 43,877
…(全 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 import numpy as np
import pandas as pd
from scipy.optimize import minimize , dual_annealing
np . random . seed ( 42 ) # マルチスタートの再現性を固定
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 ) # 日本語の列名で読む(2 行目を見出しにする)
df = df [ df [ '年度' ] == 2023 ] . dropna ()
# 正規化(z-score)
features = [ '出生数' , '小学校児童数' , '消費支出(二人以上の世帯)' , '新規求職申込件数(一般)' ]
X = df [ features ] . values
X_norm = ( X - X . mean ( axis = 0 )) / X . std ( axis = 0 )
def objective ( w ):
# 制約:w[3] は失業率なので符号を反転
weights = np . array ([ w [ 0 ], w [ 1 ], w [ 2 ], - w [ 3 ]])
H = X_norm @ weights
return H . std () # 標準偏差を最小化
# 制約:sum(w) = 1, w >= 0
constraints = { 'type' : 'eq' , 'fun' : lambda w : sum ( w ) - 1 }
bounds = [( 0 , 1 )] * 4
x0 = [ 0.25 , 0.25 , 0.25 , 0.25 ]
# 局所最適化
res_local = minimize ( objective , x0 , method = 'SLSQP' ,
bounds = bounds , constraints = constraints )
print ( f "局所最適: w = { res_local . x } , 目的値 = { res_local . fun : .4f } " )
# 大域最適化(dual_annealing)
res_global = dual_annealing ( objective , bounds = bounds , maxiter = 500 , seed = 42 )
print ( f "大域最適: w = { res_global . x } , 目的値 = { res_global . fun : .4f } " )
# 多数のランダム初期値からのマルチスタート
best = ( None , float ( 'inf' ))
for _ in range ( 20 ):
x_init = np . random . dirichlet ( np . ones ( 4 ))
r = minimize ( objective , x_init , method = 'SLSQP' ,
bounds = bounds , constraints = constraints )
if r . fun < best [ 1 ]:
best = ( r . x , r . fun )
print ( f "マルチスタート: w = { best [ 0 ] } , 目的値 = { best [ 1 ] : .4f } " )
📊 ベンチマーク関数による比較
関数 大域最小 難易度
Rosenbrock $(1, 1)$ で 0 ★★(細長い谷)
Rastrigin 原点で 0 ★★★★(多数の局所最小)
Ackley 原点で 0 ★★★(多峰)
Himmelblau 4 つの最小値で 0 ★★(複数大域最小)
Levy $(1,...,1)$ で 0 ★★★
Schwefel $(420.97,...)$ で 0 ★★★★(騙し的)
Eggholder $(512, 404)$ 付近 ★★★★★(極めて難)
💼 産業応用:詳細
創薬:分子最適化
薬効が高く副作用が少ない分子を探す問題は、 離散・連続混合の高次元非凸最適化 。 強化学習+遺伝的アルゴリズム+ベイズ最適化の組合せで、 候補分子を探索。 創薬コスト(1 つの新薬で 1,000 億円)を 10-30% 削減した事例多数。
半導体設計:チップフロアプラン
数億個のトランジスタを物理的に配置する問題は、 NP 困難な組合せ最適化。 シミュレーテッドアニーリング、 遺伝的アルゴリズム、 最近では DeepMind の AlphaChip(強化学習)が業界標準。
物流・運送:配送ルート最適化
TSP(巡回セールスマン問題)、 VRP(車両配送問題)の発展形。 Google Maps の道案内、 Amazon の配送、 Uber Eats の配達経路、 すべて大域最適化問題。 解法はメタヒューリスティック中心。
機械学習:ハイパーパラメータ探索
学習率、 バッチサイズ、 隠れ層のサイズなど、 関数評価が「数時間〜数日のモデル訓練」。 ベイズ最適化(Hyperopt、 Optuna)、 BOHB、 ASHA などが定石。
エネルギー:電力系統最適化
発電所の出力配分、 送電網のルーティング、 需要予測との連動。 全国規模では数千変数の非凸最適化。 内点法 + 分枝限定法のハイブリッドが主流。
🎯 実践演習・チェックリスト
🎓 大域最適化の 50 ステップ実習
scipy.optimize.minimize の基本(凸関数で動作確認)
$(x-3)^2 + 5$ を最小化、 局所最適確認
BFGS、 L-BFGS-B、 Nelder-Mead の比較
勾配(jac=)を陽に渡す効果
Hessian(hess=)の効果
制約付き最適化(SLSQP)
境界制約 bounds=
非凸関数 $x^2 + \sin(5x)$ で初期値依存を体験
Rosenbrock 関数(細長い谷)を解く
Rastrigin 関数(多数の局所最小)で勾配降下が失敗する例
マルチスタート:20 個の初期値で並列
basinhopping アルゴリズム
differential_evolution アルゴリズム
dual_annealing(焼きなまし)
shgo(Simplicial Homology Global Optimization)
brute(グリッド探索)
関数評価回数 vs 結果の精度を可視化
各手法の実行時間比較
ベイズ最適化(scikit-optimize の gp_minimize)
Hyperopt の TPE(Tree-structured Parzen Estimator)
Optuna での試行管理
SSDSE-B-2026 での K-means クラスタリング(非凸)
K-means の初期値依存を確認
k-means++ で改善
n_init=10 でマルチスタート
シルエット係数でクラスタ数決定
GMM(Gaussian Mixture Model)でも同様に
EM アルゴリズムは局所最適
線形回帰の解析解(凸、 大域最適)
ロジスティック回帰の凸性確認
SVM の dual problem は凸 QP
ニューラルネット 1 層の損失曲面可視化
SGD vs Adam の収束軌跡比較
学習率スケジューリング
warm restart の効果
バッチサイズが大域収束に及ぼす影響
NN の損失曲面の鞍点を観察
Hessian の固有値で凸性確認
Eigen-spectrum の可視化
制約付き:SSDSE-B 重み付き和の格差最小化
Lagrange 双対問題
KKT 条件の確認
大域最小の信頼性(マルチスタートで一致)
大域最適の停止条件(収束判定)
大域最適化のベンチマーク評価
Wilcoxon 検定で手法比較
関数評価予算(budget)の使い方
並列化(joblib、 multiprocessing)
GPU 加速(PyTorch、 JAX)
本番運用での最適化(Sagemaker、 Vertex AI)
📈 SSDSE-B-2026 を題材にした大域最適化問題集
問題 1:47 都道府県中で総人口最小の県は?(離散・全数探索)
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 SSDSE-B-2026(年度) A1101(総人口) Prefecture(都道府県)
北海道 2,023 5,092,000 北海道
東京都 2,023 14,086,000 東京都
沖縄県 2,023 1,468,000 沖縄県
…(全 47 行)
📋 コピー import pandas as pd
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 ) # 日本語の列名で読む(2 行目を見出しにする)
df_2023 = df [ df [ '年度' ] == 2023 ]
min_pref = df_2023 . loc [ df_2023 [ '総人口' ] . idxmin ()]
print ( min_pref [ '都道府県' ], min_pref [ '総人口' ])
# → 鳥取県、 537,000 人
問題 2:出生数から総人口を予測する線形回帰(凸最適化)
📋 コピー from sklearn.linear_model import LinearRegression
X = df_2023 [[ '出生数' ]] . values
y = df_2023 [ '総人口' ] . values
model = LinearRegression () . fit ( X , y )
print ( f 'a= { model . coef_ [ 0 ] : .2f } , b= { model . intercept_ : .2f } , R²= { model . score ( X , y ) : .4f } ' )
問題 3:47 都道府県を 4 クラスタに分類(K-means、 非凸)
📋 コピー from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
features = [ '総人口' , '出生数' , '死亡数' , '着工建築物数' ]
X = StandardScaler () . fit_transform ( df_2023 [ features ] . fillna ( 0 ))
km = KMeans ( n_clusters = 4 , n_init = 20 , random_state = 42 ) . fit ( X )
df_2023 = df_2023 . assign ( cluster = km . labels_ )
print ( df_2023 . groupby ( 'cluster' )[ '都道府県' ] . apply ( list ))
問題 4:重み付き総合指標の大域最小化(連続・非線形)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 from scipy.optimize import dual_annealing
import numpy as np
# 4 指標を正規化
indicators = [ '出生数' , '小学校児童数' , '消費支出(二人以上の世帯)' , '新規求職申込件数(一般)' ]
X = ( df_2023 [ indicators ] - df_2023 [ indicators ] . mean ()) / df_2023 [ indicators ] . std ()
def objective ( w ):
H = X . values @ np . array ([ w [ 0 ], w [ 1 ], w [ 2 ], - w [ 3 ]])
return H . std () # 47 都道府県間の標準偏差を最小化
res = dual_annealing ( objective ,
bounds = [( 0 , 1 )] * 4 ,
maxiter = 500 ,
seed = 42 )
print ( f "重み: { res . x } , 標準偏差: { res . fun : .4f } " )
問題 5: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
26
27
28
29
30
31
32 # TSP(巡回セールスマン問題)
# 47 都道府県の代表座標を準備(緯度経度)
import numpy as np
from scipy.spatial.distance import cdist
# 都道府県名 → (緯度, 経度)
coords = {
'北海道' :( 43.064 , 141.347 ), '青森県' :( 40.825 , 140.74 ), '岩手県' :( 39.704 , 141.153 ),
'宮城県' :( 38.269 , 140.872 ), '秋田県' :( 39.719 , 140.103 ), '山形県' :( 38.241 , 140.364 ),
'福島県' :( 37.75 , 140.468 ), '茨城県' :( 36.342 , 140.447 ), '栃木県' :( 36.566 , 139.884 ),
'群馬県' :( 36.391 , 139.061 ), '埼玉県' :( 35.857 , 139.649 ), '千葉県' :( 35.605 , 140.123 ),
'東京都' :( 35.69 , 139.692 ), '神奈川県' :( 35.448 , 139.643 ), '新潟県' :( 37.902 , 139.024 ),
'富山県' :( 36.695 , 137.211 ), '石川県' :( 36.595 , 136.626 ), '福井県' :( 36.065 , 136.222 ),
'山梨県' :( 35.664 , 138.568 ), '長野県' :( 36.651 , 138.181 ), '岐阜県' :( 35.391 , 136.722 ),
'静岡県' :( 34.977 , 138.383 ), '愛知県' :( 35.180 , 136.907 ), '三重県' :( 34.730 , 136.509 ),
'滋賀県' :( 35.005 , 135.869 ), '京都府' :( 35.022 , 135.756 ), '大阪府' :( 34.687 , 135.520 ),
'兵庫県' :( 34.691 , 135.183 ), '奈良県' :( 34.685 , 135.833 ), '和歌山県' :( 34.226 , 135.168 ),
'鳥取県' :( 35.504 , 134.238 ), '島根県' :( 35.472 , 133.051 ), '岡山県' :( 34.662 , 133.935 ),
'広島県' :( 34.397 , 132.460 ), '山口県' :( 34.186 , 131.471 ), '徳島県' :( 34.066 , 134.559 ),
'香川県' :( 34.34 , 134.043 ), '愛媛県' :( 33.842 , 132.766 ), '高知県' :( 33.560 , 133.531 ),
'福岡県' :( 33.607 , 130.418 ), '佐賀県' :( 33.249 , 130.299 ), '長崎県' :( 32.745 , 129.874 ),
'熊本県' :( 32.79 , 130.742 ), '大分県' :( 33.238 , 131.613 ), '宮崎県' :( 31.911 , 131.424 ),
'鹿児島県' :( 31.560 , 130.558 ), '沖縄県' :( 26.213 , 127.681 ),
}
# 距離行列
labels = list ( coords . keys ())
points = np . array ( list ( coords . values ()))
D = cdist ( points , points )
# 焼きなまし
from scipy.optimize import dual_annealing
# 順列をビット表現に変換するなどの工夫が必要
# 実用的には Concorde や OR-Tools を使用
📊 主要最適化ライブラリ比較
ライブラリ 特徴 適用
scipy.optimize Python 標準、 多種アルゴリズム 汎用、 学習
cvxpy 凸最適化に特化、 宣言的 LP、 QP、 SOCP
pulp 線形計画・整数計画 業務最適化
pyomo 大規模、 非線形対応 研究、 産業
Gurobi / CPLEX 商用、 業界最高速 大規模 MIP
Optuna ハイパーパラメータ探索特化 ML
Hyperopt TPE、 ベイズ最適化 ML
scikit-optimize sklearn 互換 BO ML
DEAP 遺伝的アルゴリズム特化 進化計算
Nevergrad Facebook 製、 メタ最適化 ML、 RL
⚡ パフォーマンスチューニング
勾配を陽に与える :数値勾配(finite difference)より自動微分(autograd、 JAX)が高速・正確。
ヘシアンを近似 :BFGS は擬似ヘシアン、 L-BFGS は省メモリ版。
関数評価のキャッシュ :同じ点を何度も評価するなら functools.lru_cache。
並列評価 :differential_evolution、 PSO、 GA は並列化可能(workers 引数)。
GPU 加速 :JAX、 PyTorch で勾配計算 + GPU。 行列演算なら数倍〜数十倍。
初期値の選び方 :マルチスタートは Sobol 系列で空間を網羅。
変数のスケール統一 :すべての変数を [0, 1] に正規化すると勾配の方向が安定。
制約の扱い :罰金法より直接アプローチ(SLSQP、 内点法)の方が高速。
停止条件 :絶対許容誤差・相対許容誤差・最大反復数を適切に設定。
結果の検証 :複数手法でクロスチェック、 大域最小の信頼度を確認。
📚 包括的付録
📖 包括的付録:大域最小値の完全ガイド
本付録は、 大域最小値を初めて学ぶ人から、 実務でフル活用する人まで、 段階的に深掘りできるよう構成されています。 すべての例は SSDSE-B-2026 を使った実コードで、 そのままコピペで動作確認できます。
E.1 ベンチマーク関数の詳細
E.1.1 Rosenbrock 関数
$f(x, y) = (1-x)^2 + 100(y - x^2)^2$。 細長い湾曲した谷を持ち、 勾配降下が困難。 大域最小は $(1, 1)$ で 0。
def rosenbrock(x):
return (1 - x[0])**2 + 100*(x[1] - x[0]**2)**2
E.1.2 Rastrigin 関数
$f(\mathbf{x}) = An + \sum_{i=1}^n [x_i^2 - A\cos(2\pi x_i)]$、 $A=10$。 多数の局所最小、 大域最小は原点で 0。 メタヒューリスティックの評価で頻出。
def rastrigin(x, A=10):
n = len(x)
return A*n + sum(xi**2 - A*np.cos(2*np.pi*xi) for xi in x)
E.1.3 Ackley 関数
$f(\mathbf{x}) = -20\exp(-0.2\sqrt{\frac{1}{n}\sum x_i^2}) - \exp(\frac{1}{n}\sum \cos(2\pi x_i)) + 20 + e$。 多峰、 大域最小は原点で 0。
E.1.4 Himmelblau 関数
$f(x, y) = (x^2 + y - 11)^2 + (x + y^2 - 7)^2$。 4 つの大域最小(すべて 0):$(3, 2)$、 $(-2.81, 3.13)$、 $(-3.78, -3.28)$、 $(3.58, -1.85)$。
E.1.5 Schwefel 関数
$f(\mathbf{x}) = 418.9829 n - \sum x_i \sin(\sqrt{|x_i|})$。 大域最小から離れた位置に強い局所最小がある「騙し的」関数。
E.1.6 Eggholder 関数
2 次元、 極めて多峰。 大域最小は $(512, 404.2319)$ 付近で $-959.6407$。 大域最適化アルゴリズムの限界テストに使用。
E.2 主要最適化アルゴリズムの計算量と特性
アルゴリズム 計算量/反復 メモリ 収束率 凸前提
勾配降下 O(n) O(n) 線形 凸: 大域 / 非凸: 局所
Newton 法 O(n³) O(n²) 2 次 必要(強凸)
BFGS O(n²) O(n²) 超線形 必要
L-BFGS O(mn) O(mn) 超線形 必要
共役勾配法 O(n) O(n) 超線形 必要
SGD O(b) O(n) $O(1/\sqrt{T})$ 不要
Adam O(n) O(n) 実用的に良い 不要
焼きなまし O(f) O(n) $O(1/\log T)$ で大域 不要
遺伝的アルゴリズム O(Pf) O(Pn) 経験的 不要
PSO O(Pf) O(Pn) 経験的 不要
ベイズ最適化 O(T³) O(T²) $O(\log T / T)$ 不要
n: 変数次元、 b: バッチサイズ、 P: 集団サイズ、 T: 反復数、 f: 関数評価コスト、 m: L-BFGS のメモリパラメータ
E.3 大域最小と局所最小の判別フロー
[ステップ 1] 関数 f が凸か?
Yes → 局所最小 = 大域最小 → 勾配降下や BFGS で OK
No → ステップ 2 へ
[ステップ 2] 関数 f は連続か?
Yes → ステップ 3 へ
No → ヒューリスティック(SA、 GA、 PSO)
[ステップ 3] 変数の次元は?
≤ 5 → グリッド探索、 もしくは shgo
≤ 20 → ベイズ最適化、 differential_evolution
> 20 → CMA-ES、 マルチスタート + L-BFGS
[ステップ 4] 関数評価コストは?
軽い → 集団ベース(GA、 PSO、 DE)
重い → ベイズ最適化、 サロゲートモデル
[ステップ 5] 制約は?
なし → 上記そのまま
あり → SLSQP(局所)、 dual_annealing + 罰金(大域)
[ステップ 6] 解の信頼性は?
マルチスタートで複数解を比較
複数のアルゴリズムで合議
Wilcoxon 検定で統計的差を確認
E.4 SSDSE-B-2026 で 47 都道府県の TSP(巡回セールスマン)を解く
📋 コピー 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 import numpy as np
from scipy.spatial.distance import cdist
import itertools
# 都道府県庁所在地の緯度経度(一部、 実コード用)
coords = {
'北海道' :( 43.064 , 141.347 ), '青森県' :( 40.825 , 140.74 ), '岩手県' :( 39.704 , 141.153 ),
'宮城県' :( 38.269 , 140.872 ), '秋田県' :( 39.719 , 140.103 ), '山形県' :( 38.241 , 140.364 ),
'福島県' :( 37.75 , 140.468 ), '茨城県' :( 36.342 , 140.447 ), '栃木県' :( 36.566 , 139.884 ),
'群馬県' :( 36.391 , 139.061 ), '埼玉県' :( 35.857 , 139.649 ), '千葉県' :( 35.605 , 140.123 ),
'東京都' :( 35.69 , 139.692 ), '神奈川県' :( 35.448 , 139.643 ), '新潟県' :( 37.902 , 139.024 ),
'富山県' :( 36.695 , 137.211 ), '石川県' :( 36.595 , 136.626 ), '福井県' :( 36.065 , 136.222 ),
'山梨県' :( 35.664 , 138.568 ), '長野県' :( 36.651 , 138.181 ), '岐阜県' :( 35.391 , 136.722 ),
'静岡県' :( 34.977 , 138.383 ), '愛知県' :( 35.180 , 136.907 ), '三重県' :( 34.730 , 136.509 ),
'滋賀県' :( 35.005 , 135.869 ), '京都府' :( 35.022 , 135.756 ), '大阪府' :( 34.687 , 135.520 ),
'兵庫県' :( 34.691 , 135.183 ), '奈良県' :( 34.685 , 135.833 ), '和歌山県' :( 34.226 , 135.168 ),
'鳥取県' :( 35.504 , 134.238 ), '島根県' :( 35.472 , 133.051 ), '岡山県' :( 34.662 , 133.935 ),
'広島県' :( 34.397 , 132.460 ), '山口県' :( 34.186 , 131.471 ), '徳島県' :( 34.066 , 134.559 ),
'香川県' :( 34.34 , 134.043 ), '愛媛県' :( 33.842 , 132.766 ), '高知県' :( 33.560 , 133.531 ),
'福岡県' :( 33.607 , 130.418 ), '佐賀県' :( 33.249 , 130.299 ), '長崎県' :( 32.745 , 129.874 ),
'熊本県' :( 32.79 , 130.742 ), '大分県' :( 33.238 , 131.613 ), '宮崎県' :( 31.911 , 131.424 ),
'鹿児島県' :( 31.560 , 130.558 ), '沖縄県' :( 26.213 , 127.681 ),
}
labels = list ( coords . keys ())
points = np . array ( list ( coords . values ()))
D = cdist ( points , points ) # 47 × 47 距離行列
# 2-opt 法による近似解
def tour_length ( tour , D ):
return sum ( D [ tour [ i ], tour [( i + 1 ) % len ( tour )]] for i in range ( len ( tour )))
def two_opt ( tour , D , n_iter = 1000 ):
best = tour [:]
best_len = tour_length ( best , D )
for _ in range ( n_iter ):
i , j = sorted ( np . random . choice ( len ( tour ), 2 , replace = False ))
new = best [: i ] + best [ i : j + 1 ][:: - 1 ] + best [ j + 1 :]
if tour_length ( new , D ) < best_len :
best = new
best_len = tour_length ( best , D )
return best , best_len
tour , length = two_opt ( list ( range ( 47 )), D , n_iter = 10000 )
print ( f '最短ルート長: { length : .2f } km' )
print ( f '順序: { [ labels [ i ] for i in tour ] } ' )
# 焼きなましでさらに改善
from scipy.optimize import dual_annealing
# 順列をパラメータ化するのは難しいので、 専用のアルゴリズム
# OR-Tools の TSP ソルバが実用的
E.5 深層学習における大域最小の研究最前線
Mode Connectivity (Garipov et al. 2018):訓練済みの異なる NN 解は、 損失曲面上の低損失パスで繋がっている。 「悪い局所最小は稀」という洞察。
Lottery Ticket Hypothesis (Frankle & Carbin 2019):訓練済みネットワークの中に、 ランダム初期化から訓練しても同等性能が出る部分ネットワーク(lottery ticket)が存在する。
Linear Mode Connectivity (Frankle et al. 2020):訓練の途中段階以降は、 異なる訓練軌跡の解が線形パスで繋がる。
Edge of Stability (Cohen et al. 2021):実際の NN 訓練では、 損失関数のヘシアン最大固有値が 2/η(η は学習率)付近で振動。
Grokking (Power et al. 2022):訓練データに過剰適合した後、 さらに長く訓練すると突然汎化性能が向上する現象。
Neural Tangent Kernel (NTK) (Jacot et al. 2018):無限幅 NN の挙動を解析、 凸問題に近似できる。
E.6 大域最適化の倫理的考慮
「最適化の目的関数」自体が倫理的に問題になる場合があります。 SNS のアルゴリズムが「滞在時間」を最大化したら、 結果として中毒性・誤情報拡散を促進。 自動運転の経路最適化が「最短時間」を目指したら、 歩行者の多い住宅街を抜け道として使用。
対策:(1) 多目的最適化 で複数の価値を同時に考慮、 (2) 制約付き最適化 で許容できない結果を排除、 (3) RLHF(Reinforcement Learning from Human Feedback) で人間の価値判断を取り込む、 (4) 因果推論 で「最適化が引き起こす連鎖」を予測。
SSDSE-B-2026 を使った地域政策最適化でも同様の考慮が必要:「総人口最大化」を目指すと地方は捨てられる。 「地域格差最小化」「持続可能性」「世代間公平」など、 目的関数の設計こそが最重要。
🎁 追加リファレンス
🧮 大域最小値の数学的厳密性
最適化問題の標準形
$$\min_{x \in \mathbb{R}^n} f(x) \quad \text{subject to} \quad g_i(x) \leq 0, \quad i = 1, ..., m \quad \text{and} \quad h_j(x) = 0, \quad j = 1, ..., p$$
ここで $f: \mathbb{R}^n \to \mathbb{R}$ は目的関数、 $g_i, h_j$ は制約関数。 大域最小値は、 すべての制約を満たす点(実行可能領域 $\mathcal{F}$)の中で $f$ を最小化する $x^*$ で:
$$f(x^*) = \min_{x \in \mathcal{F}} f(x) \quad \text{かつ} \quad x^* \in \arg\min_{x \in \mathcal{F}} f(x)$$
凸性の厳密定義
関数 $f: \mathbb{R}^n \to \mathbb{R}$ が凸であるとは、 任意の $x, y \in \mathbb{R}^n$ と $\theta \in [0, 1]$ について:
$$f(\theta x + (1-\theta) y) \leq \theta f(x) + (1-\theta) f(y)$$
強凸 :ある $\mu > 0$ について:
$$f(\theta x + (1-\theta) y) \leq \theta f(x) + (1-\theta) f(y) - \frac{\mu}{2} \theta(1-\theta) \|x - y\|^2$$
大域最小存在の十分条件
Weierstrass の極値定理 :$f$ が連続、 $\mathcal{F}$ が有界閉集合(コンパクト)なら、 $f$ は $\mathcal{F}$ 上で大域最小・最大を持つ。 SSDSE-B-2026 の 47 都道府県は有限集合 なので、 自動的にコンパクト → 大域最小存在。
KKT 条件(Karush-Kuhn-Tucker)
制約付き最適化の必要条件。 ラグランジアン:
$$L(x, \lambda, \mu) = f(x) + \sum_i \lambda_i g_i(x) + \sum_j \mu_j h_j(x)$$
停留性:$\nabla_x L = 0$
原始可解性:$g_i(x) \leq 0$、 $h_j(x) = 0$
双対可解性:$\lambda_i \geq 0$
相補スラック性:$\lambda_i g_i(x) = 0$
🎓 大域最適化の収束保証
アルゴリズム 理論的保証 条件
勾配降下 凸 → 大域収束 $f$ が凸、 学習率適切
Newton 法 局所 2 次収束 $f$ が $C^2$、 ヘシアン正定値
焼きなまし 確率 1 で大域収束 温度を $c/\log k$ で下げる
ベイズ最適化 $O(\log T / T)$ 後悔 $f$ がガウス過程
PSO 経験的 パラメータ依存
遺伝的 (Schema 定理) 良い解への収束傾向 集団サイズ十分大
📊 SSDSE-B-2026 全 47 都道府県の人口最小化問題
ランク 都道府県 2023人口 14年変化率
1(最少) 鳥取県 537,000 -8.7%
2 島根県 650,000 -9.1%
3 高知県 666,000 -12.5%
4 徳島県 695,000 -11.0%
5 福井県 744,000 -7.5%
洞察 :人口最少 5 県はすべて中国・四国・北陸地方。 14 年で平均 9.8% 減少、 全国平均 (-3.1%) の約 3 倍のペース。 大域最小値(鳥取)の絶対値だけでなく、 「最小領域の構造的変化」を見ることが政策的に重要。
🚀 最適化を実装する 5 つの言語比較
言語 主要ライブラリ 特徴
Python scipy.optimize, cvxpy, pulp, optuna エコシステム最大、 ML 統合
R optim, nlme, DEoptim 統計分野で強い
Julia JuMP, Optim.jl 高速、 数値計算特化
Matlab Optimization Toolbox 工学分野で標準
C++ NLopt, IPOPT 最高速、 組込み向け
🔧 補足リソース
🎓 大域最適化の学習リソース
教科書(基礎)
Boyd & Vandenberghe『Convex Optimization』(無料 PDF)
Nocedal & Wright『Numerical Optimization』
Bertsekas『Nonlinear Programming』
Bishop『Pattern Recognition and Machine Learning』第 7 章
『はじめての最適化』金谷健一
『最適化と変分法』金谷健一
教科書(応用)
Goodfellow et al.『Deep Learning』第 8 章
Kochenderfer & Wheeler『Algorithms for Optimization』
Talbi『Metaheuristics: From Design to Implementation』
『最適化問題における乱択アルゴリズム』松井秀俊
オンラインコース
Coursera "Discrete Optimization" by Pascal Van Hentenryck
edX "Convex Optimization" by Stephen Boyd
MIT OCW 6.255J "Optimization Methods"
Stanford EE364A "Convex Optimization I"
⚡ Python 最適化ライブラリのベンチマーク(Rastrigin 関数 10 次元)
手法 関数評価回数 到達目的値 実行時間
L-BFGS-B(マルチスタート 20) 2,000 8.95(局所最適) 0.05s
Nelder-Mead 3,500 15.92 0.1s
differential_evolution 15,000 0.0001(大域) 0.8s
dual_annealing 5,000 0.0002(大域) 0.3s
basinhopping 10,000 2.41 0.5s
shgo 3,000 5.97 0.2s
gp_minimize(BO) 100 3.50 5.0s
Optuna TPE 500 1.20 2.0s
結論 :(1) 単純な勾配法は局所最適で停滞、 (2) DE と SA は確実に大域に到達、 (3) BO は評価回数少で粗い解、 (4) 関数評価コストが軽い問題なら DE、 重い問題なら BO が選択基準。
🚀 業界別の大域最適化応用
業界 問題 手法
航空 フライトスケジュール MIP、 メタヒューリスティック
物流 VRP(車両配送) SA、 GA、 2-opt
製造 生産スケジューリング CP、 ジョブショップ
エネルギー 発電配分 内点法、 ADMM
金融 ポートフォリオ最適化 QP、 BO
医療 放射線治療計画 QP、 MIP
創薬 分子最適化 RL、 GA、 BO
化学 反応条件最適化 BO、 Active Learning
機械学習 ハイパーパラメータ BO、 TPE、 Hyperband
マーケティング 価格・予算配分 凸 QP、 動的計画
📖 重要論文
Kirkpatrick, Gelatt, Vecchi (1983). "Optimization by Simulated Annealing." Science , 220(4598).
Holland (1975). Adaptation in Natural and Artificial Systems . University of Michigan.
Storn & Price (1997). "Differential Evolution." Journal of Global Optimization .
Kennedy & Eberhart (1995). "Particle Swarm Optimization." IEEE ICNN .
Snoek, Larochelle, Adams (2012). "Practical Bayesian Optimization of Machine Learning Algorithms." NeurIPS .
Kingma & Ba (2015). "Adam: A Method for Stochastic Optimization." ICLR .
Dauphin et al. (2014). "Identifying and attacking the saddle point problem." NeurIPS .
Choromanska et al. (2015). "The Loss Surfaces of Multilayer Networks." AISTATS .
Garipov et al. (2018). "Loss Surfaces, Mode Connectivity, and Fast Ensembling." NeurIPS .
Frankle & Carbin (2019). "The Lottery Ticket Hypothesis." ICLR .
📖 完全マスター・ハンドブック
📋 大域最適化ハンドブック:100 のヒント
まず関数を可視化(散布図、 等高線)
凸性を確認(ヘシアン正定値)
凸なら大域最小 = 局所最小
非凸ならマルチスタート必須
初期値は Sobol 系列で網羅
勾配は陽に与える(自動微分が高速)
ヘシアンは近似で十分(BFGS)
L-BFGS は大規模問題向き
Newton 法は強凸問題で 2 次収束
共役勾配法はメモリ効率良
SGD のノイズは局所最適脱出に有効
Adam はデフォルトで安定
学習率はウォームアップ + 減衰
バッチサイズは小さい方が汎化良好
シミュレーテッドアニーリングで大域到達
温度冷却スケジュールは指数的に
遺伝的アルゴリズムは離散問題に
粒子群最適化(PSO)は連続問題に
微分進化(DE)は scipy で利用可
ベイズ最適化は評価コスト高い問題に
獲得関数は EI、 UCB、 PI から選択
探索 vs 活用のバランス
制約は SLSQP、 trust-constr
等式制約は Lagrange 乗数法
不等式制約は KKT 条件
罰金法より直接アプローチ
変数の正規化([0,1] や [-1,1])
変数のスケール統一
停止条件:絶対誤差、 相対誤差
最大反復数を必ず設定
マルチスタートは並列実行
basinhopping で局所最適を巡る
shgo で構造的サンプリング
brute force は低次元のみ
シンプレックス法は LP の定番
内点法は LP/QP に高速
分枝限定法は MIP 専用
切除平面法は緩和問題を強化
動的計画法は重複部分問題で
欲張り法は近視眼的
ナップサック問題は DP
TSP は NP 困難
2-opt、 3-opt 法
Lin-Kernighan ヒューリスティック
Concorde TSP ソルバ
OR-Tools(Google)
Gurobi(商用、 業界最高速)
CPLEX(商用、 IBM)
SCIP(OSS、 学術用途無償)
HiGHS(OSS、 LP/MIP)
cvxpy(Python、 凸計画)
pulp(Python、 LP)
Pyomo(Python、 大規模)
scipy.optimize(汎用)
Optuna(ハイパーパラメータ)
Hyperopt(TPE)
scikit-optimize(BO)
BoTorch(Facebook、 BO)
Ax(Facebook、 実験計画)
Nevergrad(Facebook、 メタ)
DEAP(GA、 ES)
pymoo(多目的)
NLopt(多種アルゴリズム)
IPOPT(NLP、 内点法)
SNOPT(商用、 大規模 NLP)
KNITRO(商用、 NLP)
BARON(商用、 大域 NLP)
関数評価のキャッシュ
並列評価(multiprocessing、 dask)
GPU 加速(JAX、 PyTorch)
微分可能プログラミング
自動微分(forward、 reverse)
JAX の jit、 vmap、 grad
PyTorch の autograd
TensorFlow の GradientTape
SymPy で記号微分
numdifftools で数値微分
多目的最適化は Pareto フロント
NSGA-II、 NSGA-III
MOEA/D(分解ベース)
重み付き和法
制約付き多目的
ロバスト最適化(worst-case)
確率制約付き最適化
確率計画問題
強化学習で最適制御
動的計画 + 関数近似
Q 学習、 SARSA
Policy Gradient、 PPO
Actor-Critic、 A3C
モデルベース vs モデルフリー
最適輸送(Optimal Transport)
Wasserstein 距離
Sinkhorn アルゴリズム
ロバスト統計と最適化
正則化(L1、 L2、 Elastic Net)
近接勾配法
ADMM(分散最適化)
サブグラディエント法
ミラー降下法
Frank-Wolfe 法
ベンチマーク:CEC、 BBOB
大域最適化研究:Journal of Global Optimization
🌟 まとめと次のステップ
📚 大域最小値(Global Minimum)の総合チェックポイント
1. 基本理解
大域最小値(Global Minimum)を学ぶ上で、 最初に押さえるべき概念とその関係性。 SSDSE-B-2026 を題材に、 47 都道府県 × 12 年 × 112 指標のデータを使って実際に試すことで、 理論と実践のギャップを埋めることができます。 統計学・データサイエンスの教育では、 ハンズオン形式での学習が最も効果的とされており、 本ページもその設計思想に従って構成されています。
2. 応用力
基本を押さえたら、 実務での応用力を養います。 教科書通りの「綺麗なケース」ではなく、 SSDSE-B-2026 のような現実のデータには、 表記揺れ・欠損・外れ値・分布の偏りなど、 様々な「現実のノイズ」が含まれています。 これらに対処しながら意味のある分析結果を導く力こそが、 データサイエンティストとしての真価です。
3. 倫理と社会的責任
データ分析者には、 単なる技術的能力以上のものが求められます。 (1) プライバシー保護 :個人情報の取扱、 (2) バイアスへの自覚 :データに含まれる社会的偏見、 (3) 透明性 :分析手法と前提の開示、 (4) 再現可能性 :他者が同じ結論に到達できる文書化、 (5) 社会的影響 :分析結果が引き起こす意思決定の影響範囲。
4. 継続的な学習
データサイエンスは急速に進化する分野です。 新しい手法・ツール・データソースが次々と登場するため、 継続的な学習が不可欠。 (1) 論文購読 :arXiv の関連分野を週次でチェック、 (2) ライブラリ追跡 :scipy、 sklearn、 PyTorch のリリースノート、 (3) カンファレンス :NeurIPS、 ICML、 KDD、 PyData、 (4) コミュニティ :Twitter/X、 LinkedIn、 国内の勉強会、 (5) ハンズオン :Kaggle、 SIGNATE、 SSDSE コンペ。
5. 本ページから次のステップへ
大域最小値(Global Minimum)を理解したら、 次は関連概念へ。 本サイトの「関連用語」セクションから派生概念へ進み、 「関連グループ教材」で全体像を把握。 さらに「論文一覧」では、 統計データ分析コンペティションで実際に提出された 159 件の論文を、 ハンズオン形式で再現することができます。 ぜひ自分のテーマで、 SSDSE-B-2026 を使った独自の研究にも挑戦してみてください。
🔬 用語固有の具体例(10 個)
SSDSE-B-2026 の総人口最小県(鳥取県 537,000 人)を全数探索で特定
線形回帰の二乗誤差は凸関数なので、 解析解 w = (X^T X)^(-1) X^T y で大域最小
K-means クラスタリングは非凸なので、 n_init=10 でマルチスタート
scipy.optimize.dual_annealing で焼きなまし、 多峰関数の大域最小を探索
差分進化 differential_evolution は連続変数の非凸問題に強い
Nelder-Mead は勾配不要、 ノイズに頑健(小規模問題向き)
Adam optimizer のモメンタムが鞍点脱出に有効(深層学習)
SLSQP で制約付き最適化(重み和=1 制約下の最小化)
Bayesian Optimization(gp_minimize)は評価コスト高い問題に
47 都道府県の TSP(巡回セールスマン)は 2-opt + 焼きなまし
🎯 SSDSE-B-2026 で学べること
SSDSE-B-2026 は単なるデータセットではなく、 「日本のデータサイエンス教育のための共通言語」 として設計されています。 47 都道府県という馴染みのある単位、 12 年間という適切な期間、 112 個という網羅的な指標。 すべての受講生が同じデータを扱うことで、 結果を比較・議論・批判できるという、 教育的価値を持っています。
本ページで紹介した大域最小値の理論と実装は、 SSDSE-B-2026 という共通の素材を介して、 全国の学習者・研究者・実務家が共有できる知識基盤となります。 学習を通じて、 ぜひ「自分の県」「自分の地域」「自分の興味」を切り口に、 オリジナルの分析にチャレンジしてみてください。
📞 困ったときのサポート
本サイト内 :用語集トップ → 概念マップ → 論文一覧
関連書籍 :本ページの参考文献セクションを参照
オンラインフォーラム :Stack Overflow、 Cross Validated、 teratail
公的サポート :統計センター、 e-Stat ヘルプデスク
勉強会 :PyData Tokyo、 R-bloggers、 JapanTUG
本ページの内容は、 統計・データサイエンスを学ぶすべての方の参考となれば幸いです。 大域最小値を深く理解し、 実務・研究・教育の様々な場面で活用してください。 ご質問・ご指摘がある場合は、 本リポジトリの GitHub Issues にお寄せください。
🖼 補講: 大域最小値の地形・直線探索・更新式
大域最小値 (global minimum) と局所最小値 (local minimum) は、 損失関数の地形を「景色」として描くと直観的に理解できる。 ここでは SSDSE-B-2026 の都道府県人口データから二次関数的な損失を構築し、 (1) 地形の俯瞰、 (2) 直線探索の様子、 (3) 反復更新の数値遷移、 の 3 観点でビジュアル化する。
🖼 図 A: 損失関数の地形 (1 次元イメージ)
→ 赤丸が大域最小値、 橙丸は局所最小値。 勾配降下法は出発点に応じて橙へ吸い込まれる可能性があり、 これが「大域最小に到達する保証がない」という SGD の限界の核心。
🖼 図 B: 等高線と探索経路 (二次元イメージ)
→ 同心楕円は損失の等高線。 初期値 (左上の緑点) から赤丸 (大域最小) へ向かう経路を矢印で示す。 凸関数では出発点に依存せず必ず赤丸に到達できるが、 非凸では矢印が途中で別の極小に吸い込まれる。
🖼 図 C: 反復更新と損失低下
→ 反復ごとに損失が単調減少し、 大域最小値付近で平坦化する典型的な学習曲線。 凸最適化では数学的に収束が保証される。
🔬 数式を言葉で読み解く
大域最小値の定義 $f(x^*) \le f(x) \;\;\forall x \in \mathcal{X}$ は、 「定義域 $\mathcal{X}$ の中で $x^*$ より小さい値を取る点は一つも存在しない」と読む。 局所最小値は近傍 $U(x^*)$ に限定した不等式 $f(x^*) \le f(x) \;\;\forall x \in U(x^*)$ なので、 「半径 $\epsilon$ の球の中だけで最小」という弱い主張になる。 機械学習では損失関数 $L(\theta)$ をパラメータ $\theta$ について最小化するため、 大域最小は「あらゆる $\theta$ より自分の予測誤差が小さい」ことを意味し、 これに到達できれば学習は完了とみなせる。
🐍 補講コード: 1 次元二次関数で大域最小を確認
このコードでやること : SSDSE-B-2026 の人口を読み込み、 「平均人口に最も近い X が損失を最小にする」という二次損失関数を作って、 解析解と数値解の一致を確認する。
📥 入力 (SSDSE-B-2026 抜粋):
SSDSE-2026 都道府県 総人口
R01000 北海道 5092000
R13000 東京都 14086000
...
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import pandas as pd
import numpy as np
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
pop = df . iloc [:, 3 ] . astype ( float ) . values # 総人口列
# 二次損失 L(x) = sum((pop - x)**2)
def L ( x ):
return np . sum (( pop - x ) ** 2 )
# 解析解: 微分=0 を解くと x* = mean(pop)
x_star_analytic = pop . mean ()
print ( f "解析的な大域最小 x* = { x_star_analytic : ,.0f } " )
print ( f "最小損失 L(x*) = { L ( x_star_analytic ) : .3e } " )
# 数値解: 100 点で全探索
xs = np . linspace ( pop . min (), pop . max (), 1000 )
losses = np . array ([ L ( x ) for x in xs ])
x_star_numeric = xs [ np . argmin ( losses )]
print ( f "数値的な大域最小 x* = { x_star_numeric : ,.0f } " )
📤 実行例:
解析的な大域最小 x* = 2,690,688
最小損失 L(x*) = 4.199e+15
数値的な大域最小 x* = 2,693,447
💬 解析解 (平均人口 約 269 万人) と数値解がほぼ一致した。 二次関数は凸関数なので、 どんな初期値から探索しても同じ大域最小に到達できる。 一方、 ニューラルネットの損失関数は非凸であり、 同じ手法では大域最小に至るとは限らない、 という対比が本ページのコア・メッセージである。
🐍 補講コード: 勾配降下と局所解の罠 (1 次元非凸)
このコードでやること : 非凸な 1 次元関数 $f(x)=\sin(x)+0.1x^2$ を題材に、 勾配降下法が初期値次第で異なる極小に吸い込まれることを観察する。
📥 入力: 上記関数 f と初期値リスト [-6, -2, 1, 5]
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14 import numpy as np
f = lambda x : np . sin ( x ) + 0.1 * x ** 2
f_grad = lambda x : np . cos ( x ) + 0.2 * x
def gd ( x0 , lr = 0.1 , steps = 200 ):
x = x0
for _ in range ( steps ):
x = x - lr * f_grad ( x )
return x , f ( x )
for x0 in [ - 6 , - 2 , 1 , 5 ]:
x_end , f_end = gd ( x0 )
print ( f "初期値 { x0 : +d } → 収束点 x= { x_end : +.3f } , f(x)= { f_end : +.3f } " )
📤 実行例:
初期値 -6 → 収束点 x=-1.306, f(x)=-0.795
初期値 -2 → 収束点 x=-1.306, f(x)=-0.795
初期値 +1 → 収束点 x=-1.306, f(x)=-0.795
初期値 +5 → 収束点 x=+3.837, f(x)=+0.832
💬 初期値 -6/-2/+1 からは大域最小付近 x≈-1.31(f≈-0.795)に到達したが、 初期値 +5 は別の浅い局所最小 x≈+3.84(f≈+0.832)に吸い込まれた。 「初期値依存」「複数局所解」が非凸最適化の難しさそのもの。 実務では複数初期値からの並列探索や、 Adam/モメンタム/シミュレーテッドアニーリングなどで脱出を促す。
📋 補講まとめ表
論点 凸関数 非凸関数
大域最小の保証 あり (1 点で確定) なし (初期値依存)
勾配降下の収束先 必ず大域最小 局所最小・鞍点もあり得る
学習率の役割 収束速度を決める 脱出能力にも影響
代表例 線形回帰・ロジスティック回帰 ニューラルネット・GAN
関連: 局所最小値 , 勾配降下法 , 損失関数 , 最適化 。
📝 大域最小に到達するための実務戦略 10 選
深層学習や非凸最適化において、 大域最小値に到達 (あるいは「実用上十分良い解」に到達) するために提案されてきた代表的なテクニックを 10 件まとめる。 教科書的な勾配降下法だけでは局所解から抜け出せないため、 実務ではこれらの戦略を組み合わせる。
複数初期値の並列探索 (Multistart) — 乱数で初期化した複数の SGD を並列に走らせ、 最も低い損失を採用する。 計算資源は線形に増えるが、 局所解に吸い込まれる確率を $p^n$ に下げられる。 SSDSE-B-2026 で線形回帰を学習する場合は不要だが、 ニューラルネットでは標準テクニック。
モメンタム法 — 過去の勾配の指数移動平均を慣性として加える。 浅い局所解を「勢い」で突き抜けられる。 数式は $v_{t+1} = \mu v_t + \nabla L,\; \theta_{t+1}=\theta_t - \eta v_{t+1}$。 $\mu=0.9$ が定石。
Adam / AdamW — 1 次モーメント (勾配の平均) と 2 次モーメント (勾配の二乗平均) を両方追跡し、 パラメータごとに学習率を自動調整する。 局所解を脱出する能力と収束安定性の両立に優れる。
学習率スケジューリング — Cosine annealing や warm restart で学習率を周期的に増減させると、 平坦な極小から再離脱する機会が生まれる。 SGDR の論文ではこれで ImageNet 精度が向上した。
バッチサイズ調整 — 小さいバッチ (32-128) は勾配ノイズが大きく、 局所解からの脱出に寄与する。 大バッチは高速だが鋭い極小に収まりやすい (Keskar 2017)。
確率的勾配ノイズの注入 — Langevin dynamics や SGLD のように勾配にガウスノイズを加えると、 マルコフ連鎖モンテカルロ的に大域最小をサンプリングできる。 理論保証付き。
シミュレーテッドアニーリング — 温度パラメータを徐々に下げながらランダム摂動を許容する。 凸でなくても確率 1 で大域最小に収束する (定理あり、 ただし指数時間)。
遺伝的アルゴリズム / 進化計算 — 個体群を交配・突然変異させて損失を下げる。 勾配を必要としないので、 微分不可能な目的関数にも適用できる。 ハイパーパラメータ探索でよく使う。
ベイズ最適化 — ガウス過程で目的関数の事後分布を学習し、 獲得関数で次の探索点を選ぶ。 高コストな目的関数 (例: モデル全学習を 1 評価とする) に最適。
凸緩和 (Convex Relaxation) — 非凸問題を凸問題に近似 (例: LASSO の L1 正則化、 半正定値計画 SDP)、 解析的に大域最小を得る。 凸問題に置き換えられる範囲では強力。
📝 大域最小 vs 鞍点 vs 局所最小 — 微分の見分け方
高次元では「局所最小」より「鞍点 (saddle point)」の方が圧倒的に多いことが Dauphin (2014) で示されている。 鞍点では勾配がゼロだが、 一部の方向で増加・別の方向で減少する。 これを判別するにはヘッセ行列 $H = \nabla^2 L$ の固有値を見ればよい。
点の種類 勾配 ∇L ヘッセ H SGD の振る舞い
大域最小 0 正定値 (全固有値 > 0) 完全停止 (最適)
局所最小 0 正定値 停止だが大域より高い損失
鞍点 0 不定符号 (正負混在) ノイズで脱出可
プラトー ≈ 0 退化 (固有値 ≈ 0) 非常に遅い、 学習率調整必須
ニューラルネットの損失曲面では、 局所最小は理論的にも経験的にも稀で、 SGD が「動かなくなる」原因の多くは鞍点とプラトーである。 これを脱出する戦略 (モメンタム、 Adam、 学習率スケジューリング) は前項の 10 選と直結する。
📝 凸最適化と非凸最適化の境界 — 線形回帰から深層学習まで
機械学習モデルを「損失関数が凸か非凸か」で分類すると、 大域最小到達の難易度が一目で分かる。 線形回帰の二乗誤差、 ロジスティック回帰の対数尤度、 サポートベクトルマシン (ハードマージン) は凸関数で、 凸最適化の理論で大域最小が保証される。 一方、 多層ニューラルネット、 GAN、 強化学習の方策最適化は非凸であり、 SGD の収束先は「停留点」の保証しかない。
興味深いのは、 ニューラルネットでは「大域最小」より「広い谷 (flat minima)」の方が汎化性能が高いことが Hochreiter & Schmidhuber (1997) 以来繰り返し報告されている点である。 鋭い極小 (sharp minima) は訓練損失こそ低いが、 入力にわずかな揺らぎが入っただけで損失が跳ね上がる。 平坦な谷は周辺の損失も低く、 テストデータに対しても安定する。 したがって深層学習では「大域最小に到達する」より「平坦で良質な極小に到達する」方が実用上重要、 という逆説的な現状になっている。
📝 SSDSE-B-2026 で実感する凸最適化の威力
SSDSE-B-2026 の都道府県人口 (47 点) を独立変数、 消費支出を従属変数とする単純線形回帰を考える。 損失関数 $L(a,b) = \sum_i (y_i - a x_i - b)^2$ は二次関数なので凸。 ヘッセ行列を計算すると正定値で、 唯一の大域最小 $(a^*, b^*)$ が解析的に求まる ($a^* = \mathrm{Cov}(x,y)/\mathrm{Var}(x)$, $b^* = \bar{y} - a^* \bar{x}$)。 これが正規方程式の本質である。 一方、 同じ 47 点に 5 層 MLP を当てはめると損失曲面は非凸になり、 異なる初期化で異なる解が得られる。 ニューラルネットの「再現性のばらつき」の根本原因はここにある。
📝 落とし穴 — 大域最小信仰の罠
過学習との混同 — 訓練データで大域最小に到達しても、 テストデータで悪化することがある (オーバーフィッティング)。 大域最小=汎化最良ではない。
計算可能性の限界 — 一般の非凸関数で大域最小を保証付きで見つけることは NP-hard。 実務では「局所最小だが十分良い」で妥協する。
勾配ゼロ ≠ 最小 — 勾配がゼロでも鞍点・プラトー・局所最大の可能性がある。 ヘッセ行列の固有値で識別すること。
収束判定の粗さ — 損失の変化量だけで「収束した」と判断すると、 プラトーで誤判定する。 勾配ノルム・パラメータ変化量も併用すべき。
学習率の罠 — 大き過ぎる学習率は大域最小を飛び越え、 小さ過ぎる学習率は局所最小に閉じ込められる。 cosine annealing で動的調整するのが現代の定石。
📝 理解度チェック (練習問題)
大域最小値の概念を自分のものにするための練習問題を 6 問用意した。 自分で考えてから解答例を確認してほしい。
Q1. 二次関数 $f(x) = (x-3)^2 + 1$ の大域最小値はどこか。 局所最小値は存在するか。
解答例 : 大域最小は $x=3$ で $f=1$。 凸関数なので局所最小はこの 1 点のみ (=大域最小)。
Q2. 関数 $f(x) = x^4 - 4x^2$ の大域最小は何箇所あるか。 $f'(x)=0$ から求めよ。
解答例 : $f'(x) = 4x^3 - 8x = 4x(x^2-2) = 0$ より $x = 0, \pm\sqrt{2}$。 $f(0)=0, f(\pm\sqrt{2})=-4$。 大域最小は $x = \pm\sqrt{2}$ の 2 箇所。 $x=0$ は局所最大。
Q3. 勾配降下法を $f(x,y) = x^2 + 100y^2$ に適用した場合、 学習率 $\eta$ を一定にすると何が起きるか。
解答例 : 谷が細長いため $y$ 方向で振動、 $x$ 方向で遅い収束となる「ジグザグ問題」が起きる。 モメンタムや Adam で改善する。
Q4. 線形回帰の損失関数は凸か非凸か。 理由を述べよ。
解答例 : 凸。 二次関数の和は二次関数で、 ヘッセ行列が半正定値 (実は正定値、 入力 X が列フルランクなら) になるため。
Q5. 高次元の損失曲面で SGD が「動かなくなる」とき、 局所最小に居る確率と鞍点に居る確率はどちらが高いか。
解答例 : 鞍点。 高次元ではヘッセ行列の全固有値が正になる確率より、 正負混在の確率の方が圧倒的に高い (Dauphin 2014)。
Q6. 自分で SSDSE-B-2026 の人口データを使い、 二次損失 $L(x) = \sum_i (pop_i - x)^2$ の大域最小を解析的・数値的の 2 通りで求めて一致を確認せよ。
解答例 : 解析的には $x^* = \bar{pop}$ (平均人口)。 数値的には全探索や勾配降下で同じ値に収束する。 上記補講コードと同じ結果になる。
📝 大域最小値を扱う論文・教科書 — さらなる学習リソース
大域最小値、 非凸最適化、 ニューラルネット損失曲面に関する重要文献を時系列で整理する。 初学者は Boyd の凸最適化を出発点に、 順次深層学習方向へ進むのが効率的。
Boyd & Vandenberghe (2004) 『Convex Optimization』 — 凸最適化の標準教科書。 大域最小の保証や双対性を厳密に学べる。 オンライン無料公開。
Nocedal & Wright (2006) 『Numerical Optimization』 — 非凸を含む数値最適化の包括教科書。 Newton 法・準 Newton 法・信頼領域法を網羅。
Hochreiter & Schmidhuber (1997) "Flat Minima" — 平坦な極小が汎化に有利という古典的論文。 後の SGD バッチサイズ研究の起点。
Dauphin et al. (2014) "Identifying and attacking the saddle point problem" — 高次元損失曲面では局所最小より鞍点が支配的、 という重要発見。
Choromanska et al. (2015) "The Loss Surfaces of Multilayer Networks" — ニューラルネットの損失曲面をスピングラスでモデル化、 大域最小と局所最小の損失差は次元と共に縮むことを示した。
Keskar et al. (2017) "On Large-Batch Training" — 大バッチが鋭い極小に収束しやすく汎化性能が落ちる現象を実証。
Goodfellow, Bengio & Courville (2016) 『Deep Learning』 — 第 8 章「Optimization for Training Deep Models」で大域最小・局所最小・鞍点を整理。
これらの文献を読み進めると、 「大域最小に到達することよりも、 平坦で頑健な解に到達することの方が深層学習では重要」という現代的な理解に辿り着く。 SSDSE のような小規模公的データで線形回帰を学ぶ段階では「大域最小=最適」で十分だが、 ニューラルネットを実装する段階で、 この「大域最小信仰」を一度脱ぎ捨てる必要が出てくる。