Time-MoE — 24億パラメータのMoE時系列基盤モデル【ICLR 2025】

大規模言語モデル(LLM)の世界では「モデルを大きくすれば性能が上がる」というスケーリング則が確立されています。GPT-3(175B)→ GPT-4(推定1.8T)→ と、パラメータ数の増加とともに性能が予測可能な形で向上してきました。では、時系列にも同じスケーリング則が成り立つのでしょうか?

この問いに初めて体系的に答えたのが、Time-MoE(Shi et al., ICLR 2025)です。24億パラメータ、3000億データ点(Time-300Bと名付けられた、9ドメインにまたがる時系列コーパス)という前例のない規模で時系列基盤モデルを事前学習し、「パラメータ数を増やせば時系列の予測性能は予測可能な形で向上する」ことを実証しました。疎なMixture-of-Experts(疎なMoE)を時系列基盤モデルに持ち込み、10億超パラメータ級までスケールさせた初の研究でもあります。

Time-MoEと既存の時系列基盤モデルのゼロショット性能比較(左)と、Denseモデルに対する疎なMoEの効率優位(右)

出典: Shi et al., Time-MoE, ICLR 2025, Fig.1

この図がTime-MoEの主張を1枚で語っています。左は横軸が「活性化パラメータ数」、縦軸が6ベンチマーク平均のゼロショットMSE(小さいほど良い)。Time-MoE(base/large/ultra)が右下がりの直線上で、Moirai・Chronosなど既存モデルを下回る誤差を達成しています。右は横軸が1トークン予測あたりのGFLOPs。同じ計算予算(同じFLOPs)で比べると、疎なMoE版(青)が同規模のDense版(赤)を一貫して下回ります。「容量を増やしても計算予算を増やさずに性能が上がる」——これが疎なMoEを時系列に持ち込む動機です。

しかし、24億パラメータのモデルを推論時にすべて使うのでは計算コストが膨大になります。ここでMoE(Mixture of Experts)が威力を発揮します。最大のモデル(Time-MoE$_{\text{ultra}}$)は全24億パラメータのうち、各入力に対して実際に活性化されるのは約11億パラメータ(同じ計算予算のDense版に相当)だけです。全パラメータの知識を持ちながら、推論時にはDenseモデルよりFLOPs効率よく動作する — これがMoEの本質的な利点で、論文では訓練コスト平均78%減・推論コスト39%減と報告されています。

Time-MoEを理解することは、以下のような場面で直接役立ちます。

  • 多数の系列の汎用予測: 大量の産業センサ系列や需要データに対して、ドメイン固有のファインチューニングなしでゼロショット予測・埋め込みが可能になります
  • 推論効率の最適化: MoEアーキテクチャにより、エッジデバイスや帯域幅が限られた環境でも大規模モデルの恩恵を受けられます

本記事の内容

  • MoEの基礎復習(ゲーティング、スパース活性化、負荷分散)
  • 時系列におけるMoEの意義
  • Time-MoEのアーキテクチャ(点単位トークン化、共有エキスパート付き疎なMoE、マルチ解像度予測ヘッド)
  • 損失関数(Huber損失 + 負荷分散補助損失)とTime-300Bデータ
  • 時系列のスケーリング則とスパース化解析
  • Pythonによる簡易MoE時系列モデルの実装

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

画像なし
Mixture of Experts(MoE)の理論と実装
MoEの基本概念とルーティング機構を解説しています
時系列基盤モデルの全体像
主要な時系列基盤モデルの比較を解説しています

MoEの基礎復習

ゲーティングとスパース活性化

MoE(Mixture of Experts)は、複数のエキスパート(専門家ネットワーク)を持ち、入力に応じて一部のエキスパートだけを活性化するアーキテクチャです。Transformerの文脈では、FFN(Feed-Forward Network)層をMoE層に置き換えます。

MoEの概念図:入力トークンをゲートが受け取り、複数のエキスパートのうち一部(Top-2)だけを起動して重み付き和を出力する

