argmin・argmaxとは?意味・読み方からLaTeXでの正しい書き方まで実例で解説

機械学習の論文を読んでいると、$\theta^{*} = \arg\min_{\theta} L(\theta)$ のような式が当たり前のように出てきます。「この argmin って何? min と何が違うの? そもそも何と読むの?」——この記事は、そんな疑問への答えから始めて、LaTeX で argmin・argmax を思い通りに組む方法までを一気に解説する記事です。

先に一言で答えてしまいましょう。

  • argmin(読み方: アーグミン)= 関数を最小にする入力 $x$ のこと。最小値そのものではありません。
  • argmax(読み方: アーグマックス)= 関数を最大にする入力 $x$ のこと。
  • arg は argument(引数、アーギュメント) の略。「argument of the minimum = 最小値を与える引数」が語源です。

たとえば機械学習でモデルを学習することは、「損失 $L(\theta)$ を最小にするパラメータ $\theta$ を探すこと」であり、次の1本の式で書けます。

$$ \theta^{*} = \operatorname*{argmin}_{\theta} L(\theta) $$

この式は「損失 $L$ を最小にする $\theta$ を $\theta^{*}$ と名付ける」と読みます。argmin・argmax は機械学習(損失最小化・最尤推定・MAP 推定)、最適化、統計と、理工系のあらゆる場面で登場するので、意味と書き方をセットで押さえておくと論文がぐっと読みやすく・書きやすくなります。

本記事の内容

  • argmin・argmax の意味と読み方 — min/max との違いを図で直感的に理解する
  • やりたいことから引ける LaTeX 逆引き早見表
  • \operatorname* と \DeclareMathOperator* による正しい書き方(* が真下化のスイッチ)
  • \arg\min・\underset・\mathop などの代替手段とスペーシング
  • インラインで下付きが右下にずれる理由と \limits / \nolimits による制御
  • KaTeX・MathJax(Web 表示)での対応状況
  • 機械学習での用例(損失最小化・MLE・MAP・分類・クラスタリング・強化学習)
  • よくあるエラーの対処と FAQ

「意味だけ知りたい」方は次の章だけ読めば5分で完結します。「LaTeX の書き方を思い出したい」方は、その次の逆引き早見表に直行してください。

argmin・argmax とは何か(意味と読み方)

読み方: アーグミン・アーグマックス

まず検索の多い「読み方」から。argmin は「アーグミン」、argmax は「アーグマックス」と読むのが一般的です(人によっては「アークミン」「アルグマックス」と読むこともありますが、通じればどれでも問題ありません)。口頭では「アーグ・ミン・シータ」のように、下付きの変数まで続けて読むこともあります。

arg は argument(アーギュメント)=関数の引数(入力)のことです。つまり argmin は「minimum の argument」、直訳すれば「最小値を与える引数」。この語源を知っておくと、意味を忘れません。

意味: min は「値」、argmin は「場所」

min と argmin は混同されがちですが、返すものがまったく違います。min は関数の最小値そのもの(縦軸の高さ)を返すのに対し、argmin はその最小値を与える入力 $x$(横軸の位置)を返します。

たとえば $f(x) = (x – 0.7)^2 + 0.5$ という下に凸の関数を考えましょう。2乗の項 $(x-0.7)^2$ は $0$ 以上で、$x = 0.7$ のときだけ $0$ になります。したがってこの関数の最小値は $0.5$ で、それを与える $x$ は $0.7$ です。式で書くと次のようになります。

$$ \min_{x} f(x) = 0.5, \qquad \arg\min_{x} f(x) = 0.7 $$

微分を使って求めることもできます。$f'(x) = 2(x – 0.7) = 0$ を解くと $x = 0.7$。これが argmin であり、それを $f$ に代入した $f(0.7) = 0.5$ が min です。「微分してゼロと置いて解いたときに出てくる $x$ が argmin、それを代入した値が min」という対応で覚えてもよいでしょう。

同様に argmax(argument of the maximum)は最大値を与える $x$ を返します。次の図で、この「値」と「値を与える $x$」の違いを押さえておきましょう。

argminとargmaxの概念図 最小最大を与えるxを指す

左の図では、赤い点が関数の最小値(高さ $0.5$)を示し、緑の矢印がその点の真下の $x = 0.7$ を指しています。argmin が返すのはこの $x$ の値です。右の図の argmax も同様で、最大値を与える $x$ を返します。「min/max は山の高さ、argmin/argmax は山の足元の位置」と覚えると混同しません。

違いを表にまとめておきます。

記号 読み方 返すもの 上の例での値
$\min_{x} f(x)$ ミン(ミニマム) 最小値(縦軸) $0.5$
$\operatorname*{argmin}_{x} f(x)$ アーグミン 最小値を与える入力(横軸) $0.7$
$\max_{x} f(x)$ マックス 最大値(縦軸) —
$\operatorname*{argmax}_{x} f(x)$ アーグマックス 最大値を与える入力(横軸) —

なぜ「場所」を返す記号が必要なのか

