【ITニュース解説】All about Gradient Descent
2025年09月27日に「Dev.to」が公開したITニュース「All about Gradient Descent」について初心者にもわかりやすく解説しています。
ITニュース概要
勾配降下法は、機械学習の線形回帰などで使われる重要な最適化手法だ。モデルの予測と実際の値との誤差を示す「コスト関数」を、数学的な計算(微分)によって最小化する。これにより、最適なモデルの係数を見つけ出し、データへの当てはまりが良いモデルを構築できる。
ITニュース解説
システムエンジニアを目指す上で、機械学習の基礎となる重要な概念の一つに線形回帰がある。線形回帰は、大量のデータから、知りたい値(目的変数 y)と、その値に影響を与えると思われる複数の要因(説明変数 x)との間に、どのような線形の関係があるかを数学的に表現するモデルだ。例えば、家の価格を予測する際に、広さや築年数、駅からの距離といった要因が価格にどう影響するかを、直線や平面の方程式で表すようなものだと考えると良い。
この関係は一般に y = m0 + m1x1 + m2x2 + … + mnxn という形で表される。ここで y は予測したい値、x1, x2, ..., xn は家の広さや築年数といった要因にあたる。m0 は切片と呼ばれ、すべての要因がゼロのときの y の値を示し、m1, m2, ..., mn はそれぞれの要因が y に与える影響の大きさを表す「係数(重み)」である。線形回帰の目標は、与えられたデータに最もよくフィットするような、これらの m0, m1, ..., mn の最適な値をどう見つけるか、という点にある。
最適な m の値を見つけるためには、まず、モデルがどれだけ正確に予測できているかを評価する基準が必要になる。これが「コスト関数」と呼ばれるものだ。コスト関数は、モデルが予測した値(y^、ハット付きの y)と、実際の正解の値(y)との間にどれくらいの「誤差」があるかを数値化する。この誤差が小さければ小さいほど、モデルはデータに良く適合している、つまりより正確な予測ができていると言える。コスト関数は、これらの誤差を全て集計し、最終的に一つの数値として表現する。学習アルゴリズムは、このコスト関数の値を可能な限り小さくすることを目指すのだ。
例えば、線形回帰でよく使われるコスト関数の一つに「平均二乗誤差(Mean Squared Error, MSE)」がある。これは J(y^) = 1/(2N) * Σ(y^i - yi)^2 という式で表される。この式は、各データ点における予測値と実際の値の差を計算し、それを二乗したものを全て合計し、最後にデータ点の数 N で割る(そして計算を簡単にするために 1/2 を掛ける)ことで、平均的な誤差を算出している。二乗することで、誤差の正負を考慮せず、大きい誤差にはより大きなペナルティを与えることができる。この J(y^) の値が小さくなるように、m の値を調整していくことになる。
では、このコスト関数を最小化するにはどうすればよいのだろうか。その答えが「勾配降下法(Gradient Descent)」という強力なアルゴリズムである。勾配降下法は、コスト関数をグラフ上に描いたときに、最も低い地点(「最小値」と呼ばれる)を効率的に見つけ出すための手法だ。イメージとしては、山の中腹に立っていて、一番低い谷底へ向かって下っていくようなものだと考えると分かりやすい。どの方向に進めば最も効率よく谷底にたどり着けるかを知るために、その地点での地面の傾き(勾配)を利用する。傾きが急な方向に一歩進み、またその地点での傾きを調べて進む、ということを繰り返すことで、最終的に谷底に到達できるという考え方だ。
この「傾き」を数学的に計算するために、微分や偏微分が用いられる。線形回帰の例で考えてみよう。コスト関数 J が、先述の係数 m と切片 b の値によって変化するとする。このとき、J を m と b それぞれで偏微分することで、現在の m と b の値が、コスト関数をどれくらい変化させるか(つまり、グラフの傾き)がわかる。
具体的には、線形回帰の単純なモデル y = mx + b の場合、コスト関数 J(m,b) を m で偏微分したものは ∂J(m,b)/∂m = 1/N * Σ(xi((mxi+b) - yi)) となり、b で偏微分したものは ∂J(m,b)/∂b = 1/N * Σ((mxi+b) - yi) となる。
これらの偏微分値を使って、m と b の値を更新していく。更新式は次のようになる。
m_new = m_curr - α * (∂J(m,b)/∂m)
b_new = b_curr - α * (∂J(m,b)/∂b)
ここで m_curr と b_curr は現在の m と b の値であり、m_new と b_new は更新された新しい値である。α (アルファ) は「学習率」と呼ばれ、一度にどれくらいの大きさで谷底に向かって進むか(どれくらいの「歩幅」で進むか)を決定する重要なパラメータだ。学習率が大きすぎると谷底を飛び越えてしまったり、小さすぎると谷底にたどり着くまでに時間がかかりすぎたりするため、適切な設定が必要となる。この更新プロセスを、コスト関数の値が十分に小さくなり、ほとんど変化しなくなるまで(収束するまで)繰り返し実行することで、コスト関数を最小にする最適な m と b の値を見つけることができる。
現実世界で扱うデータは、通常、一つの要因だけでなく、多数の要因が複雑に絡み合って結果に影響を与えることが多い。例えば、株価の予測には、過去の株価だけでなく、経済指標、企業のニュース、政治情勢など、多くの要因が関係する。このような「多変数」の線形回帰においても、勾配降下法は非常に有効である。
多変数の線形回帰モデル y = m0 + m1x1 + m2x2 + … + mnxn を扱う場合、個々の m と x を一つずつ扱う代わりに、「線形代数」という数学の分野で使われる「行列」や「ベクトル」という形式を利用すると、計算を効率的に、そしてシンプルに表現できるようになる。例えば、すべての説明変数 x と定数項 1 を縦に並べたベクトル X と、すべての係数 m を横に並べたベクトル M を用意することで、線形回帰の式は Y = M ⋅ X という行列の積の形で表現できる。
コスト関数の勾配(傾き)を計算する際も、個々の偏微分を計算する代わりに、すべての係数に対する偏微分をまとめた「勾配ベクトル(ヤコビアン)」を用いる。記事ではこれを ∇M J(M) と表現している。この勾配ベクトルも行列の計算で効率的に求めることができ、具体的には ∇M J(M) = 1/N * Σ(Xi^T (M ⋅ Xi - Yi)) となる。ここで Xi^T は X の転置行列(行と列を入れ替えたもの)を表す。
そして、係数ベクトル M の更新も、
M_new = M_old - α * ∇M J(M)
という非常に簡潔な行列の形式で表現できる。この更新プロセスも、単変数の場合と同様に、コスト関数が収束するまで繰り返すことで、多変数の場合でも最適な係数の組み合わせ M を見つけ出すことが可能になる。このように、勾配降下法は、線形回帰モデルの学習において、データに最もよく適合する最適なパラメータを効率的に探すための、不可欠なアルゴリズムだ。