IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Web development  >

World Wide Wits: Web でホストされた壊されにくい頭脳を構築する

異機種の Web サーバー群を使った分散ニューラル・ネットワークの構成

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 中級

Lewin Edwards (sysadm@zws.com), Design Engineer, Freelance

2007年 10月 30日

HTTP トランスポート・コードに単純なニューロン実装を付加し、観察者からは (たとえソース・コードにアクセスできる人であっても) 非常に内容を把握しにくい堅牢な分散コンピューティング・アプリケーションを構築しましょう。

はじめに

分散コンピューティング (具体的には、アイドル状態にある PC から使われていない CPU サイクルを借用することに依存する技術) は、複雑な計算が必要な問題を解決するための方法として十分に確立されています。プロジェクトとして、例えば SETI@home (存在するかもしれない地球外生命体からの電波を探索して電波望遠鏡のデータを分析する) や Folding@home (タンパク質がどのように折り畳まれるかを解析する)、そして Prime95 (非常に大きなメルセンヌ素数を探す) などは、現在行われている、よく知られた分散コンピューティング・プロジェクトのうちの 3 つにすぎません。世の中には文字どおり何百というプロジェクトがあり、そのいくつかは非常に有名です。ソニーに至っては、同社のゲーム機、PLAYSTATION®3 の中心的なファームウェアの中に Folding@home 専用のクライアントを統合してしまっています。

アイドル状態にあるコンピューターの空き CPU サイクルを利用することは非常に結構なことですが、この手法を使おうとすると、従来の方法では次のようにいくつかの困った問題が生じます。

  • アプリケーションのソース・コードを公開すると、アルゴリズムを一般大衆に公開することになります。これは望ましくないかもしれません。必要な暗号鍵と暗号化方式もソース・コードの中に入れる必要があるため、ソース・データのストリームも世界中に公開されてしまいます。もっと悪いことに、誰かが悪意でクライアント・ソフトウェアを加工したバージョンを使って計算の中に偽の結果を注入できてしまいます。
  • その一方、もしソース・コードを公開しないと、人々はそのアプリケーションがまったく害がないものであると信用することができません。結局のところ、適切に動作する分散コンピューティング・クライアントは親サーバーと頻繁にデータのやりとりを行うことになります。そうでなければ、キー入力のログを記録していないこと、そしてパスワード収集をしていないこと、あるいは文書の興味深い部分を誰かに送信していないことなどを誰が指摘するのでしょう。
  • すべての分析タスクが容易に「ファクター化」できるわけではありません (ファクター化: 相互に依存しないため独立に処理できる手軽なバイト・サイズのチャンクに分割すること)。
  • 結果を収集し、作業負荷を管理するための単一障害点ができてしまいます。ある研究作業を攻撃しようとする者は、クライアント・ソフトウェアにアドレスがハードコーディングされているホーム・ベース・サーバーに対して、単純に DoS (Denial of Service: サービス拒否) 攻撃を実行できてしまいます。

この記事を書く 1 つの動機となったのが、「Chinese Lottery Attack」と呼ばれる暗号解読手法です。これは、分散コンピューティング・ノードとしてコンシューマー機器を利用することで暗号鍵を見つけるための仮説的な方法です。この前提は単純です。まず、ある政府が、小さな鍵空間に対してブルート・フォース攻撃を実行するための安価な暗号解読チップを開発します (この攻撃は 56 ビットの DES が十分にセキュアな暗号化だと見なされていた頃に提案されました)。その政府は次に、その国内で販売されるすべてのラジオとテレビにこのチップを搭載することを要求する法案を提出します。(これは決してあり得ない話ではありません。米国が 2000年からのテレビへの V チップ搭載の法制化に成功したことを思い出してください。) 個々のラジオとテレビには、解析対象となる鍵空間のほんの一部が電波を介して割り当てられます。ある機器が答えらしいものを見つけたと判断した場合には、その機器は LED を点灯させるので、その機器の所有者は通話料無料の番号に電話をかけ、賞金を請求します。そしてその政府は「当選した」機器を回収し、そのメモリーから鍵を読み出すのです。