「最小値がわかれば十分では?」と思うかもしれませんが、最適化の実務では逆で、知りたいのはほとんどの場合「場所」のほうです。機械学習なら、損失が最終的に $0.023$ まで下がったという事実(min)より、その損失を達成するパラメータの値(argmin)こそが学習の成果物です。カーナビの経路探索でも、最短の「所要時間」より最短を実現する「経路そのもの」が欲しいはずです。この「答えとして場所が欲しい」という需要に専用の記号を与えたのが argmin・argmax だと考えると、存在理由がすっきりします。

離散的な例も見ておきましょう。3クラス分類モデルがある入力に対して次の確率を出したとします。

クラス $k$ 1(犬) 2(猫) 3(鳥)
予測確率 $p_k$ $0.2$ $0.7$ $0.1$

このとき $\max_{k} p_k = 0.7$(最大の確率値)ですが、$\operatorname*{argmax}_{k} p_k = 2$(その確率を出したクラス番号)です。モデルの予測ラベルとして採用するのは、値 $0.7$ ではなくクラス $2$(猫)のほう——つまり argmax です。連続でも離散でも、「値は max、場所は argmax」という役割分担は変わりません。

少しだけ厳密に: argmin は本来「集合」

数学的に少し正確に言うと、argmin は最小値を達成する点の集合として定義されます。

$$ \operatorname*{argmin}_{x \in X} f(x) = \bigl\{\, x \in X \;\bigm|\; f(x) \leq f(y) \ \text{for all } y \in X \,\bigr\} $$

最小値を与える $x$ が複数あるかもしれない(例: $f(x) = \sin x$ の最小点は無数にある)ので、本来は集合なのです。最小点が1つに定まる場合はその1点と同一視して $x^{*} = \operatorname*{argmin}_{x} f(x)$ と書き、複数あり得ることを明示したい場合は $x^{*} \in \operatorname*{argmin}_{x} f(x)$ と「$\in$(属する)」で書きます。論文でたまに見かける $\in$ 表記はこの理由によるものです。

もう1つの注意は、argmin が存在しないこともあることです。たとえば $f(x) = e^{x}$ は $x \to -\infty$ で限りなく $0$ に近づきますが、$0$ に到達する $x$ は存在しません。この場合、下限 $\inf_{x} e^{x} = 0$ は定義できても、$\operatorname*{argmin}_{x} e^{x}$ は空集合です。厳密な議論では、最小値の到達が保証されないときに $\min$ の代わりに $\inf$(下限)、$\max$ の代わりに $\sup$(上限)を使います。応用の文脈では気にしなくてよいことも多いですが、「argmin は常に存在するとは限らない」ことは頭の片隅に置いておくと安全です。

意味がわかったところで、本題の「LaTeX でどう書くか」に進みましょう。実は素直に argmin と打つと $argmin$ のように斜体になり、「$a \cdot r \cdot g \cdot m \cdot i \cdot n$ という変数の掛け算」に見えてしまいます。正しく組む方法を、まずは早見表から示します。

LaTeX 逆引き早見表:やりたいことからコマンドを引く

「とりあえずコピペしたい」という方はこの表だけで用が足りるはずです。いずれも \usepackage{amsmath} を前提とします(「amsmath なし」と書いた行を除く)。argmax にしたいときは argmin を argmax に置き換えるだけです。

やりたいこと コマンド 備考
立体の argmin(下付きなし) \operatorname{argmin} 斜体化を防ぐ基本
下付き $x$ を真下に(その場で1回) \operatorname*{argmin}_{x} * が真下化のスイッチ
何度も使う(推奨) プリアンブルで \DeclareMathOperator*{\argmin}{arg\,min} → 本文で \argmin_{x} プリアンブル専用
amsmath なしで書く \arg\min_{x} 標準コマンドの組み合わせ
明示的に真下に置く \underset{x}{\operatorname{argmin}} インラインでも真下になる
インラインでも真下に強制 \operatorname*{argmin}\limits_{x} \limits で強制
別行立てでも右下に強制 \operatorname*{argmin}\nolimits_{x} \nolimits で強制
arg と min の間に細い空き arg\,min の \, thin space
古いコードで見かける書き方 \mathop{\rm arg~min} 現代なら \mathop{\mathrm{arg\,min}}

この表の各行を、以降のセクションで順番に解説していきます。まずは「そもそもどの書き方だとどう表示されるのか」を、ソースと表示結果を並べて確認しましょう。

ソースと表示結果の対応表

argmin の書き方は一通りではありません。代表的な4つのソースと、その表示結果を並べたのが次の図です。

argminのLaTeXソースとレンダリング結果の対応表

この図から、4つの書き方の使い分けが読み取れます。1行目の \operatorname{argmin}(* なし)は単に立体で組むだけで、下付きは付けていません。2行目の \operatorname*{argmin}_{x} は * のおかげで $x$ が真下に来ます。3行目の \arg\min_{x} は LaTeX に最初から備わっている \arg と \min を組み合わせたもので、\min がもともと真下化する演算子なので $x$ が真下に来ます。4行目の \underset{x}{...} は明示的に「真下に置く」コマンドです。いずれも argmin が斜体ではなく立体で組まれている点が共通しており、これが読みやすい数式の条件です。

