2017-12-02 28 views
6

मैं SVM नुकसान और व्युत्पन्न के लिए कोड के माध्यम से जा रहा था, मैं नुकसान को समझते थे, लेकिन मैं नहीं समझ सकता कैसे ढाल एक vectorized ढंगvectorized SVM ढाल

def svm_loss_vectorized(W, X, y, reg): 

loss = 0.0 
dW = np.zeros(W.shape) # initialize the gradient as zero 
num_train = X.shape[0] 

scores = X.dot(W) 
yi_scores = scores[np.arange(scores.shape[0]),y] 
margins = np.maximum(0, scores - np.matrix(yi_scores).T + 1) 
margins[np.arange(num_train),y] = 0 
loss = np.mean(np.sum(margins, axis=1)) 
loss += 0.5 * reg * np.sum(W * W) 

ने यहां तक ​​समझ में गणना की जा रही है, के बाद यहाँ मैं नहीं समझ सकता कि हम क्यों पंक्ति-वार बाइनरी मैट्रिक्स में संक्षेप कर रहे हैं और अपने योग द्वारा घटाकर

binary = margins 
binary[margins > 0] = 1 
row_sum = np.sum(binary, axis=1) 
binary[np.arange(num_train), y] = -row_sum.T 
dW = np.dot(X.T, binary) 

# Average 
dW /= num_train 

# Regularize 
dW += reg*W 

return loss, dW 

उत्तर

1

हमें परिदृश्य और नुकसान समारोह पहले सारांश यह करते हैं, तो हम एक ही पृष्ठ पर हैं:

PN में नमूना बिंदु PxN मैट्रिक्स X के रूप में दिए गए नमूना बिंदु हैं, इसलिए अंक इस मैट्रिक्स की पंक्तियां हैं। X में प्रत्येक बिंदु M श्रेणियों में से एक को असाइन किया गया है। इन्हें वेक्टर Y लंबाई P के रूप में दिया गया है जिसमें 0 और M-1 के बीच पूर्णांक मान हैं।

लक्ष्य M रैखिक classifiers (प्रत्येक श्रेणी के लिए एक) एक वजन मैट्रिक्स आकार NxM की W के रूप में दिया द्वारा सभी बिंदुओं की कक्षाओं भविष्यवाणी करने के लिए है, इसलिए classifiers W के स्तंभ हैं। सभी नमूनों की श्रेणियों की भविष्यवाणी करने के लिए X सभी बिंदुओं और सभी वज़न वैक्टरों के बीच स्केलर उत्पाद बनते हैं। यह X और W को मैट्रिक्स गुणा करने के समान है जो एक स्कोर मैट्रिक्स Y0 प्रदान करता है, जिसकी व्यवस्था की जाती है कि इसकी पंक्तियों को Y के तत्वों की तरह आदेश दिया जाता है, प्रत्येक पंक्ति एक नमूना के अनुरूप होती है। प्रत्येक नमूने के लिए अनुमानित श्रेणी बस सबसे बड़ा स्कोर के साथ है।

कोई पूर्वाग्रह शर्तें नहीं हैं इसलिए मुझे लगता है कि कुछ प्रकार की समरूपता या शून्य औसत धारणा है।

अब, वजन का एक अच्छा सेट खोजने के लिए हम एक नुकसान समारोह चाहते हैं जो अच्छी भविष्यवाणियों के लिए छोटा है और बुरी भविष्यवाणियों के लिए बड़ा है और इससे हमें ढाल का वंशज बनने देता है। सबसे सीधे आगे के तरीकों में से एक है कि प्रत्येक नमूना i प्रत्येक नमूना के लिए सही श्रेणी के स्कोर से बड़ा है और दंड को अंतर के साथ रैखिक रूप से बढ़ने दें। तो अगर हम श्रेणियों j के सेट के लिए A[i] लिखते हैं कि सही श्रेणी Y0[i, j] > Y0[i, Y[i]] नमूना i के लिए नुकसान के रूप में

sum_{j in A[i]} (Y0[i, j] - Y0[i, Y[i]])

या समतुल्य लिखा जा सकता है और अधिक से अधिक स्कोर अगर हम A[i] में तत्वों की संख्या के लिए #A[i] बारे में

(sum_{j in A[i]} Y0[i, j]) - #A[i] Y0[i, Y[i]]

स्कोर के संबंध में आंशिक डेरिवेटिव इस प्रकार हैं बस

    | -#A[i]  if j == Y[i] 
dloss/dY0[i, j] = {  1  if j in A[i] 
        |  0  else 

जो ठीक है कि आप कहें कि पहली चार पंक्तियां आप गणना समझ में नहीं आती हैं।

अगली पंक्ति श्रृंखला नियम dloss/dW = dloss/dY0 dY0/dW लागू करती है।

प्रति नमूना हानि पाने के लिए नमूनों की संख्या से विभाजित करना और विनियमनकरण अवधि के व्युत्पन्न को जोड़ने के लिए शेष है जो नियमित रूप से एक घटकवार वर्गबद्ध कार्य होना आसान है।

+0

मैं तर्क समझता हूं, मुझे समझ में आया कि गैर-वेक्टरीकृत कोड से, क्या आप समझा सकते हैं कि 1,0 (मार्जिन> 0) का मैट्रिक्स कैसे उपयोग किया जाता है, गैर-वेक्टरिज्ड में हम वास्तव में [i] [ जे] यानी (1 या 0 तक गोल नहीं), यहां 'मार्जिन = स्कोर [जे] - correct_class_score + 1', लेकिन वेक्टरिज्ड में हम 1 या 0 तक गोल कर रहे हैं, 'बाइनरी [मार्जिन> 0 नहीं' ] = (वास्तविक मान जो हैं> 0, नहीं 1, अन्य 0) 'अधिक समझ में आता है? –

+0

गैर-वेक्टरकृत कोड नहीं होने पर मैं केवल वेक्टरकृत पर टिप्पणी कर सकता हूं। जैसा कि मैंने जवाब में व्याख्या करने की कोशिश की, _ डेरिवेटिव_ के लिए 1 और 0 का उपयोग करके, वास्तविक मान नहीं, गणितीय रूप से सही काम करना है। क्योंकि 'dY0 [i, j]/dY0 [k, l]' 1 है यदि i = k, j = l', 0 else। –

+0

क्या आप यहां एक नज़र डाल सकते हैं: https://github.com/huyouare/CS231n/blob/master/assignment1/cs231n/classifiers/linear_svm.py –

संबंधित मुद्दे