COUSERA Machine Learning Week10

Ats
10 min readDec 16, 2020

--

ソフトウェアエンジニアが Cousera の機械学習コーシ(10週目)に参加して学んだことをメモ代わりに共有します。今回は大量にデータがある場合の機械学習のテクニックを学びました。分散処理の技術は聞いたことありましたが、実際に使うイメージが湧いて面白かったです。

9週目の記事もあるので良かったら読んでみてください。

Gradient Descent with Large Datasets

この章では、大量データを使って機械学習をする方法について説明します。

Learning With Large Datasets

数年前と比べて、近年は学習アルゴリズムがうまく動作するようになりました。その理由の一つには、アルゴリズムのトレーニングに使えるデータの量が単純に増えたことがあります。しかし、大規模なデータセットからの学習は、特有の問題もつきまといます。具体的には、計算的な問題です。国内外でもデータセットが1億を超えるサービスを見つけるのは難しことではなくなりました。

そんな時には、1億のデータセットからランダムに1000のデータセットを 抽出して、その1000のデータセットでトレーニングすることは、計算量的に合理的です。 だから、これらの巨大なモデルをトレーニングするのに必要なソフトウェアの開発などに投資する前に、 1000のデータセットでトレーニングしてみる事は、良いサニティチェックになります。

その際に、6週目で学んだように、学習曲線が m=1000 の時に高分散であることを確認する必要がある。高バイアスだと、いくらトレーニングセットを増やしてもモデルに改善は見られないが、高分散だとトレーニングセットを m=1000000 にした時に、改善されると予想ができるからです。興味がある人は、6週目の記事を読んでみてください。

Stochastic Gradient Descent

この節では、確率的最急降下法(Stochastic Gradient Descent)について説明します。大量のトレーニングセットがある時は、最急降下法は極めて計算的に高価なアルゴリズムです。何故なら、下記の数式で、m 個のトレーニングセットを全て足し合わせないといけいないからです。

この時にデータセット数 m の値が1億などの大きい数の場合、全データを1回の計算で行い非常に大きな負荷(メモリおよびCPU負荷)がかかります。この最急降下法をバッチ最急降下法とも呼びます。それに対して、確率的最急降下法は大量データ向けに改善されたアルゴリズムです。確率的最急降下法では1回では1データのみに対して計算を行います。具体的には以下のステップを踏みます。

1 データシャッフル
トレーニングデータセットをランダムにシャッフルします。

2 パラメータ最適化
は訓練データ数、jjはパラメータ数で、以下の式でパラメータ最適化計算をします。ポイントは1回の計算に1つのデータのみを使うことです。

バッチ最急降下法と比較して、収束の際に遠回りをします。これは1データしか使用しないため、間違った方向に進むこともあり得るためです。確率的最急降下法に興味がある人は下記の記事読んでみてください。

確率的最急降下法は、1データに対する学習を複数回(1から10回程度)行います。ただ、大量データを使った場合には1回でも十分。データ数に依存して1データに対する学習回数を決めます。

Mini-Batch Gradient Descent

この節では、ミニバッチ最急降下法(Mini-Batch Gradient Descent)について説明します。バッチ最急降下法と確率的最急降下法のハイブリットな方法で、ミニバッチ最急降下法があります。確率的最急降下法はデータ1件ごとにパラメータを更新していきましたが、ミニバッチ最急降下法はデータ b 件ごとに同じことを行います。b=m とすると、バッチ最急降下法となり、b=1 とすると確率的最急降下法となります。

ミニバッチ最急降下法が、確率的最急降下法より良いパフォーマンスを出すと期待出来るのは良いベクトル化実装がある時だけです。実装するプログラミング言語に、行列を扱うライブラリーやメソッドがない場合は、無理に使う必要がありません。そして、b の値を選んで、良いベクトル化した実装を使えば、確率的最急降下法やバッチ最急降下法よりも、ミニバッチ最急降下法はパフォーマンスが高くなる可能性があります。

