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

バック・プロパゲーション・アルゴリズムによるパターン学習

ニューラル・ネットは、コンピューティングの未来像かもしれません。ニューラル・ネットを 使ってひとつの問題を解くことによって、ニューラル・ネットを理解することができます。その 問題とは、このようなものです。C、C++、Java、Python のうちのいずれかによる 500 文字の コードがあると想定し、そのコードの言語が何であるか特定するためのプログラムを作ります。そのための 1 つのソリューションとして挙げられるのが、これらの言語を特定する方法を学習す るニューラル・ネットの構築です。この記事では、ニューラル・ネットの基本的特徴およびその 構築方法について示します。これによって、皆さんは、自分自身のコーディングにニューラル・ ネットを応用することができるようになるでしょう。

Andrew Blais, Author, Gnosis Software, Inc.

Andrew Blais は、息子を自宅で教育すること、Gnosis のために執筆すること、および Anna Maria College で哲学と宗教を教えることに時間を割いています。



David Mertz, Ph.D, Author, Gnosis Software, Inc.

David Mertz 氏は多くの分野で活躍しています。ソフトウェア開発や、それについて著述もしています。その他、学術政策理念について分野を問わず、関係する雑誌に記事も書いています。かなり以前には、超限集合論、ロジック、モデル理論などを研究していました。その後、労働組合組織者として活動していました。そして、David Mertz 氏自身は人生の半ばにもまだ達していないと思っているので、これから何かほかの仕事をするかもしれません。



2001年 7月 01日

人間の脳に関して簡単に説明すると、まず、脳は約 100 億個のニューロンを持っています。そし て、1 個のニューロンは、平均して数千のその他のニューロンとつながっています。ニューロン は、これらの接続を介してさまざまな量のエネルギーを送ったり受け取ったりしています。ニューロンの持つきわめて大きな特徴のひとつは、ニューロンはエネルギーを受け取ってもすぐ には反応しないということです。ニューロンは、受け取ったエネルギーを蓄積し、その蓄積が特 定のしきい値に達したときにそのエネルギーを他のニューロンに送ります。脳は、これらの接続 の数と強さを調整しながら学習を行っていきます。これは、生物学上の事実を簡単に示したもの ですが、ニューラル・ネットの特徴をうまく示しています。

Threshold Logic Unit (TLU、しきい値論理ユニット)

ニューラル・ネットを理解するための最初のステップは、生物学におけるニューロンの働きを大 まかに理解し、その特徴である Threshold Logic Unit (TLU) を理解することです。TLU とは、重 み付けのされた数量を複数インプットし、それらの数量を合計して、その合計が、あるしきい値 に達するか上回った時点でその数量をアウトプットするオブジェクトです。この特徴にラベル付 けをしてみましょう。まず、インプットを X1、X2、…、Xnとし、それらの重み付けを W1、W2、…、Wnとします。次に、Xi*Wiを合計すると活性化レベル a になります。つまり、以下の ようになります。

a = (X1 * W1)+(X2 * W2)+...+(Xi * Wi)+...+ (Xn * Wn)

このしきい値を theta (シータ) といいます。最後に、アウトプットを y とします。a ≧ theta のと きは y=1 となり、それ以外のときは y=0 となります。アウトプットは、スカッシング関数 s (ま たはシグマ) (a を引数として、出力が0と 1 の間である) によって決定することも可能であるため、不連続 である必要はありません。そのとき、y=s(a)となります。

図 1. Threshold Logic Unit とシグマ関数 (上) およびカットオフ関数 (下)
Threshold Logic Unit とシグマ関数 (上) およびカットオフ関数 (下)

