デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理と英語を基礎からやり直す。https://qiita.com/yaju

なぜ数式には2乗が多いのかを理解してみる

はじめに

機械学習を学ぶようになり数学や統計の本やサイトに出てくる数式をみると2乗をよく見かけます。同じ数を2回掛けるってだけなのになんでなんだろう。

ネットで調べると下記のピッタシの本がありました。

ドラゴン堀江で堀江貴文さんに講師として共演していた教育系YouTuberのヨビノリたくみさんとの動画の中で、堀江貴文さんがなぜ2乗をするのかという質問に対し、たくみさんが積分の次数の話をしてちょっとだけ説明しています。
www.youtube.com

内容

今回は、Qiita側に記事を書きました。 qiita.com

勾配降下法の可視化を解析してみる

はじめに

今回は下記サイトの記事を見ていきます。
qiita.com

最急降下法(Gradient Descent)のみとなります。

データ

dataは下記サイトから100件
https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv

# 2 クラスにするため、setosa, versicolor のデータのみ抽出
data = iris[:100]

# 説明変数は 2つ = 2 次元
columns = ['PetalWidth', 'PetalLength']

x = data[columns]     # データ (説明変数)
y = data['Name']      # ラベル (目的変数)
PetalLength,PetalWidth,Name
1.4,0.2,Iris-setosa
1.4,0.2,Iris-setosa
1.3,0.2,Iris-setosa
 ︙
4.7,1.4,Iris-versicolor
4.5,1.5,Iris-versicolor
4.9,1.5,Iris-versicolor

ロジスティクス回帰なので、0 と 1 の2値にします。

y = (y == 'Iris-setosa').astype(int)
PetalLength,PetalWidth,y
1.4,0.2,1
1.4,0.2,1
1.3,0.2,1
 ︙
4.7,1.4,0
4.5,1.5,0
4.9,1.5,0

ロジスティック回帰

def p_y_given_x(x, w, b):
    # x, w, b から y の予測値 (yhat) を計算
    def sigmoid(a):
        return 1.0 / (1.0 + np.exp(-a))
    return sigmoid(np.dot(x, w) + b)

ロジスティック回帰は、以下の数式で表現できます。
y=\displaystyle \frac {1} {1+exp(-(b_{1}X_{1}+b_{2}X_{2}+b_{3}X_{3}+ \cdots  + b_{i}X{i}+b_{0}))}

シグモイド関数 f(x)=\displaystyle \left(\frac {1}{1+exp(-x)}\right) と同じ形であり、exp内に重回帰を入れた形式となります。

今回のプログラムは、\hat{y}=\sigma (xw+b) で計算となり、上記式を変数に合わせて変更したのが下記の数式となります。
\hat{y}=\displaystyle \frac {1} {1+exp(-(x_{0}w_{0}+x_{1}w_{1}+b))}

  • \hat{y} : 真のラベル y の予測値ベクトル。次元は (入力データ数, 1)
  • \sigma : シグモイド関数。計算結果を (0, 1) 区間写像する
  • x : 入力データ。次元は (入力データ数, 説明変数の数)
  • w : 係数ベクトル。次元は(クラス数 = 2)
  • b : バイアス (スカラー)

内積

np.dot(x, w) は、内積です。

AB として次の例を考えます。
A=(1,2)B=(3,4)
この場合、次の式の計算を行います。
A1B1+A2B2 = 1 \times 3 + 2 \times 4 = 3 + 8 = 11

勾配計算

勾配(gradient) を計算します。

def grad(x, y, w, b):
    # 現予測値から勾配を計算
    error = y - p_y_given_x(x, w, b)
    w_grad = -np.mean(x.T * error, axis=1)
    b_grad = -np.mean(error)
    return w_grad, b_grad

np.mean は平均を求めます。axis=1とすると、行ごとに平均値を計算します。
x.Tは転置行列にします。これにより100行2列から2行100列になります。

  • error : 誤差 … y の値は 0 から 1 であり、 p_y_given_x関数の戻り値は0.0~1.0の値を返します。
  • w\_grad :重みの勾配。100個分に対し重みを計算します。
  • b\_grad : バイアスの勾配。切片なので変数は1つです。

データ件数が多くなると件数に比例して値が大きくなってしまうので平均を取ることでデータ件数の影響をなくします。

最急降下法(Gradient Descent)

