DUICUO

オープンソース ツールを使用して合成時系列データを生成します。

翻訳者 | ブガッティ

校正:孫淑娟

導入

時系列データは、複数の時点にわたって同一の変数を測定するもので、現代のデータ環境では広く利用されています。表形式データと同様に、機密情報を保護したり、実世界のデータが不足している状況でトレーニングデータをさらに作成したりするために、合成時系列データを生成したいというニーズは少なくありません。合成時系列データの用途としては、センサーデータ、タイムスタンプ付きログメッセージ、金融市場価格、医療記録などが挙げられます。時間という新たな次元(時点間の傾向や相関関係は、変数間の相関関係と同様に重要です)が、合成データにとってさらなる課題をもたらします。

Gretelでは以前、合成時系列データに関するブログ記事を公開しましたが、合成データ生成を改善するための新しいモデルを模索していました。DoppelGANgerモデルと、Linらによる関連論文「GANによるネットワーク時系列データの共有:課題、展望、そして成果」は非常に高く評価しており、このモデルをGretelのAPIとコンソールに統合しています。この取り組みの一環として、DoppelGANgerモデルをPyTorchで再実装し、オープンソースライブラリ「gretel-synthetics」の一部としてリリースできることを嬉しく思います。

この記事では、DoppelGANger モデルの概要を示し、PyTorch 実装の使用例を示し、毎日の Wikipedia Web トラフィックを合成するタスクにおける優れた合成データ品質を示します。実行時速度は TensorFlow1 実装と比較して約 40 倍向上しています。

ドッピガンガーモデル

DoppelGANgerは、敵対的生成ネットワーク(GAN)をベースとし、時系列生成タスクにより適したように改良されています。GANとして、このモデルは敵対的学習スキームを採用し、合成データと実データを比較することで、識別器ネットワークと生成器ネットワークを同時に最適化します。学習が完了すると、入力ノイズを生成器ネットワークに入力することで、任意の数の合成時系列データを作成できます。

Linらは論文の中で、既存の合成時系列手法と自身の観察結果に基づいて限界を特定し、いくつかの具体的な改良点を提案しました。これらの改良点には、GAN全般の改良点と時系列に特化した手法が含まれています。主な改良点は以下の通りです。

  • ジェネレーターにはシーケンス データを生成するための LSTM が含まれていますが、時間的な相関関係を改善するために各 LSTM ユニットが複数の時点を出力するバッチ設定になっています。
  • 可変長シーケンスは、学習と生成の両方でサポートされています(PyTorchリリースでは計画されていますが、まだ実装されていません)。例えば、モデルは10秒または15秒のセンサー測定値を使用して生成することができます。
  • 時間の経過とともに変化しない固定変数(属性)をサポートします。この情報は、過去の金融価格データにおける各銘柄に関連付けられた業種やセクターなど、時系列データと併せて表示されることがよくあります。
  • 連続変数のスケーリングをサポートしており、例を挙げて、大きなダイナミックレンジを持つデータを扱うことができます。例えば、人気のあるWikipediaのページと、そうでないWikipediaのページでは、ページビュー数が桁違いに異なることがあります。
  • 勾配ペナルティを伴う Wasserstein 損失を使用すると、モードの崩壊が軽減され、トレーニングが改善されます。

補足として、用語とデータ設定について説明しましょう。DoppelGANger には、複数の時系列データサンプルを含むトレーニングデータが必要です。各サンプルは、0個以上の属性値、時間の経過とともに変化しない固定変数、そして各時点で観測された1つ以上の特徴量で構成されます。トレーニングデータセットに組み込むと、これらのサンプルは属性の2次元配列(サンプル x 固定変数)と特徴量の3次元配列(サンプル x 時間 x 時間変数)のように見えます。タスクと利用可能なデータによっては、この設定で複数の長い時系列データを、トレーニングサンプルとして使用できる短いチャンクに分割する必要がある場合があります。

まとめると、基本的なGANにこれらの変更を加えることで、高忠実度の合成データを生成できる表現力豊かな時系列モデルが実現します。DoppelGANgerは、様々なスケール(週ごとや年ごとの傾向など)で時間的に関連性のあるデータを学習・生成する能力が特に優れています。モデルの詳細については、論文をご覧ください。

使用例

PyTorch実装は、2つの入力形式(NumPy配列またはPandas DataFrame)と、モデル用の多くの設定オプションをサポートしています。完全なリファレンスドキュメントについては、https://synthetics.docs.gretel.ai/をご覧ください。

このモデルを使用する最も簡単な方法は、Pandas DataFrame のトレーニングデータを使用することです。この設定では、データは「ワイド」形式である必要があります。つまり、各行はサンプル、一部の列は属性、残りの列は時系列値です。以下のコードスニペットは、DataFrame からのトレーニングとデータ生成を示しています。

 #ランダムなトレーニングデータを作成する

df = pd.DataFrame ( np.random.random ( サイズ= ( 1000 , 30 ) ) )

df . columns = pd . date_range ( "2022-01-01"periods = 30 )

# 属性列を含める

df [ "属性" ] = np . random . randint ( 0 , 3 , サイズ= 1000 )
# モデルをトレーニングする

