コンテンツへスキップ

意識する機械を作る話の続き

ちょっと前の日記を読み返して、意識する機械の話を読み返しました。で、おそらく意識する機械のためのLSIとして、FPGAと呼ばれる、ユーザがプログラムできるゲートアレー(大規模な論理回路)が適当じゃないか、なんてことを書いていますけど、最近、FPGAをちょくちょく扱っておりまして、その内容もわかってきましたので、ここでもう少し具体的に、ニューロンの作り方を議論しましょう。

まず、シナプスに加わる刺激と、コレに掛かる係数を、3ビットの指数部と符号ビットで表します。指数部がオール1の場合はゼロであるという約束にしておきます。そうすると、1から2の6乗までの正負の数を倍々の刻みで表すことが出来ます。この掛け算は足し算で行うことが出来ます。符号は同じならプラス、違えばマイナスですね。ただし、指数部がオール1の場合は結果もオール1にします。これは、ゼロをかける演算です。ニューロンは全てのシナプスが受ける刺激の和を計算します。この和は16ビットの符号付整数に収まるでしょう。

ニューロン一つあたり8千のシナプスがあるなら、8千の3ビット加算器と16ビット加算器が必要になり、192,000のロジックエレメントが必要になります。このようなチップの値段、数十万円といったところでしょうかね。係数はRAMに保持されるのですが、その容量は32kビット、この程度のメモリーは、20万ロジックエレメントのFPGAなら持っているでしょう。

加算結果はシグモイド関数の演算を行いますが、コレは一つだけで済みますので、たいしたゲートは要りません。その結果は、指定されたニューロン番号とシナプス番号を付けて、送信モジュールにスタックします。送信モジュールは外部のメモリーにコレを送り、ストアしとくわけですね。で、そのニューロンの計算を行う番になったら、刺激と係数をFPGAに送ってやるんですね。

ま、これは一番簡単な方法ですけど、もう少しうまい構成が出来そうです。

まず、データを受け取る側のチップを、メモリ論理混成チップにします。で、受け取った所で乗算し、加算します。そうすれば、個々の信号の記憶は必要なく、後での乗算も不要になりますし、加算も不要になりますね。ニューロンの演算はシグモイド関数の計算だけですけど、これも受信側のチップに入れてしまいましょう。また、結果を送るべきニューロンとシナプスのアドレスも同じチップに入れておきます。そうすると、これだけで全てが構成できる。

受信したデータはスタックしておいて、一つづつ計算することにすれば、乗算用の3ビット加算器も、累積用の16ビット加算器も一つで済みます。比較的安価な1万論理エレメントのチップでも、500ほどのニューロンを組み込めそうです。ただし、係数の記憶に、4ビット×8千×500のメモリーが必要になりますので、2MB程度の記憶領域が必要になるほか、送信先のアドレスが必要です。

ふーむ、140億個のニューロン、2800万個のFPGAが要りますね。これ、一つ1万円として、2800億円! ちょっと高いですね。ま、10億のニューロンで良いなら、200億、これでも高いけど、昔の見積もりに接近してきましたね。