def gd(x, y, w, b, eta=0.1, num=100):
    for i in range(1, num):
        # 入力をまとめて処理
        w_grad, b_grad = grad(x, y, w, b)
        w -= eta * w_grad
        b -= eta * b_grad
        e = np.mean(np.abs(y - p_y_given_x(x, w, b)))
        yield i, w, b, e
  • eta : 学習係数\eta = 0.1 です。
  • w : 勾配w_gradを用いて現在の重み w を更新します。
  • b : 勾配b_gradを用いて現在の重み b を更新します。
  • e : 誤差の平均です。一般的な2乗誤差ではないです。

yieldを使用してジェネレータを実行し、勾配法 1ステップごとの結果を得てアニメーションとして生成しています。

英語の勉強を継続して半年経過

はじめに

yaju3d.hatenablog.jp

ということで、毎年数ヶ月もすれば何もしないで終わっていた英語の勉強ですが、今年は続けることが出来ています。
やはり習慣化することが大事ですね、平日の会社終わりにコワーキングの「エニシア静岡 丸井店」に行って、そこで英語の勉強をしています。

ただ時間が30分~40分くらいです。確かに短いかなと思いつつも、無理なく継続することの方が大切かなと思っています。
せっかく習慣化できるようになってきたので、6月から英語以外の勉強を30分追加していきます。

何をしているか

瞬間英作文のiPhoneアプリ版を使用しており、中学3年生が終わって繰り返す段階です。
回答をノートに書いて一致しているか確認し、何か違っているのか、何でこうなるのか考えたり調べながらやっています。
まだ過去形とか複数形など見落としがありつつも正解に近づいている実感があります。

ひたすらこれをやり続けて、さっと出るようにしたいです。「例文のおかわり」の購入も考えたんですが、まだ後回しとします。
5/27からiPhoneに瞬間英作文CD2枚を入れて、通勤の車の中で聴いています。もっと早くやれば良かったかな。

英文法の整序問題で正しい順序にして英文法を作成する「英語組み立てTOWN」もやるのですが、瞬間英作文で気分が乗らない時くらいでやる頻度は落ちています。こんな簡単な英単語だらけなのに考え込みます。

次の展開

瞬間英作文と英語組み立てTOWNは引き続きやります。
今後は自宅で発音の練習をしていきます。幾つかの英語学習の本を読むと、発音が分かると聴き取りができるようになるって書いてあるので信じてやっていきます。

TOEICのテストは1回くらいは受験しておきたいので、今の予定は12月くらいですかね。
英語に慣れてきてTOEIC用の英単語を覚えるとか徐々に準備していこうかな。

海外ドラマの「フレンズ」がいいという情報がありますが、TOEIC700点レベルってことなので今の段階でやっても仕方ないかと思っていて、代わりに中身もだいたい分かるAudio版「Doraemon」を購入してみました。

books.apple.com

これは音声だけなのでAudio版「Doraemon」の本は楽天で別個に購入してあります。

8年ぐらい前に「Doraemon」のコミック版は5巻まで購入してあったんですが、これは音声がないんですよね。
Audio版「Doraemon」と内容が同じかとおもいきや違ったんです。

「Doraemon」は勉強って感じではなく、気分転換で読むイメージですね。

最後に

英語学習の記事を今後は増やしていきます。
瞬間英作文をやってて何でこうなるのか調べたりしたことをブログで書いていく予定です。

機械学習に使われる微分の数式を理解してみる(勾配降下法:確率的勾配法)

はじめに

前回の記事の続きとなります。
yaju3d.hatenablog.jp

最急降下法確率的勾配降下法の違いについては、以前に記事を書きました。
yaju3d.hatenablog.jp

参考

やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷

パラメーター更新の式

最急降下法

前回、重回帰で求めたパラメーター更新の式です。
\displaystyle \theta_j := \theta_j - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x_j^{(i)}

最急降下法は学習データのすべての誤差の合計を取ってからパラメーターを更新します。学習データが多いと計算コストがとても大きくなってしまいます。また、学習データが増えるたびに全ての学習データで再学習が必要となってしまいます。

確率的勾配法

\theta_j := \theta_j - \eta \Biggl(f_{\theta} ({x}^{(k)}) - y^{(k)}\Biggr){x_j}^{(k)}
(式中のkは、パラメーター更新毎にランダムに選ばれたインデックス)

大きな違いとして、確率的勾配降下法ではシグマ\sum (1~nまで合計)が取れています。
その分、計算コストは少なくなる。

