ココンの情報をいつでも、どこでも。ココントコ。

エンジニア 2018.03.27

時系列データに対する多様体学習について

AI戦略室の坂本です。
今回のエントリはやや技術的な話をしようと思います。
『時系列データに対する多様体学習について』
少し専門的な内容になりますが、お付き合いください。

目次

背景

ココングループではセキュリティ関連の事業を展開しているのですが、セキュリティを考えるときには「いかにして攻撃を防ぐか」だけではなく、「いかにして攻撃やその予兆を発見するか」という点も重要になります。
そして、攻撃やその下準備となる情報収集を発見するために、サーバーのログを解析して特徴的なアクセスを探し出すのですが、アクセスログというものは時間軸上に並んでいる時系列データなので、それを解析するモデルを作成するには、少々難しい点があります。
もちろん、攻撃検出に関しては単純な一つのモデルで全てを賄う等ということはあり得ない話でして、従来型のアルゴリズムも含む様々な手法を組み合わせて疑わしいアクセスをフィルタリングしてゆくのですが、AI戦略室ではより先進的で精度の高い解析モデルを作成するための研究開発を行っています。
今回の記事ではそのなかでも、ディープラーニングを使用したニューラルネットワークによる教師なし学習について、いくつかの技法を紹介します。

アクセスログを解析する

さて、一口にログと言っても、実際には様々なデータがそこには含まれています。
ログデータの解析作業にも、設定する目的に応じて異なる戦略が存在しますが、通常は、単一のテキストログから、セッションを分離してゆくところから作業がスタートします。
セッションログには、同一のクライアントからの連続するアクセス情報が含まれているので、ユーザーの行動傾向を解析して分離するような目的には、セッション毎のアクセスログが必須となります。
そしてその後、セッション内に含まれているログから特徴量を抽出し、ベクトルデータ化します。
これは機械学習モデルでログを扱う為に必要なステップで、離散値の扱い方にもよりますが、だいたい200〜数千次元のベクトルで一つのログを表現することになります。
一つのセッションには数百から多いときには数万以上のログが含まれており、それらの全てが数千次元ベクトルデータとして表現されるので、一つのセッション全体は数十万以上の次元からなる高次元データとして表現されることになります。

セッション全体をデータ化することが出来るならば、ユーザーからのアクセスをセッション単位で機械学習モデルに学習させれば、「これは攻撃によるアクセスだ」だとか、「他とは異なる得意な行動だ」だとか、ゲームのログであれば「この行動傾向はチート行為に違いない」などと判断できるようになるはずです。
この解析モデルの基本は、単一のログとしては特徴的な傾向が見られないアクセスであっても、セッション内の行動を時系列に並べて見ると、何らかのパターンが見つかるはずだ、というアイデアに基づいています。
その中に典型的な行動パターンが存在すれば、教師あり学習を用いて攻撃を検出する事も可能になりますし、教師なし学習を用いて特異なセッションを発見することも可能になります。
教師あり学習では、既知の攻撃手法によるアクセスを学習させることで、同様の攻撃を検出する事が目的となります。また、大抵の攻撃に共通して行われる事前準備となる情報収集のためのアクセスを検出する事も出来ます。
一方の教師なし学習では、データの分布を統計的に解析して、正常系と異常系を分離することになります。
教師なし学習でよく利用されるのが、クラスタリングという手法で、この手法はベクトルで表されるデータの空間内の分布に従って、データをいくつかのクラスタ(固まり)に分離します。
そのためのアルゴリズムにはいくつもの種類が知られていますが、その中でも単純なアルゴリズムの一つである「K-means法」というアルゴリズムでは、K個のデータから重心点を求めて、その重心点に近いデータでクラスタを更新してゆくことでデータを複数のクラスタへと分離します。

以下のリンク先に、様々なクラスタリングのアルゴリズムによるデータの分離が載っています。
http://scikit-learn.org/stable/modules/clustering.html
リンク先にある画像では、二次元上のデータ(点の集まり)に対して、色分けがクラスタリングによる分離結果を表しています。このような分類を高次元のベクトルデータに対して行うことで、集団から外れた得意な傾向を持つログを発見したり、ログの集まりをいくつかのベクトル成分へと分離することが可能になるのです。
こうしてログデータを解析することで「全体の90%はこのクラスタに属する」「5%は他とは違う傾向がある」等の知見を発見することが出来ます。そして、その後は人の手で「このクラスタはチートっぽい事をしているようだ」「このクラスタはボットからのアクセスだ」等とラベリングをしてゆくことになります。
教師あり学習では、まずラベリングしてからそれと同様の分類をしてゆくのに対して、クラスタリングは教師なし学習なので、まず分類してそれからクラスタをラベリングする訳ですね。
ここまでは原理主義的な話で、どのようなビジョンでもってログデータを解析してゆこうか、という目的の話になります。
ところが、現実の解析モデルを作成する場合は、そう素直に物事が進まないところに難しさがあります。
ログデータを数値化して得られる高次元のベクトルデータを、そのままクラスタリング出来れば面倒がなくて良いのですが、実際にはデータの次元数が問題になり、そのままクラスタリングのアルゴリズムを適用することは出来ません。
まず、次元数が巨大すぎるため、メモリ使用量や計算時間が非現実的なレベルに増大してしまいますし、球面集中現象によりデータ間の距離差が消失してしまい、正しい分類が行えなくなってしまいます(これを「次元の呪い」と呼びます)。
さらに、一つのセッションに含まれているログの数が可変であり、従ってログデータ全体を表すデータも、次元数が可変、ということになってしまいます。
クラスタリングを含めてほとんどの機械学習のアルゴリズムは、扱うデータは同じ次元数で表現されているという前提で作成されるので、これは問題です。
もちろん、固定長のウィンドウサイズでログデータを切り分ければ、同じサイズのベクトルデータとしてログデータを扱う事が出来ますし、実際それで上手くゆくことも多いのですが、ここではあくまで可変長のログデータをいかにしてデータ化するか、という点について議論します。
つまり、まとめると、ログデータを解析する上で最初の困難点となるのが、
・特徴量の扱いによってはログを表現するデータの次元数が膨大になる
・セッション内に含まれるログの数が可変である
という点で、これを、現実的なサイズで固定長のベクトルデータにすること、つまり、
・10〜数百次元程度の固定長のベクトルデータに、セッションの全ての情報が詰め込まれている
という状態へもってゆくことが、ログ解析のはじめの一歩となります。

