たかくんの成長

大学1年生、たかくんの成長を綴ります。学習記録や学生生活に関することが多いと思われます。

1ヶ月くらいかけてCourseraで機械学習について学んだまとめ。【学習まとめ】

f:id:karia68:20180602112353j:plain

(煽りタイトルかつ何番煎じか分かりませんが、まとめてみました。)

 大学に入学して間もない学部1年(工学部)が、Courseraというスタンフォード大学による無料のオンライン講義サービスを利用して、AI(機械学習)について0から学んでみた。そのまとめ。 初めの方はすごい硬い語り口調だけどだんだんゆるくなっていきます。

 非常にモチベが高く暇だったので1ヶ月もしないうちに終わらせた。ただ、講座としての期間は3ヶ月くらいなのでゆったりやるのも可能。

モチベーション

  • AIの実態を把握したい
  • 英語で何かを学んでみたい
  • AIの知識を今後に生かしたい(というか人工知能で遊びたい)

AIについて、知りたい 

 今も、そしてこれからもAIの技術が至るところで活用されていくのは間違いないだろう。将棋のPonanzaや囲碁のAlphaGoは記憶に新しい。さらに今後、自動運転技術*1やロボット、その他あらゆる場面でAIは活用されていくだろう。そんな中で私は、AIとはなんなのか、世の中において具体的にどのような場面で、どういう手法で活用されているのかという事を把握したいと思った。そんでもって願わくば自分もそこに関わりたい。

英語で何かを学んでみたい

 Courseraの講義は基本的に全て英語で行われている。人気の講義に対しては、英語以外にも字幕が用意されていたりする。私が受けた機械学習のコースは非常に人気が高いので、日本語の字幕も用意されている。だが、講義のテキストや課題、そして受講者が互いに質問をしあって学習を助けあうフォーラムでの議論は全て英語なので、やはり英語で学ぶのが一番良いと思う。このCourseraというサービスについて、詳しくは後ほど述べる。

 自分は英語がある程度得意な方*2だったので、受験が終わって英語の能力をこのまま風化させていくのは非常にもったいないと感じていた。そんな中で、自分に興味が持てる分野を英語で学ぶこと、つまり英語のための英語ではない英語の使い方を望んでいたので(ややこしい)、自分の現状に非常にマッチしていると感じた。

AIの知識を今後に生かしたい(というか人工知能で遊びたい)

 自分の学生(工学部)としての興味の繋がり。大学の授業で教授が自らの研究を語ってくれる場が何度かあり、その話の中でもRobotics、つまりロボットに非常に興味を持った。Youtubeなどでボストンダイナミクスのロボット、Atlas(軽快に走ったり、宙返りをしたりする)などを見たことがある人もいるかもしれない。今や、ロボットは高度なソフトウェアを搭載するのが当たり前となっており、当然そこにAI(機械学習など)といったものも含まれてくる。なので、AIについて学ぶことは自分の将来にもきっと役に立つと思っている。(もっとも、AIという言葉はなんとも曖昧でアレだけれど)

 っていうのは表面的な説明で、根源的に自分の中で人工知能というテーマで遊びたい欲が非常につよい。自動運転やロボティクス、脳の解明、音声認識、言語処理、その他諸々。。ああ知能。ああAI。ああBrain。

