Online Learning
オンライン学習では、データがストリーミングで届くたびに、1つのサンプルまたはミニバッチ単位でモデルを更新するため、再学習せずに学習を続け、概念ドリフトに対応できます。
オンライン学習とは、固定されたデータセットで一度だけ学習するのではなく、逐次到着するデータからモデルが学習し、各例または小さなバッチの後に更新する機械学習の方式です。各ステップでモデルは予測し、正解を受け取り、損失を測定して、次の例が到着する前にパラメーターを調整します。この方法は、クリック、取引、センサーの読み取り値などのストリームとして届くデータ、保存するには大きすぎるデータ、時間とともに変化する関係性に適しています。対照的なバッチ学習またはオフライン学習では、モデルはすべての学習データを一度に使って学習し、再学習するまで固定されます。
オンライン学習の仕組み#
Frank Rosenblattが1958年に開発したパーセプトロンはオンライン学習器で、誤分類のたびに重みを少しずつ更新しました。確率的勾配降下法(SGD)は、ほぼすべての微分可能なモデルに対し、例ごとまたはバッチごとに同様の更新を適用します。ストリーム向けに設計されたアルゴリズムもあります。Pedro DomingosとGeoff Hultenが2000年に発表したHoeffding木は、各例を一度だけ見るストリームから決定木を成長させます。また、Riverなどのライブラリは、一般的なモデルのストリーミング版を実装しています。scikit-learnでは、partial_fitメソッドを持つ推定器が逐次学習に対応します。
オンライン学習器は通常、統計学者Philip Dawidに由来する用語であるプレクエンシャル方式で評価されます。新しい例をまずモデルのテストに使い、その後で学習に使うため、逐次的なスコアはモデルがまだ見ていないデータで計算されます。理論上、オンライン学習器はリグレット、つまり累積損失と、後から選んだ最良の固定モデルの損失との差で評価されます。Martin Zinkevichは2003年、オンライン勾配降下法ではリグレットの増加がステップ数の平方根にとどまり、1ステップあたりの平均差がゼロに近づくことを示しました。
この例では、SGDで学習するロジスティック回帰に400個のミニバッチをストリーミング入力します。途中でラベルを割り当てるルールが変わり、その時点で固定したコピーを、学習を停止したモデルの代わりに使います。
import copy
import numpy as np
from sklearn.linear_model import SGDClassifier
rng = np.random.default_rng(0)
online = SGDClassifier(loss="log_loss", random_state=0)
scores = {"frozen": [], "online": []}
for step in range(400): # 400 mini-batches of 20 examples arrive one at a time
X = rng.normal(size=(20, 2))
w = [1.0, 1.0] if step < 200 else [1.0, -1.0] # the labeling rule changes at step 200
y = (X @ np.array(w) > 0).astype(int)
if step == 200:
frozen = copy.deepcopy(online) # a copy that stops learning when the rule changes
if step >= 200: # test on each new batch before learning from it
scores["frozen"].append(frozen.score(X, y))
scores["online"].append(online.score(X, y))
online.partial_fit(X, y, classes=[0, 1])
for name, acc in scores.items():
print(f"{name}: {np.mean(acc):.2f} accuracy after the change")ルール変更後、固定モデルのスコアは0.47で、推測と大差ありません。一方、オンラインモデルの平均スコアは0.98です。オンラインモデルは新しいルールでの最初のバッチでは0.35、2つ目では0.80を記録し、さらに数バッチ後には回復します。
コンセプトドリフトと忘却#
オンライン学習が必要とされる主な理由は、入力とラベルの関係が変化するコンセプトドリフトです。多くの場合、入力自体のデータドリフトも伴います。例のように急激に変化することもあれば、徐々に進行したり、季節や時刻に応じて繰り返したりすることもあります。Albert BifetとRicard Gavaldàが開発したADWINなどの検出器は、誤差のストリームを監視し、平均値が変化した際に通知します。これをきっかけに更新を速めたり、リセットしたりできます。
迅速な適応には代償があります。高い学習率はドリフトへの追従を速めますが、ノイズにも追従します。また、最近のデータだけを見るネットワークは、以前に学習した内容を上書きしてしまいます。これは破滅的忘却と呼ばれる問題です。各更新に過去の例を混ぜるリプレイバッファーが一般的な対策です。
実運用におけるオンライン学習#
ラベルが数秒以内に届く環境では、オンライン学習が一般的です。広告クリックの予測は典型的な例です。Googleは2013年、FTRL-Proximalアルゴリズムを用いて、クリック率モデルをストリーミングデータで継続的に学習する方法を説明しました。レコメンデーションシステムや不正検知のスコアリングも、同じように更新されることがよくあります。一方、導入済みのビジョンモデルは通常バッチ単位で更新されます。ラベルの到着が遅く、破損した更新が後続の予測すべてを劣化させる可能性があるためです。そのためチームは、モデルモニタリングと、最近のデータやリプレイデータを使った定期的なファインチューニングを、モデル保守ワークフローのように組み合わせます。
ビジョンシステム内部でも、小規模なオンライン更新が行われています。Ultralytics YOLO26のトラッキングモードでwith_reid: Trueを使って再識別を有効にすると、デフォルトのTrackTrackトラッカーは各トラックの外観埋め込みを保持し、マッチした検出ごとに移動平均として更新します。新しい埋め込みには検出信頼度の5%を重みとして与えます。そのため、ReIDネットワーク自体は固定されたまま、各トラックの外観情報は姿勢や照明の緩やかな変化に追従します。
継続学習はオンライン学習と重なりますが、新しいタスクが加わる中で以前のタスクを保持することに重点を置きます。一方、オンライン学習は更新頻度を表します。能動学習はラベル付けする例を選び、強化学習も相互作用のストリームから学習しますが、ラベル付きの例ではなく、自身の行動に対する報酬から学習します。










