AIの損失関数とは?MSE・RMSE・交差エントロピーを新人エンジニア向けに数式つきで解説

こんにちは。ゆうせいです。

今回は、第1章として「損失関数」について解説します。

AIや機械学習を学び始めると、かなり早い段階で「損失関数」という言葉が出てきます。

なんだか難しそうですよね。

でも、損失関数の考え方そのものは、とてもシンプルです。

損失関数とは、AIの予測がどれくらい間違っているかを数値で表す関数です。

たとえば、AIに「明日の気温は何度ですか?」と予測させたとします。

AIが「25度」と予測し、実際は「27度」だった場合、2度ずれています。

この「ずれ」を数値で測る仕組みが損失関数です。

高校のテストでたとえるなら、損失関数は「減点の計算方法」です。

AIがどれだけ良い答えを出したかではなく、どれだけ間違えたかを測ります。

そして、機械学習の目的は、この損失をできるだけ小さくすることです。

損失関数を学ぶ前に押さえる記号

まずは、今回使う記号を整理しておきましょう。

記号意味初心者向けの説明
x入力値AIに渡す情報
y正解値本当の答え
ŷ予測値AIが出した答え
nデータ数学習に使うデータの個数
iデータ番号1番目、2番目、3番目という番号
L損失予測と正解のずれ
J全体の損失データ全体で見た平均的な間違い

数式では、予測値を y の上に山形の記号を付けて ŷ と書きます。

これは「ワイハット」と読みます。

帽子をかぶった y だと思ってください。

y が本当の答え、ŷ がAIの予測です。

データセットを数式で表す

機械学習では、入力と正解のペアをたくさん用意します。

たとえば、家の広さから家賃を予測するAIを考えるなら、入力は家の広さ、正解は家賃です。

D = {(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)}

日本語で言えば、データセットDは、入力xと正解yのペアをn個集めたものです。

1番目のデータは x_1 と y_1。

2番目のデータは x_2 と y_2。

このように、n個目まで続きます。

AIは、このデータを見ながら「入力がこうなら、出力はこうなりそうだ」という関係を学びます。

AIの予測を数式で表す

AIモデルは、入力xを受け取って予測値ŷを出します。

ŷ_i = f_θ(x_i)

日本語で言えば、i番目の入力x_iをAIモデルf_θに入れると、i番目の予測値ŷ_iが出るという意味です。

ここで θ は「シータ」と読みます。

θは、AIモデルが持つ調整可能な値の集まりです。

線形回帰なら、傾きや切片がθにあたります。

ニューラルネットワークなら、重みやバイアスがθにあたります。

たとえるなら、θは料理の味を決める調味料の量です。

塩を増やすか、砂糖を減らすかで味が変わるように、θを変えるとAIの予測も変わります。

誤差とは何か

損失関数を理解する前に、「誤差」を押さえましょう。

誤差とは、予測値と正解値のずれです。

e_i = ŷ_i - y_i

日本語で言えば、i番目の誤差は、AIの予測値から正解値を引いたものです。

たとえば、AIが25と予測し、正解が27なら、誤差は次のようになります。

e_i = 25 - 27 = -2

日本語で言えば、AIの予測は正解より2小さかったという意味です。

逆に、AIが30と予測し、正解が27なら、誤差は3です。

e_i = 30 - 27 = 3

日本語で言えば、AIの予測は正解より3大きかったという意味です。

ただし、誤差をそのまま足し合わせると困ることがあります。

プラスの誤差とマイナスの誤差が打ち消し合うからです。

誤差をそのまま足すと危険

次のような3つの予測を考えてみましょう。

データ正解値 y予測値 ŷ誤差 e = ŷ - y
110011010
210090-10
31001000

誤差をそのまま足すと、次のようになります。

10 + (-10) + 0 = 0

日本語で言えば、プラス10の誤差とマイナス10の誤差が打ち消し合って、合計が0になってしまいます。

でも、1つ目と2つ目の予測は間違っていますよね。

合計が0だから完璧、とは言えません。

そこで、誤差を二乗して扱う方法がよく使われます。

MSEとは何か

MSEは、Mean Squared Errorの略です。

日本語では、平均二乗誤差と呼ばれます。

平均二乗誤差とは、予測値と正解値の差を二乗し、それを全データで平均したものです。