それぞれの書き方を順番に詳しく見ていきます。まずは最も基本となる \operatorname から始めましょう。

方法1: operatorname と operatorname*

\operatorname{...} は amsmath が提供するコマンドで、引数の文字列を「数学演算子」として立体(ローマン体)で組むものです。\sin や \log のような組み込み演算子を、自分で好きな名前で作れると考えてください。

\usepackage{amsmath}   % プリアンブルで読み込む

\operatorname{argmin}          % 立体の argmin(下付きなし)
\operatorname{argmin}_{x} f    % 下付き x は右下に付く
\operatorname*{argmin}_{x} f   % * 付きなら下付き x は真下に

どちらも別行立て($$...$$ や equation 環境)の中では、* 付きなら次のように $x$ が argmin の真下に来ます。

$$ \operatorname*{argmin}_{x} f(x), \qquad \operatorname*{argmax}_{x} f(x) $$

* の有無で下付き条件の位置がどう変わるかを図にしました。

operatornameとoperatorname*で下付き位置が変わる

この図の通り、* がない \operatorname{argmin}_{x} では $x$ が右下($\sin$ の角度のような普通の下付き位置)に付きます。一方 * を付けた \operatorname*{argmin}_{x} では、別行立てのとき $x$ が記号の真下に来ます。argmin・argmax は「どの $x$ について最小化するか」を真下に書く慣習が一般的なので、たいていは * 付きを使うことになります。

\operatorname* の長所は、その場で一回だけ使うぶんには手軽な点です。ただし論文全体で argmin が何度も登場する場合、毎回 \operatorname*{argmin} と打つのは面倒ですし、表記が揺れる原因にもなります。そこで次の章では、\argmin という専用コマンドを自作する方法を紹介します。

方法2: DeclareMathOperator で \argmin を自作する(推奨)

何度も使うなら、プリアンブルで一度だけ宣言して \argmin という短いコマンドを作るのが最もきれいな方法です。amsmath(正確にはその一部の amsopn)が提供する \DeclareMathOperator を使います。

\usepackage{amsmath}                          % amsopn を含む

\DeclareMathOperator*{\argmin}{arg\,min}       % * 付き = 下付きを真下に
\DeclareMathOperator*{\argmax}{arg\,max}

宣言したあとは、本文中で次のように短く書けます。

\theta^{*} = \argmin_{\theta} L(\theta)

$$ \theta^{*} = \operatorname*{argmin}_{\theta} L(\theta) $$

この一連の流れを図にまとめました。

DeclareMathOperatorでargminを自作する手順

図のとおり、手順は3ステップです。①プリアンブルで \usepackage{amsmath} を読み込み、②\DeclareMathOperator*{\argmin}{arg\,min} で宣言し、③本文では \argmin_{x} と書くだけ。ここでも宣言時の * が真下化のスイッチです。* を付けずに \DeclareMathOperator{\argmin}{arg\,min} と宣言すると、\sin などと同じく下付きが右下に付くコマンドになります。

第2引数の arg\,min の中の \, は「細い空白(thin space)」を表します。これを入れることで $\operatorname{arg\,min}$ のように arg と min の間に程よい隙間が生まれ、読みやすくなります。arg\,min とするか argmin と詰めるかは好みと分野の慣習で、論文でもどちらも見かけます。文書内で統一されていることのほうが大切です。

\DeclareMathOperator 方式の利点は3つあります。第一に、本文が \argmin と短く書けて読みやすい。第二に、表記が一箇所の宣言で統一され、揺れが起きない。第三に、後から「arg min の間隔を変えたい」と思っても宣言を1行直すだけで全体に反映されます。長い文書では迷わずこの方式を選びましょう。

なお \DeclareMathOperator はプリアンブル専用(\begin{document} より前)である点に注意してください。本文の数式の中で使うとエラーになります。本文中で一度だけ即席に使いたいときは、前述の \operatorname* を使います。次は、amsmath を使わずに素のコマンドで書く方法を見ます。

方法3: 素の \arg\min / \arg\max とスペーシング

実は LaTeX には \arg、\min、\max という演算子が最初から備わっています。これらを組み合わせれば、amsmath なしでもそれらしい表記が作れます。

\arg\min_{x} f(x)     % arg と min を並べる
\arg\max_{x} f(x)

$$ \arg\min_{x} f(x), \qquad \arg\max_{x} f(x) $$

\min と \max はもともと「別行立てで下付きが真下に来る」演算子(\sum や \lim の仲間)なので、_{x} を付けると $x$ が真下に来てくれます。この点は手軽です。ただし \arg と \min は別々の演算子なので、両者の間隔が \operatorname{arg\,min} で自分で調整したものとは微妙に異なります。仕上がりにこだわるなら自作コマンド方式、サッと書きたいなら素の組み合わせ、と使い分けるとよいでしょう。