TLU では分類が可能です。2 つのインプットがあり、両方のインプットの重みが 1 に等しく、theta が 1.5 に等しい TLU があると想定します。この TLU が <0,0>、<0,1>、<1,0>、<1,1>をイン プットすると、それぞれ 0、0、0、1 がアウトプットされます。この TLU は、これらのインプッ トを「1 グループ」と「0 グループ」の 2 つのグループに分類します。論理積 (ブール代数の AND) の知識を持つ人間の脳が、論理的に結合した文に対して分類を行うのと同じように、この TLU は論理積というものを理解することができます。

この TLU は、幾何学的解釈によって現象をとらえます。TLU の 4 つのインプットは、直交グラ フ上の 4 点に対応しています。X1*W1+ X2*W2 = theta (TLU の分類が切り替わる点) という式か ら、X2 = -X1 + 1.5 が得られます。この式のグラフは、TLU の分類に対応する 2 つの空間に、こ の 4 つのインプットを分割します。これは、TLU に関する一般的原則の 1 つの例です。TLU が 任意の数のインプット「N」を持つ場合は、考えられるインプットのセットは、N 次元空間の点 のセットに対応します。これらの点のセットを超平面、つまり上記の例の線に対応する N 次元 幾何学図形によって分割することができる場合は、その分割と分類が一致する TLU を定義する ためのしきい値と重み付けがあります。


TLU の学習方法

TLU は、分類を行うことができ、学習能力を持っています。また、ニューラル・ネットもその 学習能力を特徴としています。これらの学習メカニズムは、脳における神経接続の調整メカニズ ムをその手本としています。TLU は、重みとしきい値を変化させることによって学習します。実際、数学的な観点からは、重みとしきい値の区別は幾分あいまいです。TLU が 0 ではなく 1 をアウトプットする臨界点は、SUM(Xi * Wi) ≧ theta のときであることを思い出してください。これは、臨界点は、SUM(Xi * Wi) + (-1 * theta) ≧ 0 のときであると言うことと同じです。した がって、-1 を定数入力として扱うことができます。その重み theta は、学習 (専門用語では「ト レーニング」) 過程で調整されます。この場合は、SUM(Xi * Wi) + (-1 * theta) ≧ 0 のときは y=1 で、そうでないときは y=0 です。

トレーニング中、ニューラル・ネットは以下のものをインプットします。

  1. 一連の分類項目例
  2. それらの正しい分類およびターゲット

そのようなインプットは、ベクトル <X1, X2, ..., Xn, theta, t>と見なすことができます。ここでは、ターゲットまたは正しい分類を指します。ニューラル・ネットは、これらのベクトルを使って重 みを修正し、トレーニング・セットにおいて分類をターゲットに合わせようとします。より正確 に言えば、これは、管理のないトレーニングではなく、管理されたトレーニングです。管理され たトレーニングはターゲットのある例に基づくものであり、管理のないトレーニングは統計解析 に基づくものです (この記事の最後の参考文献を参照)。重みの修正はルール学習の後に行われま す。理想的な学習アルゴリズムの例として、以下のようなものがあります。

リスト 1. 理想的な学習アルゴリズムの例
fully_trained = FALSE
DO UNTIL (fully_trained):
    fully_trained = TRUE
    FOR EACH training_vector = <X1, X2, ..., Xn, theta, target>::
# Weights compared to theta
        a = (X1 * W1)+(X2 * W2)+...+(Xn * Wn) - theta
        y = sigma(a)
        IF y != target:
            fully_trained = FALSE
        FOR EACH Wi:
        MODIFY_WEIGHT(Wi)# According to the training rule
    IF (fully_trained):
        BREAK