確率的勾配降下法は学習データをシャッフルした上で学習データの中からランダムに1つを取り出して誤差を計算し、パラメーターを更新をします。勾配降下法ほどの精度は無いが増えた分だけの学習データのみで再学習する(重みベクトルの初期値は前回の学習結果を流用)ため再学習の計算量が圧倒的に低くなります。

ミニバッチ確率的勾配降下法

\displaystyle \theta_j := \theta_j - \eta \sum_{k\in K} \Biggl(f_{\theta} ({x}^{(k)}) - y^{(k)}\Biggr){x_j}^{(k)}

ここでシグマが付くのですが、これはインデックスの集合となります。
たとえば学習データが100個あると考えた時に、m=10 だったら、K={61,53,59,16,30,21,85,31,51,10} みたいにランダムに10個のインデックスの集合を作って、パラメーターの更新を繰り返すことになります。

ミニバッチ確率的勾配降下法最急降下法確率的勾配降下法の間を取ったような形となります。 最急降下法では時間がかかりすぎ、確率的勾配降下法では一つ一つのデータにかなり揺さぶられることになるので、学習データの中からランダムにいくつかのデータを取り出して誤差を計算、パラメーターを更新をします。このときの一回に取り出すデータの数をバッチサイズと呼びます。

視覚化

※注意 これまでやってきたのは最小2乗法を用いたものでした。この視覚化についてはロジスティクス回帰となっています。
最急降下法と確率的勾配法とミニバッチ確率的勾配降下法の違いを知るだけならいいのですが、プログラムの中身はパラメーター更新と一致しないです。

下記サイトでは、最急降下法と確率的勾配法とミニバッチ確率的勾配降下法の違いを視覚化されています。
sinhrks.hatenablog.com

これを、組み直ししてみました。 qiita.com

最後に

視覚化を組み直してみたのですが内容を見ないで単純に移植してみたようなものなので、今後は視覚化したのを説明していきたいですね。
その前に、内積ロジスティクス回帰などをやっていきます。
まだ数式とプログラムを組むイメージが頭の中で一致してないので理解度が足りてないですな。

機械学習に使われる微分の数式を理解してみる(重回帰)

はじめに

前回の記事の続きとなります。
yaju3d.hatenablog.jp

参考

やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷

重回帰

前回の多項式回帰でも、変数 x が1つだけでした。
f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2} + \theta_3 x^{3} + \cdot + \theta_n x^{n}

機械学習をする上で実際に解きたい問題は変数 x が2つ以上の方が多いです。
変数が3つの場合
f_\theta(x_1,x_2,x_3) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3

一般式

変数を n 個にした場合の一般式
f_\theta(x_1,\cdots,x_n) = \theta_0 + \theta_1 x_1 + \cdots + \theta_n x_n

列ベクトル化

先程の一般式を \theta_0x を列ベクトルとして定義してみます。
\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
\boldsymbol{x} = \begin{bmatrix}
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}

\thetax の次元数が違うので揃えます。
1を追加したとしても計算上は値が変わらない。\theta_0 \times 1 = \theta_0となるため。
\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
x = \begin{bmatrix}
1  \\
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}

もう一工夫する。x_0 = 1 と定義することで、すべて x とすることができる。

\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
x = \begin{bmatrix}
x_0  \\
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}
\ \ \
(x_0 = 1)

こうすることで、\theta を転置したものと x を掛けると次のように書ける。
\theta^{T} x = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n

これは一般式を x_0 = 1 としたものと同じになるわけです。
そして、すべて x としたことで簡潔した式に表現できるようになるのです。
f_\theta(x) = \theta^{T} x

更新式を求める

\thetaj 番目の要素を \theta_j とすると、E\theta_j偏微分した式

\displaystyle \frac{\partial u}{\partial \theta_j} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_j}

※誤解されないように最初に説明しておくと、x^{(i)}y^{(i)}i 乗という意味ではなくて、i 番目の学習用データを参照する意味である。

uv微分

uv微分するところは前々回までと同じ(再掲)

\displaystyle \frac{\partial u}{\partial v} =  \frac{\partial}{\partial v} \Biggl(\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)^{2}} - 2y^{(i)}v+v^{2}\right) \Biggr)

v微分するので、y^{(i)^{2}} は計算対象外なので除外します。

=\displaystyle \frac{1}{2}\sum_{i=1}^n \left(-2y^{(i)}+2v\right)

共通因数の -2 を前に出します。
=\displaystyle \frac{1}{2}\sum_{i=1}^n -2\left(y^{(i)}-v\right)