MSE = (1 / n) * Σ_{i=1}^{n} (ŷ_i - y_i)^2

日本語で言えば、MSEは、各データの予測値と正解値の差を二乗し、その合計をデータ数nで割ったものです。

同じ意味で、正解値から予測値を引いて書くこともあります。

MSE = (1 / n) * Σ_{i=1}^{n} (y_i - ŷ_i)^2

日本語で言えば、正解値から予測値を引いても、二乗するため最終的な値は同じになります。

なぜ二乗するのでしょうか?

理由は2つあります。

理由説明
プラスとマイナスを打ち消さないため二乗すると必ず0以上の値になる
大きな誤差を重く見るため誤差が大きいほど二乗後の値が急に大きくなる

たとえば、誤差が2なら二乗して4です。

誤差が10なら二乗して100です。

2^2 = 4

日本語で言えば、誤差2は二乗すると4になります。

10^2 = 100

日本語で言えば、誤差10は二乗すると100になります。

MSEは、大きな間違いに厳しい採点方法です。

小さなミスより、大きなミスを強く減点します。

MSEを具体例で計算する

ここで、実際にMSEを計算してみましょう。

正解値と予測値が次のようにあるとします。

データ番号 i正解値 y_i予測値 ŷ_i誤差 ŷ_i - y_i二乗誤差 (ŷ_i - y_i)^2
121.5-0.50.25
232.0-1.01.00
342.5-1.52.25
453.0-2.04.00

二乗誤差の合計は次の通りです。

0.25 + 1.00 + 2.25 + 4.00 = 7.50

日本語で言えば、4つのデータの二乗誤差をすべて足すと7.50になります。

データ数は4個なので、MSEは次のようになります。

MSE = 7.50 / 4 = 1.875

日本語で言えば、二乗誤差の合計7.50をデータ数4で割ると、平均二乗誤差は1.875になります。

この1.875が、AIの間違い具合を表す数値です。

値が小さいほど、予測が正解に近いと言えます。

RMSEとは何か

RMSEは、Root Mean Squared Errorの略です。

日本語では、平方根平均二乗誤差と呼ばれます。

少し長いですね。

RMSEは、MSEに平方根をつけたものです。

RMSE = sqrt(MSE)

日本語で言えば、RMSEは、MSEの平方根を取った値です。

MSEの式をそのまま入れると、次のようになります。

RMSE = sqrt((1 / n) * Σ_{i=1}^{n} (ŷ_i - y_i)^2)

日本語で言えば、RMSEは、各データの予測値と正解値の差を二乗し、その平均を取り、最後に平方根を取ったものです。

先ほどのMSEは1.875でした。

RMSEは次のように計算できます。

RMSE = sqrt(1.875) ≈ 1.3693

日本語で言えば、MSEである1.875の平方根を取ると、RMSEは約1.3693になります。

RMSEの良いところは、元の単位に近い感覚で誤差を見られることです。

たとえば、家賃を万円単位で予測しているなら、RMSEも万円に近い感覚で理解できます。

MSEは誤差を二乗するため、単位の感覚が少し分かりにくくなります。

RMSEは平方根を取ることで、現実の誤差感に戻してくれるイメージです。

線形回帰の損失関数を省略せずに書く

次に、線形回帰で使う損失関数を見ていきましょう。

線形回帰とは、入力xと出力yの関係を直線で表す方法です。

直線の式は次のように書けます。

ŷ_i = w * x_i + b

日本語で言えば、i番目の予測値は、重みwに入力x_iを掛け、バイアスbを足したものです。

wは重み、または傾きです。

bはバイアス、または切片です。

高校数学の直線でいう y = ax + b とほぼ同じです。

この予測式をMSEに代入します。

J(w, b) = (1 / n) * Σ_{i=1}^{n} (y_i - ŷ_i)^2

日本語で言えば、全体の損失Jは、正解値y_iと予測値ŷ_iの差を二乗し、その平均を取ったものです。

ここに、予測値の式を代入します。

J(w, b) = (1 / n) * Σ_{i=1}^{n} (y_i - (w * x_i + b))^2

日本語で言えば、予測値ŷ_iをw * x_i + bに置き換えた式です。

括弧の中を見やすくすると、次のようになります。

