Courses
学習させるあらゆる機械学習モデルは最適化問題を解いています——そして実際に最適化しようとしている対象が、目的関数と呼ばれるものです。
平たく言えば、解の「良さ」を測る数学的な関数です。入力の集合を受け取り、単一のスコアを出力します。目標は常に、そのスコアを最大化または最小化する値を見つけることです。線形計画法からディープラーニングに至るまで、あらゆる分野の中心に目的関数があります。仕組みを理解すると、至るところで目にする基本概念です。
本記事では、目的関数とは何か、損失関数やコスト関数との違い、そして機械学習と最適化での使われ方を解説します。
2026年でも通用するディープラーニングの本格解説をお探しですか? Deep Learning in Python コースで、PyTorchのポートフォリオを構築しましょう。
目的関数とは?
目的関数は、解の良さを評価する数学的な関数です。
モデルパラメータや意思決定変数といった入力の集合を与えると、単一の数値を返します。その数値が、現在の解の性能を示します。数値が高い(または低い)ほど、解はより良い(または悪い)ということです。
ここで、最適化一般についても触れておきましょう。
最適化とは、その数値を望ましい方向に押し上げる(または押し下げる)入力を見つけるプロセスです。最小化ならできるだけ小さく、最大化ならできるだけ大きくします。いずれにせよ、基準となるのは目的関数です。
要するに、スコアリングシステムと考えると分かりやすいでしょう。候補解それぞれにスコアが付き、最も良いスコアのものを見つけるのが仕事です。
目的関数 vs 損失関数 vs コスト関数
この3つの用語はしばしば同じ意味で使われます——が、厳密には同一ではありません。
まず目的関数は最も広い概念です。最大化または最小化の対象となる任意の関数を指します。必ずしも誤差や予測に関わる必要はなく、単にその問題における「より良い」の定義を与えます。
一方、損失関数は、単一の学習事例に対する誤差——モデルの予測が実際の値からどれだけ外れているか——を測ります。例えば、1つのデータ点に対する平均二乗誤差は損失関数です。
そしてコスト関数は、データセット全体にわたる損失を(通常は平均して)集約します。したがって、訓練中に実際に最小化しているのはコスト関数であり、1つの事例ではなく全事例にまたがるモデルの性能を要約します。
実務では、多くのMLフレームワークや論文でこれらの用語はゆるやかに使われます。「コスト」と言うべき場面で「損失」と呼ばれたり、「目的」が3つすべてを指したりします。
研究論文を読むときには、この区別が重要です。文脈から著者がどれを指しているかを判断します。
より具体的な比較は、以下の表をご覧ください。

目的関数/損失関数/コスト関数の比較表
最適化における目的関数
あらゆる最適化問題には、目標と制約があります。
目的関数は目標——最大化または最小化したいもの——を定義します。制約は限界——解が従うべき境界——を定義します。この2つで問題が枠付けられます。
簡単な資源配分の例を考えてみましょう。
2つの製品を生産する工場を運営していて、利益の最大化を目指すとします。目的関数は、各製品の生産量に応じた総利益を表します。制約は、使用可能な原材料、機械稼働時間、労働力などの限界を表します。目的関数は何を最適化するかを、制約はどの範囲でできるかを示します。
これは線形計画法が典型的に当てはまる設定です。線形の目的関数を線形制約の下で最適化する手法で、物流、スケジューリング、サプライチェーンから金融まで広く用いられています。数学は確立されており、ソルバーは数千の変数を持つ問題にも対応できます。
重要なのは、目的関数は制約の内容を変えないという点です——ソルバーに「何を目指すか」を指示するだけです。目的関数を変えれば、同じ制約でもまったく異なる解が得られます。
機械学習における目的関数
機械学習では、目的関数がモデルが実際に学習していることを定義します。
モデルを訓練するたびに、勾配降下法、Adam、RMSPropといった最適化アルゴリズムを走らせ、目的関数を最小化または最大化するようにパラメータを調整しています。モデルは問題の内容を知りません。知っているのは目的関数が与えるスコアだけで、各更新でそのスコアの改善を試みます。
つまり、どの目的関数を選ぶかが結果を形作ります。ケースに応じていくつか試してみるのが賢明です。
平均二乗誤差(回帰)
平均二乗誤差(MSE)は回帰問題のデフォルトの目的関数です。モデルの予測と真の目標値との平均二乗差を測定します。

