COURSERAで学ぶ機械学習(2週目-1)

しんぺい

こんにちは!しんぺいです。

前回のCOURSERAの「Andrew Ng先生の機械学習」2回目からの続きです。

2回目はこちらからどうぞ!

1回目はこちら

多変量線形回帰

これまでは、「家の売値=家の広さ」で考えてきましたが、実際にはもっと多くの特徴を考慮する必要があります。
例えば、

  • 寝室の数
  • 階数
  • 築年数

などが考えられますよね。

これらの複数の特徴を当てはめるにはどうしたらいいでしょうか?

今まで使ってきた以下の数式は、1つの変数しか考慮していませんので、残念ながらもう使えません。

$$\large h_θ(x)=θ_0+θ_1x$$

代わりに、変数がn個の場合は以下のような数式になります。

$$\large h_θ(x)=θ_0+θ_1x_1+θ_2x_2+θ_3x_3+\cdots+θ_nx_n$$

例えば家の広さ(x1)、階数(x2)、寝室の数(x3)、築年数(x4)を考慮する場合、こんな考え方ができるのではないでしょうか。

  • 家販売の基本価格が80ドル
  • 広さが\(1m^2\)広がるごとに「広さ×0.1ドル」の追加
  • 階数が追加されるごとに「階数×0.01ドル」の追加
  • 寝室の数が追加されるごとに「寝室の数×3ドル」の追加
  • 築年数が上がるごとに「築年数×2ドル」の削減

以上の条件を数式に当てはめると、このようになります。

$$\large h_θ(x)=80+0.1\times x_1+0.01\times x_2+3\times x_3-2\times x_4$$

さて、ここで新たに、\(x_0=1\)というのを新たに定義します。こうすることで、式をシンプルに表現できるようになるからです。

\(x_0=1\)を導入した数式は

$$\large h_θ(x)=θ_0x_0+θ_1x_1+θ_2x_2+θ_3x_3+\cdots+θ_nx_n$$

になりますね。\(x_0=1\)なので、意味合いは変化しません。

ところで、この式を行列で表すとどうなるでしょうか。

\[
\left(
\begin{array}{ccc}
θ_0 \\
θ_1 \\
θ_2 \\
\vdots \\
θ_n
\end{array}
\right)
\left(
\begin{array}{ccc}
x_0 \\
x_1 \\
x_2 \\
\vdots \\
x_n
\end{array}
\right)
\]

このままでは計算ができませんので、行列を転置します。

\[
\begin{pmatrix}
θ_0 & θ_1 & θ_2 & \ldots & θ_n
\end{pmatrix}
\begin{pmatrix}
x_0 \\
x_1 \\
x_2 \\
\vdots \\
x_n
\end{pmatrix}
\]

これで計算が出来るようになりました!
すなわち、多変量線形回帰の数式は、以下のように変形することができるわけです。

$$\large h_θ(x)=θ^Tx$$

最急降下法と多変量線形回帰

ここで、機械学習(1週目-1)でやった最小二乗法(コスト関数)の数式を思い出してみましょう。

$$\large J(θ_0,θ_1)=\frac{1}{2m}\sum_{i=1}^m (h_θ(x_i)-y_i)^2$$

今回は変数が複数ありますので、左辺をこのように置き換えます。

$$\large J(θ)=\frac{1}{2m}\sum_{i=1}^m (h_θ(x_i)-y_i)^2$$

次に、最急降下法の数式を思い出しましょう。

$$\large θ_j:=θ_j-α\frac{\partial}{\partial θ_j}J(θ_0,θ_1)$$

こちらも上と同様に、複数変数の箇所を置き換えてあげます。

$$\large θ_j:=θ_j-α\frac{\partial}{\partial θ_j}J(θ)$$

これで\(J(θ)\)について代入できるようになりましたね。

代入すると、