おそらく皆さんは、「どのようなトレーニング・ルールなのか」と疑問に思うことでしょう。た くさんのルールがありますが、考えられるルールのひとつとして、重みとしきい値の修正が (t - y) の何分の 1 かに決められるべきであるという原理に基づくルールがあります。これは、学習率 と呼ばれる alpha (アルファ) (0 < alpha < 1) の導入により実現することができます。Wiの変化は、(alpha * (t - y) * Xi) に等しくなります。ニューラル・ネットは、alpha が 0 に近いときはわずかな 重み修正を行い、alpha が 1 に近いときには、より大幅な重み修正を行います。このルールを用 いるニューラル・ネットはパーセプトロンとして知られており、また、このルールはパーセプト ロン学習ルールと呼ばれます。パーセプトロンに関する 1 つの点として、1962 年に Rosenblatt 氏 (参考文献を参照) は、N 空間の点のセットが超平面によって分割された場合は、パーセプトロ ン・トレーニング・アルゴリズムを使うと、結果として、超平面が分割する TLU を定義するた めの重み分配になるということを示しました。もちろん、ケインズを引き合いに出せば、結局私 たち皆どうしようもなくなります。しかし、ニューラル・ネットでは、インプットにおける空間 での分割を複数行うこともできるため、問題点は計算時間のみに限られないことになります。

最初に示したコード言語の例でこれを説明しましょう。C、C++、Java、Python のいずれかの コードが N 文字与えられたと想定します。この問題では、コードの言語を特定するプログラム を作るという課題が与えられています。TLU によってこれを行う場合、インプットの空間にお いて複数の分割を行う必要があり、この空間を 4 つの領域 (各言語ごとに 1 つの領域) に分割する 必要があります。これは、2 回の分割を行うようニューラル・ネットをトレーニングすることに よって行うことができます。1 つの分割によって C/C++と Java/Python とを分け、もう 1 つの分割 によって C/Java と C++/Python とを分けます。このような分割を行えるネットであれば、ソー ス・コード・サンプルの言語を特定することができます。しかしそれには、異なったネット構造 が必要です。どのような違いが必要であるかを説明する前に、まず、検討が必要となる事項につ いて簡単に説明しましょう。

図 2. 初歩的 (充分なものではない) なパーセプトロン学習モデル
初歩的 (充分なものではない) なパーセプトロン学習モデル

計算時間の点では、N 文字のコードの取り込み、可視の ASCII 文字 (コード 32?127) の出現回数 のカウント、それらのカウントとコード言語に関するターゲット情報に基づいたニューラル・ ネットのトレーニングを行うことは不可能です。これを解決するために、文字カウントを、C、C++、Java、Python のコード中で最も頻繁に出現するアルファベット以外の 20 文字に限定しまし た。また、浮動小数点計算を考慮して、正規化因子によってこれら 20 の文字カウントを分割し ネットをトレーニングすることにしました。構造上の違いは明らかです。それは、ネットに 20 個のインプット・ノードがあるという点です。しかし、これは前の説明で既にその可能性が示 されているため、驚くほどのことではありません。もっとおもしろい違いは、1 組の中間ノード N1 と N2 であり、アウトプット・ノード数が 2 個から 4 個 (O1?O4) に増加している点です。

C か C++であると判断した場合には y1=1 と設定し、Java か Python であると判断した場合には y1=0 と設定するように N1 をトレーニングします。N2 も同様のトレーニングによって、C か Java であると判断した場合には y2=1 と設定し、C++か Python であると判断した場合には y2=0 と設定するようにします。さらに、N1 と N2 は Oi に対して 1 または 0 をアウトプットします。したがって、N1 が C または C++であると判断し、N2 が C または Java であると判断した場合に は、このコードは C であることが分かります。あるいは、N1 が C または C++であると判断し、N2 が C++または Python であると判断した場合には、このコードは C++であることになります。このように、パターンはきわめて簡単です。では、Oi が以下の表に基づいて 0 または 1 をアウ トプットするようにトレーニングを受けたと想定しましょう。

アウトプット (ブール関数) と中間ノードの対応
N1N2O1 (C)O2 (C++)O3 (Java)O4 (Python)
000001
010010
100100
111000

