はじめに
機械学習を学ぶようになり数学や統計の本やサイトに出てくる数式をみると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)
ロジスティック回帰は、以下の数式で表現できます。
シグモイド関数 と同じ形であり、内に重回帰を入れた形式となります。
今回のプログラムは、 で計算となり、上記式を変数に合わせて変更したのが下記の数式となります。
np.dot(x, w) は、内積です。
、 として次の例を考えます。
、
この場合、次の式の計算を行います。
勾配(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列になります。
データ件数が多くなると件数に比例して値が大きくなってしまうので平均を取ることでデータ件数の影響をなくします。
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
yieldを使用してジェネレータを実行し、勾配法 1ステップごとの結果を得てアニメーションとして生成しています。
ということで、毎年数ヶ月もすれば何もしないで終わっていた英語の勉強ですが、今年は続けることが出来ています。
やはり習慣化することが大事ですね、平日の会社終わりにコワーキングの「エニシア静岡 丸井店」に行って、そこで英語の勉強をしています。
ただ時間が30分~40分くらいです。確かに短いかなと思いつつも、無理なく継続することの方が大切かなと思っています。
せっかく習慣化できるようになってきたので、6月から英語以外の勉強を30分追加していきます。
瞬間英作文のiPhoneアプリ版を使用しており、中学3年生が終わって繰り返す段階です。
回答をノートに書いて一致しているか確認し、何か違っているのか、何でこうなるのか考えたり調べながらやっています。
まだ過去形とか複数形など見落としがありつつも正解に近づいている実感があります。
ひたすらこれをやり続けて、さっと出るようにしたいです。「例文のおかわり」の購入も考えたんですが、まだ後回しとします。
5/27からiPhoneに瞬間英作文CD2枚を入れて、通勤の車の中で聴いています。もっと早くやれば良かったかな。
英文法の整序問題で正しい順序にして英文法を作成する「英語組み立てTOWN」もやるのですが、瞬間英作文で気分が乗らない時くらいでやる頻度は落ちています。こんな簡単な英単語だらけなのに考え込みます。
瞬間英作文と英語組み立てTOWNは引き続きやります。
今後は自宅で発音の練習をしていきます。幾つかの英語学習の本を読むと、発音が分かると聴き取りができるようになるって書いてあるので信じてやっていきます。
TOEICのテストは1回くらいは受験しておきたいので、今の予定は12月くらいですかね。
英語に慣れてきてTOEIC用の英単語を覚えるとか徐々に準備していこうかな。
海外ドラマの「フレンズ」がいいという情報がありますが、TOEIC700点レベルってことなので今の段階でやっても仕方ないかと思っていて、代わりに中身もだいたい分かるAudio版「Doraemon」を購入してみました。
これは音声だけなのでAudio版「Doraemon」の本は楽天で別個に購入してあります。
8年ぐらい前に「Doraemon」のコミック版は5巻まで購入してあったんですが、これは音声がないんですよね。
Audio版「Doraemon」と内容が同じかとおもいきや違ったんです。
「Doraemon」は勉強って感じではなく、気分転換で読むイメージですね。
英語学習の記事を今後は増やしていきます。
瞬間英作文をやってて何でこうなるのか調べたりしたことをブログで書いていく予定です。
前回の記事の続きとなります。
yaju3d.hatenablog.jp
最急降下法と確率的勾配降下法の違いについては、以前に記事を書きました。
yaju3d.hatenablog.jp
やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷
前回、重回帰で求めたパラメーター更新の式です。
最急降下法は学習データのすべての誤差の合計を取ってからパラメーターを更新します。学習データが多いと計算コストがとても大きくなってしまいます。また、学習データが増えるたびに全ての学習データで再学習が必要となってしまいます。
(式中のkは、パラメーター更新毎にランダムに選ばれたインデックス)
大きな違いとして、確率的勾配降下法ではシグマ (1~nまで合計)が取れています。
その分、計算コストは少なくなる。
確率的勾配降下法は学習データをシャッフルした上で学習データの中からランダムに1つを取り出して誤差を計算し、パラメーターを更新をします。勾配降下法ほどの精度は無いが増えた分だけの学習データのみで再学習する(重みベクトルの初期値は前回の学習結果を流用)ため再学習の計算量が圧倒的に低くなります。
ここでシグマが付くのですが、これはインデックスの集合となります。
たとえば学習データが100個あると考えた時に、 だったら、 みたいにランダムに10個のインデックスの集合を作って、パラメーターの更新を繰り返すことになります。
ミニバッチ確率的勾配降下法は最急降下法と確率的勾配降下法の間を取ったような形となります。 最急降下法では時間がかかりすぎ、確率的勾配降下法では一つ一つのデータにかなり揺さぶられることになるので、学習データの中からランダムにいくつかのデータを取り出して誤差を計算、パラメーターを更新をします。このときの一回に取り出すデータの数をバッチサイズと呼びます。
※注意
これまでやってきたのは最小2乗法を用いたものでした。この視覚化についてはロジスティクス回帰となっています。
最急降下法と確率的勾配法とミニバッチ確率的勾配降下法の違いを知るだけならいいのですが、プログラムの中身はパラメーター更新と一致しないです。
下記サイトでは、最急降下法と確率的勾配法とミニバッチ確率的勾配降下法の違いを視覚化されています。
sinhrks.hatenablog.com
これを、組み直ししてみました。 qiita.com
視覚化を組み直してみたのですが内容を見ないで単純に移植してみたようなものなので、今後は視覚化したのを説明していきたいですね。
その前に、内積とロジスティクス回帰などをやっていきます。
まだ数式とプログラムを組むイメージが頭の中で一致してないので理解度が足りてないですな。
前回の記事の続きとなります。
yaju3d.hatenablog.jp
やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷
前回の多項式回帰でも、変数 が1つだけでした。
機械学習をする上で実際に解きたい問題は変数 が2つ以上の方が多いです。
変数が3つの場合
変数を 個にした場合の一般式
先程の一般式を と を列ベクトルとして定義してみます。
と の次元数が違うので揃えます。
1を追加したとしても計算上は値が変わらない。となるため。
もう一工夫する。 と定義することで、すべて とすることができる。
こうすることで、 を転置したものと を掛けると次のように書ける。
これは一般式を としたものと同じになるわけです。
そして、すべて としたことで簡潔した式に表現できるようになるのです。
の 番目の要素を とすると、 を で偏微分した式
※誤解されないように最初に説明しておくと、 や は 乗という意味ではなくて、 番目の学習用データを参照する意味である。
で微分するので、 は計算対象外なので除外します。
共通因数の を前に出します。
こうすると と相殺できます。
このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 と を入れ替えます。
の定義を元に戻す。
を で微分する。
合成関数の微分に従って、それぞれの結果を掛ける。
最終的なパラメーターの更新式は下記のようになります。
今回はここまで、次回は確率的勾配法となります。
前回の記事の続きとなります。
yaju3d.hatenablog.jp
最終的な更新式を求めたところまでやりました。
パラメータ と の更新式は、最終的に下記のようになります。
やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷
プロットしたデータにフィットさせる際に1次関数の場合は形が直線にしかなりません。
しかし、場合によっては曲線の方がプロットしたデータにフィットする。
これは関数 を2次関数として定義することで実現できる。
もっと大きな次数にすることも出来る。その場合はより複雑な曲線に対応できるようになる。
しかし、次数を増やせば増やすほどいい感じになるわけではない。確かにフィットするようにはなるけど、過学習と呼ばれる別の問題が発生するようになる。
前回と同じように を に偏微分して更新式を求めます。
と は計算対象外なので除外します。残った は微分して になります。
最終的なパラメーターの更新式は下記のようになります。
これはパラメーターが、 、 、 と増えていっても同じような更新式になります。
ということは、 番目のパラメーターの更新式は下記のようにできる。
※ となることを利用する。
このように多項式の次数を増やした関数を使うものは、多項式回帰と呼びます。
※誤解されないように説明しておくと、 や は 乗という意味ではなくて、 番目の学習用データを参照する意味である。
今回はここまで、次回は重回帰となります。
前回の記事で、シグモイド関数の微分を行いました。
yaju3d.hatenablog.jp
今回は、偏微分を含んだ微分を理解していきます。
本とかだと分かっている人向けなので展開式を省略されてしまうのですが、私はあえて分かりやすく展開式を書きたいと思っています。
やる夫で学ぶ機械学習 - 単回帰問題 - · けんごのお屋敷
数値解析の分野では勾配降下法を最急降下法と呼びますが、勾配降下法の中にもいくつかの方法が存在します。
最急降下法は学習データのすべての誤差の合計を取ってからパラメーターを更新します。学習データが多いと計算コストがとても大きくなってしまいます。また、学習データが増えるたびに全ての学習データで再学習が必要となってしまいます。
目的関数 最小2乗法
※誤解されないように最初に説明しておくと、 や は 乗という意味ではなくて、 番目の学習用データを参照する意味である。
この目的関数は、 を含んでいて、今回 は、 と の2つのパラメーターを持っているとします。
これは との2変数を持つ2変数関数になるので、普通の微分ではなく偏微分になります。
偏微分とは、 変数関数のある一つの変数以外の 個の変数の値を固定し、残りの 1 つの変数について関数を微分することです。
mathtrain.jp
更新式は下記の2つになります。
…①
…②
実際に①を偏微分してみましょう。これには合成関数の微分を使うといいです。
合成関数の微分
と という関数があったとき、これらの合成関数 を で微分する場合は下記式になり、これを使えば簡単になる。
これを目的関数に適用します。
の中に が出てきて、 の中に が出てきます。
それを下記のように考えてみます。
まずは を で微分するところから計算してみます。
で微分するので、 は計算対象外なので除外します。
共通因数の を前に出します。
こうすると と相殺されて、微分した後の式が簡単になります。
それが最初に を掛けていた理由です。
このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 と を入れ替えます。
次に を で微分します。
は計算対象外なので除外します。残った は微分して になります。
合成関数の微分に従って、それぞれの結果を掛けてあげれば、 で微分した結果が出る。
の定義を元に戻す。
次は、②の について微分します。
を で微分するところは同じ展開なので省略しても良かったのですが、あえて書いておきます。
で微分するので、 は計算対象外なので除外します。
共通因数の を前に出します。
こうすると と相殺できます。
このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 と を入れ替えます。
次に を で微分する部分だけを計算する。
は計算対象外なので除外します。残った は微分して になります。
合成関数の微分に従って、それぞれの結果を掛けてあげれば、 で微分した結果が出る。
の定義を元に戻す。
パラメータ と の更新式は、最終的に下記のようになります。
長くなったので今回はここまで、次回は多項式回帰となります。
スポンサーリンク