図のイメージを持っておきましょう。入力トークンが来ると、ゲートが「どのエキスパートに任せるか」を決め、選ばれた一部のエキスパート(緑)だけが計算します。残り(灰)は今回は動きません。全エキスパートの容量を抱えつつ、1回の計算では一部しか使わない——この「容量と計算の分離」がMoEの肝です。

$E$ 個のエキスパート $\{f_1, f_2, \ldots, f_E\}$ とゲーティングネットワーク $G$ を持つMoE層は、入力トークン $\bm{x}$ に対して以下のように動作します。

まず、ゲーティングネットワークがルーティング確率を計算します。

$$ \bm{g} = \text{softmax}(\bm{x} \bm{W}_g) \in \mathbb{R}^E $$

ここで $\bm{W}_g \in \mathbb{R}^{d \times E}$ はゲーティングの重み行列です。$g_i$ はエキスパート $i$ が選択される確率を表します。

Top-K routing では、$\bm{g}$ の上位 $K$ 個のエキスパートのみを活性化します。

$$ \text{TopK}(\bm{g}) = \{i : g_i \text{ is in the top-}K \text{ of } \bm{g}\} $$

出力は活性化されたエキスパートの重み付き和です。

$$ \bm{y} = \sum_{i \in \text{TopK}(\bm{g})} \tilde{g}_i \cdot f_i(\bm{x}) $$

ここで $\tilde{g}_i$ は選択されたエキスパートの中で再正規化されたゲート値です。

$$ \tilde{g}_i = \frac{g_i}{\sum_{j \in \text{TopK}(\bm{g})} g_j} $$

$E = 8$, $K = 2$ の場合、8個のエキスパートのうち2個だけが各トークンに対して活性化されます。パラメータ数は8倍ですが、計算量は2倍にしかなりません。

Top-Kルーティングの流れ:softmaxで各エキスパートの確率を出し、上位2個だけ再正規化して重み付き和を取る

左の図がゲートのsoftmax確率で、上位2個(赤)が選ばれます。右はその2個だけを抜き出して再正規化したゲート値。出力はこの2個のエキスパートの重み付き和です。確率の高い「得意そうなエキスパート」に処理を振り分けている、と読めます。

負荷分散損失

Top-K routing にはルーティング崩壊の問題があります。学習初期に偶然よく選ばれたエキスパートがさらに多く選ばれるフィードバックループが発生し、一部のエキスパートに負荷が集中します。

これを防ぐための負荷分散損失は以下で定義されます。

$$ \mathcal{L}_{\text{balance}} = E \cdot \sum_{i=1}^E f_i \cdot p_i $$

ここで $f_i$ はエキスパート $i$ に割り当てられたトークンの割合、$p_i$ はエキスパート $i$ のゲート値の平均です。全エキスパートが均等に使われると $\mathcal{L}_{\text{balance}}$ が最小になります。

MoEの基礎を確認したところで、次に「なぜ時系列にMoEが適しているのか」を見ていきます。

時系列におけるMoEの意義

異なるパターンに異なるエキスパート

時系列データには質的に異なるパターンが混在しています。工場設備やプラントのセンサを例にすると、

  • 定常パターン: 稼働が安定している区間(定常運転状態)
  • 周期パターン: 日次・シフトの周期に伴う負荷の周期的変動
  • 過渡パターン: 起動・停止時の急激な変化
  • 異常パターン: 機器故障による非周期的な変動

Dense model(全パラメータ常時活性化)では、これらすべてのパターンを1つのFFNで処理する必要があり、パラメータ干渉が発生します。MoEでは、定常パターン専門のエキスパート、周期パターン専門のエキスパート、異常パターン専門のエキスパートが自然に分化し、各パターンに特化した処理が可能です。

時系列の4パターン(定常・周期・トレンド・異常)に異なるエキスパートが分化して対応する概念図

イメージはこの図の通りです。定常・周期・トレンド・異常という質の違うパターンを、別々のエキスパートが分担する。1つのFFNですべてを抱えると互いに干渉しますが、分業すれば各エキスパートは自分の得意パターンに集中できます。後ほど、この「自動的な分業」が実際に起きることをコードで確認します。

効率的なスケーリング

LLMの世界では、パラメータ数を増やすにはGPUメモリと計算量の両方が増加します。例えば7Bのモデルを14Bにすると、計算量も約2倍になります。