$$\large θ_j:=θ_j-α\frac{\partial}{\partial θ_j}(\frac{1}{2m}\sum_{i=1}^m (h_θ(x_i)-y_i)^2)$$

になります。

\(θ\)について偏微分すると、

$$\large θ_j:=θ_j-α\frac{1}{m}\sum_{i=1}^m (h_θ(x_i)-y_i)$$

となります。

今までは変数1つで考えてきたため、\(θ_1\)の場合は

$$\large θ_1:=θ_1-α\frac{1}{m}\sum_{i=1}^m (h_θ(x_i)-y_i)x_i$$

で良かったですが、複数変数を持った場合を考えて、このように書き換えます。

$$\large θ_1:=θ_1-α\frac{1}{m}\sum_{i=1}^m (h_θ(x^{(i)})-y^{(i)})x^{(i)}_1$$

すなわち、複数変数がある場合の数式は、以下になります。

$$\large θ_j:=θ_j-α\frac{1}{m}\sum_{i=1}^m (h_θ(x^{(i)})-y^{(i)})x^{(i)}_j$$

フューチャースケーリング

フューチャースケーリングとは、特徴量それぞれの取りうるレンジを調整して、最急降下法を素早く収束させるための方法です。

例えば、次のような2つの特徴量があったとします。

  • \(θ_1=\)家のサイズ(レンジ:0~2000\(m^2\))
  • \(θ_2=\)寝室の数(レンジ:1~5)

この2つの関係を等高線図で表現すると、どうなるでしょうか?(※今回は\(θ_0\)は考えないものとします)

単純に比率で考えれば2000:5なので、このような縦に非常に細長いグラフになります。

これでは非常に多くのステップを必要とするため、最小値に到達するまで時間がかかってしまいますし、非効率的ですよね。

もう一度今回の2つの特徴量それぞれのレンジを確認してみましょう。

  • \(0\leqq θ_1\leqq 2000\)
  • \(1\leqq θ_2\leqq 5\)

この2つのレンジをスケーリングしたいので、それぞれの特徴量の最大値で割ります。
そうすると、

  • \(0\leqq θ_1\leqq 1\)
  • \(0\leqq θ_2\leqq 1\)

となり、どちらの特徴量も0と1の間で収まるようになりました。

フューチャースケーリングをする際、一般的には\(-1\leqq x_i\leqq 1\)のように-1と1の間でスケーリングしますが、絶対ではありません。\(0\leqq x_1\leqq 3\)、\(-2\leqq x_2\leqq 0.5\)でも問題ありません。

しかしもし、\(-100\leqq x_3\leqq 100\)となった場合はどうでしょうか?

これは-1と1というレンジから大きく乖離しているため、適切ではありません。
同様に、\(-0.0001\leqq x_4\leqq 0.0001\)と極端に小さくなった場合も適切ではありません。

つまり、必ずしも-1と1の間に収まる必要はないですが、極端に大きく、もしくは小さく乖離したものは適切ではないということを覚えておく必要があります。

どのレンジまで許容するかは人それぞれの経験則によりますが、Andrew Ng先生によれば、\(-3\leqq x_i\leqq 3\)、\(-\frac{1}{3}\leqq x_i\leqq \frac{1}{3}\)までは許容範囲内ですが、これを超えるもしくは下回る場合は、気にする必要があるようです。

今回は最大値で割りましたが、スケーリング手法としては他に、平均正規化(Mean Normalization)というものがあります。

これは、特徴量の平均\(μ\)を引いたものを最大値で割るという方法です。

$$\large x_i=\frac{x-\mu_i}{x_{max}}$$

先ほどの2つの特徴量に当てはめるとこのようになります。

$$\large x_1=\frac{広さ-1000}{2000}$$

$$\large x_2=\frac{寝室の数-2}{5}$$

以上の手法をもっと一般化すると、特徴量の平均を0、分散を1にする標準化という方法があります。
特徴量平均を引いたものを、標準偏差で割るというものです。