MSEの式
差を二乗することで、すべての誤差は正になり、大きな誤差が小さな誤差よりも強く罰せられます。例えば10だけ外れた予測は、合計に10ではなく100を寄与します。これによりMSEは外れ値に敏感になるため、現実世界の雑多なデータでは注意が必要です。
import numpy as np
y_true = np.array([3.0, 5.0, 2.5, 7.0])
y_pred = np.array([2.8, 5.2, 2.0, 6.5])
mse = np.mean((y_true - y_pred) ** 2)
print(f"MSE: {mse:.4f}")

MSEの出力
クロスエントロピー損失(分類)
クロスエントロピー損失は分類問題の標準的な目的関数です。モデルが予測した確率分布が真のクラス分布からどれだけ離れているかを測定します。

クロスエントロピー損失関数
正しいクラスに高い確率を割り当てれば損失は小さくなります。自信を持って誤っていれば損失は大きくなり、それを強く罰します。これが、モデルに正しいクラスを自信を持って予測させる原動力になります。
import numpy as np
# True labels (one-hot encoded)
y_true = np.array([1, 0, 0])
# Model's predicted probabilities
y_pred = np.array([0.7, 0.2, 0.1])
cross_entropy = -np.sum(y_true * np.log(y_pred))
print(f"Cross-Entropy Loss: {cross_entropy:.4f}")

クロスエントロピーの出力
対数尤度
対数尤度は確率モデルや統計モデルで一般的です。モデルのパラメータが観測データを生成した確からしさを最大化します。

対数尤度の式
尤度そのものではなく対数を扱うのは、確率の積を和に変換でき、計算と最適化がはるかに容易になるからです。
実務では、多くのフレームワークが対数尤度を最大化する代わりに負の対数尤度(NLL)を最小化します。勾配降下法で扱いやすいように符号を反転しただけで、本質的には同じです。
import numpy as np
from scipy.stats import norm
# Observed data
data = np.array([1.2, 2.3, 1.8, 2.1, 1.9])
# Assumed model parameters
mu, sigma = 2.0, 0.5
# Compute negative log-likelihood
nll = -np.sum(norm.logpdf(data, loc=mu, scale=sigma))
print(f"Negative Log-Likelihood: {nll:.4f}")

対数尤度の出力
訓練の本質は最適化です。順伝播で目的関数の値を計算し、逆伝播で勾配を計算し、各パラメータ更新でスコアが改善する方向にモデルを動かします。
凸関数と非凸関数の目的関数
目的関数はすべて同じではありません。形状が、最適化の難しさと得られた解の信頼性を左右します。
線形の目的関数
線形の目的関数では、入力と出力の関係が直線的です。任意の入力を一定量変えると、出力も一定量変化します。
線形関数は、目的関数と制約の両方が線形である線形計画法で用いられます。もっとも扱いやすいクラスであり、大規模な問題でも大域的最適解を安定して見つけられます。
非線形の目的関数
非線形の目的関数は、入力と出力の関係がより複雑です。多くの実世界の問題——そしてほとんどの機械学習モデル——がこのカテゴリに属します。
MSEは非線形です。クロスエントロピーも非線形です。ニューラルネットワークの損失面も非線形です。複雑さが増すことでデータの複雑な関係を捉えられる反面、最適化は難しくなります。
凸か非凸か
ここが面白いところです。
凸関数はお椀型の形状をしています。曲線上の2点を結ぶ線分は、常に曲線の上または上にあります。これにより、任意の局所最小が大域最小でもあることが保証されます——つまり、最適化手法が底を見つければ、それが本当の底です。
非凸関数はより不規則で、谷や台地、鞍点が複数存在します。最適化手法は局所最小にハマることがあります——底のように見えて実は底ではない谷です。ディープニューラルネットワークの損失面は高度に非凸であるため、学習率、最適化手法、初期化の丁寧な調整が必要になります。
凸問題は厳密に解けますが、非凸問題は近似的に解きます。解の質は最適化戦略に依存します。
視覚的に理解したい方のために、線形・非線形・凸・非凸の目的関数を比較した図を示します。