J(w, b) = (1 / n) * Σ_{i=1}^{n} (y_i - w * x_i - b)^2

日本語で言えば、正解値から、重み付き入力とバイアスを引いた差を二乗して平均しています。

ここで、二乗の中身を省略せずに展開します。

(y_i - w * x_i - b)^2
= y_i^2 - 2 * y_i * w * x_i - 2 * y_i * b + (w * x_i)^2 + 2 * w * x_i * b + b^2

日本語で言えば、正解値、重み付き入力、バイアスの差を二乗すると、各項の二乗と、それぞれの掛け合わせの項に分かれます。

(w * x_i)^2 は、次のようにも書けます。

(w * x_i)^2 = w^2 * x_i^2

日本語で言えば、wとx_iの積を二乗すると、wの二乗とx_iの二乗の積になります。

したがって、損失関数全体は次のように展開できます。

J(w, b)
= (1 / n) * Σ_{i=1}^{n} (y_i^2 - 2 * w * x_i * y_i - 2 * b * y_i + w^2 * x_i^2 + 2 * w * b * x_i + b^2)

日本語で言えば、線形回帰の損失関数は、正解値、入力値、重み、バイアスを使った複数の項の合計として表せます。

さらに、Σの外に出せるものを整理すると、次の形になります。

J(w, b)
= (1 / n) * (Σ_{i=1}^{n} y_i^2 - 2 * w * Σ_{i=1}^{n} x_i * y_i - 2 * b * Σ_{i=1}^{n} y_i + w^2 * Σ_{i=1}^{n} x_i^2 + 2 * w * b * Σ_{i=1}^{n} x_i + n * b^2)

日本語で言えば、wやbのようにデータ番号iによって変わらない値は、合計記号の外に出して整理できます。

この式を見ると、損失Jはwとbによって決まることが分かります。

x_iとy_iは、すでに与えられている学習データです。

つまり、AIが調整できるのはwとbです。

損失関数を小さくするとは、より良いwとbを探すことなのです。

線形回帰の具体例

次のようなデータを考えます。

ix_iy_i
112
223
334
445

このデータは、見れば分かる通り、次の直線でぴったり表せます。

y = x + 1

日本語で言えば、入力xに1を足すと正解yになります。

つまり、理想的な重みとバイアスは次の通りです。

w = 1

日本語で言えば、重みは1です。

b = 1

日本語で言えば、バイアスは1です。

このとき、予測値は次のようになります。

ŷ_i = 1 * x_i + 1

日本語で言えば、予測値は入力x_iに1を足したものです。

ix_iy_iŷ_i = 1 * x_i + 1y_i - ŷ_i(y_i - ŷ_i)^2
112200
223300
334400
445500

MSEを計算すると、次のようになります。

MSE = (1 / 4) * (0 + 0 + 0 + 0) = 0

日本語で言えば、すべての予測が正解と一致しているので、平均二乗誤差は0です。

損失が0ということは、このデータに対しては完全に当たっているという意味です。

わざと悪い直線で計算してみる

次に、わざと少し悪いモデルを使ってみます。

ŷ_i = 0.5 * x_i + 1

日本語で言えば、予測値は入力x_iに0.5を掛けて、1を足したものです。

このとき、計算は次のようになります。

ix_iy_iŷ_i = 0.5 * x_i + 1y_i - ŷ_i(y_i - ŷ_i)^2
1121.50.50.25
2232.01.01.00
3342.51.52.25
4453.02.04.00

二乗誤差の合計は次の通りです。

0.25 + 1.00 + 2.25 + 4.00 = 7.50

日本語で言えば、4つの二乗誤差をすべて足すと7.50です。

MSEは次のようになります。

MSE = (1 / 4) * 7.50 = 1.875

日本語で言えば、二乗誤差の合計7.50を4で割ると、MSEは1.875です。

RMSEも計算してみます。

RMSE = sqrt(1.875) ≈ 1.3693

日本語で言えば、このモデルは平均的に約1.3693くらいずれている、と見ることができます。

分類問題では交差エントロピーを使う

ここまでは、数値を予測する回帰問題を扱いました。

回帰問題とは、気温、売上、家賃、点数のような連続値を予測する問題です。

一方で、分類問題では、どのカテゴリに属するかを予測します。