ここで重要なのがスペーシングです。よくある失敗は、数式モードでそのまま argmin と打ってしまうことです。すると LaTeX は $a, r, g, m, i, n$ という6つの変数の積と解釈し、$argmin$ のように斜体・等間隔で組んでしまいます。次の図で、立体と斜体の違いを並べて確認しましょう。

argminのスペーシング 立体と斜体の違い

図の1行目 \arg\min は arg と min がそれぞれ立体で組まれ、間に細い空きが入っています。2行目の直書き arg min は $arg\ min$ のように斜体になり、変数の積に見えてしまうため避けるべきです。3行目の \operatorname{arg\,min} は立体に \,(thin space)を加えたもので、自作コマンドと同じ仕上がりになります。「argmin は演算子であって変数の積ではない」ことを LaTeX に伝えるのが、立体化(\operatorname や \arg\min)の本質です。

ここまでが定番の3通りです。もう少しマイナーですが、古いコードや Web でよく見かける書き方も2つ補足しておきます。

方法4: underset と mathop(代替手段・古いコードの読み解き)

\underset で明示的に真下に置く

amsmath の \underset{下}{本体} は「本体の真下に何かを置く」汎用コマンドです。これを使っても argmin が書けます。

\underset{x}{\operatorname{argmin}} \, f(x)

$$ \underset{x}{\operatorname{argmin}} \, f(x) $$

\underset の特徴は、インライン数式の中でも常に真下に置かれることです(後述する displaystyle/textstyle の影響を受けません)。ピンポイントで「ここだけは絶対に真下」としたいときに便利ですが、行の高さが広がって行間が乱れやすいので、多用は禁物です。

\mathop — 古い文書で見かける書き方

古い LaTeX のコードや Web の質問サイトでは、次のような書き方も見かけます。

\mathop{\rm arg~min}_{x} f(x)          % 古いスタイル(\rm は旧式)
\mathop{\mathrm{arg\,min}}_{x} f(x)    % 現代的に書くならこちら

\mathop{...} は「中身を演算子(\lim の仲間)として扱え」というプリミティブで、これにより下付きが別行立てで真下に来るようになります。\rm はローマン体(立体)への切り替え、~ は空白です。動作はしますが、\rm は LaTeX2e では非推奨の旧式コマンドなので、いま新しく書くなら \operatorname* か \DeclareMathOperator* を使うのが安全です。古い文書を読むときに「これは argmin を手作りしているんだな」とわかれば十分です。

\mathrm や \text での代用はアリか

「立体にするだけなら \mathrm{argmin} や \text{argmin} でもいいのでは?」という疑問もよくあります。たしかに見た目は立体になりますが、\operatorname 系と比べて2つ欠点があります。

  1. 前後の空きが演算子扱いにならない — \operatorname は $\sin x$ のように「演算子と引数の間の適切な空き」を自動で入れますが、\mathrm はただの文字列なので詰まって組まれます。
  2. 下付きを真下に置けない — \mathrm{argmin}_{x} の $x$ は常に右下で、* のような真下化の仕組みがありません。

つまり \mathrm・\text は「フォントを変えるだけ」、\operatorname は「数学演算子として登録する」コマンドです。argmin のような演算子には、素直に \operatorname 系を使いましょう。

さて、ここまで「真下に置く」話を何度もしてきましたが、実は同じソースでも別行立てかインラインかで下付きの位置が変わります。「* を付けたのに真下に来ない!」の原因はほぼこれなので、次にこの仕組みを掘り下げます。

下付き条件の位置: displaystyle と textstyle、limits/nolimits

「\operatorname* を使ったのに $x$ が真下に来ない」という現象に出くわすことがあります。その原因はたいてい displaystyle と textstyle の違いです。

LaTeX の数式には2つの組み方モードがあります。$$...$$ や equation 環境のような別行立ては displaystyle で組まれ、\sum や \lim、\operatorname* の下付きは記号の真下に置かれます。一方、文章中に埋め込むインライン $...$ は textstyle で組まれ、行の高さを抑えるために下付きが右下に縮められます。

displaystyleとtextstyleで条件位置が変わる

この図のとおり、同じ \operatorname*{argmin}_{x} というソースでも、別行立て(displaystyle)では $x$ が真下に、インライン(textstyle)では $x$ が右下に来ます。インラインの例: $\operatorname*{argmin}_{x} f(x)$。別行立ての例は次のとおりです。

$$ \operatorname*{argmin}_{x} f(x) $$

この挙動を強制的に切り替えるのが \limits と \nolimits です。

% インラインでも下付きを真下に強制する
$\operatorname*{argmin}\limits_{x} f(x)$

% 別行立てでも下付きを右下に強制する
\operatorname*{argmin}\nolimits_{x} f(x)

\limits は「下付き・上付きを真下・真上に置け」、\nolimits は「右下・右上に置け」という命令です。インラインの式でもどうしても $x$ を真下に置きたいときは \limits を、逆に別行立てでも右下にまとめてコンパクトにしたいときは \nolimits を使います。なお \limits・\nolimits は \operatorname* や \sum のような演算子に対してのみ使えます。

