SVM損失関数とその勾配を実装しようとしています。これら2つを実装するいくつかのサンプルプロジェクトを見つけましたが、勾配を計算するときに損失関数をどのように使用できるかわかりませんでした。
理解できないのは、勾配の計算中に損失関数の結果をどのように使用できるかということです。
サンプルプロジェクトでは、勾配を次のように計算します。
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はトレーニングデータの配列です。しかし、損失関数の導関数がこのコードでどのように生成されるかは理解できませんでした。
この場合の勾配を計算する方法は、微積分です(数値的にではなく、分析的に!)。したがって、W(yi)に関して損失関数を次のように区別します:
W(j)の場合、j!= yiの場合:
1は単なるインジケーター関数なので、条件がtrueの場合は中間形式を無視できます。そして、コードで書くとき、あなたが提供した例が答えです。
Cs231nの例を使用しているため、必要に応じて note とビデオを必ず確認してください。
お役に立てれば!
減算がゼロ未満の場合、損失はゼロなので、Wの勾配もゼロになります。減算がゼロより大きい場合、Wの勾配は損失の偏微分です。