Courseraとはなにか、(+講義の内容)

 Coursera(https://www.coursera.org)とは、スタンフォード大が提供するいわゆるMOOC(Massive Open Online Courses)の一つで、その名の通り沢山の講義をインターネット上で、無料(もしくは有料)で公開しているサービスである。同様のサービスとして、edX, Khan academy, Udacity, Alison, Udemy・・・など様々存在する。 

 自分が受講したのはCourseraのAndrew Ng先生によるMachine Learningの講座だ。学習量としては、WEEK1からWEEK11までの11週間。1WEEKあたりにかかる時間はおおよ3〜6時間といった印象だろうか。

 動画による講義と、その直後のテキストによる動画の内容のまとめの1セットで講座が進んでいく。新しい概念に対して動画で丁寧に解説をしてくれて、その直後にテキストのまとめで理解を深めていくという感じだ。 

 WEEKの最後には、そのWEEKの内容の簡単なクイズと、実際にプログラミングでシステムを実装をする課題が用意されている。クイズは5問で、3度連続で正答率が8割を切ると、ペナルティとして数時間の間クイズの受け直しが出来ないようになっている。とはいっても講座の内容を理解していれば特に問題なく解けるので、心配はいらない。しかし、プログラミング課題の方は少し根性が必要かもしれない(後述)。

学習に取り組む上で必要な要素

  • 簡単な行列の計算(特に行列の掛け算)
  • 高校程度の数学の知識(高いレベルの知識は全く必要ない)
  • 英語のある程度のリスニング、リーディング能力
  • 興味
  • パソコン

数学の知識

 行列のある程度の計算は出来た方が望ましい。とはいっても、講座のWEEK1の中で学習の補助として大量に行列やベクトルに関する講義が用意されているので、そんなに心配することはないかもしれない。実際、講義では数学的な背景を深追いせずにひとまず自分でシステムを組み立ててみることを目標としているので、数学に関する深い知識がなくても全く問題はない。ただ具体的に言うのならば、logやΣといったものの意味くらいは分かっておいた方がいい。(Σは出現率激高)

(ちなみに行列と高校数学を別として扱ったのは、現行の課程に行列が含まれていないため。この課程はコロコロ変わっているので要チェックだ。)

英語のレベル

 英語の能力は、ある程度必要なのは間違いない。Andrew先生の英語は非常に明快で、かつ平易な語彙で喋ってくれるので、学習ハードルがめちゃくちゃに高い、というわけでもないと思う。しかしながら、サイトも、テキストも、動画も、フォーラムも全て英語なので、英語に対する嫌悪感が強い人にはオススメは出来ない。ただ、絶望する前に一旦どの程度のレベルなのか見てみるとよいと思う。

 これから日本語対応していくということも考えられるので、(現時点でも動画の字幕には日本語がある)待ってみるのもいいかもしれない。現時点で英語が苦手だけどAIに興味があるという人がいるとするならば、この講義で英語に対するモチベーションも同時に上げるっていうのが一番いいことなのだろうけど・・・。

 実際研究の最前線で使用される言語は英語なので、学んでおくにこしたことはないと思う。(もちろんGoogle翻訳等を使いまくれば学習は十分可能だろう。機械学習の講義で機械学習のシステムをフル活用するというのも面白い)

 最後に、当然ながらAIへの興味がないと学習は続かないだろう。このサービスは、無料で受けられるとはいうものの、"講義"なので11週間は続く。(もちろん自分で学習を進めて早期に終了することは可能)無料なので別にいつ始めていつやめても構わないのだが、やる気がなければ受けたってしょうがないじゃん、というところはある。

(※プログラミング課題を行うためにPCは必須です)

プログラミング課題 

 プログラミング課題は、Octaveという言語で行う。その週に習った内容を、実際に自分の手を動かして自分のコンピュータで動かすことになる。Octaveを触ったことがなくても心配はいらない*3。講座の中でOctaveの導入方法およびその使用方法を丁寧に解説してくれている。プログラミング課題は少し難しいけれど、この講座における最も良い点の一つであると思う。

 プログラミングの経験については、ほとんど必要ないのではないかなと思う。自分は軽くPythonを触ったことがある(本当に触っただけ)だけで、特に深い知識もないけれど、課題は計算がメインなのでそんなに難しいことは必要ない。けれど、機械学習を学ぶ上では最終的にはゴリゴリとプログラミングすることは確実だと思うので、同時にプログラミング学習にも取り組んでみることをオススメする。私はまったくの知識ゼロの状態から、独学プログラマーという本を使って学習をスタートした。

karia68.hatenablog.com

 プログラミング課題は、以下のような感じで進めていく。まず講座のページからファイルをダウンロードし、その中に含まれているPDFとテキストを参照しながら、自分でコードを実際に書いていく。分からないところがあったり途中で躓いた場合は、講義を見直してみたりフォーラムを調べ回る。ここでこの課題の大きなGOODポイントとして、具体的なコード例が一切示されないというところにある。つまり、こういう入力が来るので授業内で扱ったこういう計算をして、こういう出力を返しなさい、と、言葉による指示があるのみで、こういうコードを書けば正解だよ、という具体的な指示は一切なされない。これがプログラミング課題を難しくしている一番の要因でありつつ、この講座における最も良い点だと思う。自分の頭で考え、何回も何回も成功するまで試行錯誤を重ね続けなければならない。

   ここからは、自分自身の学習した内容の総まとめ。WEEK1からWEEK11まで順に軽くさらっていきたい。*4これから学習する人の参考になれば幸い。(間違いがあれば教えて下さると嬉しいです。)(炎上ラーニング)

用語集

Machine Learning(機械学習), Supervised Learning(教師あり学習), Unsupervised Learning(教師なし学習), Regression Problem(回帰問題),Classification   Problem(分類問題), Cost Function(損失関数),  Linear Regression(線形回帰), Logistic Regression(ロジスティック回帰), Mean Squared Error(平均二乗和誤差), Feature Scalling, Mean Normalization, Gradient Descent(勾配降下法),  Sigmoid Function(シグモイド関数), Normal Equation(正規方程式), Decision Boundary(決定境界), Overfitting(過学習), Regularization(正則化), Neural Network(ニューラルネットワーク), Activation Function(活性化関数), Deep Learning(深層学習),  Backpropagation(誤差逆伝播法), Gradient Checking, Random Initialization, Bias/Variance, Precision/Recall, Support Vector Machineサポートベクターマシン), Kernels(カーネル法), Clustering(クラスタリング), Dimensionality Reduction(次元削減), Principal Component Analysis, PCA(主成分分析), Gaussian Distribution(正規分布), Anomaly Detection(異常検知), Stochastic Gradient Descent (確率的勾配降下法), Mini-Batch Gradient Descent(ミニバッチ勾配降下法), Online Learning(オンライン学習), Map Reduce, Data Parallelism, Pipeline, Ceiling Analysis

WEEK1 

WEEK1は導入部分。