これがうまく機能すれば、ネットによるコード・サンプル言語の特定ができるということになり ます。これはすばらしいアイデアであり、きわめて広範な分野に対する応用が可能でしょう。こ のソリューションでは、C/C++と Java/Python のインプットは 1 つの超平面で分割され、また、C/Java と C++/Python のインプットはもう 1 つの超平面で分割されることを前提としています。しかし、インプット空間に関するこのような前提を必要としないネット・トレーニングの方法も あります。


デルタ・ルール

もう 1 つのトレーニング・ルールはデルタ・ルールです。パーセプトロン・トレーニング・ルー ルは、ターゲットとアウトプットの差の何分の 1 かが最も適切な重み修正であるという原理に基 づいていますが、一方、デルタ・ルールは勾配降下法に基づくものです。この難解な数学的概念 の説明として、次のような例がよく用いられます。ある場所から南へ向かう道は東へ向かう道よ りも傾斜が急です。東に歩いていけば崖から遠ざかりますが、南に行けばゆるやかに傾斜した稜 線に沿って歩くことができます。西に行くと傾斜の急な丘を登ることになり、北に行けば平地に 着きます。のんびりと散歩をしたいだけであれば、通る場所全体で最も険しくない道をルートと して選びます。これと同様に、ニューラル・ネットは重み修正を行うことにより、誤差を最小に する重みの配分を選択することができます。

ネットに隠れたノードがないようにすることが必要ですが、おそらく複数個のアウトプット・ ノードがあるため、p をトレーニング・セットの要素とし、t(p,n) を、対応するアウトプット・ ノード n のターゲットとします。ただし、y(p,n) は、上記のスカッシング関数 s によって決定さ れるものとします。ここで、a(p,n) は p に対する n の活性化であり、y(p,n) = s( a(p,n) )、つまり、p に対するノード n のスカッシングされた活性化です。また、ネットに対して重み (各 Wi) を設定 すると、すべての p と n に対して t(p,n) と y(p,n) の差が設定されます。これは、すべての p に対し てネット全体の誤差が設定されることを意味します。したがって、重みのどのセットに対しても 平均誤差があります。ただし、デルタ・ルールでは、平均および誤差に関して改善が施されてい ます。ここでは、詳細には触れず、ある p と n に対する誤差は、&frac12 * square( t(p,n) - y(p,n) ) である とだけ述べておくことにします (参考文献を参照)。したがって、Wi ごとに以下のような平均誤差 が生じます。

リスト 2. 平均誤差を見つける
sum = 0
FOR p = 1 TO M:# M is number of training vectors
    FOR n = 1 TO N:# N is number of output nodes
        sum = sum + (1/2 * (t(p,n)-y(p,n))^2)
average = 1/M * sum

デルタ・ルールの定義は、この誤差の定義によって行われます。誤差は、すべてのトレーニン グ・ベクトルによって説明されるため、デルタ・ルールは、特定の重みのセットとベクトルに よって重みを変更し、誤差が最小になるパスをニューラル・ネットが選ぶようにするアルゴリズ ムです。ここでは、このアルゴリズムの基礎となる計算については取り上げません。任意の Wi に対する変更は、以下のとおりであると述べるだけにとどめます。

alpha * s'(a(p,n)) * (t(p,n) - y(p,n)) * X(p,i,n).

X(p,i,n) はノード n にインプットされる p の i 番目の要素であり、すでに説明したように、alpha は学習率です。最後に、s'( a(p,n) ) は、p に対する n 番目のノードの活性化におけるスカッシング 関数の変化率 (微分係数) です。これがデルタ・ルールです。alpha が小さければ、重みベクトルは 誤差が最小になるベクトルに近づくということを Widrow 氏と Stearns 氏 (参考文献を参照) は示 しました。重み修正のためのデルタ・ルール・ベースのアルゴリズムは、以下のとおりです。

下方勾配 (誤差が充分に縮小されるまで行う)
ステップ 1:トレーニング・ベクトル p ごとに、a(p) を見つける
ステップ 2:i ごとに、以下の式によって Wi を変更する
            alpha * s'(a(p,n)) * (t(p,n)-y(p,n)) * X(p,i,n)

