2012-02-21 12 views
8

私は、GLMに関するAndrew Ng教授の講義を見てから、K-classifier問題を解くSoftmax回帰アルゴリズムを実装しようとしています。方程式をベクトル化する方法は?

Cost function for Softmax Regression with Weight Decay

私が午前問題は理解しようとしている:私は、私はそれが最終的に次のようにあるソフトマックス回帰のためのコスト関数を実装するコードを書くことに来るまで、彼が言っていたすべてのものを理解を考えましたこれをベクトル化する方法を外してください。再び私はと思った私は線形とロジスティック回帰のためにそれを行うことができたので、このような方程式をベクトル化する方法を理解しましたが、その式を見て私は立ち往生しています。

私はベクトル化された解決策を見つけ出すことが大好きですが(同じ質問が既に投稿されています:Vectorized Implementation of Softmax Regression)、私が興味を持っているのは、あなたの誰かが私に道を教えてくれるかどうかですに方法的には、このような方程式をベクトル化された形に変換します。たとえば、MLのエキスパートやベテランの経験豊富な人のために、初めて新しいアルゴリズムを読んで、上の方程式と同様の表記で書かれているのを見たら、どうやってそれらに変換するのですか?ベクトル化されたフォーム?

私は、モーツァルトに「ピアノをどうやって演奏していますか」と尋ねている学生のようになっているかもしれないと思います。しかし、私の質問は、この資料をより良くしようとする意欲からだけであり、誰もが方程式をベクトル化する方法を知って生まれたわけではないと仮定して、そこにいる誰かが自分のシステムを考案しているに違いない。事前に多くの感謝!

乾杯

+0

あなたはGLMの講義へのリンクを提供することはできますか? – justis

+1

スタンフォード大学のAndrew Ng教授のMLクラスの礼儀:http://cs229.stanford.edu/materials.html - GLMとSoftmax回帰の資料は、講義1の最後にあります – oort

答えて

1

この1つは、あなたの総和の内側に指数関数を行っているので、ベクトル化するために、かなりハードに見えます。私はあなたが任意の力に電子を上げていると仮定します。ベクトル化できるものは、\ sum \ sum theta^2の式の第2項です。matlabの演算子*演算子enter link description here〜コンピュータ\ theta^2

同じように、対数に入る。 \ theta 'x ^(i)はベクトル化可能な式です。

また、memoizationや動的プログラミングテクニックのメリットがあり、e^\ theta 'x ^(i)の計算結果を再利用することもできます。

私の経験では、一般にベクトル化する方法は、ベクトル化されていない実装を最初に行うことです。次に、計算の最も明白な部分をベクトル化しようとします。すべてのステップで、あなたの関数を微調整し、ベクトル化されていない計算と同じ結果が得られるかどうか常にチェックします。また、複数のテストケースを持つことは非常に役に立ちます。

2

オクターブに付属しているヘルプファイルは、このエントリを持っている:

19.1基本的なベクトル化

非常に良い第一近似として、ベクトル化における目標は、ループを回避し、全体のアレイを使用しています 書き込みコードにありますオペレーション。 簡単な例として、これを書くのは単なるより簡単ではありませんはるかに簡単

c = a + b; 

に比べ

for i = 1:n 
    for j = 1:m 
    c(i,j) = a(i,j) + b(i,j); 
    endfor 
endfor 

を検討します。それはまた、内部的にははるかに簡単です 最適化する。オクターブは、他の最適化の中で特別なベクトル ハードウェア命令を使用するか、または パラレルで追加を実行する可能性がある、基礎となる 実装にこの操作を委任します。一般に、コードがベクトル化されている場合、基盤となる の実装では、より高速な実行を実現するために 命令で行うことができる前提に対して、より自由度があります。

"安価な"ボディのループで特に重要です。多くの場合、 の許容値を得るには、最も内側のループをベクトル化するだけで十分です。一般的な経験則では、 ベクトル化されたボディの「順序」は、ループを囲む の「順序」より大きいか等しい必要があります。以下簡単な例として

、代わりの

for i = 1:n-1 
    a(i) = b(i+1) - b(i); 
endfor 

書き込み

a = b(2:n) - b(1:n-1); 

これは 索引付けのためにアレイを使用する代わりに、インデックス変数をループに関する重要な一般的な概念を示しています。 インデックス式。 ブーリアンインデックスも寛大に使用してください。 の条件をテストする必要がある場合は、この条件をブール型 インデックスとして記述することもできます。代わりに '> 5' ブール指標を生成するという事実を利用

for i = 1:n 
    if (a(i) > 5) 
    a(i) -= 20 
    endif 
endfor 

書き込み

a(a>5) -= 20; 

のインスタンス。

( '。*'や '。^'などの演算子)をループさせないように、可能な限り要素ごとのベクトル演算子を使用してください。 Á算術演算。単純な インライン関数の場合、 'vectorize'関数はこれを自動的に行うことができます。

- 組み込み関数:ベクタライズ(FUN) 「で、「」、「/」の すべての発生、等を置き換えることにより、インライン関数funのベクトル化バージョンを作成します。「」./」、等

This may be useful, for example, when using inline functions with 
numerical integration or optimization where a vector-valued 
function is expected. 

     fcn = vectorize (inline ("x^2 - 1")) 
     => fcn = f(x) = x.^2 - 1 
     quadv (fcn, 0, 3) 
     => 6 

See also:  inline,  formula, 
 argnames. 

はまた、これらの両方に 回避がループ要素単位の演算子との不要な中間メモリの割り当てに放送を利用します。
放送中。

可能であれば、組み込み関数とライブラリ関数を使用します。組み込み関数と コンパイル関数は非常に高速です。 m-ファイルライブラリ関数を使用しても、 機能が既に最適化されているか、最適化される可能性があります。将来のリリースでは が最適化されます。例えば

a = b(2:n) - b(1:n-1); 

よりも良いが

a = diff (b); 

ほとんどオクターブ機能は 心のベクトルと配列の引数で書かれています。非常に単純な操作でループを作成していると思われる場合は、 はそのような関数が既に存在する可能性があります。以下 関数はベクトル化コードで頻繁に発生する。

  • ランキング操作

    * find 
    
    * sub2ind 
    
    * ind2sub 
    
    * sort 
    
    * unique 
    
    * lookup 
    
    * ifelse/merge 
    
  • 繰り返し

    * repmat 
    
    * repelems 
    
  • ベクトル化演算

    * sum 
    
    * prod 
    
    * cumsum 
    
    * cumprod 
    
    * sumsq 
    
    * diff 
    
    * dot 
    
    * cummax 
    
    * cummin 
    
  • 高い次元配列

    * reshape 
    
    * resize 
    
    * permute 
    
    * squeeze 
    
    * deal 
    

の形状も例といくつかのより多くの指導のためのスタンフォードMLのwikiからこれらのページを見てください。

http://ufldl.stanford.edu/wiki/index.php/Vectorization

http://ufldl.stanford.edu/wiki/index.php/Logistic_Regression_Vectorization_Example

http://ufldl.stanford.edu/wiki/index.php/Neural_Network_Vectorization

関連する問題