trybeetle

take it slow!!

DeepLearning.ai course3 振り返り


Posted on Aug. 19, 2018, 8:57 p.m.



DeepLearning.aiのコース(Structuring Machine Learning Projects)では、精度を高めるための方法やTransfer learning等について学びます。


week 1

machine learningの基本的な命題として、cost functionを最小化することを目的としているため、それに応じた各ステップとしては以下の様になります。その各段階で、生じやすい問題と主な対策も下記に記載します。

Step 問題 対策
Fit training set well on cost function underfitting Bigger NW
Change algolithm
Fit dev set well on cost function overfitting Regularization
Bigger training set
Fit test set well on cost function overfitting Bigger dev set
Perform well in actual usage mismatch Change dev set/ cost function

Evaluation

構築したモデルを評価する場合は、single number で単純比較をした方が明快なので、F score等を用います。


また、optimizingとsatisfying の考えから、達成したい目標を定めます。(例:optimizing=>accuracy, satisfying=>running time)satisfyingについては、thresholdを設定し、その値を満たすことを目標とします。その値を満たしさえすれば、あとはoptimizingを追及することを専念します。


Train/Dev/Test data distribution

datasetをTrain/Dev/Test dataに分配するときに、まず気を付けることとして、下記の2点があげられます。

  • データの種類が同じであること
  • ランダムにシャッフルされていること

分配のサイズとしては、10,000くらいまでの小規模なデータの場合は、Train:Dev/Test=60:20:20 の割合で分けてしまっても良いが、10,000を超え更に大規模なデータとなった場合には、必要純分なDev/Testのデータセットが確保できれば、後は、Training用データに配分します。



week 2
Error analysis

Error analysisを実施する際は、以下の様に進めます。

  • Dev setから、100個のmislabeledと判断された例を抽出します。
  • 予想される問題をカテゴリ分けします。
  • カテゴリ毎に、当てはまる場合は、カウントします。
  • カウント時に、他にも問題がありそうな場合は、その問題も新たにカテゴリに追加します。
  • 抽出した100のデータに対する割合を出し、比較します。

その結果、下記の様な表が求まり、どの問題から優先的に対処すべきかの指標になります。

誤ってlabel付けをしていた割合が高い場合には、修正するデータは、Dev/Test用のデータを修正するだけで大丈夫です。

imageがぼやけていることが原因であれば、Artficial Data Synthesisにより、ぼやけフィルタを加え、人工的にぼやけたデータを作成することで対処します。


Dev/Testで使用するデータについて

Dev/Testで使用するデータは下記の2点に気を付ける必要があります。

  • Dev/Testのデータは、同じDistributionから来ていること
  • Dev/Testのデータは、enduserが使用するであろうデータを用いること

仮に集めたデータとして、90,000枚のInternetで集めたHi-resな写真と、10,000枚の携帯で撮影した写真の2つのDistributionがあり、実際にenduserが使用するであろう写真が携帯でとった写真の場合を想定します。
この場合、2つのDistributionを纏めてから、分配すると、Dev/Testで欲しいデータが10%しか入っていないことになります。Dev/Testの結果で、最適値を決めるので、Dev/Testには、enduserが使用するであろう写真のみで構成する必要があります。
この場合の分配例としては、90,000枚のInternetの写真は、全てTraining dataとし、10,000の携帯の写真の分配としては、Training:Dev:Test=5000:2500:2500の様に分配するといったことが考えられます。


Data mismatch

先の様に、TrainingデータとDev/Testデータで異なる種のデータを用いた場合、Data mismatchを起こす可能性があります。
Data mismatchが起きているか確認するためには、Trainingデータを、training用とtraining-dev用(devと同じくらいのサイズ)の2つに分割し、training-devとdevのerror率を比較することで、data mismatchが発生しているか、していないかを判断することができます。

Data mismatchが発生した場合には、Training用データをDev/Testデータに近づける必要があります。その1つの手法として、Artificial Data systhesisで人工的にデータを作成します。
※この時に注意する必要があるのが、限られたフィルタで人工データを作成した場合、そのフィルタにoverfittingを起こす可能性があります。そのため、フィルタの種類もtraining data数に合わせて、十分に用意する必要があります。


Transfer learning

Transfer learningによって、Deep learningの結果を他のDeep learningに流用することができます。
これにより、求めたいTaskのデータセットが少なかったとしても、類似するTaskの結果を流用、予めweightを求めておく(Pre-tuning)ことで、少ないデータセットのみで導き出す(Fine-tuning)ことができます。

Taskが似ていれば、featureの取り方もにているであろうという考えに基づいています。
L層のTaskの場合には、1~(L-1)までのweightを流用し、W_Lのweightのみ初期化して、deep learningを実行することで、少ない情報量で求めることができます。

Transfer learningが適用する(TaksAの結果をTaskBに流用)ための条件として下記の様なことがあります。

  • TaskAとTaskBで、inputのfeature数が同じであること
  • TaskAのデータ数 > TaskBのデータ数
  • TaskAのlow level featureがTaskBに有用であること

Multi task learning

Multi task learningでは、output layerの結果に複数のlabelを持たせることで、ラベルごとに別々のNeural Networkを組む手間を省きます。
これも、Transfer learningと似たような考えで、low levelのfeatureが似通っているので、その部分を共有使用という考えです。

複数のラベルを持つので、cost functionを求めるときには、ラベルをsummationする必要があります。(Cを扱うラベル数とします。)
$$ J = \frac{1}{m} \sum_{i=1}^m \sum_{j=1}^C \mathcal{L}(a^{(i,j)}, y^{(i,j)}) $$

Multi task learningの条件としては、下記のことがあります。

  • low level featureが共通していること
  • データ数が近いこと
  • 十分に大きいNeural Networkであること

multi task learningの用途は、computer visionなどいまのところ限られている様です。


end to end learning

今までは、Pipelineの考えかあら、1つのTaskを複数のsubtaskに分割していました。end to end learningでは、分割するのを止め、1つのneural networkで導き出そうという考えです。

条件としては、大規模なデータが必要であり、そのデータが、input Xから最終的に求めるラベルYまで、紐づいている必要があります。
複雑なTaskの場合、そのようなデータを大量に確保することが難しいかもしれません。


Category:ML
Tag: ML python
Aug. 19, 2018, 8:57 p.m.

Comments