たとえば、画像を見て「グー」「チョキ」「パー」のどれかを判定するAIは分類問題です。

分類問題では、交差エントロピー損失がよく使われます。

交差エントロピー損失とは、AIが正解クラスにどれくらい高い確率を出せたかを評価する損失関数です。

多クラス分類の交差エントロピー

多クラス分類とは、3つ以上のクラスから1つを選ぶ問題です。

たとえば、グー、チョキ、パーの3クラス分類です。

1つのデータに対する交差エントロピー損失は次のように書けます。

L_i = -Σ_{k=1}^{K} y_{i,k} * ln(ŷ_{i,k})

日本語で言えば、i番目のデータについて、各クラスkの正解ラベルy_{i,k}と予測確率ŷ_{i,k}の自然対数を掛け、その合計にマイナスを付けたものです。

ここで、Kはクラス数です。

y_{i,k}は、i番目のデータがクラスkなら1、そうでなければ0です。

ŷ_{i,k}は、AIがi番目のデータをクラスkだと予測した確率です。

データ全体の平均交差エントロピーは次のようになります。

J = -(1 / n) * Σ_{i=1}^{n} Σ_{k=1}^{K} y_{i,k} * ln(ŷ_{i,k})

日本語で言えば、全データについて交差エントロピー損失を計算し、その平均を取ったものです。

交差エントロピーの具体例

グー、チョキ、パーの3分類を考えます。

正解がパーだったとします。

このとき、正解ラベルは次のように表せます。

y = [0, 0, 1]

日本語で言えば、グーではなく、チョキでもなく、パーが正解という意味です。

AIの予測確率が次のようだったとします。

ŷ = [0.10, 0.20, 0.70]

日本語で言えば、AIはグーを10%、チョキを20%、パーを70%と予測しています。

交差エントロピー損失は次のようになります。

L = -((0 * ln(0.10)) + (0 * ln(0.20)) + (1 * ln(0.70)))

日本語で言えば、正解であるパーの予測確率だけが損失に効きます。

0を掛けた項は0になります。

L = -ln(0.70)

日本語で言えば、損失は、正解クラスであるパーの予測確率0.70の自然対数にマイナスを付けたものです。

L ≈ 0.3567

日本語で言えば、この予測の交差エントロピー損失は約0.3567です。

もしAIがパーに高い確率を出していれば、損失は小さくなります。

-ln(0.95) ≈ 0.0513

日本語で言えば、正解クラスの予測確率が0.95なら、損失は約0.0513まで小さくなります。

逆に、正解クラスの確率が低ければ、損失は大きくなります。

-ln(0.10) ≈ 2.3026

日本語で言えば、正解クラスの予測確率が0.10しかない場合、損失は約2.3026になります。

交差エントロピーは、「正解にどれだけ自信を持てたか」を見る採点方法です。

正解に高い確率を出せば低い損失。

正解に低い確率しか出せなければ高い損失。

とても分かりやすいですね。

二値分類の交差エントロピー

二値分類とは、2つのクラスから1つを選ぶ問題です。

たとえば、迷惑メールか通常メールか、故障しているか正常か、合格か不合格か、といった問題です。

二値分類の交差エントロピーは、次のように書けます。

L_i = -(y_i * ln(ŷ_i) + (1 - y_i) * ln(1 - ŷ_i))

日本語で言えば、正解が1の場合はŷ_iの確率を評価し、正解が0の場合は1 - ŷ_iの確率を評価します。

データ全体では、次のようになります。

J = -(1 / n) * Σ_{i=1}^{n} (y_i * ln(ŷ_i) + (1 - y_i) * ln(1 - ŷ_i))

日本語で言えば、二値分類の損失を全データで計算し、その平均を取ったものです。

たとえば、正解が1で、AIが0.90と予測した場合です。

L = -(1 * ln(0.90) + (1 - 1) * ln(1 - 0.90))

日本語で言えば、正解が1なので、AIが1である確率として出した0.90が評価されます。

L = -ln(0.90) ≈ 0.1053

日本語で言えば、正解クラスに高い確率を出せているため、損失は小さくなります。

逆に、正解が1なのに、AIが0.20と予測した場合は次のようになります。

L = -ln(0.20) ≈ 1.6094

日本語で言えば、正解クラスに低い確率しか出せていないため、損失は大きくなります。