こうすると \displaystyle \frac{1}{2} と相殺できます。
=\displaystyle \sum_{i=1}^n -\left(y^{(i)}-v\right)

このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 - y^{(i)}v を入れ替えます。

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)

v=f_{\theta}(x)の定義を元に戻す。

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

v\theta_j微分

v\theta_j微分する。
\displaystyle \frac{\partial v}{\partial \theta_j} = \frac{\partial}{\partial \theta_j}(\theta^{T} x) \\
= \displaystyle \frac{\partial}{\partial \theta_j}(\theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n) \\
= x_j

結果を掛ける

合成関数の微分に従って、それぞれの結果を掛ける。
\displaystyle \frac{\partial u}{\partial \theta_j} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_j}

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr) \cdot x_j^{(i)}

最終的な更新式

最終的なパラメーターの更新式は下記のようになります。

\displaystyle \theta_j := \theta_j - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x_j^{(i)}

最後に

今回はここまで、次回は確率的勾配法となります。

機械学習に使われる微分の数式を理解してみる(多項式回帰)

はじめに

前回の記事の続きとなります。
yaju3d.hatenablog.jp

最終的な更新式を求めたところまでやりました。
パラメータ  \theta_0 \theta_1 の更新式は、最終的に下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

参考

やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷

多項式回帰

プロットしたデータにフィットさせる際に1次関数の場合は形が直線にしかなりません。
しかし、場合によっては曲線の方がプロットしたデータにフィットする。
f:id:Yaju3D:20190413234724p:plain

これは関数 f_\theta(x) を2次関数として定義することで実現できる。

f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2}

もっと大きな次数にすることも出来る。その場合はより複雑な曲線に対応できるようになる。

f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2} + \theta_3 x^{3} + \cdot + \theta_n x^{n}

しかし、次数を増やせば増やすほどいい感じになるわけではない。確かにフィットするようにはなるけど、過学習と呼ばれる別の問題が発生するようになる。

更新式を求める

前回と同じように v\theta_2偏微分して更新式を求めます。
\theta_0\theta_1 x は計算対象外なので除外します。残った \theta_2 x^{2}微分して x^{2} になります。

\displaystyle \frac{\partial v}{\partial \theta_2} = \frac{\partial}{\partial \theta_2} \left(\theta_0 + \theta_1 x + \theta_2 x^{2} \right) = x^{2}

最終的な更新式

最終的なパラメーターの更新式は下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

\displaystyle \theta_2 := \theta_2 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)^{2}}

これはパラメーターが、 \theta_3\theta_4\cdot と増えていっても同じような更新式になります。
ということは、j 番目のパラメーターの更新式は下記のようにできる。
x^{0} = 1 となることを利用する。

\displaystyle \theta_j := \theta_j - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)^{j}}

このように多項式の次数を増やした関数を使うものは、多項式回帰と呼びます。

※誤解されないように説明しておくと、x^{(i)}y^{(i)}i 乗という意味ではなくて、i 番目の学習用データを参照する意味である。

最後に

今回はここまで、次回は重回帰となります。

機械学習に使われる微分の数式を理解してみる(勾配降下法:最急降下法)

はじめに

前回の記事で、シグモイド関数微分を行いました。
yaju3d.hatenablog.jp

今回は、偏微分を含んだ微分を理解していきます。
本とかだと分かっている人向けなので展開式を省略されてしまうのですが、私はあえて分かりやすく展開式を書きたいと思っています。

参考

やる夫で学ぶ機械学習 - 単回帰問題 - · けんごのお屋敷

勾配降下法

yaju3d.hatenablog.jp

数値解析の分野では勾配降下法を最急降下法と呼びますが、勾配降下法の中にもいくつかの方法が存在します。

最急降下法とは

最急降下法は学習データのすべての誤差の合計を取ってからパラメーターを更新します。学習データが多いと計算コストがとても大きくなってしまいます。また、学習データが増えるたびに全ての学習データで再学習が必要となってしまいます。

目的関数の微分方法

目的関数 最小2乗法
\displaystyle E(\theta)=\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - f_{\theta}(x^{(i)})\right)^{2}

※誤解されないように最初に説明しておくと、x^{(i)}y^{(i)}i 乗という意味ではなくて、i 番目の学習用データを参照する意味である。

この目的関数は、f_{\theta}(x) を含んでいて、今回 f_{\theta}(x) は、\theta_0\theta_1 の2つのパラメーターを持っているとします。
これは\theta_0\theta_1の2変数を持つ2変数関数になるので、普通の微分ではなく偏微分になります。
偏微分とは、n 変数関数のある一つの変数以外の n-1 個の変数の値を固定し、残りの 1 つの変数について関数を微分することです。
mathtrain.jp