ちなみに \displaystyle を明示的に付けると、インラインの式の中でも別行立てと同じ大きな組み方に切り替わり、下付きも真下になります。

$\displaystyle \operatorname*{argmin}_{x} f(x)$   % インラインでも真下に

このように下付きの位置はモードに依存します。位置の制御がわかったところで、実務でよく必要になる「下付き条件が複雑な場合」の書き方も押さえておきましょう。

制約付き最適化: 下付き条件が複雑なときの書き方

最適化の実務では、単に $x$ ではなく「$x$ は集合 $C$ の中」「ノルムが1」のような制約付きの argmin を書く場面が多くあります。パターン別にまとめます。

定義域を下付きに書く

制約が1つなら、下付きにそのまま書くだけです。集合の記号 $\in$ を使います。

\operatorname*{argmin}_{x \in C} f(x)
\operatorname*{argmax}_{k \in \{1, \dots, K\}} p_k

$$ \operatorname*{argmin}_{x \in C} f(x), \qquad \operatorname*{argmax}_{k \in \{1, \dots, K\}} p_k $$

条件が複数行になるとき: \substack

条件が2つ以上あって1行に収まらないときは、amsmath の \substack で下付きを複数行に分けられます。行の区切りは \\ です。

\operatorname*{argmin}_{\substack{x \in \mathbb{R}^n \\ \|x\| = 1}} f(x)

$$ \operatorname*{argmin}_{\substack{x \in \mathbb{R}^n \\ \|x\| = 1}} f(x) $$

\substack の中は自動的に小さめの文字で中央揃えに組まれるので、条件が2〜3行あってもコンパクトに収まります。\sum の添字などにも同じテクニックが使えます。

subject to(s.t.)形式で書く

制約が多い・式が長い場合は、下付きに詰め込まず「subject to(〜という制約のもとで)」形式に分けるのが読みやすい書き方です。

x^{*} = \operatorname*{argmin}_{x} \ f(x) \quad \text{s.t.} \quad g(x) \leq 0, \ h(x) = 0

$$ x^{*} = \operatorname*{argmin}_{x} \ f(x) \quad \text{s.t.} \quad g(x) \leq 0, \ h(x) = 0 $$

\text{s.t.} で立体の「s.t.」を入れ、\quad で間隔を空けるのが定番です。不等式制約 $g(x) \leq 0$ に使う不等号の書き分けは LaTeXで不等号を書く方法 にまとめています。

実はこの「下付きが真下に来る」性質は argmin に固有のものではなく、$\sum$ や $\lim$ など多くの演算子に共通する仕組みです。次の章でその仲間を整理します。

min・max・sup・inf・lim も同じ仕組み

argmin の * による真下化は、特別な機能ではありません。LaTeX にはもともと下付きが真下に来る演算子がいくつもあり、argmin はその仲間に新しく加わっているだけです。代表的なものを並べてみましょう。

min max sup inf limもargminと同じ真下化の仕組み

図に挙げた $\min$、$\max$、$\sup$、$\inf$、$\lim$ は、いずれも別行立てで下付きが真下に来る演算子です。ソースは次のように、どれも \演算子名_{条件} という同じ形をしています。

\min_{x} f(x)        % 最小値
\max_{x} f(x)        % 最大値
\sup_{x} f(x)        % 上限(supremum)
\inf_{x} f(x)        % 下限(infimum)
\lim_{x \to 0} f(x)  % 極限

$$ \min_{x} f(x), \quad \max_{x} f(x), \quad \sup_{x} f(x), \quad \inf_{x} f(x), \quad \lim_{x \to 0} f(x) $$

これらは amsmath を読み込まなくても標準で使えます。\DeclareMathOperator* で argmin を自作するというのは、要するに「argmin を \min や \lim と同じ振る舞いの演算子として新規登録する」ことに他なりません。だからこそ宣言時の * が、\min などと同じ真下化の挙動を与えるスイッチになるわけです。

min・max 単体の書き方の補足

\min・\max そのものの使い方も、argmin と同じ知識で整理できます。

  • 下付き付き: \min_{x} f(x) — 別行立てなら $x$ が真下、インラインなら右下。インラインでも真下にしたければ \min\limits_{x} と \limits を付けます(argmin の場合とまったく同じルールです)。
  • 2つの値の小さいほう: \min(a, b) あるいは \min\{a, b\} — 下付きを使わず、引数を括弧で並べる書き方です。$\min(a, b)$ のように関数呼び出しの見た目になります。
  • 直打ちは NG: min と直打ちすると $min$ と斜体になり、変数 $m, i, n$ の積に見えてしまいます。必ず \min を使ってください。

argmin で学んだ「立体で組む」「下付きの位置は displaystyle 次第」という原則が、\min・\max にもそのまま通用することがわかります。

この仲間意識を持っておくと、\det(行列式)や \gcd(最大公約数)のような他の演算子も同じ要領で扱えるとわかります。極限 \lim の下付き($x \to 0$ など)の書き方は LaTeXで極限limを書く方法 で詳しく解説しています。