ニューラルネットワークによる多様体学習

多様体学習とは、高次元のデータを解析する際に利用される手法の一つで、データの持つ情報を損ねないままデータの次元数を操作する手法のことを指します。
一般的には次元縮小や次元縮退と言って、データの持つ情報はそのままに、そのデータの次元数(データを構成する数字の数)を少なくします。また、応用例は少ないですが、逆にベクトルの次元数を増やすような学習も存在しています。
直感的には、次元数を減らせば、そのデータが表している情報も必然的に欠損してしまのでは?と思うでしょうが、実際はデータの持つ情報を保存したまま次元数を操作することは可能です。
例えば、下の図を見てください。

多様体学習の一つである「主成分分析」では、複数のベクトルデータから最も共通するベクトルを生成し、そのベクトル上に全てのデータをマッピングします。
上の図では2次元のデータを1次元に縮小する様子を表していますが、2次元から1次元に次元数を縮小する場合は、「最も良く当てはまる楕円の長軸に沿って全てのデータを並べる」という操作に相当します。
他にも、ベクトル間の距離が近いものをまとめるようにするIsomap法や、ベクトル間の距離を保存するMDS法などが、多様体学習の手法として知られています。
「主成分分析」は多様体学習の代表例ですが、このように、次元数を縮小する手法を工夫すれば、少なくなった次元で表されたデータから、元々のデータの位置を復元できる、つまりデータの持っている情報を保持したままデータの次元数を縮小することが出来る、という訳なのです。
多様体学習のアルゴリズムにも様々なものがありますが、One-Hot-Vector化した離散データなどを含む高次元のベクトルデータを扱う場合に有効なのが、ニューラルネットワークを使用した多様体学習です。

最も単純なニューラルネットワークを使用した多様体学習では、上の図のように全結合層を重ねて順伝播型ニューラルネットワークを作成し、中間層のニューロン数を目的となる次元数に設定します。
そして、入力と出力が同一の値になるように機械学習を行い、学習後、入力に対する中間層のデータを取り出すことで、データの次元数を変更するのです。
ニューラルネットワークによる多様体学習は、ネットワークのモデルを変更することで、どの程度元のベクトルの形を保持するかなど、柔軟にパラメーターの調整が出来ることが特徴です。
また、図では次元数を減らすニューラルネットワークを表していますが、ドロップアウトを適切に使用することで、次元数を増やすような多様体学習も可能になります。

時系列データに対する多様体学習