パーセプトロン・アルゴリズムとの大きな違いがいくつかあります。重み変更の式は、明らかに 大きく異なった解析を基としています。デルタ・ルール・アルゴリズムは、常に重みを変更し、アウトプットではなく活性化に基づくものです。最後に、これが隠れたノードを持つネットにど の程度当てはまるのかは明らかになっていません。


バック・プロパゲーション

バック・プロパゲーションは、デルタ・ルールのベースとなっている解析を、隠れたノードを持 つニューラル・ネットにまで拡張するアルゴリズムです。これを理解するために、次の例を用い て考えましょう。Bob が Alice にある話を伝え、次にその話を Alice が Ted に伝えたとします。事実を確認した Ted は、その話が間違っていることに気づきました。したがって Ted は、その誤 りのうち、どの程度が Bob に原因がありどの程度が Alice に原因があるのかを突き止める必要が あります。アウトプット・ノードが隠れたノードからのインプットを受け入れ、それが誤りであ ることをネットが認識して、その重みを調整する場合、その誤り全体に各ノードがどの程度影響 しているかを見つけ出すアルゴリズムが必要となります。ネットは「だれのせいで問題が発生し たのか。どの程度の問題なのか。どのように修正すればよいのか」を知る必要があります。ネッ トは何を行うべきなのでしょうか。

図 3. バック・プロパゲーションによるニューラル・ネットワーク「Code Recognizer」
バック・プロパゲーションによるニューラル・ネットワーク「Code Recognizer」

バック・プロパゲーション・アルゴリズムもまた、傾斜降下法をそのベースとしているため、重 み修正の解析における唯一の変更点は、t(p,n) と y(p,n) との差に関するものです。通常、Wiの変 更は以下のようなものです。

alpha * s'(a(p,n)) * d(n) * X(p,i,n)

ここで、隠れたノード n に対する d(n) は、(1) n による任意の指定アウトプット・ノードへの影響 の度合い、および (2) そのアウトプット・ノード自体のネット全体の誤差への影響の度合いに依 存しています。一方、n がアウトプット・ノードに影響を与えれば与えるほど、n はネット全体 の誤差に影響を与えます。逆に、アウトプット・ノードが全体の誤差にそれほど影響を与えてい ない場合には、それに応じて n の影響は小さくなります。d(j) が、アウトプット・ノード j によ るネット全体の誤差への影響を表し、W(n,j) が、n が j に与える影響を表す場合、d(j) * W(n,j) は、これら 2 つの影響を組み合わせたものです。ただし、n はほとんどの場合、複数のアウトプッ ト・ノードに影響を与えており、また、すべてのアウトプット・ノードに影響を与えている場合 も考えられます。したがって、d(n) は以下のようになります。

すべての j に対して、SUM(d(j)*W(n,j))

ここで、j は n からのインプットを受け取るアウトプット・ノードです。以上をまとめたものが トレーニング・ルールとなります。パート 1:隠れたノード n とアウトプット・ノード j の間の 重みの変化は、以下のとおりです。

alpha * s'(a(p,n))*(t(p,n) - y(p,n)) * X(p,n,j)

パート 2:インプット・ノード i とアウトプット・ノード n の間の重みの変化は、以下のとおり です。

alpha * s'(a(p,n)) * sum(d(j) * W(n,j)) * X(p,i,n)

ここで、j は、n からのインプットを受け取るすべてのアウトプット・ノードにおいて変化しま す。なお、バック・プロパゲーション・アルゴリズムの基本的なアウトラインは、以下のとおり です。

小さな乱数値に合わせて Wi を初期化します。