ところで、この記事を Qiita やブログ、Jupyter Notebook など Web 上の数式で試している方も多いはずです。Web の数式エンジンでは LaTeX と挙動が少し違う点があるので、先に注意点をまとめておきます。

KaTeX・MathJax(Web表示)での注意

Web で数式を表示するエンジンは主に KaTeX と MathJax の2つで、argmin まわりの対応状況が異なります。

書き方 LaTeX(文書) KaTeX MathJax
\operatorname{argmin} ○ ○ ○
\operatorname*{argmin}_{x} ○ ○ ○
\DeclareMathOperator*{\argmin}{arg\,min} ○(プリアンブル) ×(非対応) ○(数式内で宣言可)
\arg\min_{x} / \underset / \limits / \mathop ○ ○ ○

ポイントは1つだけです。KaTeX は \DeclareMathOperator に対応していません。KaTeX 環境(Qiita、Jupyter の一部、多くの静的サイトジェネレータ)では、プリアンブルという概念がそもそもないため、\operatorname*{argmin}_{x} を直接書くのが確実です。毎回書くのが面倒なら、KaTeX のマクロ設定(macros: {"\\argmin": "\\operatorname*{argmin}"} のような定義)でエディタ側に登録する方法もあります。

一方 MathJax は数式内での \DeclareMathOperator 宣言に対応しているので、LaTeX 文書とほぼ同じ感覚で使えます。「LaTeX では動くのにブログでは argmin がエラーになる」ときは、まずこの差を疑ってください。

書き方は一通りそろいました。最後に、argmin・argmax が実際に活躍する機械学習の場面を、数式例とともに見ておきましょう。冒頭で見た「意味」が、実際の式の中でどう働くかを確認する仕上げです。

機械学習での用例

argmin・argmax がもっとも頻繁に登場するのが機械学習です。代表的な使い方を数式例とともに紹介します。

損失最小化(経験リスク最小化)

モデルの学習とは、「予測の誤差(損失)を最小にするパラメータを探す」作業です。これはまさに argmin で表されます。学習で得られる最適パラメータ $\theta^{*}$ は、損失関数 $L(\theta)$ を最小にする $\theta$ として書けます。

\theta^{*} = \operatorname*{argmin}_{\theta} \frac{1}{N} \sum_{i=1}^{N} \ell\bigl(y_i, f_\theta(x_i)\bigr)

$$ \theta^{*} = \operatorname*{argmin}_{\theta} \frac{1}{N} \sum_{i=1}^{N} \ell\bigl(y_i, f_\theta(x_i)\bigr) $$

ここで $\ell$ は1サンプルあたりの損失、$N$ はデータ数です。この「損失曲面の谷底を与える $\theta$」というイメージを図にすると次のようになります。

機械学習で損失を最小化するパラメータをargminで表す

図の青い曲線が損失 $L(\theta)$、赤い点がその最小値です。緑の矢印が指す $\theta^{*}$ こそ argmin が返す値、すなわち学習の答えになります。勾配降下法などの最適化アルゴリズムは、この $\theta^{*}$ を数値的に探し当てる手続きだと理解できます。勾配 $\nabla L$ の書き方は LaTeXで勾配∇(ナブラ)を書く方法 を参照してください。

最尤推定と MAP 推定

確率モデルのパラメータ推定でも argmax・argmin が活躍します。最尤推定(MLE)は尤度 $p(\mathcal{D} \mid \theta)$ を最大にするパラメータを選びます。

\hat{\theta}_{\mathrm{MLE}} = \operatorname*{argmax}_{\theta} \, p(\mathcal{D} \mid \theta)

$$ \hat{\theta}_{\mathrm{MLE}} = \operatorname*{argmax}_{\theta} \, p(\mathcal{D} \mid \theta) $$

事前分布 $p(\theta)$ を考慮する MAP(事後確率最大化)推定は、事後分布 $p(\theta \mid \mathcal{D}) \propto p(\mathcal{D} \mid \theta)\, p(\theta)$ を最大にする $\theta$ を選びます。

\hat{\theta}_{\mathrm{MAP}} = \operatorname*{argmax}_{\theta} \, p(\mathcal{D} \mid \theta)\, p(\theta)

$$ \hat{\theta}_{\mathrm{MAP}} = \operatorname*{argmax}_{\theta} \, p(\mathcal{D} \mid \theta)\, p(\theta) $$

実際の計算では対数をとって積を和に変え、符号を反転して「負の対数尤度の最小化」として解くことが多く、その場合は argmax が argmin に変わります。

\hat{\theta}_{\mathrm{MAP}} = \operatorname*{argmin}_{\theta} \Bigl\{ -\log p(\mathcal{D} \mid \theta) - \log p(\theta) \Bigr\}

$$ \hat{\theta}_{\mathrm{MAP}} = \operatorname*{argmin}_{\theta} \Bigl\{ -\log p(\mathcal{D} \mid \theta) – \log p(\theta) \Bigr\} $$

