AI は、答えを出しては正解と比べ、外れた分だけ中の数を直す、という作業をくり返して学習します。その「どちらへ、どれだけ直すか」を決めるのに使うのが微分(びぶん)です。この記事では、微分が何を計算しているのかを小さな数の手計算で確かめます。最後に、微分と対になる積分(せきぶん)が何を表すかも短く見ます。

大学の授業では、微分は極限(きょくげん)という考え方の定義から入ることが多いです。ここでは、自分で計算して何をしているのかをつかむことを優先し、証明は扱いません。紙とペンと電卓を用意し、途中の小さな問題は答えを読む前に計算してみてください。

AI のどこで微分を使うか

AI の中には、重み(おもみ)と呼ばれる数がたくさん入っています。入力に重みを掛けて足し、答えを出します。重みの値しだいで、答えが当たったり外れたりします。

AI の答えと正解のずれを1つの数で表したものを、誤差(ごさ)と呼びます。損失(そんしつ)とも呼び、論文では損失のほうをよく使います。学習とは、誤差が小さくなるように重みを直していくことです。

重みは何万個、何億個とあります。1つ1つの重みについて「少し大きくすると誤差は増えるのか減るのか」が分かれば、全部の重みを誤差が減る向きに直せます。この「少し動かしたときの変わり方」を出す計算が微分です。

横軸が重み、縦軸が誤差の、下に丸くへこんだ曲線のグラフ。曲線の左側の点に「今の重み」と書かれ、その点に接する直線が「この点の傾き=微分」。点から右下へ青い矢印があり、誤差が減る向きへ少し動かすと書いてある。いちばん下の点に、いちばん誤差が小さい所と書いてある

この図を読めるようになることを目指して、関数とグラフから順に進みます。

関数とグラフ

関数(かんすう)は、数を1つ入れると、決まった計算をして数を1つ返すものです。

f(x) = 2x + 1

これは「f という関数は、入れた数 x を2倍して1を足して返す」という意味です。f(x) は「エフ・エックス」と読みます。2x は 2 × x の掛け算の記号を省いた書き方です。x に 3 を入れると、f(3) = 2×3 + 1 = 7 になります。

入れる数を横軸、返ってくる数を縦軸にして点を打ち、つなげたものがグラフです。上の図の曲線も関数のグラフで、重みを入れると誤差を返す関数だと見れば、「重みを少し動かすと誤差がどう変わるか」はグラフの傾きの話になります。

傾きは横に進んだ分に対する縦の変わり方

まっすぐな線の傾きは、次の割り算で出します。中学の数学の「変化の割合」と同じものです。

傾き = 縦の変わった量 ÷ 横の変わった量

f(x) = 2x + 1 で x が 1 から 3 に変わると、f(x) は 3 から 7 に変わります。横に 2 進んで縦に 4 上がったので、傾きは 4 ÷ 2 = 2 です。まっすぐな線は、どこで測っても傾きが同じです。

傾きの符号には意味があります。

傾き グラフの形 x を少し増やすと
プラス 右上がり f(x) が増える
0 平ら f(x) はほとんど変わらない
マイナス 右下がり f(x) が減る

微分は曲線のその点での傾き

曲がった線では、場所によって傾きが変わります。f(x) = x² のグラフで考えます。x² は「エックスの2乗」と読み、x × x のことです。

x = 1 の所での傾きを知りたいとします。曲線なので、さっきの割り算をそのまま使えません。そこで、x = 1 の点と少し右の点を結んだ線の傾きを出し、右の点をだんだん近づけます。

相手の点 縦の変わった量 横の変わった量 傾き
x = 2 2² − 1² = 3 1 3
x = 1.5 1.5² − 1² = 1.25 0.5 2.5
x = 1.1 1.1² − 1² = 0.21 0.1 2.1
x = 1.01 1.01² − 1² = 0.0201 0.01 2.01
x = 1.001 1.001² − 1² = 0.002001 0.001 2.001

相手の点を近づけるほど、傾きは 2 に近づきます。この近づけた先の値を極限と呼びます。「x = 1 での傾きは 2」とし、これを求めることを微分と呼びます。

y = x² の曲線に、x = 1 の点がある。x = 1 と 2 を結ぶ灰色の線は傾き 3、x = 1 と 1.5 を結ぶ点線は傾き 2.5、x = 1 の点にくっついた青い線は傾き 2。相手の点を近づけるほど傾きが 2 に近づく

傾きを返す関数