Stochastic Gradient Descent Convergence

確率的最急降下法が正しく収束しているかを確認する方法について説明します。バッチ最急降下法では、コスト関数をプロットして、最急降下法が正しく収束しているか確認していました。確率的最急降下法でも同様に、コスト関数をプロットして確認します。前述した通り、確率的最急降下法のコスト関数は以下で計算します。

バッチ最急降下法では、コストをトレーニングデータ全体に対して計算していたのに比べて、確率的最急降下法はデータ1件に対して計算します。ただ、1件ごとにプロットするとノイズが激しいので、N(1000など)件ごとにコスト平均した値をグラフ上にプロットして確認します。

上記のグラフのように、正しく収束している場合は右肩下がりのグラフになります。線の乱高下が激しいと思ったら、N を大きくすると滑らかな線を得ることができます。また、右肩上がりのグラフになっていたら、発散をしているので、学習率 α を小さくする対応を取ります。

また、発展型として、α を徐々に小さくするという手法もあります。確率的最急降下法で確実にグローバル最小に収束してほしい場合に使われます。具体的には、下記のように定数1(constant1)と定数2(constant2)を使って、イテレーションごとに α を小さくしていくという方法です。

確率的最急降下法の特性上、トレーニングデータの最後の方で完全にコスト最小値で収束しにくいです。なので、学習率を低下させていくことで、最小値に収束しやすくしています。ただ、この方法はあまり一般的ではないです。その理由としては、これら二つの追加のパラメータ、constant1とconstant2を 調整するのに時間を食われるからです。なので、確率的最急降下法を適用する時には、α は定数のままにしておく方が普通です。

Advanced Topics

この章では、大量にデータがある場合の応用的な学習方法を説明します。

Online Learning

この節では、オンライン学習という機械学習方法を説明します。オンライン学習とは、連続的なストリームのデータが流入し続けていて、アルゴリズムにそのストリームのデータから学習さることです。例えば、EC サイトでのユーザの閲覧・購買などのデータがストリーミングしてくる系に関する学習です。このような場合は、常に新鮮なデータが来るのでオンラインで(リアルタイムに)学習させます。求める結果を y=1とし、特徴量 x とパラメータ θ を使って、下記の数式で y=1 となる確率を考えます。

オンライン学習時には、訓練データ x(train), y(train) は、 xi, yi ではなく、x, y で表します。これは、1回使った過去データは二度と学習に使わずに、常にストリーミングしてくるデータのみで学習し続けるからです。

アルゴリズムは、確率的最急降下法のアルゴリズムと良く似ています。唯一違う点は、固定したトレーニングセットを使う代わりに、ユーザー達から一つのリアルなデータセットだけを取り出し、学習することを繰り返します。オンライン学習の利点の一つには、変わっていくユーザーの嗜好をアルゴリズムに反映できる点です。 ユーザーのトラフィックも十分にあって、連続的なデータのストリームがある時は、オンライン学習は検討する余地があります。

Map Reduce and Data Parallelism

この節では、Map Reduce と並列化について説明します。Map Reduce とは、トレーニングセットを別々のサブセットに分割し、後に統合することです。並列化とは、その分割されたトレーニングセットを別々のマシーンで同時に処理を行うことです。

Map Reduce と並列化の両方合わせた処理を、分散処理と言います。下記の Hadoop は、分散処理の有名なオープンソースの一つです。

まだ、1台のマシーン内の複数のコアで並列化することもできます。複数コアに対する並列化のメリットは、複数のマシンに渡る並列化と比べて、 ネットワークのレイテンシを気にする必要が無くなることです。優れたライブラリでは、特にプログラム上で意識をせずにマルチコアを有効活用して計算してくれます。

11週目の記事もあるので良かったら読んでみてください。

--

--

Ats
Ats

Written by Ats

I like building something tangible like touch, gesture, and voice. Ruby on Rails / React Native / Yocto / Raspberry Pi / Interaction Design / CIID IDP alumni

No responses yet