更新式を求める

更新式は下記の2つになります。
\displaystyle\ \theta_0 := \theta_0 - \eta\frac{\partial E}{\partial \theta_0}…①

\displaystyle\ \theta_1 := \theta_1 - \eta\frac{\partial E}{\partial \theta_1}…②

実際に①を偏微分してみましょう。これには合成関数の微分を使うといいです。

合成関数の微分
fg という関数があったとき、これらの合成関数 f(g(x))x微分する場合は下記式になり、これを使えば簡単になる。
\displaystyle \frac{df}{dx}=\frac{df}{dg} \cdot \frac{dg}{dx}

これを目的関数に適用します。
E(\theta) の中に  f_{\theta}(x) が出てきて、  f_{\theta}(x) の中に \theta_0 が出てきます。
それを下記のように考えてみます。

u=E( \theta_0)

v=f_{\theta}(x)

すると、こうやって段階的に微分が出来ます。
合成関数の微分
\displaystyle \frac{\partial u}{\partial \theta_0} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_0}

まずは uv微分するところから計算してみます。

\displaystyle \frac{\partial u}{\partial v} =  \frac{\partial}{\partial v} \Biggl(\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)^{2}} - 2y^{(i)}v+v^{2}\right) \Biggr)

v微分するので、y^{(i)^{2}} は計算対象外なので除外します。

=\displaystyle \frac{1}{2}\sum_{i=1}^n \left(-2y^{(i)}+2v\right)

共通因数の -2 を前に出します。
=\displaystyle \frac{1}{2}\sum_{i=1}^n -2\left(y^{(i)}-v\right)

こうすると \displaystyle \frac{1}{2} と相殺されて、微分した後の式が簡単になります。
それが最初に \displaystyle \frac{1}{2} を掛けていた理由です。 =\displaystyle \sum_{i=1}^n -\left(y^{(i)}-v\right)

このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 - y^{(i)}v を入れ替えます。

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)

次に  v \theta_0微分します。
\theta_1 x は計算対象外なので除外します。残った \theta_0微分して 1 になります。

\displaystyle \frac{\partial v}{\partial \theta_0} = \frac{\partial}{\partial \theta_0} \left(\theta_0 + \theta_1 x\right) = 1

合成関数の微分に従って、それぞれの結果を掛けてあげれば、  \theta_0微分した結果が出る。

\displaystyle \frac{\partial u}{\partial \theta_0} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_0}

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)  \cdot 1

v=f_{\theta}(x)の定義を元に戻す。

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

次は、②の  \theta_1 について微分します。

\displaystyle \frac{\partial u}{\partial \theta_1} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_1}

 u v微分するところは同じ展開なので省略しても良かったのですが、あえて書いておきます。

\displaystyle \frac{\partial u}{\partial v} =  \frac{\partial}{\partial v} \Biggl(\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)^{2}} - 2y^{(i)}v+v^{2}\right) \Biggr)

v微分するので、y^{(i)^{2}} は計算対象外なので除外します。

=\displaystyle \frac{1}{2}\sum_{i=1}^n \left(-2y^{(i)}+2v\right)

共通因数の -2 を前に出します。
=\displaystyle \frac{1}{2}\sum_{i=1}^n -2\left(y^{(i)}-v\right)

こうすると \displaystyle \frac{1}{2} と相殺できます。
=\displaystyle \sum_{i=1}^n -\left(y^{(i)}-v\right)

このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 - y^{(i)}v を入れ替えます。

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)

次に  v \theta_1微分する部分だけを計算する。
\theta_0 は計算対象外なので除外します。残った \theta_1 x微分して x になります。

\displaystyle \frac{\partial v}{\partial \theta_1} = \frac{\partial}{\partial \theta_1}(\theta_0 + \theta_1 x) = x

合成関数の微分に従って、それぞれの結果を掛けてあげれば、  \theta_1微分した結果が出る。
\displaystyle \frac{\partial u}{\partial \theta_1} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_1}

=\displaystyle \sum_{i=1}^n\left(v - y^{(i)}\right) \cdot x^{(i)}

v=f_{\theta}(x)の定義を元に戻す。

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

最終的な更新式

パラメータ  \theta_0 \theta_1 の更新式は、最終的に下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

最後に

長くなったので今回はここまで、次回は多項式回帰となります。

スポンサーリンク