x = 3 で同じことを行うと、傾きは 6 に近づきます。x = 1 で 2、x = 3 で 6 なので、x² の傾きはどの x でも 2x になっています。「x を入れると、その点での傾きを返す関数」のことも微分と呼び、f'(x) と書きます。読み方は「エフ・プライム・エックス」です。

f(x)  = x²
f'(x) = 2x      (x = 1 なら 2、x = 3 なら 6)

dy/dx(ディーワイ・ディーエックス)と書く書き方もあります。「x を少し動かしたときの y の変わり方」という意味で、f'(x) と同じものを指します。d は「ほんの少しの変化」を表す記号で、割り算の形をしているのは、傾きが「縦の変わった量 ÷ 横の変わった量」だからです。

微分の公式

毎回、点を近づける表を作ると手間がかかります。よく使う形は公式としてまとまっています。

元の関数 微分 例
数だけ(例: 7) 0 7 の微分は 0
x 1
xⁿ(x の n 乗) n × xⁿ⁻¹ x² は 2x、x³ は 3x²
数 × 関数 数 × (関数の微分) 5x² は 5 × 2x = 10x
関数 + 関数 それぞれの微分を足す x² + 3x は 2x + 3

理由を1行ずつ見ます。

  • f(x) = 7 は、x が何でも 7 を返すので、グラフは平らな横線です。傾きは 0 です
  • f(x) = x は、横に 1 進むと縦にも 1 上がる線なので、傾きは 1 です
  • xⁿ の公式は、x² で表を作って 2x になったのと同じことを n 乗で行った結果です。x³ で確かめると、x = 1 の所で (1.001³ − 1³) ÷ 0.001 ≈ 3.003 となり、3x² に x = 1 を入れた 3 に近づきます
  • 関数を5倍するとグラフが縦に5倍に伸びるので、傾きも5倍です
  • 2つの関数を足したときの変わり方は、それぞれの変わり方の足し算になります

練習として、x³、4x² + 2x + 5、(x − 3)² を微分してください。答えは 3x²、8x + 2、2x − 6 です。(x − 3)² は先に x² − 6x + 9 とかっこを外すと 2x − 6 になります。

傾きの符号から動かす向きを決める

f(x) = (x − 3)² のグラフは、x = 3 で最も低い 0 になる、下に丸くへこんだ形です。傾きは f'(x) = 2 × (x − 3) です。

x = 5 では傾きが 2 × (5 − 3) = 4 でプラス(右上がり)です。x を増やすと f(x) も増えるので、f(x) を小さくしたいなら x を減らします。x = 4.9 にすると f(x) = 1.9² = 3.61 で、x = 5 のときの 4 より小さくなります。x = 1 では傾きが 2 × (1 − 3) = −4 でマイナス(右下がり)なので、x を増やすと f(x) が小さくなります。

どちらの場合も、傾きと反対の向きに動かすと f(x) が小さくなっています。これが次の節の考え方の元です。

傾きを使って重みを少しずつ直す(勾配降下法)

最初の図をもう一度見てください。横軸が重み、縦軸が誤差のグラフで、学習の目的は一番低い所の重みを見つけることです。グラフ全体が見えていれば一番低い所はすぐ分かりますが、実際の AI は重みが何万個もあり、グラフを全部描くことはできません。分かるのは、今いる場所での傾きだけです。そこで、坂を下る向きへ少しだけ動き、動いた先でまた傾きを測る、というのをくり返します。このやり方を勾配降下法(こうばいこうかほう)と呼びます。

傾きと反対の向きに動けば誤差は減るので、次の式で書けます。

新しい w = 今の w − 学習率 × 傾き

学習率(がくしゅうりつ)は、1回にどれだけ動かすかを決める小さな数です。傾きの前にマイナスが付いているので、傾きがマイナスのときは w が増え、プラスのときは w が減ります。

手で3回まわす

誤差が (w − 3)² で表されるとして、w = 1 から始めます。傾きは 2 × (w − 3)、学習率は 0.1 です。表を見る前に、1回目を自分で計算してください。

回 今の w 誤差 傾き 新しい w
1 1.0 4.0 −4.0 1.0 − 0.1 × (−4.0) = 1.4
2 1.4 2.56 −3.2 1.4 − 0.1 × (−3.2) = 1.72
3 1.72 1.6384 −2.56 1.72 − 0.1 × (−2.56) = 1.976