さて、多様体学習を使用すれば、データの次元数が多すぎるという問題は何とか解決できそうですが、ログデータのような時系列データを解析する際にはもう一つ問題がありました。
それは、一つのセッションに含まれているデータの個数が可変で、従ってセッション全体を表すデータの次元数も可変にならざるを得ない、という問題です。
このような特徴を持つ時系列データを、固定サイズのベクトルで表現して、そのベクトル内にセッション内の全データが押し込まれている、という状態にすることが、時系列データに対する多様体学習となります。
○Sparse Composite
まず、比較的シンプルな手法ながら、長さのあるデータも効果的に解析できる手法として、多様体学習とベクトル演算を組み合わせた手法を紹介します。
これは、「Sparse Composite Document Vectors」(https://dheeraj7596.github.io/SDV/https://arxiv.org/pdf/1612.06778.pdf)という自然言語解析の手法を応用したもので、基本的な発想は同じです。
自然言語文章というのは、順番に並んだ単語の羅列(時系列データに相当)であり、文単位で区切りが存在する(セッションに相当)ため、ログデータのような時系列データの解析と共通する手法が多く用いられます。

この手法では、まず全てのログを多様体学習&クラスタリングしておき、一つのセッション内に含まれる全てのログを、属するクラスタ毎に集約します。
集約のための演算は、通常は単純な合算を行いますが、ログ内におけるデータの出現個数が問題にならないと解っている場合は、平均値を取ることもあります。
そしてその後、全てのクラスタにおける集約済みのベクトルを一つのベクトルとして結合し、最終的なベクトルとします。
例えば、全ログを2次元ベクトルへと次元削減し、5つのクラスタへとクラスタリングしておくならば、最終的にセッションを表すベクトルは、2×5=10次元のベクトルデータとなる訳です。
この手法では、一旦ある程度の大きさがある固定長のベクトルへセッション情報を押し込めて、その後さらに多様体学習でもって、必要なサイズのベクトルへ情報を押し込めることも行います。
○1-D Convolution
データ内のパターンを見つけ出すという点では、1-D Convolutionによる畳み込みニューラルネットワークも、時系列データの解析では威力を発揮します。
畳み込みニューラルネットワークというと画像認識で使用されるイメージが強いですが、1次元データに対する畳み込みを行う1-D Convolutionネットワークは、Word2Vecのような文字ベクトル生成に使用されたりと、自然言語解析でも使われています。ここで、時間軸の方向に畳み込みを行うようにネットワークを構築すれば、1-D Convolutionネットワークを使用して時系列データを扱う事が出来ます。

TensorflowやChainer等のフレームワークで用意されている1-D Convolution層は、普通固定長のデータしか扱うことが出来ませんが、Paddingを可変にするなど可変長のデータを扱えるように改造した1-D Convolutionネットワークを利用して、後は前述のニューラルネットワークによる多様体学習と同じ手法で時系列データを畳み込んでゆくと、セッション内の全データを一つのベクトルデータに押し込めることが出来ます。
また、畳み込みニューラルネットワークの特徴である、パターン発見に威力を発揮するという能力を生かして、一つのベクトルデータへと多様体学習するのではなく、ログデータをそのまま1-D Convolutionネットワークで解析することも出来ます。
○Encoder-Decoderモデル
ニューラルネットワークで時系列データならRNNだ、と理解している方も多いでしょう。
RNNを使用したEncoder-Decoderモデルを使用して、時系列データの多様体学習を行うことも可能です。
RNNとは、入力と出力の他に、現在のステータスを保持することが出来るニューラルネットワークで、ステータスを引き継ぎながら次々とデータの入出力を行うことで、時系列データを扱う事が出来ます。

RNNの良いところは、いつデータを開始・終了しても良いという点で(データの開始記号と終端記号を特別に用意しておく場合が多いです)、そのため時系列データをそのまま扱う事が出来るのです。
Encoder-Decoderモデルというのは、RNNを使った自然言語文章の翻訳モデルとして登場して、エンコーダーとデコーダーの二つのニューラルネットワークを使い、エンコーダーは入力された文章を、その文章の意味を表すステータスへとエンコードし、デコーダーで翻訳先の文章へとステータスをデコードするというものです(https://arxiv.org/abs/1406.1078)。

Encoder-Decoderモデルとニューラルネットワークによる多様体学習の手法を組み合わせるならば、エンコーダーへの入力と、デコーダーからの出力が同じになるようにニューラルネットワークを学習させて、その後、デコーダーへとデータを入力した際のデコーダーの出力するステータスを、その入力データを表現するベクトルデータとして扱う事が出来ます。
つまり、前述のニューラルネットワークによる多様体学習と同じように、Encoder-Decoderモデルでも入力と出力とが同じになるように学習させることで、エンコーダーからデコーダーへとデータを受け渡すためのステータス内に、入力されたセッションの全ての情報が押し込められることになるのです。
以上、時系列データを扱うための手法について3つほど紹介しました。
ここで紹介した内容はどれも単純化した手法であり、実際にはより複雑な手法を組み合わせることが多いのですし、どの手法が望ましいかは場合場合によるので一概に決定することは出来ません。
しかしこのようにして、時系列データを固定長のベクトルデータとすることが出来れば、後は機械学習の手法を使ってクラスタリングするなりクラス分類するなり、様々な解析モデルを作成する事が出来ます。
これらの手法は、ログデータ解析の前段階であり、実際の解析の第一歩でしかありませんが、このようにして膨大なテキストログから有効な知見を抽出してゆく訳なのです。
次回は実際のソースコードを提示しながら、時系列データの解析を行う手法を紹介したいと思います。

続きはこちら。「ログデータのクラスタリングについて」

イベントインタビュー広報 2020.01.31

「OpenID Summit Tokyo 2020」参加レポート

広報の馬場です。4年に一度のOpenIDの祭典「OpenID Summit Tokyo 2020」が渋谷ストリーム・ホールにて1月2…

イベントインタビュー広報 2019.11.11

世界のハッカーが競う「DEF CON CTF Finals 2019」参加者インタビュー

広報の馬場です。 DEF CONの人気コンテンツの一つである「DEF CON CTF」は、熾烈な予選を勝ち抜いたチーム…

エンジニア 2019.08.23

危険すぎると話題の文章生成モデル「GPT-2」で会社紹介文を生成してみました

ココングループのAI TOKYO LABの細川です。AI、特にディープラーニング系のホットな技術を実際に動かすと…