Machine Learning(機械学習

 コンピュータに、状況に応じた人の手による細かなプログラミングを行わずに学習能力を与えること。主にSupervised Learning(教師あり学習Unsupervised Learning(教師なし学習の2種類に分類される。 

Supervised Learning(教師あり学習

 与えられた入力データ(X)に対して既に目標とする出力データ(Y)を持っており、入力データと出力データの間になんらかの関係があることを予想できる機械学習。後述するUnsupervides Learning(教師なし学習では、入力データXがあるのみ。

この中にも主に2つの種類、Regression Problem(回帰問題)Classification Problem(分類問題)がある。

Regression Problem(回帰問題)

 入力されたデータに対して連続した量を返すモノ。例えば、マンションの値段を予測するプログラムが考えられる。

まずはじめに、マンションの駅からの近さと部屋の広さ(X)とマンションの値段(Y)というデータセットを与える。学習を繰り返すことによって、新たに”マンションの駅からの近さと広さ”という情報を与えられた時に、連続した量として予測されるマンションの値段を返す。 

これだけでは連続ってどういうこっちゃねんてなるけど、次のClassification Problem(分類問題)と比べることでよく理解できる。

この問題に対しては主にLinear Regression(線形回帰)という手法を用いて学習を行う。

Classification Problem(分類問題)

 入力されたデータ(X)に対して、離散的な値(Y)を返すモノ。

例えば、ある患者さんの腫瘍の大きさ(X)からそれが良性なのか悪性なのか(Y)を判断するプログラムが考えられる。 腫瘍が悪性か良性のどちらかであるというのは、0か1かという表現で表すことができる。(離散的な値)

まずはじめに、大量の腫瘍の大きさ(X)とそれぞれ良性なのか悪性なのか(Y)というデータセットを与える。学習を繰り返すことで、”新たに腫瘍の大きさが与えられた時”にそれが悪性であるか良性であるかという判断を返す。

この問題に対してはLogistic Regression(ロジスティック回帰)と呼ばれる手法を用いる。

Linear Regression(線形回帰)

 考え方:入力データ(X)に対して、あるパラメータ(θ)を用いることで出力データ(Y)と入力データ(X)の関係をうまいこと見つけ出すのが目標。(ここで、出力データであるYは連続した量であるということに注意。つまり腫瘍が悪性か良性か、のような0 or 1、Yes or Noで表されるような量ではない) 

具体的には、入力データ(X)のそれぞれにθを掛け合わせた仮の関数(以下h(θ)と呼ぼう)を用意して、その関数の値と出力データ(Y)の値の差を比較する。言い換えれば入力データ(X)にθというパラメータを掛け合わせることで出力データ(Y)との関係を探る。そしてその2つの値の差がなるべく小さくなるような美味しいパラメータを見つけ出すのが目標。

ここでそのh(θ)とYの誤差を表す関数を、Cost Function(損失関数)*5と呼ぶ。以下h(θ)に加えて、損失関数をJ(θ)と表そう

損失関数には様々な種類の関数が存在する。ここでは一番簡単なMean Squared Error(平均二乗誤差)と呼ばれる式を使って評価する。つまり最終目標は、平均二乗誤差(すなわちJ(θ)のこと)が限りなく0に近づくようなθを見つけること!それも自動的に。 

ここで注意すべきなのは、J(θ)はθというパラメータにより変動する関数であるということ。なぜなら、J(θ)の中に登場して来るXとYとθのうち、XとYはもう入力済みの決まった量(定数)だから。上で言ったようにJ(θ)が最小となるようなθを上手いこと見つけられればOK。

ではそんな美味しいθをどう求めればいいのだろうか。端的に言えば、その答えはJ(θ)をθで微分することだ。つまりθが変化する時にJ(θ)がそれにつられてどう動いていくのかという様子を見る。Gradient Descent(勾配降下法)

 1階微分の値(接線の傾き)が負になる方向へ進めばJ(θ)が減少する方向に移動することが出来るよねという話。(それを繰り返す)

勾配降下法を用いて計算を繰り返し、θの値をどんどん最適化することによって美味しいθを作ることが出来れば、学習完了となる。

WEEK2

WEEK1の続き。どんどん行く。

Feature Normalization

 勾配降下法など、機械学習において不可欠な計算処理を出来るだけ軽くするために行うデータの前処理のこと。この講座ではFeature ScalingMean Normalizationを紹介している。

特に難しい話ではないので、省略。(実際に処理を行う上ではとても重要なようだ)

 Polynominal Regression

 具体的に数式を示していなかったので説明が難しいが、いままでの仮関数h(θ)では入力データ(X)の1つに対してそれぞれ1つだけの項を与えていた。この状態のh(θ)は線形なので、単純なモデルにしか上手くフィットさせることができない。しかしながら、無理やり項を増やすことによって非線形の複雑なモデルにも対応できるようにしよう、というのがこのPolynominal Regressionである。

具体的には、Xという入力データにたいしてXだけでなくX^2やX^3なども無理やり組み合わせてしまって、非線形のモデルを表現できるようにしよう、ということ。

しかし、後述するようにこのモデルはデータが増えるごとに計算量が激増し、大量のデータを処理するには現実的ではない手法である。

Normal Equation(正規方程式)

使用目的として、勾配降下法はθを求めるのに繰り返し計算を必要とするのに比べてこの正規方程式は一度でθを求めることができる。しかしながらデータが大きくなると有効ではなくなる。 

数学的なバックグラウンド、まだわからん。(線形代数べんきょうします)講義の中でAndrew先生は数学的なお話は省略しておられたので、あとでしっかりキャッチアップしたいと思う。

そしてここで初めてのプログラミング課題到来。Octaveチュートリアルもこの週です。なんやかんやで最初が一番手間取ったような気がする。

WEEK3

 ロジスティック回帰がここで登場。

 Logistic Regression(ロジスティック回帰) 

 考え方:入力データ(X)に対して、あるパラメータ(θ)を用いることで出力データ(Y)と入力データ(X)の関係をうまいこと見つけ出すことが目標。(ここで、出力データであるYは離散的な値であるということに注意。つまり腫瘍が悪性か良性かのような0 or 1で表されるような量である(コピペ))

本質的には上の線形回帰とやることは同じ。だけれどそのまま行うと、Yの値が離散的であるということから1つ問題が発生する。

 上の線形回帰では答え(Y)がそれぞれバラバラな値を取っていた。しかしながら今回はYの値は0か1の2通りしかない。(腫瘍が悪性なのか良性なのか)今ここで知りたい情報は、腫瘍が良性か悪性のどちらであるか、ということである。なのでロジスティック回帰のモチベーションとしては、この問題をどうにか確率として扱えないだろうかというものだ。

それではどうするのかというと、具体的には先ほど用意したh(θ)(Xとθを掛け合わせたもの)を"ある関数"に通すことによってその結果を圧縮し、確率の問題へと変える。その関数のことをSigmoid Function(シグモイド関数という。

補足すると、シグモイド関数というのは値域が0≦Y≦1という特徴を持っている関数。だから確率の問題として扱うことができる。こうすることによって腫瘍の大きさが与えられた時にそれが悪性なのか良性なのか、ということへの答えを確率として表してくれるようになった。 

後は同様に、このロジスティック回帰も線形回帰と同じ方法に帰着できる。損失関数J(θ)により誤差を測定し、微分してθをどんどん更新していくことによって美味しいθを作ることが出来れば、学習完了。

 (ただし、J(θ)に平均二乗誤差とは異なる式を使うことに注意)

 

このあたりの数学的な話はCourseraのコースでも詳しく扱っておらず、統計学をキチンと学ばないとダメそう。このコースやり終えたらまたしっかり学びたいと思っている。

 Decision Boundary(決定境界)

 上のロジスティック回帰において、Yが離散的な値なのでそれに対応してh(θ)も形を変えようという話。具体的には、h(θ)>>0.5 ならばY=1、h(θ)<<0.5 ならばY=0とする。ここでその閾値は本当に0.5でいいのかっていう疑問が湧くんだけど、あとからそこについての説明もしてくれている。

そしてこの閾値が、Y=1とY=0、すなわち腫瘍が良性なのか悪性なのかの決定の境目である。これをDesicion Boundary(決定境界)という。

Overfitting(過学習

過学習とは、与えられたデータセットに過度に適応してしまった状態。言ってみればそのモデルには柔軟性(一般性、普遍性)が無く、新しくデータが入力された時に見当はずれの値を出力してしまう。

この問題は、入力データの種類が多かったり、データセットが少なかったりすると起こりやすい。ちなみに、Underfitting(学習不足)はこれの逆。

対処法としては、データの種類を減らす、データセットをたくさん用意する、Regularization(正則化という手法を用いる、などが考えられる。

Regularization(正則化

上の過学習への対処法の1つ。 データの種類を減らしたくない時に非常に有効。

具体的にどうするかというと、Cost function J(θ)にlambda*Θ^2を足し算する。lambdaはregularization parameterと呼ばれるもの。上のΘはベクトル。

lambdaを適当に大きな値に調節することによって、お邪魔なθを取り消すことが目的。過度に学習してしまっている項を間引くようなイメージ。

WEEK4

ついにニューラルネットのご登場です。

Neural Network(ニューラルネットワーク

ニューラルネットワークとは、人間の脳を模倣したアルゴリズム(計算方法)のこと。 

ニューラルネットワークと以前までの線形回帰モデルやロジスティック回帰モデルの違いは、層の厚さ。入力データ(X)と出力データ(Y)を直接結びつけるのではなく、その間に更に隠れ層(hidden layer)を挟み込む。以下、より具体的に。 

隠れ層が2つあるとすれば、全体の層は(X層),(a1層),(a2層),(Y層)となる。そしてそのそれぞれを以前までと同様にパラメータΘ、シグモイド関数を用いて関係付ける。つまり

 z1 = Θ1*X, a1 = sigmoid(z1)

 z2 = Θ2*a1(=Θ2*Θ1*X), a2 = sigmoid(z2)

 Y   = Θ3*a2(=Θ3*Θ2*a1=Θ3*Θ2*Θ1*X

のようになる。

層を移る度に、以前の層の値にパラメータΘを掛け合わせ、その値を活性化関数に入れる。(Activation Function)ここではその活性化関数はシグモイド関数になっている。活性化関数から出てきた値にまたパラメータΘを適用して、シグモイド関数に通して、最後の出力層に伝えている。活性化関数という名前は、ニューラルネットワークにおける特別な名称。やっていることは線形回帰やロジスティック回帰と同じ。ただθの数がべらぼうに多くなる。

こうすることによって、より複雑なデータを処理することが可能となる。

(大量のデータに対し、以前までのモデルで対処をしようとすると、計算量が膨大になってしまう。すなわち非線形のモデルを1層で表現しようとすると、仮関数の中に多次元の項を大量に用意することになってしまい、データの量が多くなってくると計算量が現実的ではなくなってしまう。これはWEEK2あたりで触れたPolynomial Regressionと同じ問題。コンピュータの性能や計算手法が洗練される以前は、隠れ層を多く重ねることが出来ず複雑な処理を行うことが出来ていなかった。)

 とはいえもちろんニューラルネットワークにも、大きな計算量が要求される。ニューラルネットワークという考え方自体は古くから存在していたが、コンピュータの性能の問題からなかなか発展(多数の層を計算)はしなかった。しかしながら、技術の発展と共に近年様々な分野で活用されている。

一般的に隠れ層が何層にも連なるニューラルネットワークによる機械学習深層学習(Deep Learningと言う。

WEEK5

一番の山場。誤差逆伝播法の中身はまだよく理解していない。

Backpropagation(誤差逆伝播

誤差逆伝播法とは、ニューラルネットワークに於いて入力データと出力データの差(誤差)つまりJ(θ)を最小にするために良く用いられる計算手法。

このCourseraのコースでは理論的な話は省いて、実際の計算方法とプログラムの実行例を真似てみるというスタンスで講義が行われていたので正直内容の中身をあまり理解できていない。

イメージとしては、出力データとその一つ前の層のデータの誤差を比較して、そこからどんどんモリモリ差をとって微分して層をさかのぼっていく。そして、それぞれの要素ごとに誤差をチェックして修正する。具体的な隠れ層の様子は分からなかったとしても、微分することによってその増減の差くらいは分かるよ〜っていう話。(なにも理解してなさそう)

実際なにもわかってないので、コレから学んでゆこう。

Gradient Checking

数値微分をすることで、実際に誤差逆伝播法を用いたモデルが正常に機能しているかどうかを確かめる。

 つまり、普通の数学で習うような微分の定義式でシンプルに計算してみて、誤差逆伝播法ってなんやら複雑でよくわからんけどちゃんとできてんの?っていう疑問に対処する。

 あくまでも確認なので、実際に作動させるときにはこの手法は採用しない。この方法はシンプルな故に間違いにくいが、その分計算コストが非常に高いので一度確かめたらそれ以降はより効率的な誤差逆伝播法を用いて計算を行う。

 Random Initialization

Θの初期値はランダムにしてあげなければなりません。例えばΘの初期値を全部0にしてはいけません。なぜならそのとき、誤差逆伝播法においてΘが全て同じ値に更新されてしまうからです。層を積み重ねる意味がなくなってしまいます。(棒)

だんだん雑になっていっているような気がしなくもないけれど、週を通して根本的にやっていることはだいたい同じなので、新しい概念だけに注目してまとめている。

WEEK6

 この週は一風変わって、実際に機械学習を構築する上でどう行動すべきか?というようなテーマで講義が進んでいく。

次に何を試すべきか?

 仮関数h(θ)になんらかの予期せぬエラーが認められた時、その次にあなたが取るべき行動はなんだろうか?ここでは5つの選択肢が説明されている。

  • より多くのデータを収集する
  • 入力データ(X)の種類を少なくする
  • 入力データ(X)の種類を増やす
  • Polynomial featureを導入してみる
  • λの値を調節する

一番やってはいけないことは、上の5つからランダムに対処法を決めることである。それは多くの場合無駄に時間を浪費することとなる。

その代わりに、我々は仮関数の評価をすることでこの問題に対処する。

モデルセレクション

では、どうすれば仮関数の評価ができるのだろうか?

(注意、以下はまだ間違い)具体的には、データセットをトレーニングセットとテストセットの2つに分割する。つまり仮想的に教師データと現実のデータを設定して、それぞれ評価しようということだ。

( 元のデータ100% = トレーニングセット80% + テストセット20% )

そして、トレーニングセットを使用して、さまざまなPolynomial Featuresを試して、それぞれにおいて最適なパラメータθを見つける。次にテストセットを使用して、トレーニングセットで見つけたθを用いて、どんな形の仮関数を使えば一番誤差が小さくなるのか調べる。そして一番誤差の小さい形(モデル)を採用する。

そして最後に、同じテストセット、先ほど検証したモデルを用いて一般化した場合の誤差を調べる。

しかし、これは本当に有効だろうか? 否、有効ではない。なぜならせっかくデータを分割したのに結局テストセットで仮関数の形を調節してしまっているからだ。これではこのモデルを一般に適用させた時にそれがちゃんと作動するかが分からない。

-------------------------------------------

(コレが正解)なので単純に今度は3つに分ける。具体的には、データセットをトレーニングセットとバリデーションセット、テストセットの3つに分ける。

( 元のデータ100% = トレーニングセット60% + バリデーションセット20% + テストセット20% )

そして、先ほどと同様トレーニングセットを用いてパラメータθを求め、バリデーションセットを用いて仮関数のモデルを決定する。最後にその効果をテストセットで検証するというわけだ。こうすることによって、テストセットで一般化した場合の効果を調べることができる。めでたしめでたし。

つまるところここでの問題意識は、データセットを用いて仮関数を作ってみたはいいけれども、現実のデータに適用した時に、それは本当に期待通りに作動するのだろうか?ということ。それを検証するために、意図的にデータセットを仮のデータセットと仮の現実のデータとに分割したわけだ。

Diagnosing Bias vs Variance

(これは訳語がよくわからなかった。そのままバイアスと分散でいいのか)

ここで行われるのは、仮関数の性能が悪い時、その原因を分類して分析してみようというお話。具体的には、過学習と不足学習の分類。 

先ほどと同様、トレーニングセットとバリデーションセットを考えてみよう。

まず、我々がすることはトレーニングセットにおける仮関数h(θ)の精度をあげることだ。一般に、Polynomial Degreeを増やすことで、誤差を減らすことができる。それはつまり、項を増やしてh(θ)を複雑な関数にすることで、より非線形な形でデータにフィットさせることが出来るということだ。なるほど、ならば誤差を減らすためにPolynomial Degreeを増やしまくれば良さそうに思える。しかし、もちろんそれは過学習につながってしまうからよくない。 

そこで、我々は過学習をしているかどうかを判別するために、バリデーションセットを検証に使うというわけだ。Polynomial Degreeを増やすことによって、トレーニングセットにおける誤差は減少していっているかもしれない。しかしながらそのときバリデーションセットにおける誤差が上昇していたとしたら?それはまさに過学習をしてしまっているということだ。トレーニングセットに過度に適応してしまっている状態と言える。

つまり、トレーニングセットの誤差がうまく減少しつつ、かつバリデーションセットの誤差が一番少ないところのPolynomial Degreeを採用すればよいという話になる。

トレーニングセットの誤差が大きく、かつバリデーションセットの誤差が大きい状態をHigh Bias、トレーニングセットの誤差が小さく、しかしバリデーションセットの誤差が大きい状態をHigh Varianceと呼ぶ。

Reguralization Bias/Variance

今度は、Polynomial Degreeではなく正則化におけるパラメータλを増減させてBiasとVarianceの状態を見る。上とほとんど同じ話でそれをλに置き換えただけなので、すぐに理解できると思う。なのでサボろ。

Learning Curves

High Bias,High Varianceの状態をグラフに図示して、どう対処すればよいのかを分析する。 

High Biasのとき(不足学習のとき)

  •  現状を改善するためにより大量のデータセットを用意するのは、適当ではない。なぜなら、High Biasとは仮関数の表現能力が乏しい状態なので、いくらデータを持ってきてもそれに最適化をすることが望めない。
  •  データの種類を増やすことは、不足学習の改善に繋がるので、有効。
  •  λを減らすことは、不足学習の改善に繋がるので、有効。

High Varianceのとき(過学習の時)

  •  現状を改善するためにより大量のデータセットを用意するのは、良い結果をもたらす可能性が高い。なぜなら、High Varianceとは仮関数の表現が豊か(複雑な非線形)という状態なので、データを多く用意することでよりうまく最適化を進められう可能性がある。
  • データの種類を減らすことは、過学習の改善に繋がるので、有効。 
  • λを増やすことは、不足学習の改善に繋がるので、有効。

Error Metrics for Skewed Classes

 ある特定のデータを分類する時に、そのエラーを検証するのが難しいことがある。例えば、ある患者さんが癌であるか否か、ということを分析する場合である。多くの場合、患者さんは健康で、癌である可能性はそんなに高くはないだろう。

ここで、患者さんのサンプルデータのうち99.5%の人は健康で、残りの0.5%の人のみ癌であった場合を考えるとする。はじめ、我々の作った機械学習のシステムの正答率は99%だった。しかし、このときもしもシステムを書き換えて、患者さんの症状に関わらず全ての人が健康である、と機械学習に答えさせたとしたらどうなるだろう?

そう、この場合正答率が99.5%に上昇してしまうのである。しかしながら、これは本当に精度が上昇したと言えるのだろうか?

この問題を解決するために、Presicion/Recallという考え方を用いる。

 Presicion/Recall

Presicionとは、以下の割り算である。 

 Presicion =(予測と結果が一致した癌患者の数)÷ (予測では癌患者だが、実際には癌患者でなかった人の数 + 予測と結果が一致した癌患者の数) 

Recallとは、 

 Recall =(予測と結果が一致した癌患者の数)÷ (予測では健康だが、実際には癌患者だった人の数 + 予測と結果が一致した癌患者の数)

 少し長ったらしくなって分かりづらいが、実際に計算してみるとうまく指標として機能するのがわかると思う。これを用いれば、上の例も精度が上昇しているわけではないとわかる。  

WEEK7

 ついにSVMSupport Vector Machine)のご登場。はじめに言い訳しておきますが、これらの数学的背景についての自分の知識はチンパンジー以下ですのでご容赦を*6。上っ面と名前だけをさらって、プログラミング課題で一応そういう計算式を書いてみた、というだけであります。

Support Vector Machineサポートベクターマシン

 サポートベクターマシンSVM)は、より強力な機械学習アルゴリズムである。その特徴は、なるべく個々のデータから離れるようにDecision Boundary(決定境界)を選ぶ。つまり、個々のデータからの余白(マージン)が広く、誤った結果を出力する可能性が低くなる。ロジスティック回帰よりも信頼できる予測を行える可能性が高まる。ここでは計算は省略とする。(まあできないからね)

Kernels(カーネル法

 サポートベクターマシンと一緒によく使われる手法。一般に分類することが非常に難しい非線形のモデルを線形としてうま〜く扱って分類できるようにするという感じ。これもこの講座外でいろいろ調べてみたけど、あなたはこんなところを見る前にまず数学を勉強してくださいという感じになっているので辛い。 

 こう見るとサポートベクターマシンは万能ちゃんのように見えるが、実際にはいろいろ使い分けてうまいことやるようだ。(諦観)

これから統計学やるから、まっててね、SVMカーネル

WEEK8

 Unsupervised Learning(教師なし学習

 今までの教師あり学習では、データセットでXとYがすでに区別してあった。(ラベルがついていた)しかしながらこの教師なし学習では、ただの雑然としたデータの集まりがあるのみで、X,Yなどのラベルはついていない。そこで、Clustering(クラスタリングという手法を用いて、雑然としたデータたちを分類うまい具合にラベル付けして分類することを考える。

K-means(K平均法)

  Clustering(クラスタリング)における最も一般的な手法。データセットに(分類したい数だけ)centroidsというモノを新たに導入して、それによってうまい事グループ分けしていく。もちろん分類したい数すら分からないという場合もある。そのときはelbow methodと呼ばれる手法を用いたりする。もしくは頑張る。

 K-meansの順序としては

  1. 初めのcentroidsを決める(複数)
  2. 1つ1つのデータを、それぞれのcentroidsに一番近いデータごとに分類する。データ君の気持ちから考えると、あたりを見回して、一番近いcentroidsさんのところに所属する、という感じ
  3. 今度はcentoroidsが、自分のチームに所属するデータくんたちの平均値のところへ移動する
  4. 2と3を繰り返して、分類を完了させる。

 K-meansは市場の分析や、SNSクラスタ分類、コンピュータのクラスタ分類、天文学のデータの分類などに使われていたりする。

Dimensionality Reduction(次元削減)

 データセットが大量にあるとき、その次元を減らしてもっと手軽に扱えるようにしたい、というモチベーション。それによりメモリの占有率を減らしたり、計算をスピードアップさせる。

Principal Component analysis, PCA(主成分分析)

 こちらも数学的なお話は省略。データの次元を落とすときに使われる手法。2次元から1次元に落とすときの話はわかりやすい。X1とX2のデータを関連づけてその位置を影として投影することで次元を落とす。3次元から2次元も同じ感じで面として影を落とす事で次元を削減している。そんなかんじ。。。

WEEKが後半になるにつれて、ふ〜んそうなのねとしか言えなくなってきた。まとめるのにも疲れが出てきた模様。だがもう少しなのでがんばりマウス。

WEEK9

 Gaussian Distribution(正規分布)Normal Distributionとも

 確率論における連続的な変数に関する確率分布。様々な場面で複雑な現象を簡単に表すことのできるモデルとして使われている。グラフ的には左右対称のお山のような形。真ん中が平均値μで、標準偏差σが変わることでお山の形のなめらかさ、激しさが決まる。

Anomaly Detection(異常検知)

 正規分布を用いて、入力されたデータが正常なのか異常なのかを判断する。これのポイントは、どんな状態が異常であるのかということを前もって知らなくてもよいということ。事前に集めた正常なデータを使って正規分布をつくることによって、自動的に大きく平均値から外れているものを弾くシステム。Supervised Learningとごっちゃになりそうだが、Anomaly Detectionの目的は大きな外れ値を示すものを弾くことなので、異常データが少なくても(究極的にはなくても)作動させることができる。けれど教師あり学習の方は、入力データと出力データの間の関係(パラメータΘ)を見つけ出すのが目的なので、この2つはちがうものですよ。と。

Choosing What Features To Use

  異常検知をするために、ガウス分布のグラフを作りたいのだが、そううまく世の中のデータは正規分布に従うようにはなっていない。なので、そんなデータを無理やり正規分布の形に変換してしまおうという試み。元のデータをlogに入れてみたり、0.5乗とかしてみたりすると、正規分布の形に変換できるようだ。 

Recommender System, Collaborative Filtering

 世の中でバリバリバリバリ使われている、オススメ表示システムの紹介。NetflixAmazonYoutube、至る所で使われているこのシステム。ここではNetflixに代表されるような、映画サービスを例に出して説明している。基本的には線形回帰を用いてやるので新しい概念はとくに登場しない。ただ、ひとつだけ。映画を観た後に、こんな映画もおすすめですよ、とやるには、ユーザーの映画の好みのジャンルと、映画それ自体のジャンル分けが必要だ。そこで、その2つの作業を別々にやるのではなく、ユーザーからの評価と、映画のジャンル分けを同時に更新していく(Collaborative Filtering)という手法を用いている。

 まだ映画を1本も観てないユーザーは?出たばっかりの映画はどう振り分けるの?などという疑問が生まれる。それに対しては、ユーザの評価を平均化して振り分けたり、ユーザーの好みから逆推定して映画のジャンルを決めたり、などをしているようだ。

 こうやって文字で書くと、ふ〜んなにやらすごそうとなる。しかし実際には数式でスパーンと表現されているので、え、本当にこれだけでいいんすか?ってなってしまうところはある。

ふ〜。

WEEK10

Stochastic Gradient Descent (確率的勾配降下法SGD

 データの量が大規模になると、今までのように全てのデータに対して勾配を計算するのは時間がかかることが多い。より計算量を少なくするために、確率的勾配降下法SGD)を用いる。従来の方法は、全ての組を同時に計算していたので、計算量が膨大であった。SGDは、1組のデータのみから勾配を計算する。よって非常に高速に学習することが可能。

Mini-Batch Gradient Descent(ミニバッチ勾配降下法)

 SGDと同じ考え方で、こちらは1組だけではなく、もう少し大きな単位のデータを用いて学習を行う。一般的には2から100程度の組のデータを同時に計算する。こちらの手法も、表記としてSGDと表されることがあるようだ。これによってより高速に計算を行うことが出来る。

 学習率(パラメータα)を計算回数の増加とともに減少させることによって、最適解に上手く収束するのを狙う。

Online Learning(オンライン学習)

 連続的に流れ込んでくるデータに対して、それぞれについて学習を行い、常に最適化を行い続ける学習。すでに集めたデータの塊に対して機械学習を行うのではなく、個々の(最新の)データそれぞれに機械学習を行い、更新し続ける。その特性から、応用範囲が広く、様々なところで使われている、使われていくだろう。

Map Reduce and Data Parallelism

 データを分割し、複数のコンピュータで並行して学習を行うことにより、効率的に機械学習を行う。線形回帰でもロジスティック回帰でもニューラルネットワーク でも大丈夫。役割を分担して計算し、最後にマスターサーバーに集めて集計する。

WEEK11

 PhotoOCRを例に用いてPipelineとCeiling Analysisの説明。そして最後にまとめと感謝のメッセージ。

Pipeline(パイプライン処理)

 実際に機械学習を設計する上で、 どのような流れで、どんなステップを踏むことで目標を達成するのか、ということを図式化する。

 PhotoOCRは、画像の中のテキストのみを読み込み、そのテキストの内容を認識するというシステム。ここではPhotoOCRにおいてどうやったらこのシステムを実装することができるのかというところを部分部分で細かく見ていく。まず、テキストと思われる部分を画像から切り取る。2つ目にテキストを1文字ごとに分割する。そして最後にそれぞれの文字をAからZの26通りからロジスティック回帰問題として分類する。しっかりとPipelineとしてシステムの仕組みを図式化することで、その問題にどう取り組むか、同人数配分をするのかというところを明確にする、

Ceiling Analysis

 PhotoOCRのシステムの正解率を効率よく上昇させるためには、どこに重点を置いて改良するべきなのか。その分析を行うことがCeiling Analysis。まずはシステム全体の正答率を把握する。次にパイプラインの1つ1つの工程を意図的に100%正解となるようにして、それによるシステム全体の正答率の上がり幅を見る。上がり幅が大きくなった工程ほど、効率的にシステムの改善を見込める部分であるということ。

 工程1を100%正解するようにしたのに、全体としての正答率が1%しか上昇しなかった。しかし工程2を同じようにしたところ、全体として正答率が20%上昇した。ならば工程2に、人員と時間を割いた方が効率がよいのは明らかである。

最後のありがとうビデオ

 とても感動した。なんやかんやで1ヶ月の間かなりの頻度でAndrew先生の顔を見ていたことになるので、先生の方から、この講義のために時間を割いてくれて、一生懸命取り組んでくれてありがとうと言われるとジーンときてしまう。Andrew先生、本当にありがとうございました。このありがとうヴィデオ、何度も見返したいと思います。

 

 

 

まとめ 

 記事、とても、ながい。同じく機械学習を学ぼうとしている方や、実際にCourseraで講義を受けている方の参考になれば嬉しい。私はこれからこの技術の背景にある数学(や理論)をしっかりまなび、OctaveだけでなくPythonやRなどで実装のれんすうをしていきたいと思う。Kaggleに取り組んでみるのもよいかもしれない。そしていずれは、現実のデータで機械学習の設計に取り組んでみたいと思っている。自動運転も面白そうだしTech系の会社でゴリゴリデータ扱うのもよさそうだし研究色の濃いロボットとの組み合わせで遊ぶのも面白そうだし脳科学を学んでそのあたりから攻めるのも面白そうだしウウンウンン。

  というか人口知能に関する研究がしたい。DeepMind社あたりがやっていることがやりたくてたまらん。たまらんすぎてDeepMind社の求人ページをブックマークしている。しかしひとまずはTwitterで鬼のように関係者をフォローするに留めている。

 

 

 

たかくんの奮闘(成長)は続く。。。

 

神経科学(デミスハサビスの真似)はじめました。

 

karia68.hatenablog.com

 

*1:つい最近発売した岩波新書の鶴原吉郎『EVと自動運転』だったり日経ビジネスのEV特集を読んで感DOした。

*2:これは罠で、そうでもない。入学後にはせっせと語彙の増強に励んでいた。

*3:とは言いつつも私はプログラミング課題においてほとんどの時間をOctaveの挙動を調べるのに費やした。あと行列の型チェック!

*4:WEEK5あたりから、学習を進めながら順次書いていた。出来れば数式を使って表現したかったけれど、そうすると凄く進行が遅くなってしまうのでひとまずは掴んだイメージをまとめる感じにした。Texも使えるようになりたい。

*5:Loss Function、Error Functionは同義語

*6:現在は、米アマゾンのベストセラーになってる A introduction to statistical learningとかいう統計の教科書を読み漁っている。コレ無料で公開されてて、なんでそんなことが出来るのか、、という気持ち。ただPDFを眺め続けるのは目が痛いのでキツい。。