モデル= DGAN ( DGANConfig (

最大シーケンス長= 30

サンプル長さ= 3

バッチサイズ= 1000

epochs = 10 , # 実際のデータセットでは、100~1000 epochs が一般的です

))
model.train_dataframe (

df

df_attribute_columns = [ "属性" ],

attribute_types = [ 出力タイプ. DISCRETE ],


# 合成データを生成する

合成df = モデル. 生成データフレーム( 100 )

データがまだこの「ワイド」な形式になっていない場合は、pandasのpivotメソッドを使って目的の構造に変換できます。DataFrameの入力は現在多少制限されていますが、将来的には時系列データを受け入れるための他の方法をサポートする予定です。最大限の制御と柔軟性を実現するために、以下に示すように、トレーニングにNumPy配列を直接渡すこともできます(データ生成時にも同様の方法で属性と特徴の配列を受け取ります)。

 #ランダムなトレーニングデータを作成する

属性= np . random . randint ( 0 , 3 , サイズ= ( 1000 , 3 ))

特徴= np . ランダム. ランダム( サイズ= ( 1000 , 20 , 2 ))
# モデルをトレーニングする

モデル= DGAN ( DGANConfig (

最大シーケンス長= 20

サンプル長さ= 4

バッチサイズ= 1000

epochs = 10 , # 実際のデータセットでは、100~1000 epochs が一般的です

))
model.train_numpy (

属性機能

attribute_types = [ 出力タイプ. DISCRETE ] * 3 ,

feature_types = [ 出力タイプ. 連続] * 2


# 合成データを生成する

合成属性合成特徴= モデル.generate_numpy ( 1000 )

これらのコード スニペットの実行可能なバージョンは、sample_usage.ipynb で入手できます。

結果

新しい実装がTensorFlow 1からPyTorchに切り替わったため(最適化やパラメータ初期化などの基盤コンポーネントに違いがある可能性があるため)、PyTorchコードが期待通りに動作することを確認したいと考えました。この目的のため、元の論文からいくつかの結果を再現しました。現在の実装は固定長のシーケンスのみをサポートしているため、Wikipedia Web Traffic (WWT)データセットに焦点を当てました。

Linらが使用したWWTデータセットはKaggleから取得したもので、様々なWikipediaページを測定した日々のトラフィックデータが含まれています。各ページには3つの異なる属性(ドメイン、アクセスタイプ、プロキシ)があります。図1は、WWTデータセットの時系列データの例をいくつか示しています。

図 1: 3 つの Wikipedia ページの毎日のページビューを拡大表示し、右側にページ属性をリストします。

ページビューは、データセット全体の最小/最大ページビューに基づいて[-1, 1]に対数スケールされていることに注意してください。実験で使用した50,000ページのトレーニングデータ(スケール済み)は、S3でCSV形式で提供されています。

提示する3つの図は、合成データの忠実度の異なる側面を示しています。各図では、実データと3つの合成バージョンを比較しています。1) バッチサイズが大きく学習率が低い高速PyTorch実装、2) 元のパラメータを使用したPyTorch実装、3) TensorFlow 1実装です。図2では、合成データが実データとほぼ一致する属性分布を確認しています。

図2: 実際のWWTデータと合成WWTデータの属性分布

WWTデータの課題の一つは、時系列によってページビューの範囲が全く異なることです。Wikipediaのページの中には、常に多くのトラフィックを獲得しているものもあれば、それほど人気が​​ないものの、関連ニュース(ページに関連する速報ニュースなど)によって時折トラフィックが急増するものもあります。Linらは、DoppelGANgerがさまざまなスケールで時系列を生成するのに非常に効果的であることを発見しました(原著論文の図6を参照)。図3は、時系列の中点の分布を示す同様のグラフです。各例において、中点は550日間の最小ページビューと最大ページビューの中央値にあります。PyTorch実装では、中点に関して同様の忠実度を示しています。

図3: 実際のWWTデータと合成WWTデータの時系列における中間点の分布

最後に、ほとんどのWikipediaページへのトラフィックは、週ごとおよび年ごとのパターンを示しています。これらのパターンを評価するために、自己相関、具体的には異なる時間差(1日、2日など)におけるページビューのピアソン相関を使用しました。図4は、自己相関プロットの3つの合成バージョンを示しています(原著論文の図1に類似)。

図4: 実際のWWTデータと合成WWTデータの自己相関

PyTorchの両バージョンは、元の論文で観察された週次および年次の傾向を生成しました。TensorFlow 1の結果は、Linらの図1(上図参照)とは一致しません。これは、私たちの実験によるものです。元のパラメータを用いたトレーニングでは、モデルが年次(あるいは週次)のパターンを観測できないことがあり、いくつかの不一致が見られました。私たちの高速バージョンでは、低い学習率(1e-4)と大きなバッチサイズ(1000)を採用したことで、再トレーニングの一貫性が向上しました。

このセクションで生成された画像と 3 つのモデルをトレーニングするための分析コードは、GitHub でノートブックとして共有されています。

ランタイム

最後に、より複雑なモデルにおいて重要な側面は実行時間です。トレーニングに数週間かかる優れたモデルは、実際には1時間で完了するモデルよりも制約が厳しいものです。この点において、PyTorch実装は比較すると非常に優れたパフォーマンスを発揮しています(ただし、著者らは論文の中で、TensorFlow 1のコードをパフォーマンス最適化していないと述べています)。すべてのモデルはGPUを用いてトレーニングされ、NVIDIA Tesla T4を搭載したGCP n1-standard-8インスタンス(仮想CPU 8基、RAM 30GB)で実行されました。トレーニング時間を13時間から0.3時間に短縮することは、この優れたモデルを実用化するために不可欠です。

バージョン

トレーニング時間

テンソルフロー1

12.9時間

PyTorch、batch_size=100(元のパラメータ)

1.6時間

PyTorch、バッチサイズ - 1000

0.3時間

原題:オープンソースツールによる合成時系列データの生成、著者: Kendrick Boyd