上に戻る


分散コンピューティング・システムの問題

Chinese Lottery の問題は、上で説明した他の分散コンピューティング・システムの場合と同様、暗号化チップをリバース・エンジニアリングできる技術を持ち、そして放送を聞く人ならば誰でも、何を解読しようとしているのかを正確に理解できてしまうことです。これは思ったよりも大きな意味合いを持っています。なぜなら、敵が、どの通信チャネルが傍受されているかに関して強力な手掛かりを得てしまうからです。

もっと悪いことに、どの鍵についても、その特定の鍵をいつ破ろうとしているのかを非常に正確に予測ができてしまいます。なぜなら、各ノードの計算能力はわかっており、またその放送チャネルを聞き、どの鍵が攻撃されるのかも知っている人は誰でも、「当選」パケットがいつ送出されるのかを正確に知ることができるからです。そうしたシステムに対して、他にもいくつかの攻撃のタイプを想定することができます。例えば攻撃者が小さな送信機を作り、その送信機を中心とした狭い範囲で放送信号よりも優先受信される信号を発します。そして偽の「当選」パケットを大量に送出し、偽の「当選者達」によって賞金請求用のホットラインに電話を殺到させることができます。

もちろん、こうした問題のすべてに対応できる機構はあります。しかし事実としては、少なくとも下記の特徴を持った分散コンピューティング機構を使用することが相変わらず注目され、また有効なのです。

  • 単一障害点を持たない冗長な設計
  • トラフィック分析による情報リークへの耐性
  • 実行中の作業にセキュリティー侵害の危険を及ぼすことなく、自由に公開でき、エンド・ユーザーにとって害がないことがすぐに証明できる、容易に分析可能な計算エンジン
  • たとえ任意の指定ノードに対するアルゴリズムとデータ・ペイロードが与えられたとしても、観察者にはシステムが全体として何をしているのかを推定できないという、目的の不明瞭さ



上に戻る


インターネット: 冗長な情報ネットワーク

冗長な情報ネットワークとして世界最高の例は、もちろんインターネットでしょう。標準のインターネット・プロトコルを使えば、さらにエンジニアリング・コストをかけなくても膨大な量の既存技術を利用してノードにリンクすることができます。この理由から、トランスポート・プロトコルには HTTP を選択する必要があります。これにより、インターネットに標準のルーティングの冗長性を自動的に実現でき、また今日のインターネットでは普通となっている自動的なロード・バランシングやフェールオーバーの仕組みも使えるようになります。アルゴリズム自体を説明すれば、いくつか他にも予期せぬ副次効果が明らかになるのですが、ここではとりあえず単純に冗長性の問題を考え、それから他の目標に移ることにしましょう。

トラフィック分析攻撃に対する耐性はどうすれば実現できるのでしょう。まず、その耐性とは何なのかを定義してみましょう。トラフィック分析攻撃は、誰が誰に対して通信しているのかを観察することで、また場合によっては、どのくらいの量のデータが転送されているのかを観察することで、メッセージまたはプロトコルに関する情報を収集しようとします。例えば、システム A に皆さんがログインしようとしているとします。皆さんはユーザー名とパスワードのペアを入力し、トラフィックを監視します。これを観察してみると、システム A がシステム B に小さなデータ・パケットを送信し、応答のパケットを待ってからログイン要求を許可あるいは拒否することがわかります。このことから、システム B が実際の認証データベースを持ち、システム A は単なるフロントエンドであることが推測できます。これはごく些細な例かもしれませんが、今ここで説明したような分析は、暗号システムに侵入するひとつの手がかりになりうるのです。

このタイプの攻撃に対してシステムを強固にするためには、下記の 2 つの方法を使うことができます。

  1. メッシュ・トポロジーで地理的に分散したノード。ノード間のすべてのリンクを攻撃者が監視することは不可能です。なぜなら、関係するバックボーン・セグメントのすべてに対して、(政府であれ、それ以外であれ) 単一の実体がアクセスすることはできないからです。
  2. 外部の実体にとってシステムの入力境界と出力境界がどこかわからない構成。すべてのノードが常に他のノードに情報を転送しています。そのネットワークの (現在の構成での)「マップ」を持っている人でないと、現在どのノードが意味のある出力を提供しているのか、そしてそれらの出力が何を表しているのかを知ることができません。その人以外の誰が見ても、各ノードは単にランダムな数字を連続的に吐き出しているようにしか見えません。



