TL;DR
データが流動的に流れてくる機械学習のことをオンライン機械学習と呼びます。
大量のデータが連続的に、高速に生成され、リアルタイムで処理する必要があるデータの流れをビッグデータストリームと呼びます。
下記の論文では、ビッグデータストリームにおけるオンライン機械学習の基礎、要件、分散アーキテクチャ、主要なアルゴリズムについて解説しています。
本ブログでは、その論文の内容を整理します。
論文:[1802.05872] Online Machine Learning in Big Data Streams
想定読者
- 機械学習に興味がある方
- オンライン機械学習の基礎を理解したい方
- いわゆるCrossValidationのようなバッチ学習とオンライン学習の違いを理解したい方
話すこと / 話さないこと
- 話すこと
- オンライン機械学習の基礎
- データストリーム処理の要件
- 分散アーキテクチャ
- オンライン学習の方法と評価
- 話さないこと
- 論文に記載されている各アルゴリズムの詳細な数学的背景
- 個々の学習方法の詳細(論文内では、SVMやBayesNetwork、強化学習、レコメンドンデーションなどが紹介されていますが、詳細は割愛します)
- 実際のオンライン機械学習システムの実装例
論文に書かれている内容
バッチ学習の問題点(一章より)
論文内では、従来のバッチ学習の問題点として以下の点が挙げられています:
- データ変化への対応の非効率性(一章より)
- マイニング可能な大規模データベースは、数ヶ月または数年かけて収集されていますが、基礎的な収集方法も時間とともに変化します。
- そのため、段階的にモデルを変更することは非効率なうえに、実行不可能になります。
ビッグデータストリームにおけるオンライン機械学習の要件(一章より)
論文では、ビッグデータストリームにおけるオンライン機械学習に必要な3つの要件を定義しています:
- オンライン学習:
- 過去のデータ全体にアクセスせずに、各データインスタンス後にモデルを更新する必要があります。
- これはデータストリーム計算モデルの制約に対応し、メモリにすべてのデータを保持できないためです。
- 適応的な学習:
- コンセプトドリフト(データ分布の変化)に対応するため、時間とともに進化するモデルが必要です。
- 従来のバッチ学習は静的なデータセットから静的なモデルを構築しますが、ストリーム学習では時間とともに変化するモデルが必要です。
- 分散ストリーム処理アーキテクチャ:
- 大量のデータを取り扱うために、クラスタ管理がしやすくかつ、耐障害性も備えるソフトウェアアーキテクチャが必要です。
データストリームの処理(二章より)
データは最大で一度しか到達せずに、到達したとしても処理をされるか、捨てられるかアーカイブされるかという制約があります。
これに対して、スライディングウィンドウによる適応的サンプリングや代表要素や要約要素の抽出などの手法が用いられます。
特に全ての入力を保存できないため、過去のデータに基づいて下された決定を元に戻すことはできません。
これについては同一分布の場合には理論的な保証を提供してくれます。
ただ、コンセプトドリフトが発生する場合には、過去のデータに基づいて下された決定を元に戻すことはできないため、適応的な手法が有効です。
分散データストリーム処理エンジン(二章一節より)
分散データストリーム処理エンジン(DPSE)として論文内では複数の内容が紹介されています。
- Apache Flink: Apache Flink® — Stateful Computations over Data Streams | Apache Flink
- Apache Spark: Structured Streaming Programming Guide - Spark 4.0.1 Documentation
- Apache SAMOA: SAMOA Incubation Status Page - Apache Incubator
- Apache Storm: Stream API Overview
- Apache Samza: Samza - Streams
- Apache Beam: Apache Beam Python Streaming Pipelines
- Esper: espertechinc/esper: Esper Complex Event Processing, Streaming SQL and Event Series Analysis
- Aurora: Aurora: a new model and architecture for data stream management | The VLDB Journal
機械学習ツールの分類(二章二節より)
データの性質と分散かどうかという観点から、機械学習ツールは以下の4つに分類されます。
| 静的データ | ストリームデータ | |
|---|---|---|
| 分散型 | Apache Mahout etc. | FlinkML etc. |
| 非分散型 | Scikit-learn etc. | MOA etc. |
論文内で紹介されていますが、何らかのWindowを持ってストリームデータを静的データのように取り扱い、
それを繰り返すことで、非分散型の静的データ向けの機械学習ツールをストリームデータに適用する方法もあります。
パラメータサーバ(二章三節より)
計算要素を2つのサブセットに分割します:
- サーバーノード: パラメータを分散して保存
- ワーカーノード: データ処理と計算を実行
これにより、パラメータの一貫性を保ちながら、分散環境での効率的な学習が可能になります。
具体的な分散方法についてはいまいち理解できませんでした。
属性(attribute)ごとにまとめるという文脈がありますが、実際そのようなことはないと思われます。
実際にオンライン機械学習を実装する場合は、どのようにパラメータサーバを設計するかは重要なポイントになると思われます。
というのも、分散学習は様々な方法があるためです。詳細は、大規模モデルを支える分散並列学習のしくみ Part1などを参照してください。
モデルの学習および評価(三章より)
オンライン学習では、prequential(逐次)評価が使用され、以下の手順で進行します:
- ラベルなしインスタンスに対して予測を行う
- 真のラベルが利用可能になり次第、予測誤差を評価
- 観測された誤差でモデルを更新
評価指標には、MSE、精度、誤差率などが使用されます。
論文中にも記載がありますが、prequential評価は問題もあります。
適宜、忘却アルゴリズムを利用することが記載されています。
感想
- prequential評価について、新しいデータに非常に敏感になってしまうと感じたため、どのように安定させるかが重要になると感じました。
- 上記の視点を考えると、どのような場合にオンライン学習をするべきで、どのような場合に従来のバッチ学習の定期実行をするべきかの判断は非常に難しいなと感じました。
- 課題の設計方法とデータの特性、モデルの性質のすべてを考慮しないと、適当なアーキテクチャの選択ができないように思えました。
- また学習率については適当に設定する必要があると感じ、こちらも非常に難しいと感じました。