5

バックプロパゲーションを使用した 2 層ニューラル ネットワークの作成に取り組んでいます。NN は、各行に次の情報を保持する 20001x17 ベクトルからデータを取得することになっています。

-最初の 16 個のセルには、0 から 15 までの範囲の整数が格納されており、変数として機能し、これらの変数を見たときにアルファベットの 26 文字のどれを表現するかを決定するのに役立ちます。たとえば、次のような一連の 16 個の値は、文字 A を表すことを意味します: [2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7]。

-17 番目のセルには、必要なアルファベットの文字を表す 1 から 26 までの数字が入ります。1 は A、2 は B などを表します。

NN の出力層は 26 個の出力で構成されます。NN に上記のような入力が与えられるたびに、入力値が表す文字に対応する 1 つのセルを除くすべてにゼロを含む 1x26 ベクトルを出力することになっています。たとえば、出力 [1 0 0 ... 0] は文字 A になり、[0 0 0 ... 1] は文字 Z になります。

コードを提示する前に重要なこと: traingdm 関数を使用する必要があり、隠しレイヤーの番号は (今のところ) 21 に固定されています。

上記の概念を作成しようとして、次の matlab コードを作成しました。

%%%%%%%%
%Start of code%
%%%%%%%%

%
%Initialize the input and target vectors
%
p = zeros(16,20001);
t = zeros(26,20001);

%
%Fill the input and training vectors from the dataset provided
%
for i=2:20001
    for k=1:16
        p(k,i-1) = data(i,k);
    end
    t(data(i,17),i-1) = 1;
end

net = newff(minmax(p),[21 26],{'logsig' 'logsig'},'traingdm');

y1 = sim(net,p);

net.trainParam.epochs = 200;
net.trainParam.show = 1;
net.trainParam.goal = 0.1;
net.trainParam.lr = 0.8;
net.trainParam.mc = 0.2;
net.divideFcn = 'dividerand';
net.divideParam.trainRatio = 0.7;
net.divideParam.testRatio = 0.2;
net.divideParam.valRatio = 0.1;

%[pn,ps] = mapminmax(p);
%[tn,ts] = mapminmax(t);

net = init(net);
[net,tr] = train(net,p,t);

y2 = sim(net,pn);

%%%%%%%%
%End of code%
%%%%%%%%

ここで私の問題:出力を説明どおりにしたい、つまり、たとえば y2 ベクトルの各列は文字の表現にする必要があります。私のコードはそうしません。代わりに、0 と 1 の間、値が 0.1 から 0.9 の間で大きく変化する結果が生成されました。

私の質問は次のとおりです。私がしていない変換を行う必要がありますか? つまり、入力および/または出力データを、NN が正しく学習しているかどうかを実際に確認できる形式に変換する必要がありますか?

任意の入力をいただければ幸いです。

4

4 に答える 4

2

これは正常です。出力層は対数シグモイド伝達関数を使用しており、常に 0 と 1 の間の中間出力が得られます。

通常行うことは、最大の値を持つ出力、つまり最も可能性の高い文字を探すことです。

これは、 のすべての列についてy2、その行の最大値を含む行のインデックスを探していることを意味します。これは次のように計算できます。

[dummy, I]=max(y2);

Iは、各行の最大値のインデックスを含むベクトルです。

于 2009-08-18T16:34:11.057 に答える
1
  1. hardlin fcn出力層で 使用します。
    1. ネットワークの学習にはtrainlmまたはを使用します。trainrp
    2. ネットワークを学習するには、出力とターゲットを比較する for ループと条件を使用します。最適な使用法である場合は、ブレークして学習ループから抜け出します。
    3. mapminmaxデータセットの前処理ではなく、別の方法を使用してください。
于 2011-01-01T06:59:38.037 に答える
1

y2は、各入力が 26 個のアルファベット文字の 1 つである場合の出力確率分布と考えることができます。たとえば、y2の 1 つの列が次のようになっている場合:

.2
.5
.15
.15

その場合、この文字が B である確率は 50% です (可能な出力が 4 つだけであると仮定した場合)。



==備考==

NN の出力層は 26 個の出力で構成されます。NN に上記のような入力が与えられるたびに、入力値が表す文字に対応する 1 つのセルを除くすべてにゼロを含む 1x26 ベクトルを出力することになっています。たとえば、出力 [1 0 0 ... 0] は文字 A になり、[0 0 0 ... 1] は文字 Z になります。

ネットワークの出力をエンコードするために、0,1 のターゲット値を使用することは避けることが望ましいです。
0 と 1 のターゲット値を避ける理由は、'logsig'シグモイド伝達関数が、有限の重みが与えられた場合にこれらの出力値を生成できないためです。正確に 0 と 1 のターゲット値に適合するようにネットワークをトレーニングしようとすると、勾配降下によって重みが際限なく大きくなります。
[0.9,0.04,...,0.04] が文字Aのターゲット出力ベクトルになるように、0 と 1 の値の代わりに、たとえば 0.04 と 0.9 の値を使用してみてください。


参照:
Thomas M. Mitchell、機械学習、McGraw-Hill Higher Education、1997 年、p114-115

于 2009-08-19T04:21:14.110 に答える
0

これが実際の答えを構成するかどうかはわかりませんが、ここにいくつかの注意事項があります。

  • あなたのコーディングスキームがわかりません。「A」はその一連の数字としてどのように表されますか? 任意の数値を使用してカテゴリ値をコーディングするという、かなり一般的なトラップに陥っているようです。これを行わないでください: たとえば、'a' が 1、'b' が 2、'c' が 3 の場合、'a' は 'c' よりも 'b' に似ていると暗黙のうちに宣言されています (なぜなら、ネットワークには、順序プロパティが重要な実数値入力があります)。これを適切に行う方法は、各文字を 26 のバイナリ値の入力として表し、文字を表す 1 つのみがアクティブになるようにすることです。
  • あなたの出力は正しいです。出力層でのアクティベーションは0または1ではなく、実数になります。最大値をアクティビティ関数として使用できますが、これは微分可能ではないため問題があり、バックプロップを使用できません。あなたがすべきことは、合計が1になるように出力をソフトマックス関数と結合することです。必要に応じて、出力を入力に対する条件付き確率として扱うことができます。ネットワークは明示的に確率論的ではありませんが、適切なアクティビティとアクティベーション関数を使用すると、構造が対数線形モデル (おそらく隠れ層に対応する潜在変数を含む) と同じになり、人々は常にこれを行います。

デビッド・マッケイの教科書を参照して、確率論的接続を明確にするニューラル ネットワークの紹介を参照してください。Geoff Hinton のグループのこの論文を見てください。正しい表現とアクティベーション/アクティビティ関数の詳細については、コンテキストを考慮して次の文字を予測するタスクについて説明しています (ただし、彼らの方法は自明ではなく、異なるトレーニング方法)。

于 2013-03-19T10:02:44.857 に答える