$$\large x_i=\frac{x_i-\mu_i}{s_i}$$

学習率の選定

ところで、学習率はどのように決定すればよいでしょうか?

ここで考えることは以下の2つです。

  1. 最急降下法がうまくいっているかの確認方法
  2. 学習率の選定

最急降下法がうまくいっているかの確認方法

まず(1)ですが、最急降下法を実行すると同時にコスト関数Jを抜き出します。

縦軸が\(J(θ)\)の値、横軸がイテレーション回数、つまり最急降下法の繰り返し回数です。

つまり、このグラフ上にプロットできる点は「◯◯回、最急降下法を繰り返した後の\(θ\)の値」として捉えることができます。

イテレーション回数100、200、400で点をプロットしてみました。

100、200で\(θ\)の値が順調に減少しているのが見て取れますが、400より先(緑より先)はほぼ平坦です。即ち、イテレーション回数400回で\(θ\)はほぼ収束していると言えます。

学習率の選定

さて(2)ですが、学習率をどのように決定すればいいでしょうか。

上記の例ではほぼ400回で収束していましたが、30回で収束することもあれば、3000回掛かることもあるため、事前に適切な学習率を探し出すのは非常に困難です。

初期の方でも述べましたが、

  • 学習率が小さすぎる → 収束するのに時間が掛かる可能性がある
  • 学習率が大きすぎる → 収束しないで発散してしまう可能性がある

という性質を持っていますので、学習率を調整する方法としては、

0.001 → 0.01 → 0.1 → 1

のように、小さい値から大きい値へと変化させていくのがいいでしょう。もちろん、コスト関数Jと比較しながらです。

特徴量と多項式回帰

特徴量というのは、そのまま使わないといけない、という訳ではありません。

これまでやってきた家の問題で考えてみます。
例えば今、「横幅」と「奥行き」という2つの特徴量があるとしましょう。

今まで通りに考えればこのような式になります。

$$\large h_θ(x)=θ_0+θ_1\times 横幅+θ_2\times 奥行き$$

しかし、「横幅」× 「奥行き」=「面積」になると考えるとどうでしょうか。

$$\large h_θ(x)=θ_0+θ_1\times 面積$$

このように、自分で新しい特徴量を定義することも可能です。

特徴量の選定に密接して大事なことがもう一つあります。
それは多項式回帰というものです。

例えば二次関数をプロットした以下のようなグラフがあるとしましょう。

この二次関数は以下の式で表せるとします。

$$\large h_θ(x)=θ_0+θ_1x+θ_2x^2$$

非常に綺麗に当てはまっているように見えますが、ここで疑問が湧きます。

果たして二次関数でいいのでしょうか?

もし二次関数のままであれば、この先はこのようになるはずです。

広さは広くなるのに、一定の広さを超えると売値が下がるというのは理屈に合いません。

これは二次関数よりも三次関数の方が適しているように見えます。

では、どのように三次関数に当てはめればよいでしょうか?
最初にやった、多変量線形回帰から変換することが可能です。

・多変量線形回帰
$$\large h_θ(x)=θ_0+θ_1x_1+θ_2x_2+θ_3x_3+\cdots+θ_nx_n$$

・多項式回帰
$$\large h_θ(x)=θ_0+θ_1(広さ)+θ_2(広さ)^2+θ_3(広さ)^3$$

つまり、各\(θ\)にかかるxの値を2乗、3乗、としてあげればいいのです。

$$\large x_1=(広さ)\\
\large x_2=(広さ)^2\\
\large x_3=(広さ)^3$$

こうなると、フューチャースケーリングの重要性がますます認識できると思います。

例えば広さのレンジが1〜1000だった場合、\(x_2=1〜1000^2\)、\(x_3=1〜1000^3\)となるわけですから、とてもそのままでは比較できませんね。

しんぺい

だんだん機械学習がおもしろくなってきました!

次もガンガンやってみましょう!