w は 1.0、1.4、1.72、1.976 と、誤差が最も小さい w = 3 に近づきます。1回に動く量は 0.4、0.32、0.256 と小さくなっています。底に近づくほど坂がゆるやかになって傾きが小さくなるので、底を行き過ぎずに近づけます。

学習率が大きすぎるとき

学習率を 1.0 にすると、w は 1.0 から 5.0、1.0、5.0 と、1 と 5 を行ったり来たりして、3 にたどり着きません。底を飛び越えて、反対側の同じ高さに着くからです。学習率を 1.1 にすると、5.4、0.12、6.456 と、往復しながら底から離れていきます。

反対に 0.001 のように小さくしすぎると、確実に下りますが、底に着くまでに何千回もかかります。学習率は、AI を作る人が動かしながら決める数です。PyTorch などで AI を作るときも、コードの中に学習率を書く所があります。

重みが2つ以上あるとき(偏微分と勾配)

重みが2つの場合を見ます。

誤差 = (w₁ − 3)² + (w₂ + 1)²

w₁ と w₂ の右下の数字は何番目の重みかを表します。この誤差は w₁ = 3、w₂ = −1 のときに最も小さい 0 になります。

重みが2つあるときは、w₂ を止めたまま w₁ だけを少し動かしたときの傾きと、w₁ を止めたまま w₂ だけを動かしたときの傾きを、別々に出します。1つだけを動かして測る微分を偏微分(へんびぶん)と呼び、∂ という記号で書きます。

∂誤差/∂w₁ = 2 × (w₁ − 3)      w₁ だけを動かしたときの傾き
∂誤差/∂w₂ = 2 × (w₂ + 1)      w₂ だけを動かしたときの傾き

w₂ を止めているあいだ、(w₂ + 1)² の部分は変わらない数なので、微分すると 0 になり、w₁ の傾きには関係しません。

それぞれの重みの傾きを並べたものを勾配(こうばい)と呼びます。数を1列に並べたものがベクトルなので、勾配は傾きのベクトルです。勾配降下法の名前はここから来ています。

w₁ = 0、w₂ = 0 から、学習率 0.1 で1回直します。

勾配 = [2 × (0 − 3), 2 × (0 + 1)] = [−6, 2]

新しい w₁ = 0 − 0.1 × (−6) = 0.6
新しい w₂ = 0 − 0.1 × 2    = −0.2

誤差  直す前: 9 + 1 = 10
      直した後: (0.6 − 3)² + (−0.2 + 1)² = 5.76 + 0.64 = 6.4

重みが2つでも1億個でも、1つずつの重みに対して「傾きと反対の向きに少し動く」をしているだけです。

関数が重なっているとき(連鎖律)

ニューラルネットワークは層を何段も重ねた作りで、式にするとある関数の答えを次の関数に入れる入れ子の形になります。この形の微分には、連鎖律(れんさりつ)というきまりを使います。

誤差 = (2w − 6)²

かっこの中を u と名前を付けて、2段に分けます。

u    = 2w − 6      w を入れると u が出る
誤差 = u²          u を入れると誤差が出る

w を少し動かすと u が変わり、u が変わると誤差が変わります。それぞれの変わり方は公式で出せます。

u を w で微分すると     du/dw    = 2    (w を1動かすと、u は2動く)
誤差を u で微分すると   d誤差/du = 2u   (u を1動かすと、誤差は 2u 動く)

w を1動かすと u が2動き、u が1動くごとに誤差が 2u 動くので、w を1動かしたときの誤差の動きは 2 × 2u です。段ごとの変わり方を掛け算でつなぐのが連鎖律です。

d誤差/dw = d誤差/du × du/dw = 2u × 2 = 4u = 4 × (2w − 6) = 8 × (w − 3)

w = 1 で確かめます。式に入れると 8 × (1 − 3) = −16 です。w = 1 の誤差は (2 − 6)² = 16、w = 1.001 の誤差は (2.002 − 6)² = 15.984004 で、(15.984004 − 16) ÷ 0.001 = −15.996 と、−16 に近い値になります。

層が何十段も重なったニューラルネットワークでは、出口の誤差から入口のほうへ向かって、段ごとの傾きを掛け算でつなぎます。このやり方を誤差逆伝播法(ごさぎゃくでんぱほう)と呼びます。

積分はグラフの下の面積

最後に、微分と対になる積分を短く見ます。AI の学習の計算で手を動かして使う場面は少ないですが、確率や統計の式を読むときに記号が出てきます。

