はじめに
こんにちは。Internnectでインターンをしている宮原 裕宇です。
本日も先週から始まった文系でも分かる。機械学習入門を始めようと思います!👏
それではいきなりですが、今日勉強する式をみていきましょう!
こちらです!!

……………
むずかしそう…
ですね笑
大学で理系を取っている方ならぱっとわかるかもしれませんが、おそらく文系の方にとってはかなり難しそうに見えるのではないでしょうか…
しかし、理解してみればそれほど難しくない内容になっています。
今日は僕がこの式を文系にもわかりやすいように、1から10まで解説していきたいと思います!!
どうやって機械学習に使うの?
まずは、この疑問を感じた人は多いかと思います。
そうですよね、機械学習って僕ももっとプログラミング的な要素が大きいのかと思っていましたが実は数学的要素がかなり大切です。
この式も、コンピュータが「学習」をするためにとても重要な道具なのです。
それでは、いったいコンピュータはどうやって学習するのでしょうか。
それは、与えられたデータから求めたい結果を出すために必要な式のパラメータを最適な値に近づけ、それにより正確なデータを出せるようになる。
このようにしてコンピュータは学習することができるのです!
どういうことかわかりやすく説明しましょう。
まずパラメータとはなにか?
たとえば、A君が一定の速度で道を走っているとします。
このときに距離をY、走った時間をXとすると、走っている速度が分からないので〇とおいて、YとXの関係は
Y = ̻̻〇X
と表わすことができます。 このとき、丸の値さえわかれば、式が完成してどれくらいの時間A君が走ったかが分かるとすぐにYの値が分かるようになりますよね。
この〇がパラメータにあたります。
そして、このパラメータを調節するのが今回の機械学習の仕事なのです!
このパラメータを求め、Xの値を知るだけでYの値を求められるようになるということが、今回の機械学習のゴールだと念頭に置いておいてください。
なんだか簡単そうですね。
たとえば、A君が1時間で60km走ったとすると、 〇=60(km/h)と、すぐに分かります。
これなら機会学習いりませんよね!?簡単です。
しかし、これならどうでしょう?
A君は最初B町から〇Km離れているところから、時速△Km/hで走ります。しかし、時間が過ぎるにつれて疲れてしまい、毎時間◇Km遅くなってしまう。
こうなったら、〇と△と◇を時間と距離(これがデータと答えに当たります)だけの情報から見つけ出すのはかなり難しくなるのではないでしょうか?
一応式を書くと、
Y = 〇 + △X + 1/2◇X^2
となります。(^2は二乗を意味します)
先程と同様にA君が1時間で60km走ったとしても、〇△◇はわかりませんね。
更に恐ろしいことに、現実世界ではA君は毎回スタート位置や速さや疲れ方のような条件が少しずつ変わってしまいます。
ここで、最初の目的であるXを知るだけでYを知るようになるには、A君がどんな状態で走ったとしても、ある程度予測したYと実際にA君が走ったYの誤差が小さくなる〇△◇を求めることが必要です。
こうなると、人間ではデータをたくさん見て、パラメータを考えると時間が大量にかかってしまうので、コンピュータに、最適な(予測の値が実際の値とあまり変わらない)パラメータを素早く見つけてもらおう!となります。
それを実行してくれるのが最初にあげたこの式なんです!
それでは、式の使い道が分かったので実際に式の意味を読み解いていきましょう!
目的関数について
それでは、まずは目的関数について学習していきましょう。
いきなり「目的関数とはなんだ!」と思われた方がほとんどだと思います。
目的関数は先ほど挙げた式の一部であるこの式です!

まず目的関数のなかにあるhθ(x(i))この式を見てみましょう。
この式は他の式を指していて、その式の中身はこれです。

これを関数xと呼びましょう。
今回はhθ(x)を家の予想価格を出す関数、xを家の面積として考えましょう!