MoEでは、パラメータ数を増やしてもアクティブパラメータ数(各入力に実際に使われるパラメータ数)は一定に保てます。エキスパート数を8から16に増やせば全パラメータは2倍ですが、Top-2 routingなら計算量は変わりません。つまり、計算予算を増やさずに「知識の容量」だけを増やせるのがMoEの最大の利点です。

DenseとMoEの比較:MoEは全パラメータ(容量)を8倍に増やせる一方、アクティブパラメータ(推論コスト)は2倍に留まる

この図がMoEの旨味を端的に表しています。Dense(全パラメータを常に使う)と比べ、MoEは知識の容量を8倍に増やしても、1回の推論で動くのは2個分だけ。容量と計算コストを切り離せるからこそ、24億パラメータという規模が現実的な推論コストで成立します。

Time-MoEでは、この特性を活かして24億パラメータまでスケールしつつ、推論時の計算量を抑えています。

Time-MoEのアーキテクチャ

Time-MoEは「3つの構成要素」を縦に積んだ、Decoder-only Transformerです。論文Figure 2が全体像を1枚にまとめているので、まずこれを俯瞰してから各要素を式で追いかけます。

Time-MoEのアーキテクチャ全体図。点単位トークン化(①)→因果自己注意+RMSNorm→疎なMoE層(③)をN段積み、訓練ではマルチ解像度ヘッドを多タスク最適化(④)、推論ではヘッドを動的スケジューリング(⑤)

出典: Shi et al., Time-MoE, ICLR 2025, Fig.2

図の番号に沿って読むと、データフローは次の通りです。① 任意長の入力系列 $X_{1:T}$ を点単位(point-wise)でトークン化し、② 埋め込みに変換します。③ その列を「因果自己注意 + 疎なMoE層」のブロックで $N$ 段処理し、④ 訓練時は複数の解像度の予測ヘッド(FM Head)を同時に最適化、⑤ 推論時はそれらのヘッドを動的にスケジューリングして任意の予測長を出します。この記事では①②③④を順に式で具体化します。

構成要素1:点単位トークン化(SwiGLU埋め込み)

ここがTime-MoEの設計上の重要な選択で、PatchTSTなど多くの時系列Transformerが採る「パッチ化(複数点をまとめて1トークン)」ではなく、各時刻の1点を1トークンにする点単位トークン化を採用しています。情報を切り捨てずに保持し、可変長系列を素直に扱えるのが狙いです。各点 $x_t \in \mathbb{R}$ は、SwiGLU(Swish-Gated Linear Unit)で $D$ 次元の埋め込みに持ち上げられます。

$$ \bm{h}_t^{0} = \text{SwiGLU}(x_t) = \text{Swish}(\bm{W}x_t) \otimes (\bm{V}x_t) $$

ここで $\bm{W}, \bm{V} \in \mathbb{R}^{D \times 1}$ は学習パラメータ、$\otimes$ は要素積です。Swishゲート $\text{Swish}(\bm{W}x_t)$ がもう一方の線形枝 $\bm{V}x_t$ を絞ることで、1次元のスカラ入力から非線形に富んだ埋め込みを作ります。多変量系列は channel independence(各チャネルを独立した1変量系列として扱う)で1変量列に展開され、これによりTime-MoEは任意の変量数を扱えます。

構成要素2:MoE Transformerブロック

バックボーンはLLM由来の現代的なdecoder-onlyブロックで、RMSNormで各サブ層の入力を正規化し、絶対位置埋め込みの代わりに回転位置埋め込み(RoPE)を使って系列長の外挿性を高めています(バイアスは自己注意のQKV層を除き除去)。第 $l$ 層は次の3式で表されます。

$$ \bm{u}_t^{l} = \text{SA}\bigl(\text{RMSNorm}(\bm{h}_t^{l-1})\bigr) + \bm{h}_t^{l-1} $$

$$ \bar{\bm{u}}_t^{l} = \text{RMSNorm}(\bm{u}_t^{l}) $$

$$ \bm{h}_t^{l} = \text{Mixture}(\bar{\bm{u}}_t^{l}) + \bm{u}_t^{l} $$