誤差が充分に縮小されるまで行うステップ
ステップ 1 : トレーニング・ベクトルをインプット
ステップ 2 : 隠れているノードがそのアウトプットを計算
ステップ 3 : ステップ 2 に基づいてアウトプット・ノードがアウトプットを計算
ステップ 4 : ステップ 3 の結果とターゲットとの差を計算
ステップ 5 : ステップ 4 の結果を使って、トレーニング・ルールのパート 1 を適用
ステップ 6 : 隠れたノード n ごとに d(n) を計算
ステップ 7 : ステップ 6 の結果を使って、トレーニング・ルールのパート 2 を適用

ステップ 1?3 を「フォワード・パス」、ステップ 4?7 を「バックワード・パス」と言うことが あります。それが、バック・プロパゲーションという名前の理由です。


動作確認

バック・プロパゲーション・アルゴリズムが作成できたので、ソース・コード・サンプルの言語 の特定に取りかかることができます。ここで用いるソリューションでは、Neil Schemenauer 氏の Python モジュール bpnn (参考文献を参照) を拡張して使用します。彼のモジュールは驚くほど簡 単に使うことができます。クラス NN をカスタマイズしてクラス NN2 としましたが、プロセ スのプレゼンテーションとアウトプットを変更したのみで、アルゴリズムの変更は行っていませ ん。基本コードは以下のとおりです。

リスト 3. bpnn.py によってニューラル・ネットワークをセットアップ
# Create the network (number of input, hidden, and training nodes)
net = NN2(INPUTS, HIDDEN, OUTPUTS)
# create the training and testing data
trainpat = []  
testpat = []  
for n in xrange(TRAINSIZE+TESTSIZE):
#... add vectors to each set
# train it with some patterns
net.train(trainpat, iterations=ITERATIONS, N=LEARNRATE, M=MOMENTUM)
# test it
net.test(testpat)
# report trained weights
net.weights()

もちろん、インプット・データが必要です。ユーティリティー code2data.py でインプット・デー タが提供されています。インターフェースは簡単です。まず、さまざまな拡張子を持つソース・ ファイルをサブディレクトリー ./code に入れます。次に、これらの拡張子をオプションとして後 ろに付けてこのユーティリティーを実行します。以下はその例です。

python code2data.py py c java

結果として、 STDOUT にベクトルの集合がアウトプットされますが、それを別のプロセスに繋 ぐこともでき、また、ファイルにリダイレクトすることもできます。このアウトプットは以下の ようなものです。

リスト 4. Code2Data のアウトプット・ベクトル
0.15 0.01 0.01 0.04 0.07 0.00 0.00 0.03 0.01 0.00 0.00 0.00 0.05 0.00 > 1 0 0
0.14 0.00 0.00 0.05 0.13 0.00 0.00 0.00 0.02 0.00 0.00 0.00 0.13 0.00 > 1 0 0
[...]

インプットした値はさまざまな特殊文字の出現回数を正規化した数であることを思い出してくだ さい。ターゲット値 (大なり記号の後ろ) は、これらの文字を含むソース・コード・ファイルのタ イプを YES/NO (はい / いいえ) で表しています。しかし、どの値がどのタイプを表すかに関して はあまり明確ではありません。これは実によいことで、どのようなものにでもデータを設定する ことができ、インプットとターゲットの生成ができるということです。

次のステップでは、実際に code_recognizer.py プログラムを実行します。プログラムを実行する と、(STDIN に) 上記のようなベクトルの集合が表示されます。プログラムには、実際のインプッ ト・ファイルに基づいて必要なインプット・ノード (カウントとターゲット) 数を推定するラッ パーがあります。隠れたノードの数を決める際にはちょっとした工夫がいるようで、ソース・ コードの認識では、隠れたノードの数が 6?8 の場合にきわめてうまく動作します。ネットのさ まざまなオプションを試してみる場合には、コマンドラインですべてのパラメーターをオーバー ライドすることができます。ただし、そのような試験には時間がかかる可能性があります。 code_recognizer.py によって (大きな) テスト結果ファイルが STDOUT にアウトプットされますが、これはあまり役には立たず、簡単なメッセージがいくつか STDERR にアウトプットされます。したがって通常は、テスト結果を確実に保存するためのファイルとして STDOUT を保存し、経 過および結果の概要を知るには STDERR を参照することになります。

