入門:機械学習の仕組み

2016年12月22日

近頃、テクノロジー企業は機械学習に熱を上げています。これまで人間にしか解決できなかった問題を機械学習で解ける、というのがその言い分で、中にはこれを「人工知能」と呼ぶ企業すらあります。機械学習は特に、脅威の状況がめまぐるしく変化し、適切な解決策を見つけ出す必要に迫られているITセキュリティ業界内で注目を集めています。

machine-learning-featured

テクノロジーとは、つまるところ、スピードと一貫性です。トリックではありません。テクノロジーを基盤とする機械学習は、人間の言葉で説明可能です。ということで、本題に入りましょう。私たちはこれから、実際に使えるアルゴリズム、つまり機械学習を基盤とするアルゴリズムを使って、リアルな課題を解いていきます。機械学習の概念はかなりシンプルですし、本物の貴重な洞察を与えてくれます。それでは、行きましょう。

課題:意味のある文章とでたらめな文章を区別する

人間が文章を書くと、こんな感じになります(ここでは、英国の作家であるテリー・プラチェットの文章を引用。英語です)。

Give a man a fire and he’s warm for the day. But set fire to him and he’s warm for the rest of his life
It is well known that a vital ingredient of success is not knowing that what you’re attempting can’t be done
The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it

でたらめな文章は、こんな感じです。

DFgdgfkljhdfnmn vdfkjdfk kdfjkswjhwiuerwp2ijnsd,mfns sdlfkls wkjgwl
reoigh dfjdkjfhgdjbgk nretSRGsgkjdxfhgkdjfg gkfdgkoi
dfgldfkjgreiut rtyuiokjhg cvbnrtyu

私たちに与えられた課題は、意味のある文章とでたらめな文章を区別できる機械学習アルゴリズムを開発することです。これは、かなりの難題です。文章の区別は人間にとって大した作業ではありませんが、両者の違いを数式化するには相当な手間が必要です。私たちはここで、機械学習を使用します。アルゴリズムにサンプルをいくつか与え、「これは意味のある文章か?それとも、でたらめな文章か?」という質問に正しく答える方法を「学習」させるのです。アンチウイルスプログラムが実際にファイル解析を行うときは、基本的に毎回この作業をしています。

さて、この先は意味のある文章を「クリーンな文章」、でたらめな文章を「悪意ある文章」と呼ぶことにします。ITセキュリティ関連のブログで機械学習のトピックを扱っていますし、アンチウイルス製品の第一の目的は膨大な量のクリーンなデータの中から悪意あるコードを見つけることですから。

解決:アルゴリズムを使用する

私たちが作るアルゴリズムは、ある特定の文字の次に別の特定の文字が続く頻度を計算し、想定しうる文字ペアをすべて分析するアルゴリズムです。たとえば、最初のフレーズ「Give a man a fire and he’s warm for the day. But set fire to him and he’s warm for the rest of his life」はクリーンな文章ですが、このフレーズに出てくる文字ペアの出現頻度は以下のようになります(説明を簡単にするため、句読点やスペースは無視しています)。

Bu — 1
Gi — 1
an — 3
ar — 2
ay — 1
da — 1
es — 1
et — 1
fe — 1
fi — 2
fo — 2
he — 4
hi — 2
if — 1
im — 1

このフレーズでは、「a」の次に「n」が続くことが3回、「f」の次に「i」が続くことが2回、「a」の次に「y」が続くことが1回ありました。

この時点で、モデルに学習させるには1つのフレーズでは不十分なことがわかります。もっと長いテキストの分析が必要です。ということで、マーガレット・ミッチェルの『Gone with the Wind』(風と共に去りぬ)に出てくる文字ペアを数えてみましょう。正確には、同書の冒頭から5分の1のところまでです。以下はその結果の一部です:

he — 11460
th — 9260
er — 7089
in — 6515
an — 6214
nd — 4746
re — 4203
ou — 4176
wa — 2166
sh — 2161
ea — 2146
nt — 2144
wc — 1

ご覧のとおり、「he」の文字ペアの出現頻度は「an」の出現頻度の2倍です。また、「wc」は1回しか出てきません(「newcomer」のみ)。

さて、これでクリーンな文章のモデルができあがりましたが、どのように使えばいいでしょう?まず、ある行がクリーンな文章か、悪意ある文章かの確率を定義するため、その真偽性を定義します。モデルを利用して1つ1つの文字ペアの出現頻度を求め(実際の文字ペアを数える)、得られた数値をすべて乗算します。

F(Gi) * F(iv) * F(ve) * F(e ) * F( a) * F(a ) * F( m) * F(ma) * F(an) * F(n ) * …