対数をとっても argmax・argmin が変わらないのは、$\log$ が単調増加関数だからです。「最大の場所」は対数をとっても動きません——ここでも「argmax は値でなく場所」という冒頭の理解が効いてきます。

分類の予測

学習済みの分類モデルで「最も確率の高いクラスを選ぶ」操作も argmax です。クラス $k$ の予測確率を $p_k(x)$ とすると、予測ラベル $\hat{y}$ は次のように書けます。

\hat{y} = \operatorname*{argmax}_{k \in \{1, \dots, K\}} \, p_k(x)

$$ \hat{y} = \operatorname*{argmax}_{k \in \{1, \dots, K\}} \, p_k(x) $$

NumPy の np.argmax や PyTorch の torch.argmax は、まさにこの数式の演算(最大値のインデックス=場所を返す)を実装した関数です。プログラミングで argmax 関数を使ったことがある方は、「配列の最大値そのものは max、最大値の位置は argmax」という対応がそのまま数学記号にも当てはまる、と理解すると腑に落ちるはずです。

クラスタリングと強化学習

他分野の頻出例も2つ挙げておきます。k-means クラスタリングでは、各データ点 $x_i$ を「最も近いクラスタ中心 $\mu_k$」に割り当てます。「最も近い $k$」はまさに argmin です。

c_i = \operatorname*{argmin}_{k} \, \| x_i - \mu_k \|^2

$$ c_i = \operatorname*{argmin}_{k} \, \| x_i – \mu_k \|^2 $$

強化学習の greedy 方策では、状態 $s$ で「行動価値 $Q(s, a)$ が最大になる行動」を選びます。こちらは argmax です。

a^{*} = \operatorname*{argmax}_{a} \, Q(s, a)

$$ a^{*} = \operatorname*{argmax}_{a} \, Q(s, a) $$

どの例でも共通するのは、argmin・argmax が「候補の中から最良のものを選び出す操作」を1つの記号で表している点です。損失最小化ならパラメータを、分類ならクラスを、クラスタリングなら所属先を、強化学習なら行動を選ぶ——「選ぶ」場面が来たら argmin・argmax の出番、と覚えておくと式を立てるときにも役立ちます。

このように、機械学習の式は argmin・argmax を使うと「何を変数として、何を最小化・最大化するのか」が一目で伝わります。最後に、つまずきやすいエラーと、検索でよく見かける疑問への短答をまとめておきます。

よくあるエラーと対処

argmin まわりで実際に出くわしやすいエラー・トラブルを、原因と対処のセットで挙げます。

Undefined control sequence \argmin

\argmin は LaTeX の組み込みコマンドではありません。プリアンブルで \DeclareMathOperator*{\argmin}{arg\,min} を宣言し忘れていると、このエラーになります。宣言を足すか、その場しのぎなら \operatorname*{argmin} に書き換えてください。KaTeX 環境なら前述のとおり \DeclareMathOperator 自体が使えないので、\operatorname* 一択です。

\DeclareMathOperator を本文で使ってエラー

\DeclareMathOperator はプリアンブル専用です。\begin{document} より後(本文や数式の中)に書くと「LaTeX Error: \DeclareMathOperator allowed only in preamble」で止まります。宣言をプリアンブルへ移動してください。

Command \argmin already defined

テンプレートやクラスファイル側で \argmin が既に定義されていると、二重定義エラーになります。学会テンプレートでたまに起きるパターンです。自分の宣言を削るか、別名(\argminb など)で宣言し直せば回避できます。

エラーは出ないが argmin が斜体になっている

エラーではなく「静かに間違っている」ケースです。数式モードに argmin と直打ちすると変数の積として斜体で組まれてしまいます。コンパイルは通るのでレビューで指摘されるまで気づきにくく、いちばん多い失敗です。\operatorname 系で立体化しましょう。

* を付けたのに真下に来ない

インライン数式(textstyle)では仕様どおり右下に付きます。前述の \limits か \displaystyle を使うか、別行立てに移してください。

エラーの原因はほぼこの5つに集約されます。仕上げに、この記事に検索でたどり着いた方が抱きがちな疑問へ、一問一答で答えておきます。

よくある質問(FAQ)

Q. argmax とは何ですか? A. 関数を最大にする入力(引数)を返す演算子です。$\operatorname*{argmax}_{x} f(x)$ は「$f(x)$ を最大にする $x$」を意味します。最大値そのもの($\max$)ではない点がポイントです。

Q. argmin・argmax は何と読みますか? A. 「アーグミン」「アーグマックス」が一般的です。arg は argument(引数)の略なので、「アーギュメント・ミニマム」と正式に読み下すこともできますが、口頭ではまず使いません。

Q. 「argmin」と「arg min」、スペースはどちらが正しいですか? A. どちらも使われており、明確な標準はありません。組版上は \DeclareMathOperator*{\argmin}{arg\,min} のように thin space(\,)を挟む流儀と、argmin と詰める流儀があります。1つの文書内で統一されていれば問題ありません。

