web-dev-qa-db-ja.com

SVM損失関数の勾配を計算する

SVM損失関数とその勾配を実装しようとしています。これら2つを実装するいくつかのサンプルプロジェクトを見つけましたが、勾配を計算するときに損失関数をどのように使用できるかわかりませんでした。

損失関数の式は次のとおりです。 enter image description here

理解できないのは、勾配の計算中に損失関数の結果をどのように使用できるかということです。

サンプルプロジェクトでは、勾配を次のように計算します。

for i in xrange(num_train):
    scores = X[i].dot(W)
    correct_class_score = scores[y[i]]
    for j in xrange(num_classes):
      if j == y[i]:
        continue
      margin = scores[j] - correct_class_score + 1 # note delta = 1
      if margin > 0:
        loss += margin
        dW[:,j] += X[i]
        dW[:,y[i]] -= X[i] 

dWは勾配結果用です。 Xはトレーニングデータの配列です。しかし、損失関数の導関数がこのコードでどのように生成されるかは理解できませんでした。

16
Merve Bozo

この場合の勾配を計算する方法は、微積分です(数値的にではなく、分析的に!)。したがって、W(yi)に関して損失関数を次のように区別します: enter image description here

W(j)の場合、j!= yiの場合:

enter image description here

1は単なるインジケーター関数なので、条件がtrueの場合は中間形式を無視できます。そして、コードで書くとき、あなたが提供した例が答えです。

Cs231nの例を使用しているため、必要に応じて note とビデオを必ず確認してください。

お役に立てれば!

6
dexhunter

減算がゼロ未満の場合、損失はゼロなので、Wの勾配もゼロになります。減算がゼロより大きい場合、Wの勾配は損失の偏微分です。

0
BoscoTsang