6     * 364   * 2339  * 13606 * 8751  * 1947  * 2665  * 1149  * 6214  * 5043 * …

最終的な真偽値を決定するときは、行に含まれる記号の数も考慮します。つまり、行が長くなれば、乗算する数値も増えます。ですから、短い行でも長い行でも、等しく適切な真偽値となるよう、ちょっとした数学の魔法をかけます。つまり、得られた値の(対象となる行の長さ-1)乗根を求めます。

モデルを使用する

ここで、次の結論が導かれます。「計算で得られた数値が大きいほど、対象となる行がモデルに適合する度合いが高くなり、結果的に人間によって書かれたものである確率が上がる」。文章から求められた数値が大きければ、それはクリーンな文章と言えます。

対象となる行に出現率の低い文字ペア(wx、zg、yqなど)が多く含まれていると、悪意ある文章である可能性が高いといえます。

分析対象のフレーズの尤度(真偽性)をポイントで表すと、以下のようになりました。

・Give a man a fire and he’s warm for the day. But set fire to him and he’s warm for the rest of his life — 1984ポイント
・It is well known that a vital ingredient of success is not knowing that what you’re attempting can’t be done — 1601ポイント
・The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it — 2460ポイント
・DFgdgfkljhdfnmn vdfkjdfk kdfjkswjhwiuerwp2ijnsd,mfns sdlfkls wkjgwl — 16ポイント
・reoigh dfjdkjfhgdjbgk nretSRGsgkjdxfhgkdjfg gkfdgkoi — 9ポイント
・dfgldfkjgreiut rtyuiokjhg cvbnrtyu — 43ポイント

ご覧のとおり、クリーンな文章のスコアは1,000ポイントを大きく上回っていますが、悪意ある文章は100ポイントにも届きません。アルゴリズムは期待通りに働いているようです。

フレーズの前後関係(文脈)に対するスコア付けは、機械に任せて学習させるのが一番です。そのためには、実際のクリーンな文章を大量に機械に渡して真偽性を計算し、それから悪意ある文章を少し渡すという作業を繰り返し、その後に評価基準を求めます。今回の例では、約500ポイントになりました。

現実的には

ここまでの作業をおさらいしましょう。

1. クリーンな文章の特徴(文字ペアなど)を定義しました。

実際にアンチウイルス製品を開発するとき、アナリストはファイルその他のオブジェクトの特徴も定義します。なお、アナリストの関与は不可欠です。分析で評価対象とする特徴の定義は今でも人間の役目ですし、リサーチャーの専門知識と経験は、特徴の品質に直接影響を及ぼします。たとえば、3文字ではなく2文字(文字ペア)を解析しなければならない、と決めるなどです。こういった仮説も、アンチウイルスラボ内で評価されます。Kaspersky Labでは、機械学習を使用して最適な特徴と補助的な特徴を選択しています。

2. 定義された特徴を使って数学的モデルを構築し、一連のサンプルに基づいてこのモデルに学習させました。

もちろん、実際のモデルはもう少し複雑です。現在のところ、最高の結果は勾配ブースティングにより構築された決定木アンサンブルから得られますが、完璧を目指して努力を続けている以上、私たちはただぼんやりと座って現時点で得られる最高の結果をそのまま受け入れるわけにはいきません。

3. シンプルな数学的モデルを使用して、真偽性のスコアを計算しました。

正直なところ、現実の世界では正反対のことをしています。「悪意ある」方のスコアを計算しているのです。大した違いはないように思えるかもしれませんが、外国の言語や文字で書かれた文章の場合、前述した私たちのモデルではどのくらいが偽物と判断されるか、想像していただければと思います。しかしアンチウイルス製品の場合、新しい種類のファイルをチェックする際、まだよくわかっていないファイルだからといって誤った答えを返すことは許されません。

機械学習に代わるものは?

20年ほど前はマルウェアがそれほど出回っておらず、「でたらめな文章」はシグネチャ(目立った特徴を持つ文字列)で簡単に検出できました。上の例の場合、シグネチャはこんな感じとなります。

DFgdgfkljhdfnmn vdfkjdfk kdfjkswjhwiuerwp2ijnsd,mfns sdlfkls wkjgwl
reoigh dfjdkjfhgdjbgk nretSRGsgkjdxfhgkdjfg gkfdgkoi

アンチウイルスプログラムがファイルをスキャンし、「erwp2ij」を見つけると「これは、でたらめNo.17」、gkjdxfhgを見つけると「これは、でたらめNo.139」だと認識する、といった具合でした。