リスト 5. code_recognizer.py の実行
> code2data.py py c java | code_recognizer.py > test_results.txt 
Total bytes of py-source: 457729 
Total bytes of c-source: 245197 
Total bytes of java-source: 709858 
Input set: ) ( _ . = ; " , ' * / { } : - 0 + 1 [ ] 
HIDDEN = 8 
LEARNRATE = 0.5 
ITERATIONS = 1000 
TRAINSIZE = 500 
OUTPUTS = 3 
MOMENTUM = 0.1 
ERROR_CUTOFF = 0.01 
TESTSIZE = 500 
INPUTS = 20 
error -> 95.519... 23.696... 19.727... 14.012... 11.058... 9.652...  
8.858... 8.236... 7.637... 7.065... 6.398... 5.413... 4.508...  
3.860... 3.523... 3.258... 3.026... 2.818... 2.631... 2.463...  
2.313... 2.180... 2.065... 1.965... 1.877... 1.798... 1.725...  
[...] 
0.113... 0.110... 0.108... 0.106... 0.104... 0.102... 0.100...  
0.098... 0.096... 0.094... 0.093... 0.091... 0.089... 0.088...  
0.086... 0.085... 0.084... 
Success rate against test data: 92.60%

誤差の減少は指標として使用でき、長時間にわたる処理において進捗を示す役割も果たしていま す。最終的な結果はすばらしいものです。私たちが見るところ、ネットはそのコード認識という ジョブをきわめて立派に果たしています。皆さんのデータ・ベクトルでの結果もぜひお聞きかせ ください。


要約

皆さんが自分自身のコーディングに応用することができるように、ニューラル・ネットの基本を 説明しました。この記事で学んだことを取り入れて、是非、ここで示したコード識別のためのソ リューションをそれぞれ作成してみてください (ここで示されたソリューションに関しては参考 文献を参照)。

参考文献

  • ここで紹介された Code Recognizer プログラムは、Neil Schemenauer 氏のバック・プロパゲーション・モジュールをベースとしています。
  • 管理されたトレーニングと管理のないトレーニング、および一般的なニューラル・ネットとの違いについては、『Machine Learning, Neural and Statistical Classification』 (D. Michie、D.J. Spiegelhalter、C.C. Taylor 編集) (第 6 章) をご覧ください。
  • パーセプトロンに関する Rosenblatt 氏の研究に関しては、著書『Principles of Neurodynamics』 (1962 年、New York、Spartan Books) をご覧ください。
  • デルタ・ルールの詳細については、Kevin Gurney 氏の優れた著書『An Introduction to Neural Networks』 (1997 年、London、Routledge) をご覧ください。
  • デルタ・ルールに関する証明については、B. Widrow、S.D. Stearns 共著『Adaptive Signal Processing』 (1985 年、New Jersey、Prentice-Hall) をご覧ください。
  • GUI によるパーセプトロンの実装については、『The Perceptron』 (Omri Weisman、Ziv Pollack 共著) をご覧ください。
  • FAQ のないテーマがあるでしょうか。とても役に立つ NeuralNet FAQ をご覧ください。
  • 幅の広いリンク集が必要なときは、TheBackpropagator's Review をご覧ください。
  • NeuralNetworking Software には、GUI を備えたニューラル・ネットのコードがあり、DOS、Linux どちらにも対応します。
  • developerWorks のその他の Linux 参考文献をご覧ください。
  • developerWorks のその他のオープン・ソース参考文献をご覧ください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=226888
ArticleTitle=ニューラル・ネットワーク入門
publish-date=07012001