$\text{SA}$ は因果マスク付き自己注意(位置 $t$ のトークンは $\le t$ のトークンのみ参照→自己回帰生成が可能)、$\text{Mixture}$ がFFNを置き換える疎なMoE層です。注目すべきは、置き換わるのはFFN層だけで、注意層はDenseのまま、という点です。

構成要素3:共有エキスパート付き疎なMoE層

ここがTime-MoEの心臓部です。通常の1個のFFNを、$N$ 個の疎活性エキスパート + 1個の「共有エキスパート」に置き換えます。共有エキスパートは常に活性化され、ドメインをまたぐ共通知識を担います。一方、$N$ 個の非共有エキスパートからはルータがTop-$K$ だけを選びます。

$$ \text{Mixture}(\bar{\bm{u}}_t^{l}) = g_{N+1,t}\,\text{FFN}_{N+1}(\bar{\bm{u}}_t^{l}) + \sum_{i=1}^{N} g_{i,t}\,\text{FFN}_i(\bar{\bm{u}}_t^{l}) $$

第1項が共有エキスパート(添字 $N+1$)、第2項が疎活性エキスパート群です。各ゲート値は次のように決まります。まず非共有エキスパートのルータスコアをsoftmaxで求め、

$$ s_{i,t} = \text{Softmax}_i\bigl(\bm{W}_i^{l}\bar{\bm{u}}_t^{l}\bigr) $$

上位 $K$ 個だけを残して他を0にゲートします(これがスパース性を生む)。

$$ g_{i,t} = \begin{cases} s_{i,t}, & s_{i,t} \in \text{Top}_K(\{s_{j,t}\}, K) \\ 0, & \text{それ以外} \end{cases} $$

共有エキスパートのゲートだけは独立にSigmoidで開閉します。

$$ g_{N+1,t} = \text{Sigmoid}\bigl(\bm{W}_{N+1}^{l}\bar{\bm{u}}_t^{l}\bigr) $$

$\bm{W}_i^{l} \in \mathbb{R}^{1 \times D}$ はルータの学習パラメータです。「共有エキスパートで共通知識・疎活性エキスパートで個別知識」という分業が、この層の設計思想です。

モデル構成(base / large / ultra)

Time-MoEは3サイズで提供されます。具体値は論文Table 2の通りです。

Time-MoEの3モデル構成。base=12層50M活性化、large=12層200M活性化、ultra=36層16ヘッドd_model1024で活性化1.1B・総2.4B

出典: Shi et al., Time-MoE, ICLR 2025, Table 2

表を読むと、全サイズでエキスパート数 $N=8$・Top-$K=2$ は共通で、層数・次元だけを増やしてスケールしていることがわかります。最大の Time-MoE$_{\text{ultra}}$ は36層・16ヘッド・$d_{\text{model}}=1024$・$d_{\text{ff}}=4096$ で、総パラメータ24億・活性化11億。総パラメータと活性化パラメータの「ギャップ」(2.4B対1.1B、453M対200M、113M対50M)が、まさにMoEが容量と計算を切り離している証拠です。なお論文では、$\text{ultra}$ が8GB未満のVRAMを持つ一般向けGPUで推論できると述べられています。

構成要素4:マルチ解像度予測ヘッド

通常の基盤モデルは固定の1スケールしか予測できませんが、Time-MoEは複数の予測長を同時に扱うマルチ解像度ヘッドを導入しました。各ヘッドは1層FFNの出力射影で、それぞれ異なる予測ホライズン(論文の既定は $\{1, 8, 32, 64\}$)を担当します。訓練時は全ヘッドの誤差を合算した複合損失で同時に最適化し、推論時は貪欲スケジューリングでこれらのヘッドを組み合わせて任意長の予測を生成します。これにより、固定ホライズンのタスク特化モデルと違い、文脈長 $T$ も予測長 $H$ も推論時に柔軟に選べます。

アーキテクチャの全体像を理解したところで、次に「このモデルをどう訓練するか」——損失関数と事前学習データ、そして時系列のスケーリング則を見ていきます。