そして15年ほど前、マルウェアのサンプル数が著しく増えると、「ジェネリック」検知がセンターに躍り出ました。この手法の場合、ウイルスアナリストが「意味のある文章」に当てはまる規則を定義します。たとえば以下のような規則です。

  1. 1単語の長さは1~20文字でなければならない。
  2. 大文字や数字が単語の途中に出てくることはめったにない。
  3. 母音は比較的均等に子音に混じっている。

…など、など。こうした規則の多くに該当しない行は、悪意ある文章として検知されます。

要するに、原理はまったく同じです。しかしこの場合では、アナリストが手で記述する一連の規則が数学的モデルの代わりを務めていました。

そして約10年前、これまでの想像の域を超えてマルウェア検体の数が膨れ上がると、機械学習アルゴリズムが徐々に入り込んできました。当初、複雑さの点では、この記事の前半で例として挙げた初歩的なアルゴリズムとさほど変わりませんでした。しかし、当社はその頃までに専門家を積極的に採用し、専門知識を蓄えていました。カスペルスキー製品がアンチウイルス製品の中で最高レベルの検知能力を備えているのはその賜物です。

現在、機械学習なしで動作するアンチウイルス製品はありません。検知方法の比較として言えば、機械学習はふるまい分析などの高度な技術と同等です。しかし、ふるまい分析は機械学習を使っているのです!つまり、効果的な保護には機械学習が不可欠なのでした。以上。

短所

機械学習には、実に多くの長所があります。では、機械学習は万能なのでしょうか?必ずしもそうとは言えません。機械学習が有効なのは、前述のアルゴリズムが、クラウド内やクリーンなオブジェクトと悪意あるオブジェクトを大量に分析して学習する何らかのインフラ内で機能する場合です。

また、専門家チームに学習プロセスを監視してもらい、専門家の経験が必要なときに介入してもらうのも有効です。

こうした対策によって、短所を最小限に抑えることが可能です。残る短所は基本的に1つ、高額なインフラソリューションと人件費の高い専門家チームを必要とする点です。

しかし、大幅なコスト削減の必要に迫られて数学的モデルだけを製品側でのみ使用するのであれば、うまくいかないかもしれません。

1. 誤検知

機械学習に基づく検知とは、検知されたオブジェクトのレベルと誤検知のレベルの間で最適なポイントを見つけることです。より多く検知しようとすれば、必然的に誤検知の数も増えます。機械学習を使っていると、どこで誤検知が発生しうるか、想像も予測もできません。たとえば「Visit Reykjavik」(レイキャビクを訪問、の意)はクリーンな行ですが、前述の信偽性評価では101ポイントしか得られないので、悪意ある行として検知されます。このため、アンチウイルスラボにて、モデルが学習やテストで利用できるようにクリーンなファイルの記録を取り続けることが重要です。

2. モデルの回避

犯罪者がアンチウイルス製品を徹底的に分析して仕組みを調べることも考えられます。犯罪者は人間ですから、機械より(賢くはないかもしれませんが)創造的に対処しますし、適応もするでしょう。たとえば、「dgfkljhdfnmnvdfkHere’s a whole bunch of good text thrown in to mislead the machine.」というフレーズがあったとします。冒頭の部分は(人間の目には)明らかに悪意ある文章ですが、クリーンな行であると見なされます。アルゴリズムがどんなに賢くても、賢い人間は必ずそれをすり抜ける方法を見つけるものです。だからこそ、アンチウイルス研究機関は、新しい脅威に対して即座に対応できる、応答性の高いインフラを必要とします。

gibberish-en

これは、前述の数学的モデルを欺くことができることを示した例です。セリフは一見、本物のようですが、実際はでたらめです。出典(英語サイト)

3. モデルの更新

前述のアルゴリズムを説明する中で、英語の文章を使って学習したモデルは他の言語で書かれた文章では使えない、と言いました。この観点でいくと、悪意あるファイルは(既成概念にとらわれずに考えることのできる人間によって作成された場合)、絶えず進化を続けるアルファベットのようなものです。脅威の状況は、めまぐるしく変化します。Kaspersky Labは長年にわたる調査研究を通じ、定義データベース内で段階を追って直接モデルを更新するという安定した方法を編み出しました。そうすることで、通常の動作を邪魔することなく、モデルにさらに多くのことを学習させるだけでなく、学習の切り口を全面的に変更することもできるようになります。

まとめ

Kaspersky Labはサイバーセキュリティの世界における機械学習とその重要性を重視しており、サイバーセキュリティ上、最も効果的なアプローチはマルチレベルのパラダイムを基盤にするものであると考えています。

ふるまい分析や機械学習のほかにもさまざまな手法がありますが、アンチウイルスは総合的に完璧でなければなりません。この「さまざまな手法」については、また次の機会にお話ししましょう。