上に戻る


ニューラル・ネットワーク

このセクションでは、プログラムの本質、つまり処理アルゴリズム自体に話題を移します。先に挙げた設計目標のうちの後半の 2 つは、ニューラル・ネットワークを活用すれば、きちんと実現できます (もちろん、元々の計算の問題がこのネットワークで解決できるという前提です)。ニューラル・ネットワークに関する研究は、この数十年であまり行われなくなり、流行ではなくなっています。しかしこの種のアルゴリズムは非常に広く使われており、その応用は光学文字認識やクレジット・スコア (訳注: 消費者個人に与えられる信用評価点のこと。米国で個人の信用度を評価する際に近年特に用いられている。) の作成、天気予報、さらには一部の白物家電の制御など、多種多様です。

すべてのニューラル・ネットワークは最も基本的な形として、相互接続された一定数のノードで構成されています。各ノードは n 個の入力 i1 ... in を持ち、その各入力が、対応する重み付け係数 w1 ... wn と 1 つの出力 O を持ちます。ここで私が割り当てた変数名は私独自のものですが、使っている用語は標準化されたものであることに注意してください。各ノードの出力は、そのノードのシグマ (加算) 関数を (そのノードの) すべての入力に対して実行した結果です。この最も単純なケースは、次のように表現することができます。



科学的に必須なわけではありませんが、ノード入力がデジタル (yes/no) の値を表す場合には、ノード入力は -1 ≤ in ≤ 1 の範囲で変化するものとして定義することが一般的です。重みは任意の実数です。

ニューラル・ネットワークにはいくつかの異なるトポロジーがありますが、最も単純なトポロジーはフィードフォワード・ネットワークとして知られています。そうしたネットワークの実際のニューラル部分は通常、入力レイヤーと隠しレイヤー、そして出力レイヤーという 3 つのレイヤーで構成されます。(下記の図 1 では、それぞれ黄色、緑色、紫色で示されています)。しかし完全なシステムには他にもいくつかの構成部分があり、それを下記の図に示してあります。


図 1. 単純なフィードフォワード・ネットワーク

これらの部分が何を意味するのかを理解するために、紙の上に印刷されたグリフをスキャンし、それらを 3 桁の十進数に変換する光学文字認識システムを考えてみましょう。これはニューラル・ネットワークを利用できる典型的なアプリケーションの種類です (「参考文献」には、このタイプのネットワークを実際に楽しく試せるリンクを挙げてあります)。

このシステムへの入力は、印刷された紙をスキャンした画像です。次に、このシステムは画像を 2 x 3 ブロックのグレー・スケールのピクセルに分割し、各ブロックが 1 つの文字を含むようにします。これが上の図に示した特徴抽出 (Feature extraction) ステップです。このアプリケーションの解像度としては 2 x 3 では十分ではないと思いますが、ここでは単に仮定としてのアプリケーションを議論しています。それに、もっと多くのノードを示そうとすると、図 1 は非常に理解しにくくなってしまいます。

次に、各ピクセルのグレー・スケールの値が 6 つの入力レイヤー・ノードそれぞれに与えられます。各入力レイヤー・ノードの出力は 6 つの隠しレイヤー・ノードそれぞれに供給され、これら 6 つの隠しレイヤー・ノードがその出力を 3 つの出力ノードに供給します。各出力ノードが 0 から 9 までの範囲の数字を出力するものとして出力を定義します。言い換えると、単純に出力の整数部分を取り出し、それを想定される出力コードの適切な桁として使うのです。