Q. min と argmin の関係を式で書くと? A. $f\bigl(\operatorname*{argmin}_{x} f(x)\bigr) = \min_{x} f(x)$ です。「最小点に関数を適用すると最小値が返る」という関係で、argmin が「場所」、min が「値」であることがよくわかります。

Q. 最小点が複数あるときはどうなりますか? A. argmin は本来集合なので、複数の点をすべて含みます。たとえば $\operatorname*{argmin}_{x} \sin x$ は $\{\, -\pi/2 + 2\pi n \mid n \in \mathbb{Z} \,\}$ という無限集合です。1点を選んで議論したいときは $x^{*} \in \operatorname*{argmin}_{x} \sin x$ のように $\in$ で書きます。

Q. argmax と argmin は相互に変換できますか? A. できます。$\operatorname*{argmax}_{x} f(x) = \operatorname*{argmin}_{x} \bigl(-f(x)\bigr)$ という関係が常に成り立ちます。符号を反転すると山と谷が入れ替わりますが、「一番高い場所」と「(反転後の)一番低い場所」は同じ $x$ だからです。最尤推定(argmax)を負の対数尤度の最小化(argmin)に書き換えられるのも、この関係によります。

Q. argmin は日本語で何と言いますか? A. 定訳はありませんが、「最小点」「最小値を与える点(引数)」「最小化解」などと呼ばれます。文章中では「$L$ を最小にする $\theta$」のように読み下すのが自然です。

Q. NumPy の np.argmax と数学の argmax は同じものですか? A. 考え方は同じです。np.argmax(a) は配列 a の最大値のインデックス(=場所)を返します。定義域が「配列の添字の集合」になった argmax だと考えれば、そのまま対応します。なお NumPy では最大値が複数あるとき最初のインデックスだけを返す仕様で、集合を返す数学の定義とはここが少し違います。

まとめ

argmin・argmax の意味・読み方から LaTeX での書き方までを整理しました。要点は次のとおりです。

  • 意味: min/max は最小値・最大値そのもの(縦軸の高さ)、argmin/argmax はその値を与える入力 $x$(横軸の位置)を返す。厳密には最小点の集合で、複数あり得るときは $\in$ で書く。
  • 読み方: argmin は「アーグミン」、argmax は「アーグマックス」。arg は argument(引数)の略。
  • 基本の書き方: \usepackage{amsmath} を読み込み、\operatorname*{argmin}_{x} で書く。末尾の * が下付きを真下に置くスイッチ。
  • 推奨: 何度も使うならプリアンブルで \DeclareMathOperator*{\argmin}{arg\,min} と宣言し、本文では \argmin_{x} と短く書く。
  • 代替: \arg\min_{x}(amsmath 不要)、\underset{x}{\operatorname{argmin}}(常に真下)。直書きの argmin は斜体になるので NG。古いコードの \mathop{\rm arg~min} も同じ目的。
  • 位置の制御: 別行立て(displaystyle)は真下、インライン(textstyle)は右下。\limits / \nolimits で強制切り替え可能。
  • Web 表示: KaTeX は \DeclareMathOperator 非対応。\operatorname* を直接書くのが確実。
  • 仲間: \min \max \sup \inf \lim も同じ「真下化する演算子」。argmin はその仲間に加える操作。

最後に「結局どれを使えばいいか」の指針をまとめます。

  1. LaTeX 文書で何度も使う → \DeclareMathOperator*{\argmin}{arg\,min} をプリアンブルに書き、本文は \argmin_{\theta}(最推奨)
  2. 1回だけ・すぐ書きたい → \operatorname*{argmin}_{x}
  3. Qiita・ブログなど KaTeX 環境 → \operatorname*{argmin}_{x}(\DeclareMathOperator が使えないため)
  4. amsmath が使えない環境 → \arg\min_{x}
  5. インラインでどうしても真下に置きたい → \limits を足すか \underset を使う

この5パターンを覚えておけば、損失最小化でも MAP 推定でも、どんな環境でも美しく統一された式が組めます。

関連記事:LaTeX数式記法シリーズ

LaTeX数式記法 完全ガイド(実用チートシート)
頻出記法を一覧で俯瞰できるハブ記事
画像なし
LaTeXで極限limを書く 完全ガイド コピペ可
argminと同じ真下化演算子limの書き方
画像なし
LaTeXで対数log・指数expを書く 完全ガイド コピペ可
対数尤度最大化でargmaxと組み合わせる
”LaTeXで確率記号P(X)・期待値E[X
機械学習の論文を読んでいると、$\theta^{*} = \arg\min_{\...

をマスター 完全ガイド コピペ可” description=”MAP推定でargmaxを使う確率表記”]

画像なし
LaTeXで総和Σ・総乗Π
損失関数の総和とargminを組み合わせる
画像なし
LaTeXで集合記号(∈ ⊂ ∪ ∩ ∖ ∅ ℝ) 完全ガイド コピペ可
argminが集合であることを∈で書く表記
画像なし
LaTeXで行列の書き方まとめ|pmatrix・転置・逆行列
最適化で頻出の行列・ベクトル表記