損失関数・事前学習データとスケーリング則

損失関数:Huber損失 + 負荷分散補助損失

Time-MoEの最終損失は2つの項からなります。1つは予測誤差、もう1つはエキスパートの偏りを防ぐ補助損失です。

まず予測誤差には、外れ値に頑健なHuber損失を使います(大規模・長時間の事前学習では外れ点が訓練を不安定にするため)。誤差が小さい領域は二乗誤差、大きい領域は絶対誤差に切り替わります。

$$ \mathcal{L}_{\text{ar}}(x_t, \hat{x}_t) = \begin{cases} \frac{1}{2}(x_t – \hat{x}_t)^2, & |x_t – \hat{x}_t| \le \delta \\ \delta\left(|x_t – \hat{x}_t| – \frac{1}{2}\delta\right), & \text{それ以外} \end{cases} $$

次に、MoEを純粋に予測誤差だけで最適化するとルーティング崩壊(一部のエキスパートばかりが選ばれ、残りが訓練されない)が起きます。これを防ぐ負荷分散の補助損失は次の形です。

$$ \mathcal{L}_{\text{aux}} = N\sum_{i=1}^{N} f_i r_i, \quad f_i = \frac{1}{KT}\sum_{t=1}^{T}\mathbb{I}(\text{時点}\,t\,\text{がエキスパート}\,i\,\text{を選ぶ}), \quad r_i = \frac{1}{T}\sum_{t=1}^{T} s_{i,t} $$

$f_i$ はエキスパート $i$ に割り当てられたトークン割合、$r_i$ はルータ確率の平均です。両者の積和が小さいほど負荷が均等で、$\mathcal{L}_{\text{aux}}$ が最小になります(前半「負荷分散損失」で出てきた $E\sum f_i p_i$ の具体形)。最終損失は、マルチ解像度の各ホライズン $p_j$ にわたる自己回帰損失の平均に、この補助損失を係数 $\alpha$ で足したものです。

$$ \mathcal{L} = \frac{1}{P}\sum_{j=1}^{P}\mathcal{L}_{\text{ar}}\bigl(X_{t+1:t+p_j}, \hat{X}_{t+1:t+p_j}\bigr) + \alpha\,\mathcal{L}_{\text{aux}} $$

論文では予測ホライズンを $\{1, 8, 32, 64\}$、補助損失係数を $\alpha = 0.02$、最大系列長を4096、バッチサイズ1024で10万ステップ訓練しています。アブレーションでは、Huber損失をMSEに変えると性能が落ち、補助損失を外すとエキスパート層が事実上1つの小さなFFNに崩壊して性能が悪化することが確認されています(補助損失の効きを直接示す結果です)。

Time-300B:3000億データ点のデータ構成

Time-MoEの事前学習には、新規に構築されたTime-300B(約3091億データ点、約4822万系列)が使われました。これは時系列基盤モデルとして当時最大級のオープンアクセス・コーパスで、9つのドメインにまたがります(論文Table 1の内訳)。

ドメイン 観測点数 割合
Nature(気象・自然) 279.7 B 90.5 %
Energy(エネルギー) 15.98 B 5.17 %
Synthetic(合成データ) 9.22 B 2.98 %
Transport(交通) 2.13 B 0.69 %
Web 1.80 B 0.58 %
Sales / Healthcare / Finance / Other 残り < 0.1 %

観測点の9割が自然・気象系で、合成データも多様性確保のために加えられています。秒単位から年単位までのサンプリング周波数をカバーし、欠損値・無効値を除くデータクリーニングパイプラインを経て構築されています。ドメイン間のスケールの違いは、各系列のインスタンス正規化(平均0・分散1への標準化)で吸収されます。

$$ \bar{x}_t = \frac{x_t – \mu}{\sigma + \epsilon}, \quad \mu = \frac{1}{L}\sum_{t=1}^L x_t, \quad \sigma = \sqrt{\frac{1}{L}\sum_{t=1}^L (x_t – \mu)^2} $$

時系列のスケーリング則

Time-MoEの最も重要な貢献は、時系列においてもスケーリング則が成り立つことを実証したことです。