こんな感じで、青色がデータでこれらからそれぞれの値と一番誤差の小さい予測値を出せる関数を形成するパラメータを発見。
そして与えられた面積から価格を予測するということです。
(それぞれの値と一番誤差の小さい=点と大体同じ位置に線が引かれている。と考えてもらっていいです。)
それでは、このhθ(x)の意味が分かりましたね。
それでは次にhθ(x(i))-y(i)は何を表しているのでしょうか。
まず、iはデータの背番号です。

このように先ほど青色で表した点に値するデータがあるのですが、上から順番にx(1)とy(1)のペア、x(2)とy(2)のペア…というように表せます。これを一般的に使えるようにしたのがx(i)とy(i)のデータです。
つまり、hθ(x(i))-y(i)は、i番目のデータの中から与えられた面積から出した予測価格ー実際の家の価格、になります。
それでは、なぜ(hθ(x(i))-y(i))^2のように、二乗をするのでしょうか。
これは誤差が+にもーにもなり得るからです。
例えば100万円の商品を0円と予測して、-100万円の誤差を出してしまう関数があるとしましょう。
この関数は誤差が非常に大きいので、誤差を小さくするように修正しなければなりません。しかし、今回の目的関数は一つのデータではなく、データセットからすべてのデータの誤差を足してから誤差を小さくするように修正を行います。(修正の意味はあとで伝えます!)
もしここで二乗がないと、次に200万円の商品を300万円と予測してしまい、誤差が+100万円になった際に、-100+100=0となり、最終的には誤差無し!と判断されてしまいます。これでは問題ない関数として扱われてしまい、修正がうまく行われません。
これは困りますね、そこで誤差を二乗にしてすべて+の値として扱うと、プラスの誤差とマイナスの誤差で打ち消すことを防げるので、二乗にしているというわけです!

それでは、つぎは先ほど見た式の横についてるギザギザ(Σ)です。
これはシグマといって、下に置いてある値(1)から上に置いてある値(m)までを、横にある関数の中のアルファベット(i(これはΣの下に置いてある文字で決めます))に一つずつ代入して、それぞれの値を足していくという意味です。
mはデータの総数を表します。
つまり、先ほど挙げたx(1)とy(1)のデータセット、x(2)とy(2)のデータセット、……x(m)とy(m)のデータセット、をすべて代入してすべての計算結果(予測値と正解の誤差の大きさ)を足すということですね。
誤差が大きく出てしまう関数h(x)を定義してしまうとこの和が大きくなるということです。
もちろん、2乗しているので誤差がマイナスなってしまっても、最終的にはすべてプラスの値になります。
さいごに1/2mは、あとで微分(後で説明します)をする際に×2が出てきてしまうので、それをきれいに消すための1/2と適度に値を小さくするためmで割るという意味です。
やっと目的関数の式の説明が終わりました!笑
この目的関数の名前の由来は、これから行う作業に由来します。
その作業は、この目的関数の値を最も小さくする!という作業です。
これは、今回の一連の流れの最後の目標である誤差を小さくする!と一致しますね。
つまり、目的を遂行するために必要な関数だから、目的関数といわれるというわけです!
最急降下法を学ぶ!
ついにラスボス、最急降下法です。(先ほどからの作業もその一部ですが笑💦)
こちらの式を解明します。

いかにも難しそうですね…
まずは、6を反対にしたような∂(デルといいます)は何を表しているのでしょうか…
これは、まずこの式が何をしたいのかを知る必要があります。
これは、先ほどから言っている、目的関数を最小化するパラメータを発見する!という式です。
現在、目的関数J(θ)の式は、xの式を二乗している二次関数ですのでこのような形となっています!(概形だけみてください!値は適当です)(横軸がθ1,縦軸がJ(θ1)になっています)

