2

NNとバックプロパゲーションでthis tutorialに従っています。バックプロパゲーションのスケーリング

私はPythonの初心者です。コードをMATLABに変換しようとしています。 誰かが親切に(チュートリアルから)次のコード行を説明できます:要するに

delta3[range(num_examples), y] -= 1 

を、私は間違っていないよ場合、delta3yはベクトルであり、num_examplesは整数です。

delta3=probs-ythis math exchange entryのように私は理解しています(ありがとう@レイリーン)。なぜ、いつ1を引くべきですか?

他にも誰かが私をオンラインサイトに誘導できますか?コードを実行してそのコードに従うことはできますか?

:(おそらくインポート私が行方不明です)「NameError:定義されていない名 『sklearn』が」

+1

'delta3'は何ですか? 'NameError'は' sklearn'が見つからないことを意味していますので、正しく 'import'しなかったでしょう。 –

答えて

3

この行:delta3[range(num_examples), y] -= 1はの一部である私は、私は(私の自宅のPCを含む)を実行しようとしたどこにでもエラーを得ていましたソフトマックス損失関数の勾配を計算する。私はこの損失関数がどのように定式化されているか、その背後にある直感の詳細について、あなたにこの素晴らしいリンクを紹介します:http://peterroelants.github.io/posts/neural_network_implementation_intermezzo02/

さらに、私はsoftmax損失の勾配がどのように導出されるかを示す数学的スタックエクスチェンジに関するこの記事を参照してください:https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function。最初のリンクを深いダイビングとして考えてください。一方、2番目のリンクは最初のリンクのtl;drです。

ソフトマックス損失関数の勾配は、出力レイヤーがバックプロパゲーションアルゴリズムを続行する前に、レイヤーに逆方向に伝播する必要がある出力レイヤーの勾配です。

上記のリンクをまとめたので、訓練例のsoftmaxの勾配の勾配を計算すると、各クラスの損失の勾配は単純にそのクラスで評価されたsoftmaxの値になります。さらに、実際のトレーニングサンプルが属するクラスの損失値を1つ減算する必要があります。 iの例の勾配は、p_i - y_iに等しく、ここで、p_iは、例のクラスiのsoftmaxスコアであり、y_iは、ワンホットエンコーディングスキームを使用する分類ラベルです。具体的には、y_i = 0の場合、iは例の真のクラスではない場合はy_i = 1です。 delta3には、ミニバッチの例ごとにsoftmax loss関数の勾配が含まれています。具体的には、行の総数が訓練例の数と等しい2次元行列、または列の数がクラスの総数である場合はnum_examplesです。

まず、各トレーニング例と各クラスのsoftmaxスコアを計算します。次に、グラディエントの各行について、例が属する真のクラスに対応する列の位置を決定し、スコアを1だけ引きます。0からnum_examples - 1にリストを生成し、yには例ごとの真のクラスラベルが含まれます。したがって、range(num_examples)yの各ペアに対して、右の行と列の位置にアクセスして1を引いて、損失関数の勾配を確定します。

数学スタックエクスチェンジのポストとあなたの理解では、グラデーションはdelta3 = probs - yです。これはyprobsと同じサイズを有し、yの行ごとに、それが1に設定されている適切なクラスが含まれている列インデックスの除くすべてゼロであることを意味し、yワンホット符号化行列であることを前提としていしたがって、正しく考えると、行列yを生成した場合、各行に対して、その例が属するクラス番号を除いて列がすべて0になる場合は、各行の右の列にアクセスしてスコアを減算することと同等です

MATLABでは、この減算を容易にするために線形インデックスを作成する必要があります。具体的には、あなたは、線形インデックスにこれらの行と列の位置を変換するsub2indを使用する必要があり、我々は勾配マトリックスにアクセスし、そこで1

て値を減算することができる:Pythonのチュートリアルで

ind = sub2ind(size(delta3), 1 : num_examples, y + 1); 
delta3(ind) = delta3(ind) - 1; 

あなたクラスラベルは0からN-1までと仮定され、ここでNはクラスの総数です。 1から始まる配列のインデックス付けをMATLABで開始する必要がありますので、0の代わりに1でラベルが始まるように、上記のコードで1yに追加しました。 indには、アクセスする必要がある行と列の位置の線形インデックスが含まれているため、これらのインデックスを使用して減算を完了します。あなたがあなたの編集から得た知識を使って、これを策定した場合

、あなたの代わりにこれを行うだろう:

ymatrix = full(sparse(1 : num_examples, y + 1, 1, size(delta3, 1), size(delta3, 2)); 
delta3 = probs - ymatrix; 

ymatrixは、私は、各行が全てで例に対応する場所について話しましたマトリックスが含まれています例が属しているクラスに関連する列を除いて0です。これまでに見たことがないものは、sparsefullです。 sparseを使用すると、ゼロ行列を作成することができます。また、ゼロ以外の行と列の位置と、これらの位置のそれぞれが使用する値を指定することができます。この例では、行ごとに1つの要素にアクセスし、例のクラスIDを使用して列にアクセスし、これらの場所のそれぞれを1に設定しています。また、クラスを想定しているので、これはsparseの行列なので、sparseという形式で表現するのではなく、数値の行列を与えるためにfullに変換します。したがって、このコードは、私が示した前のコードスニペットと同じです。ただし、勾配計算を容易にするために追加の行列を作成しないので、最初の方法で行う方が効率的です。その代わりにグラデーションを修正しています。追記として


sklearnscikit-learn Pythonの機械学習パッケージである、とNameErrorは、インストール実際のパッケージを持っていないに言及しています。

pip install sklearn 

か:しかし

easy_install sklearn 

、scikitあなたのコマンドラインで、それはのように簡単ですので、それをインストールするには、....お使いのコンピュータにPythonパッケージをインストールするpipまたはeasy_installを使用上記の減算コードを実行するには、-learnは必須ではありません。あなたはNumPyが必要ですが、そのパッケージがインストールされていることを確認してください。 pipについては

pip install numpy 

...とeasy_install用:

easy_install numpy 
+0

私は 'y_i'の構造や理由を把握していないので、私はこれを理解するのが難しいと思っています。私の移植では(異なる)' y'は1ラベルあたり1つのベクトルですそれぞれのエントリは 'x'です。ラベルには正しいクラスの番号が含まれています。私はあなたが共有している[Mathematics Stack Exchange](http://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function)に精通しています。私の 'y 'がそれと同じようにラベル付けされているときにそれを行う方法。 – havakok

+0

私はちょうど精巧な専用の答えのためにあなたに^を与えた方法で。どうもありがとう。 – havakok

+0

あなたは何を理解していますか? 'y'はラベルのベクトルであり、変化しません。私がリンクした記事はクラスラベルを 'N '値のゼロベクトルに変換し、このベクトルのゼロ以外の位置はクラスラベルがあり、それが1に設定されています。派生を理解する必要はありません。 ...あなたが知る必要があるのは、softmaxのスコアだけです。各サンプルまたは各行に対して、そのサンプルのクラスラベルに関連付けられた列にアクセスし、それを1つ引きます。それでもクリアでない場合は私は知っているが、私はそれが私の答えに非常に自明であると思う。 – rayryeng

関連する問題