LLMにおけるスケーリング則(Kaplan et al., 2020)は以下の形式です。

$$ L(N) = \left(\frac{N_c}{N}\right)^\alpha $$

ここで $L$ は損失、$N$ はパラメータ数、$N_c$ と $\alpha$ は定数です。対数スケールでは直線関係になります。

Time-MoEは、50M, 100M, 200M, 500M, 1B, 2.4Bの6つのモデルサイズで実験を行い、時系列予測損失がパラメータ数の冪乗則に従って減少することを確認しました。対数スケールでのプロットがほぼ完全な直線を描きます。

この結果が意味するのは、「さらにモデルを大きくすれば、予測精度がどれだけ向上するか」が事前に予測可能だということです。10Bや100Bの時系列モデルの性能を、現在のデータから外挿できます。

また、データ量に関するスケーリング則も確認されています。

$$ L(D) = \left(\frac{D_c}{D}\right)^\beta $$

$D$ はデータ量(データ点数)で、こちらも冪乗則に従います。

これは時系列研究にとって非常に重要な発見です。これまで「時系列はNLPや画像と違って、スケーリングの恩恵が少ない」と考えられていましたが、Time-MoEはこの通説を覆しました。

時系列のスケーリング則の概念図:パラメータ数(50M〜2.4B)とデータ点数(最大3000億)の両方で予測損失が冪乗則に従って減少する

左がパラメータのスケーリング則、右がデータのスケーリング則です。どちらも対数軸で右下がりの直線=冪乗則。「モデルを大きくするほど」「データを増やすほど」予測損失が予測可能な形で下がる、という関係です。Time-MoEは50M〜2.4Bのサイズと3000億点でこれを実証しました。

論文では、この主張を実測のスケーラビリティ解析で裏付けています。

Time-MoEのスケーラビリティ解析。左:DenseとSparseの訓練・推論コスト比較(Sparseは訓練コスト約78%減)。右:訓練データ量100B→400Bと共に各モデルのMSEが単調に低下

出典: Shi et al., Time-MoE, ICLR 2025, Fig.3

左の図は、MoE層を同じ活性化パラメータ数のDense層に置き換えたときとのコスト比較です。Sparse(青)はDense(赤)に対し訓練コストを大幅に削減しつつ(棒の高さ=TFLOPs)、推論コスト(星=s/iter)も下げています。右の図は、訓練データを100B→200B→300B→400Bと増やすと、全モデルでMSEが単調に下がる様子。「モデルもデータも大きくするほど良くなる」というスケーリング則が、合成でなく実データで成立していることを示す中心的な証拠です。

スケーリング則の意味を理解したところで、実際に学習する簡易MoE時系列モデルをPyTorchで実装し、ルーティングの挙動とスケーリング則を自分の手で確かめてみましょう。

Pythonによる簡易MoE時系列モデルの実装

まず、4種類のパターン(定常・周期・トレンド・異常)が混在する合成時系列を作り、パッチに切って「次パッチ予測」タスクにします(本物のTime-MoEは点単位トークン化ですが、ここではMoEのルーティング挙動を見やすくするため、固定長の窓=パッチを1トークンとして扱う簡易設定にしています)。

import numpy as np
import torch
import torch.nn as nn

np.random.seed(42)
torch.manual_seed(0)

# --- 複数パターンが混在する合成時系列 ---
def generate_mixed_series(length=4000):
    t = np.arange(length, dtype=float)
    series = np.zeros(length); labels = np.zeros(length, dtype=int)
    for i in range(0, length, 200):
        seg = np.random.choice([0, 1, 2, 3]); end = min(i + 200, length)
        st = t[i:end] - t[i]
        if seg == 0:                                    # 定常
            series[i:end] = 0.5 + np.random.randn(end-i) * 0.1
        elif seg == 1:                                  # 周期
            series[i:end] = np.sin(2*np.pi*st/50) + np.random.randn(end-i) * 0.1
        elif seg == 2:                                  # トレンド
            series[i:end] = np.linspace(-1, 1, end-i) + np.random.randn(end-i) * 0.1
        else:                                           # 異常パルス
            series[i:end] = np.random.randn(end-i) * 0.1
            for _ in range(3):
                p = np.random.randint(0, end-i-5)
                series[i+p:i+p+5] += np.random.choice([-3, 3])
        labels[i:end] = seg
    return series, labels