積分は、グラフと横軸のあいだの面積を求める計算です。時速 3 km で 2 時間歩くと、進んだ距離は 3 × 2 = 6 km です。横軸を時間、縦軸を速さにしてグラフを描くと、高さ 3・幅 2 の長方形になり、その面積が 6 です。速さが途中で変わっても、グラフの下の面積が進んだ距離になります。

 3
 ∫  f(x) dx
 0

∫ は「インテグラル」と読み、「x が 0 から 3 までのあいだで、f(x) のグラフの下の面積」という意味です。dx は、横の幅を細かく刻んで、細長い長方形の面積を足し合わせていることを表します。Σ(全部足す記号)を、刻み方をどこまでも細かくしたものと考えると分かりやすいです。

f(x) = 2x の、x が 0 から 3 までの面積を考えます。グラフは原点から右上へ伸びる直線で、下の部分は底辺 3・高さ 6 の三角形なので、面積は 3 × 6 ÷ 2 = 9 です。

x² を微分すると 2x になりました。x² に 3 を入れると 9、0 を入れると 0 で、その差は 9 で、三角形の面積と同じです。微分すると 2x になる関数の差を取ると 2x のグラフの下の面積が出る、というきまりがあるからです。積分が微分の反対の計算だと言われるのはこのためです。

AI の本で積分が出てくるのは主に確率の話です。「値がこの範囲に入る確率」を、グラフの下の面積で表します。

式に出てくる記号の読み方

記号 読み方 意味
f(x) エフ・エックス x を入れると数を返す関数 f
f'(x)、dy/dx エフプライム・エックス、ディーワイ・ディーエックス 微分。その点での傾き
∂L/∂w ラウンド・エル・ラウンド・ダブリュー 偏微分。w だけを動かしたときの L の傾き
∇L ナブラ・エル 勾配。偏微分を全部並べたベクトル
∫ インテグラル 積分。グラフの下の面積
L エル 損失(loss)によく使う文字
w ダブリュー 重み(weight)によく使う文字
η イータ 学習率によく使う文字
← 矢印 右の値で左を置きかえる。「w ← w − η∇L」は勾配降下法の1回分

「w ← w − η∇L」は、この記事で使った「新しい w = 今の w − 学習率 × 傾き」を記号で書いたものです。論文で見かけたら、勾配降下法の式だと読めます。

課題:ニューロン1つの学習を1回分

AI が「入力 x に重み w を掛けた数」を予想として出すとします。入力は x = 2、正解は 6 です。誤差は(予想 − 正解)の2乗で測ります。

予想 = w × 2
誤差 = (w × 2 − 6)²
  1. w = 1 のとき、予想と誤差はいくつですか
  2. 誤差を w で微分した傾きの式を、連鎖律を使って出してください
  3. w = 1 のとき、傾きはいくつですか。w を増やすべきですか、減らすべきですか
  4. 学習率を 0.05 にして、勾配降下法で1回直すと、新しい w はいくつですか
  5. 新しい w での予想と誤差を出し、直す前より誤差が減ったことを確かめてください

答え

  1. 予想は 1 × 2 = 2、誤差は (2 − 6)² = 16 です
  2. 8 × (w − 3) です。u = 2w − 6 と置くと、2u × 2 = 4 × (2w − 6) = 8 × (w − 3) になります
  3. −16 です。傾きがマイナス(右下がり)なので、w を増やせば誤差が減ります
  4. 1.8 です。1 − 0.05 × (−16) = 1 + 0.8 = 1.8
  5. 予想は 1.8 × 2 = 3.6、誤差は (3.6 − 6)² = 5.76 です。16 から 5.76 に減り、正解の 6 を出す w = 3 に近づいています

プログラムで AI を学習させるときは、同じ計算をコンピュータに何百回、何千回とくり返させます。

この記事で出てきた言葉

言葉 意味
関数 数を入れると、決まった計算をして数を返すもの
傾き 横に進んだ分に対する、縦の変わった量の割合
微分 その点でのグラフの傾きを求めること。傾きを返す関数のこと
極限 近づけていった先の値
偏微分 変数が何個もあるとき、1つだけを動かして測る微分
勾配 偏微分を全部並べたベクトル
連鎖律 入れ子になった関数の微分を、段ごとの微分の掛け算で出すきまり
誤差(損失) AI の答えと正解のずれを1つの数で表したもの
学習率 勾配降下法で、1回にどれだけ動かすかを決める数
勾配降下法 傾きと反対の向きに少しずつ動いて、誤差の一番低い所を探すやり方
積分 グラフと横軸のあいだの面積を求める計算

参考にした資料