各レイヤーに置いたノードの数に関しては、特別な魔術がないことに注意してください。実際、各レイヤーはさらに、いくつかのノードを持つサブ・レイヤーで構成されるのかもしれません。一般的に言って、ノードの数が多ければ多いほど、ネットワークを細かく調整しやすくなります。極端な場合として、重み付けと相互接続の組み合わせを使ってブール・ゲートと等価なものを構築し、「単純な」組み合わせシステムにすることができます。しかしそれでは、ニューラル・ネットワークによるプログラミングの強みを効率的に活用できません。このタイプのアルゴリズムは、ファジーな入力から確率の高い解を推論するための方法として適しているのです。

ここまでは、相互接続がどのように構築されるかを見てきました (これは汎用で制限のない配線計画です。おそらく皆さんは、これらの経路のどれもが、宛先ノードでの入力の重みをゼロにすれば、実質的に削除できることに気付いたと思います)。そしてシグマ関数がどのように実行されるか、また (何らかの意味のある方法を使って) 入力と出力の特性をどう定義するかを見てきました。1 つ重要な部分をまだ説明していません。それが重みです。重みは既知の入力データを使ってネットワークをトレーニングすることで得られ (「参考文献」を参照)、これらの数字を実際に分析しても何ら客観的な意味は得られません。これらの数字は本当に魔術なのです。重みは、その重みが学習される特定のネットワークのコンテキストでしか意味を持ちません。

これがニューラル・ネットワークの魅力であり、この特徴があるために、私達の掲げるいくつかの設計目標に特別に適しているのです。重み自体はまったく不可解な魔法の数字であり、そこからは何も推論することができません。(実際のところ、これが不満の原因になることが時々あります。つまりニューラル・ネットワークを見ても単純なアルゴリズムを抽出することはできません。しかしこれは私達にとっては完璧です。なぜなら、1 つのノードを見ても、さらには多数のノード群を見ても、システムが何をしているのか誰にも推論できないからです。) 同様に、ノードがどのように相互に接続されるかを記述するルーティング情報自体も、それに対応する重み付けがわからない限り、ほとんど意味を持ちません。

ここまで来れば、残っている作業は、デモ用のシステムの構築だけです。この記事のサンプル・コードは、先ほど説明したタイプの単純なノードを実装しています。これは C で作成されていますが、perl や Pascal、Java、さらには bash シェル・スクリプトなど、実質的に任意の言語で非常に容易に作成することができます。この動作は次のとおりです。

各ノードには識別用に固有のシリアル番号が割り当てられます。1 つのホストに対して任意の数のノードを実行することができます。各ノードは i1 から in まで n 個の入力を持ち、それぞれの入力には、w1 から wn までの重みと、その入力を生成するノードのシリアル番号 s1 から sn が関連付けられています。サンプル・コードでは、重みはランダムに割り当てられます (トレーニングされていないネットワークを表します)。また各ノードは、テストを単純にするために、他のすべてのノードが localhost (127.0.0.1) で実行されていると想定しています。実際の環境では、さまざまなホストに特定のシリアル番号を関連付けるために追加のルーティング情報が必要になります。

このシステムは全体として、時間の量子化の概念を持っています。時間は 1 で始まり、信号が 1 つのレイヤーから次のレイヤーに伝達されるごとにインクリメントされます。ノードは、時間 n に対するそのノードの全入力が収集されて加算されるまで、時間 n+1 に対する出力を生成しません。

次のコマンドを使って、デモ用の小さなアプリケーションを起動しましょう。

neurnode a b c

ここで、a はこのノードのシリアル番号であり、b は最初の入力ノードのシリアル番号、そして c は最後の入力ノードのシリアル番号です。例えば、neurnode 100 200 299 はシリアル番号 100 のノードを起動し、このノードにはシリアル番号が 200 から 299 までの 100 ノードが入力されます。このプログラムは Web サーバーのルート・ディレクトリーで実行されると想定していることに注意してください。

毎秒 1 回、各ノードはそのノードの入力を収集しようとします。入力の URL は、その入力に対するソース・ノードのシリアル番号と現在の時刻の値から作られます。例えば、シリアル番号が 20 のノードがあり、その入力がノード 5 から 10、そして現在の時刻の値が 3 とすると、このノードは下記の URL を取得します。