series, labels = generate_mixed_series()

# --- パッチ化(各パッチの主パターンをラベルにする)---
P, stride = 32, 16
patches, plabels = [], []
for i in range(0, len(series) - P, stride):
    patches.append(series[i:i+P])
    plabels.append(np.bincount(labels[i:i+P]).argmax())
patches = np.array(patches, np.float32); plabels = np.array(plabels)
Xin = torch.tensor(patches[:-1]); Xtgt = torch.tensor(patches[1:]); lab_in = plabels[:-1]

次に、実際に学習するMoEを定義します。ポイントは Top-2 routing を微分可能な形で書き、Adamで重みを更新することです(ゲートも含めて学習されます)。

class MoE(nn.Module):
    def __init__(self, P=32, H=32, E=4, K=2):
        super().__init__(); self.K = K
        self.gate = nn.Linear(P, E)                         # ゲーティング
        self.experts = nn.ModuleList([
            nn.Sequential(nn.Linear(P, H), nn.ReLU(), nn.Linear(H, P))
            for _ in range(E)])                             # E個の独立FFN
    def forward(self, x):
        g = torch.softmax(self.gate(x), -1)                 # 各エキスパートの確率
        tv, ti = g.topk(self.K, -1)                         # 上位K個を選ぶ
        w = tv / tv.sum(-1, keepdim=True)                   # 選ばれた中で再正規化
        eo = torch.stack([e(x) for e in self.experts], 1)   # (B, E, P)
        sel = eo[torch.arange(x.shape[0])[:, None], ti]     # 選ばれたK個 (B, K, P)
        return (w.unsqueeze(-1) * sel).sum(1), g, ti        # 重み付き和

def train(H, epochs):
    torch.manual_seed(0); m = MoE(32, H, 4, 2)
    opt = torch.optim.Adam(m.parameters(), 1e-3)
    for _ in range(epochs):
        perm = torch.randperm(len(Xin))
        for i in range(0, len(Xin), 64):
            idx = perm[i:i+64]; opt.zero_grad()
            out, g, ti = m(Xin[idx]); loss = ((out - Xtgt[idx]) ** 2).mean()
            loss.backward(); opt.step()                     # ← ここで実際に学習する
    with torch.no_grad():
        out, g, ti = m(Xin); final = ((out - Xtgt) ** 2).mean().item()
    return m, ti.numpy(), final

学習後に、パターンごとにどのエキスパートが選ばれたかを集計します。

# --- ルーティング分析 ---
_, routing, _ = train(H=32, epochs=80)
mat = np.zeros((4, 4))                       # [パターン, エキスパート]
for label, experts in zip(lab_in, routing):
    for e in experts:
        mat[label, e] += 1
norm = mat / (mat.sum(1, keepdims=True) + 1e-8)
print(np.round(norm, 2))
# 定常→エキスパート1,3 / 周期→エキスパート4 に集まる

パターン別ルーティングのヒートマップ(実測):定常はエキスパート1・3に、周期はエキスパート4に集中する

本物のTime-MoEでも、同様の専門化が観察されています。論文Figure 4は、6つのベンチマークそれぞれについて、層ごと・エキスパートごとのゲーティングスコアをヒートマップにしたものです。

6ベンチマークにおける層別エキスパートのゲーティングスコア。データセットごとに活性化されるエキスパートの分布が異なる

出典: Shi et al., Time-MoE, ICLR 2025, Fig.4

横軸がエキスパート(0〜7)、縦軸が層です。データセット(ETTh1、Weather、Global Tempなど)ごとに、濃く(高スコアで)活性化されるエキスパートの位置が違うことが読み取れます。つまり入力の特性に応じて異なるエキスパートが起動し、各エキスパートが別々の知識を担っている——これが疎なMoEがドメインをまたいで汎化できる理由です。下の自作実験は、この現象を小さなスケールで追体験するものです。