すると、このような形のJ(θ)のグラフで、最小値はどこでしょうか?
もちろん、一番下にへこんでいるところですね。
つまり、現在目指しているJ(θ)の最小値を求めるという作業は、いちばんへこんでいるところを探そう!という作業になります。
僕たちはこのように俯瞰してみているのですぐにどこかわかりますが、グラフ上にいる点はどこにいちばんへこんでいる点があるのかは分からないのです。
そこで、微分という技を使って傾きを求めながら最小となる位置を探すのです!
「傾きで最小値が分かるの?」と思われ方も多いかと思いますが、僕たちがさっきのグラフのような地形の上に、目隠しをして立たされて、一番下に下れ!といわれると、一番下向きに傾いている方向に進むはずです!(これは頑張って想像してください笑)
「微分、傾きって何…?」
という方は下の動画につなが微分係数と導関数①②③の動画を見ていただければわかると思います。
傾きが分かると、なぜ最小値にたどり着くかを数学的に証明しましょう!
こちらの頑張って作った画像を見てみてください笑

はい、このように傾きにマイナスをかけるとなぜか最小値のほうに進んでいくという仕組みがあるのです!!(ボールがへこんでいるところに転がっていく原理と大体同じです)
その仕組みを実行しているのがこちらの式になるのです

マイナス以降の式が最小値に向かって進んでいる、という作業を表しています。
細かく説明すると、まず∂は何を行っているんだというと、偏微分という作業です。
簡単に言うとθ0とθ1を分けて微分をするよ、という意味です。
θ0とθ1がかかわってくると、それらの関係を表すグラフは、立体的なものになってしまい、傾きを求められなくなってしまいます。
そこで傾きを求める方向をθ0とθ1で分けて、二次元的に見たら簡単に傾きが分かる!ということです。
偏微分について細かく知りたいという方はこちら↓↓↓
-は、先ほど言ったように最小値へ向けて進む方向を決めるための符号です。
αは?というと、これは学習率といいます。
このαを大きくすれば、大きく最小値に向かって進み、小さくすると、少しずつ最小値に向かって進みます。
じゃあ大きくすればいいんじゃないの?と思う人もいると思いますが、じつは大きすぎると少し複雑な理由で最小値が求められなくなってしまいます。(今後話せるといいですね)
イメージでいうと、人生ゲームで10しか出せない人はゴールに近づくのは早いけど、ゴールに丁度止まることができなくてゴールできない。という状態で考えてみてください。逆に1で進む人だとゆっくりですが、確実にゴールできます。しかし、3ぐらいの、ゴールできるうえに、1より早くゴールできる数を見つけるといいですよね。
というように、αは大きすぎても小さすぎてもよくないので、ちょうどいい数を見つける!というのが重要になります。
そして、θjから引くのですが、(jは下で書いてあるように0と1の場合でやってくださいというだけの意味です。)
これは先ほど表した二次関数のグラフでいうところの現在位置を表しているので、現在位置から、先ほどの-α....分移動するという意味です!
θj := θj-…の := ですが、これは更新を意味します。θjの値を移動させた後の値に更新するということです。
そしてrepeat until convergence ですが、最小値に行って収束するまで。という意味になります!
一番へこんでる点にゴールするまで。ですね!
これで、最小値へ収束するまでの道のりがすべてわかりましたね!
ちなみに、偏微分をしたのちのJ(θ1),J(θ2)は下の画像の様になります。

これは合成関数の微分という技術を使っています。Couseraの先生は分からなければこれを見ながらやればよい問おっしゃっていたのですが、仕組みを知りたい方は下の動画から勉強してください!
さいごに
おつかれさまです!なかなか内容が重たかったですね!
ぼくもこの記事の構想を練ったり記事を書いたりするのに5時間かかってしまいました💦
しかし、この最急降下法は今後機械学習を学んでいくうえで今回の皆さんの努力に値するだけの価値はある、とても重要なものです!
おそらく、今回の記事で脱落する人、やってみたいと思った人が分かれると思いますので、やってみたいと思った方は、分からないところは動画で確認をして、これから僕と一緒に機械学習を学んでいきましょう!🔥
それでは、ここまで読んでくださりありがとうございました!