http://127.0.0.1/5-3.txt
http://127.0.0.1/6-3.txt
http://127.0.0.1/7-3.txt
http://127.0.0.1/8-3.txt
http://127.0.0.1/9-3.txt
http://127.0.0.1/10-3.txt

すべての入力が適切に取得されると、プログラムはその出力信号を計算し、その結果を次のレイヤーが (もしあれば) 取得できるように、ファイル「./20-3.txt」に書き込みます。すべての入力の取得ができなかった場合には、プログラムは 1 秒間スリープし、再度同じことを試みます。デモ用のシステムを 1 つの出力と 10 個の中間レイヤー・ノード、そして 10 個の入力で実行するためには、下記のコマンドに従います (Web サーバーのホーム・ディレクトリーで起動することを忘れないでください)。

neurnet 100 1 10 >/dev/null & neurnet 101 1 10 >/dev/null & neurnet 102 1 10 >/dev/null & neurnet 103 1 10 >/dev/null & neurnet 104 1 10 >/dev/null & neurnet 105 1 10 >/dev/null & neurnet 106 1 10 >/dev/null & neurnet 107 1 10 >/dev/null & neurnet 108 1 10 >/dev/null & neurnet 109 1 10 >/dev/null & neurnet 200 100 109

システム全体としての入力側では、ネットワークの最初のレイヤーに必要な入力ファイルを、単純に直接作成する必要があります。このプログラムは ASCII フォーマットの浮動小数点数を 1 つ見つけることを想定しています。それ以外の文字はすべて無視されます。出力側では、任意の Web ブラウザーを使って結果を読み出すことができます。

なぜこのように少し奇妙なプル手法を使ってトランスポート機構を実装したのか、不思議に思う人がいるかもしれません。その理由は、外部の観察者から結果を見えなくするためです。もしノードがプッシュ手法を使ったとすると、どのノードが最終的な出力なのかをルーティング・テーブルから容易に推論できてしまいます。プル手法を使えば、個々のノードは、自分たちが入力レイヤーにいるのか隠しレイヤーにいるのか、あるいは出力レイヤーにいるのかを知ることができません。

また、このプッシュ手法が非常に容易にステガノグラフィー・モジュールに統合でき、他のデータ内でのニューロンのやり取りを隠せることにも注意してください。例えば各ノードの出力を画像ファイルに埋め込んで Web サーバーに保存し、ネットワークの次のホップに取得させることもできます。非常に巧妙なものにしたい場合には、通常は他で起こりえない魔法の検索キーワードを付けて、あるページの中に出力を埋め込み、インターネット上のランダムな場所に置くこともできます。それを取得するには、通常のインターネット検索エンジンを使って、その出力を含んだページを見つけます。(もちろん、これによってメッセージの送達に非常に大きな遅延が発生しますが、興味深い案と言うことができます。)

まとめ

これで、魅力的な性質を持ち、実際に動作する (単純ながら) 標準ベースの分散ニューラル・ネットワークができました。これを完全機能の分散コンピューティング・クライアントにするには、ノードの割り当てとルーティングを行うインフラを追加し、各ノード内で重み付け係数を設定して更新する必要があります。この手法が有効なアプリケーションとしては、広い範囲に存在するデータを収集して処理し、何らかの金銭的な結果を生み出せるシステムが考えられます。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
Sample codewa-wwwits_code.zip2KBHTTP
ダウンロード形式について


参考文献

学ぶために

製品や技術を入手するために

議論するために


著者について

Lewin A.R.W. Edwards は雑誌 Fortune が選ぶ上位 50 社のうちの 1 社で、ワイヤレス・セキュリティーや火災予防機器の設計エンジニアとして働いています。その前には、Digi-Frame Inc. で x86 や ARM、そして PA-RISC ベースのネットワーク・マルチメディア機器の開発に 5 年間携わっていました。彼は暗号化やセキュリティーのソフトウェアに豊富な経験を持ち、組み込みシステム開発に関する 2 冊の本の著者でもあります。連絡先は sysadm@zws.com です。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