目的関数タイプの比較
目的関数はどのように最適化されるか
目的関数が定まったら、それを最小化または最大化する方法が必要です。そこで最適化アルゴリズムの出番です。
最も一般的なのは勾配降下法です。目的関数のパラメータに関する勾配を計算し、その値を小さくする方向へ小さな一歩を踏み出します。あとは、その値の改善が止まるまで繰り返します。
勾配とは、目的関数の導関数にほかなりません。
現在位置での傾きと、「上り坂」の方向を教えてくれます。関数を最小化するにはその逆方向へ、最大化するには同じ方向へ進みます。
このプロセスは反復的です。解に到達するために小さな更新を重ね、各更新でパラメータを最適解に近づけます。各ステップの大きさは学習率で制御します。大きすぎると最適解を行き過ぎてしまい、小さすぎると学習が長引きます。
実務では、基本形より高速で安定な勾配降下法の派生がよく使われます。
- 確率的勾配降下法(SGD)は、各ステップでランダムに選んだ1事例のみで勾配を計算します
- ミニバッチ勾配降下法は、少数の事例(バッチ)で勾配を計算する、中庸の手法です
- Adamは各パラメータに学習率を適応させ、チューニングを寛容にします
勾配ベースの手法を使うには、目的関数が微分可能、あるいは少なくとも大部分で微分可能である必要があります。導関数がなければ勾配は得られず、最適化手法は進むべき方向を失います。ここは重要なポイントです。
目的関数の例
単回帰の簡単な問題で具体化してみましょう。
延床面積に基づいて住宅価格を予測するとします。価格が既知の住宅のデータセットがあり、予測誤差を最小にする直線を当てはめたい。目的関数は、既に式をご存知の平均二乗誤差(MSE)です。
入力はモデルのパラメータ——直線の傾きと切片。出力は単一の数値——すべての予測にわたる平均二乗誤差です。この場合、小さいほど良いことを意味します。
Pythonでの実装例は次のようになるでしょう。
import numpy as np
np.random.seed(42)
# Generate some fake housing data
square_footage = np.random.uniform(500, 3000, 100)
true_price = 150 * square_footage + 50000 + np.random.normal(0, 15000, 100)
def predict(x, slope, intercept):
return slope * x + intercept
def mse(y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
# Try two different parameter sets
slope_a, intercept_a = 150, 50000 # good fit
slope_b, intercept_b = 80, 100000 # bad fit
pred_a = predict(square_footage, slope_a, intercept_a)
pred_b = predict(square_footage, slope_b, intercept_b)
print(f"MSE (good fit): {mse(true_price, pred_a):,.2f}")
print(f"MSE (poor fit): {mse(true_price, pred_b):,.2f}")

MSEの良い当てはめと悪い当てはめの比較
最初のパラメータセットはMSEがはるかに小さく、データにより良く適合しています。最適化手法はまさにこの情報を手がかりに、どちらの方向へ進むべきかを判断します。
視覚的に理解したい方は、次の画像をご覧ください。

MSEの例
2つの当てはめがデータに対してどう見えるか、さらに傾きの値域にわたるMSEの曲面——つまり目的関数そのもの——を確認できます。
左のプロットは2つのパラメータセットがデータにどう適合するかを示します。右のプロットは傾きに対するMSEの曲面、すなわち目的関数の曲線を示し、最適化手法が探し当てようとする明確な最小値が見て取れます。勾配降下法の各ステップは、この曲線に沿ってその最小値へと進みます。
制約と目的関数
目的関数は、何を最適化するかを示します。制約は、何が許されるかを示します。
現実の多くの問題では、好きなだけ最大化・最小化できるわけではありません。予算、時間枠、物理的容量などの制限内で作業します。これらの限界が制約であり、最適化手法が選べる有効解の集合を定義します。
製造の例を挙げます。
2つの製品ラインで利益を最大化したいとします。制約がなければ、答えは「できるだけ多く生産する」です。しかし、機械稼働時間は500時間、原材料は1000ユニットという上限があります。これが制約です。目的関数(利益最大化)は同じでも、最適化手法が探索できるのは制約で定まる領域内に限られます。
制約を変えれば、目的関数が同じでも最適解は変わります。
目的関数と制約の組み合わせという構造は、制約付き最適化の土台です。線形計画法、ポートフォリオ最適化、多くの実務的な計画問題はこの形で定式化されます。
結論
ニューラルネットワークの学習、資源配分、回帰モデルの当てはめ——どんな最適化問題も本質的には1つのことに集約されます。すなわち、最小化または最大化したい関数の存在です。
その関数こそが目的関数です。「より良い」の意味を定義し、あらゆるパラメータ更新を導き、モデルが実際に何を学ぶのかを決定します。適切に設定できれば、モデルは抱えている問題を解けます。しかし誤って設定すれば、まったく別の問題を、しかもエラーもなく解いてしまうことがあります。
適切な目的関数の選択はデータサイエンスにおける設計上の意思決定であり、その後のすべてを形作ります。実務家としては、遠慮なく試行してください——選択肢となる目的関数は数多くあります。
どこから始めればよいかわからない場合は、Model Validation in Python と Hyperparameter Tuning in Python の各コースが、初級〜中級のデータサイエンティストに最適な出発点です。
FAQs
目的関数とは何ですか?
目的関数は、解の良さを測る数学的な関数です。モデルパラメータや意思決定変数などの入力集合を与えると、単一の数値を返します。目標は常に、その数値をできるだけ高く、またはできるだけ低くする入力を見つけることです。
目的関数と損失関数の違いは何ですか?
損失関数は、機械学習で単一の学習事例に対する予測誤差を測る、特定のタイプの目的関数です。目的関数はより広い概念で、予測誤差に限らず、最小化または最大化の対象となる任意の関数を指します。実務では両者がしばしば同義で使われますが、研究論文を読む際にはこの区別が重要です。
目的関数はどこで使われますか?
目的関数は、最適化を含むあらゆる問題に登場します——機械学習、線形計画法、資源配分、金融、物流などです。機械学習では、モデルが訓練中に何を学ぶかを定義します。ML以外でも、制約の有無にかかわらず、最適化問題における目標を定義します。
機械学習で目的関数の選択が重要なのはなぜですか?
目的関数は、訓練中にモデルが実際に何を最適化しているかを決めます。誤った目的関数を選ぶと、モデルは誤った対象を最小化してしまいます——しかもそれを上手にやってしまうため、問題の発見が難しくなります。例えば、分類問題にMSEを使うと、結果が悪いだけでなく、自信を持って悪い結果を出すことになり、より厄介です。
目的関数に最小値が複数存在することはありますか?
はい——これはディープラーニングモデルの学習における主要な課題の一つです。非凸の目的関数には複数の局所最小があり、最適化手法が大域最小ではない谷に捕まる可能性があります。重みの初期化、学習率スケジューリング、最適化手法の選択が重要なのはこのためで、最終的に良い解を見つけられるかに影響します。