回帰と分類で損失関数が違う理由

ここで、少し整理しましょう。

なぜ回帰ではMSEやRMSEを使い、分類では交差エントロピーを使うのでしょうか?

理由は、予測したいものの種類が違うからです。

問題の種類予測したいものよく使う損失関数
回帰数値MSE、RMSE、MAE
分類クラスやカテゴリ交差エントロピー

回帰では、正解値と予測値の距離が大切です。

家賃予測なら、8万円と予測して正解が9万円なら、1万円ずれています。

この距離を測るためにMSEやRMSEが使われます。

分類では、正解クラスにどれだけ高い確率を出したかが大切です。

じゃんけん判定なら、正解がチョキのとき、AIがチョキに90%の確率を出したのか、30%しか出していないのかで評価が変わります。

損失関数の役割を一言で言うと

損失関数の役割を一言で言うなら、AIにとっての反省点数です。

人間も、テストの点数だけではなく、どこを間違えたのかを見て改善しますよね。

AIも同じです。

まず予測します。

次に、正解と比べます。

そして、損失を計算します。

最後に、損失が小さくなるようにパラメータを調整します。

prediction
        ↓
comparison
        ↓
loss
        ↓
parameter update

日本語で言えば、予測し、正解と比べ、損失を計算し、その損失を小さくする方向へパラメータを更新する流れです。

この後に出てくる「勾配降下法」は、まさに損失を小さくするための方法です。

新人エンジニアがよく誤解するポイント

誤解正しい理解
損失が小さければ必ず良いAI学習データだけで損失が小さい場合は過学習の可能性がある
MSEはどんな問題にも使える主に回帰問題で使われる
分類でも誤差の二乗を使えばよい分類では確率を評価する交差エントロピーがよく使われる
損失関数は評価指標と同じ損失関数は学習時に最小化する目的、評価指標は性能確認のもの
損失が0になるのが普通現実のデータでは損失が完全に0になることは少ない

特に注意したいのは、損失関数と評価指標の違いです。

損失関数は、AIが学習中に小さくしようとする値です。

評価指標は、学習後に性能を確認するためのものです。

たとえば、分類では学習に交差エントロピーを使い、評価では正解率を見ることがあります。

目的が少し違うのです。

第1章のまとめ

今回は、損失関数について解説しました。

損失関数とは、AIの予測がどれくらい間違っているかを数値で表す関数です。

AIは、この損失を小さくするように学習します。

用語意味
損失関数AIの予測と正解のずれを数値化する関数
MSE誤差を二乗して平均したもの
RMSEMSEの平方根を取ったもの
交差エントロピー分類問題で、正解クラスにどれだけ高い確率を出せたかを評価する損失
線形回帰の損失J(w, b) = (1 / n) * Σ_{i=1}^{n} (y_i - (w * x_i + b))^2

今回の最重要式をもう一度確認しておきましょう。

MSE = (1 / n) * Σ_{i=1}^{n} (ŷ_i - y_i)^2

日本語で言えば、MSEは、各データの予測値と正解値の差を二乗し、その平均を取ったものです。

RMSE = sqrt((1 / n) * Σ_{i=1}^{n} (ŷ_i - y_i)^2)

日本語で言えば、RMSEは、MSEに平方根を付けて、誤差の感覚を元の単位に近づけたものです。

J(w, b) = (1 / n) * Σ_{i=1}^{n} (y_i - (w * x_i + b))^2

日本語で言えば、線形回帰の損失関数は、正解値と直線モデルの予測値との差を二乗して平均したものです。

J = -(1 / n) * Σ_{i=1}^{n} Σ_{k=1}^{K} y_{i,k} * ln(ŷ_{i,k})

日本語で言えば、多クラス分類の交差エントロピーは、正解クラスに対する予測確率を使って損失を計算し、全データで平均したものです。

損失関数が分かると、次に学ぶ「勾配降下法」が一気に理解しやすくなります。

なぜなら、勾配降下法は、損失関数を小さくするための方法だからです。

今後の学習では、まずMSEを手計算できるようにしましょう。その後、線形回帰の損失関数を展開し、次章で勾配降下法によってwとbをどう更新するのかを学ぶと、AIが少しずつ賢くなる仕組みが見えてきます!

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。