学習後のルーティングを集計すると、パターンに応じた専門化が確認できます。定常パターンは主にエキスパート1と3(各0.47, 0.49)に、周期パターンはエキスパート4(0.38)に集まりました。トレンドと異常はより複数のエキスパートに分散していますが、これは合成データ上でパターンの分離が緩いためで、エキスパートが入力に応じて役割を分け始めていることは読み取れます。

エキスパートの負荷分布(実測):4つのエキスパートに比較的均等に処理が割り振られている

各エキスパートの総使用回数を見ると、極端な偏り(一部だけが使われ続けるルーティング崩壊)は起きておらず、4つのエキスパートに処理がそれなりに分散しています。実運用ではここに負荷分散損失を加えて、より均等な利用を促します。

スケーリング則のシミュレーション

最後に、エキスパート内の隠れ層次元 $H$ を変えてモデルサイズを段階的に大きくし、学習後の予測損失がどう変化するかを測ります。

# --- スケーリング則 ---
sizes = [4, 8, 16, 32, 64]                           # 隠れ層次元
losses = [train(H, epochs=60)[2] for H in sizes]     # 各サイズで学習し最終損失を記録
params = [4 * (32*h + h*32) + 32*4 for h in sizes]   # パラメータ数の概算

coeffs = np.polyfit(np.log(params), np.log(losses), 1)
print(f"スケーリング指数 α = {coeffs[0]:.4f}")           # -> -0.2928
print(f"パラメータ数が2倍になると損失は {2**coeffs[0]:.4f} 倍")  # -> 0.8163 倍

スケーリング則のシミュレーション(実測):対数軸でパラメータ数と予測損失がほぼ直線に乗り、冪乗則 α=-0.293 で減少する

実測の損失は 0.224 → 0.191 → 0.151 → 0.128 → 0.103 と、モデルを大きくするほど一貫して減少しました。対数軸でプロットするとほぼ完全な直線に乗り、冪乗則 $L \propto N^{-0.293}$ にフィットします(赤破線)。スケーリング指数 $\alpha = -0.293$ は負の値で、「パラメータ数を2倍にすると損失が約0.82倍に減る」ことを意味します。これはTime-MoE論文が大規模で報告したスケーリング則と定性的に一致します。もちろんこれは簡易モデルでの模擬で、実際のTime-MoEは桁違いの規模でより滑らかな曲線を描きますが、「大きくするほど予測可能に良くなる」という本質はこの小さな実験でも再現できます。

まとめ

本記事では、Time-MoE(ICLR 2025 Spotlight)が提案する大規模MoE時系列基盤モデルについて解説しました。

  • MoEによる効率的スケーリング: 最大モデルは24億パラメータのうち各トークンで活性化されるのは約11億。同じ計算予算のDense版と比べ訓練コスト平均78%減・推論コスト39%減で、6ベンチ平均のゼロショットMSEを上回る。N=8エキスパート・Top-2で全サイズ共通
  • 共有 + 疎活性のハイブリッドMoE: 常時起動の共有エキスパート(共通知識)と、ルータがTop-Kで選ぶ疎活性エキスパート(個別知識)を組み合わせる設計
  • 点単位トークン化とマルチ解像度ヘッド: パッチ化せず1点1トークンで情報を保持し、$\{1,8,32,64\}$ の複数ホライズンを同時学習して柔軟な予測長に対応
  • 時系列のスケーリング則: パラメータ数・データ量と予測損失が冪乗則に従うことを初めて実証。Huber損失と負荷分散補助損失(崩壊を防ぐ要)で安定訓練
  • パターンごとのエキスパート特化: 定常・周期・異常など異なる時系列パターン、異なるドメインに異なるエキスパートが自動的に特化する
  • Time-300Bの事前学習: 9ドメイン・3000億データ点でゼロショット汎化能力を獲得

次のステップとして、以下の記事も参考にしてください。

Sundial — 1兆データ点で事前学習した最新最大の時系列基盤モデル
Flow Matchingベースの確率的時系列モデルを解説しています
画像なし
PatchTST — パッチ化とチャネル独立設計で時系列Transformerを革新する
Time-MoEが採らなかったパッチ化と、共通して採用するチャネル独立設計を解説しています