Courseraで機械学習を学び、そしてハマった【学習まとめ〜WEEK3】
前に、英語の語彙を増強するにはある程度時間がかかるのでそれまではプログラミング学習に本腰を入れられそうにないって書いたけれど、ある程度語彙の習得も進んでその状況がだんだんとよい感じになってきた。
そこで最近、よちよちと第二歩を踏み出した。以前からずっとAIというものに興味を惹かれていたのでそれを学びたい習得したいという思いは強かったのだが、いかんせん英語との兼ね合いで少しガマンしていたところを、よしよしようやくたどり着いたって感じ。
具体的に何をしているかというと、主に以下の二つ
- CourseraというサービスのMachineLearningの講座
- オライリー社の『ゼロから作るDeepLearning』という本
つまりコレと
コレ
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る
まず、下の『ゼロから作るDeepLearning』という本から読み始めてみた。この本はゼロから自分の手でプログラムを実装していくことでより理解を深めていくというスタンスの本であると認識しているのだけれど、実際のところ思ってたより少し難しかった。少なくとも自分は以前にPythonを独学プログラマーやオライリーの入門Python3で少しさらっていたのでウンウンうーむと悪戦苦闘しながら読み進めは出来たものの、少しもPythonに触ったことがなかったとしたらきっとかなり厳しそう。前もってやっておいて良かった。
非常にモチベーションが高かったのでひとまず実装は軽くさらえる部分はさらって、全部を読み通すことを最優先にした。2日間くらいで読み終わって、感じたこととして。確かに分かりやすいし書いてあることはふんふんとある程度仕組みを理解しつつ読み進めることは出来るのだが、手に馴染まないというか、読み終わっても依然として空中をふわふわ漂っているような感覚。
もちろん全然読み込みが足りていないし実装も軽くさらっただけなので当然だけど、こういう時は同時並行的にやっていくのが一番だろうと思ったので新たにCourseraというサービスを活用してMachineLearningを基礎から違う視点で学ぼうとした。
(まずそもそもMachineLearningとDeepLearningは違うというか、MachineLearningにDeepLearningが含まれるという感じなので『ゼロから・・』を読んでいる途中でそっちからやり直したくなった。というのが本音)順番が逆だったよう。
このCourseraというサービス、素晴らしいの一言に尽きる。どんなものなのかというと、簡単に言えばタダで大学の講義が受けられるサービスだ。似たようなモノは幾つか存在していて、コレらは総称してMOOC(Massive Open Online Course)と呼ばれている。
Courseraはスタンフォード大によるMOOCの一つで、もちろん内容は英語なんだけれどそれがむしろ今の自分の状況にすごくマッチしていて、ハマっている(日本語もあるにはあるけど)。自分が取っているMachineLearningの講義は、動画とテキストがワンセットになっていてリスニング練習にもリーディング練習にもなる。そして目的は英語学習じゃなくて機械学習を学ぶことなので、モチベーションが段違い(笑)
授業を受けるのが目的なら本当に留学要らずって感じだ。英語も分かりやすくついていけるレベルだし、意見やアドバイスを出し合うForumや動画の後のテキストでのサポートも手厚いので、情熱を持って取り組めばしっかりやり通すことが出来るように思う。(まだ半分しかやってないけど)
しかも追加でお金を払えばその講義の修了証明書が貰える。なんということでしょう。
ここから以下は自分がその講座で学んだ内容についてまとめていきたい。(本当は数学的なお話もまとめたかったけれどWebページに数式を載せる技術はまだないのでそれはまた今度ということで、用語のまとめだけ)
基本的に自分の知識の整理用なので情報としてあまりアテにしないでください。(また、内容に間違えがあれば教えてください)
Machine Learning(機械学習), Supervised Learning(教師あり学習), Unsupervised Learning(教師なし学習), Regression Problem(回帰問題),Classification Problem(分類問題), Linear Regression(線形回帰), Logistic Regression(ロジスティック回帰), Mean Squared Error(平均二乗誤差), Gradient Descent(勾配降下法), Sigmoid Function(シグモイド関数),Overfitting(過学習), Regularization(正則化)
Machine Learning(機械学習)
コンピュータに、状況に応じた人の手による細かなプログラミングを行わずに学習能力を与えること。主にSupervised Learning(教師あり学習)とUnsupervised Learning(教師なし学習)の2種類に分類される。
Supervised Learning(教師あり学習)
与えられた入力データ(X)に対して既に目標とする出力データ(Y)を持っており、入力データと出力データの間になんらかの関係があることを予想できる機械学習。
この中にも主に2つの種類、Regression Problem(回帰問題)とClassification Problem(分類問題)がある。
Regression Problem(回帰問題)
入力されたデータに対して連続した量を返すモノ。
例えば、マンションの値段を予測するプログラムが考えられる。
まずはじめに、マンションの駅からの近さと部屋の広さ(X)とマンションの値段(Y)というデータセットを与える。
学習を繰り返すことによって、新たに”マンションの駅からの近さと広さ”という情報を与えられた時に、連続した量として予測されるマンションの値段を返す。
これだけでは連続ってどういうこっちゃねんてなるけど、次のClassification Problem(分類問題)と比べることでよく理解できる。
この問題に対してはLinear Regression(線形回帰)という手法を用いて学習を行う。
Classification Problem(分類問題)
入力されたデータ(X)に対して、離散的な値(Y)を返すモノ。
例えば、ある患者さんの腫瘍の大きさからそれが良性なのか悪性なのか(0 or 1)を判断するプログラムが考えられる。 腫瘍が悪性か良性のどちらかであるというのは、0か1かという表現で表すことができる。(離散的な値)
まずはじめに、大量の腫瘍の大きさ(X)とそれぞれ良性なのか悪性なのか(Y)というデータセットを与える。
学習を繰り返すことで、”新たに腫瘍の大きさが与えられた時”にそれが悪性であるか良性であるかという判断を返す。
この問題に対してはLogistic Regression(ロジスティック回帰)と呼ばれる手法を用いる。
Linear Regression(線形回帰)
考え方:入力データ(X)に対して、あるパラメータ(θ)を用いることで出力データ(Y)と入力データ(X)の関係をうまいこと見つけ出そう。(ここで、出力データであるYは連続した量であるということに注意。つまり腫瘍が悪性か良性か、のような0 or 1、Yes or Noで表されるような量ではない)
具体的には、入力データ(X)のそれぞれにθを掛け合わせた仮の関数を用意して、その関数の値と出力データ(Y)の値の差を比較する。言い換えれば入力データ(X)にθというパラメータを掛け合わせることで出力データ(Y)との関係を探る。そしてその2つの値の差がなるべく小さくなるような美味しいパラメータを見つけ出すのが目標。
その2つのデータの差はMean Squared Error(平均二乗誤差)と呼ばれる式を使って評価する。つまり最終目標は、平均二乗誤差(以下J(θ)と表す)が限りなく0に近づくようなθを見つけること!それも自動的に。
ここで注意すべきなのは、そのJ(θ)はθというパラメータにより変動する関数であるということ。なぜなら、J(θ)の中に登場してくるXとYとθのうち、XとYはもう入力済みの決まった量(定数)だから。
そして今度はその美味しいθを自動的に求められるようにする。具体的には、J(θ)をθで微分する。θが変化する時にJ(θ)がそれにつられてどう動いていくのかという様子を見る。Gradient Descent(勾配降下法)
1階微分の値が負になる方向へ進めばJ(θ)が減少する方向に移動することが出来るよねという話。(それを繰り返す)
勾配降下法を用いて計算を繰り返し、θの値をどんどん最適化することによって美味しいθを作ることが出来れば、学習完了。
Logistic Regression(ロジスティック回帰)
考え方:入力データ(X)に対して、あるパラメータ(θ)を用いることで出力データ(Y)と入力データ(X)の関係をうまいこと見つけ出そう!(ここで、出力データであるYは離散的な値であるということに注意。つまり腫瘍が悪性か良性かのような0 or 1で表されるような量である(コピペ))
本質的には上の線形回帰とやることは同じ。だけれどそのまま行うと、Yの値が離散的であるということから1つ問題が発生する。
上の線形回帰では答え(Y)がそれぞれバラバラな値を取っていた。しかしながら今回はYの値は0か1の2通りしかない。(腫瘍が悪性なのか良性なのか)
つまり、知りたい情報は良性か悪性かの二択なのに余分な情報が多いんじゃ!ということ。
それではどうするのかというと、具体的には先ほど用意した仮の関数(Xとθを掛け合わせたもの)を"ある関数"に通すことによってその結果を圧縮し、確率の問題へと変える。Sigmoid Function(シグモイド関数)
逆に分かりづらくなっているような気がするので補足すると、シグモイド関数というのは値域が0≦Y≦1という特徴を持っている関数。だから確率の問題として扱うことができる。
つまり、腫瘍の大きさが与えられた時にそれが悪性なのか良性なのか、ということへの答えを確率として表してくれるということ。
そうすることによって、このロジスティック回帰も線形回帰と同じ方法に帰着できる。
・・・以下(考え方は)同様・・・・誤差を測定し、微分してθを見つけて・・・θの値をどんどん最適化することによって美味しいθを作ることが出来れば、学習完了。
(ただし正確には、誤差の測定に平均二乗誤差とは異なる式を使う)
このあたりの数学的な話はCourseraのコースでも詳しく扱っておらず、統計学をキチンと学ばないとダメそう。このコースやり終えたらまたしっかり学びたいと思っている。
Overfitting(過学習)
過学習とは、与えられたデータセットに過度に適応してしまった状態。言ってみればそのモデルには柔軟性(一般性、普遍性)が無く、新しくデータが入力された時に見当はずれの値を出力してしまう。
この問題は、入力データの種類が多かったり、データセットの数が少なかったりすると起こりやすい。
対処法としては、データの種類を減らす、データセットをたくさん用意する、下のRegularization(正則化)という手法を用いる、などが考えられる。
Regularization(正則化)
上の過学習への対処法の1つ。 データの種類を減らしたくない時に非常に有効。
具体的にどうするかというと、Cost function J(θ)にlambda*Θ^2を足し算する。lambdaはregularization parameterと呼ばれるもの。上のΘはベクトル。
lambdaを適当に調節することによって、お邪魔なθを取り消すことが目的。過度に学習してしまっている項を間引くようなイメージ?
・・・続く。
アンドリュー先生のCourseraのMachine Learningの講義は全部で10weeks分あって、上にまとめた内容はその3weeks分くらい。week4からはいよいよニューラルネットワークに入る。
実はまだWEEK5を終えたばかりなんだけど、始めてから1週間なのでなかなか早いペースだよね!
完結しました↓