संक्षिप्त जवाब:
- कई बड़े डेटा सेटिंग में (कई मिलियन डेटा पॉइंट्स कहें), लागत या ग्रेडिएंट की गणना में बहुत लंबा समय लगता है, क्योंकि हमें कुछ डेटा पॉइंट्स पर योग करने की आवश्यकता होती है।
- हमें दिए गए पुनरावृत्ति में लागत को कम करने के लिए सटीक ढाल की आवश्यकता नहीं है । ढाल के कुछ सन्निकटन ठीक काम करेगा।
- स्टोचस्टिक ग्रेडिएंट सभ्य (SGD) केवल एक डेटा बिंदु का उपयोग करके ढाल को अनुमानित करता है। इसलिए, सभी डेटा की तुलना में ढाल का मूल्यांकन करने में बहुत समय बचता है।
- पुनरावृत्तियों की "उचित" संख्या के साथ (यह संख्या हजारों की संख्या में हो सकती है, और डेटा बिंदुओं की संख्या से बहुत कम है, जो लाखों हो सकती है), स्टोकेस्टिक क्रमिक सभ्य को एक उचित अच्छा समाधान मिल सकता है।
लंबा जवाब:
एंड्रयू एनजी के मशीन लर्निंग कोर्टसेरा कोर्स के बाद मेरा अंकन है। यदि आप इससे परिचित नहीं हैं, तो आप यहाँ व्याख्यान श्रृंखला की समीक्षा कर सकते हैं ।
चलो चुकता नुकसान पर प्रतिगमन मान लेते हैं, लागत समारोह है
J(θ)=12m∑i=1m(hθ(x(i))−y(i))2
और ढाल है
dJ(θ)dθ=1m∑i=1m(hθ(x(i))−y(i))x(i)
ग्रेडिएंट सभ्य (GD) के लिए, हम पैरामीटर को अपडेट करते हैं
θnew=θold−α1m∑i=1m(hθ(x(i))−y(i))x(i)
1/mx(i),y(i)
θnew=θold−α⋅(hθ(x(i))−y(i))x(i)
यहाँ हम समय क्यों बचा रहे हैं:
मान लीजिए कि हमारे पास 1 बिलियन डेटा पॉइंट हैं।
जीडी में, मापदंडों को एक बार अपडेट करने के लिए, हमें सटीक (सटीक) ढाल की आवश्यकता है। इसके लिए 1 अद्यतन करने के लिए इन 1 बिलियन डेटा बिंदुओं को योग करने की आवश्यकता है।
स्वस्थानी में, हम इसे सटीक ढाल के बजाय एक अनुमानित ढाल प्राप्त करने की कोशिश के रूप में सोच सकते हैं । सन्निकटन एक डेटा बिंदु (या कई डेटा बिंदु जिन्हें मिनी बैच कहा जाता है) से आ रहा है। इसलिए, SGD में, हम मापदंडों को बहुत जल्दी अपडेट कर सकते हैं। इसके अलावा, यदि हम सभी डेटा (जिसे एक युग कहा जाता है) पर "लूप" करते हैं, तो वास्तव में हमारे पास 1 बिलियन अपडेट हैं।
चाल यह है कि, SGD में आपको 1 बिलियन पुनरावृत्तियों / अपडेट की आवश्यकता नहीं है, लेकिन बहुत कम पुनरावृत्तियों / अपडेट्स, 1 मिलियन कहते हैं, और आपके पास उपयोग करने के लिए "बहुत अच्छा" मॉडल होगा।
मैं विचार को प्रदर्शित करने के लिए एक कोड लिख रहा हूं। हम पहले रेखीय प्रणाली को सामान्य समीकरण द्वारा हल करते हैं, फिर इसे SGD के साथ हल करते हैं। फिर हम पैरामीटर मान और अंतिम उद्देश्य फ़ंक्शन मान के संदर्भ में परिणामों की तुलना करते हैं। बाद में इसकी कल्पना करने के लिए, हमारे पास धुन करने के लिए 2 पैरामीटर होंगे।
set.seed(0);n_data=1e3;n_feature=2;
A=matrix(runif(n_data*n_feature),ncol=n_feature)
b=runif(n_data)
res1=solve(t(A) %*% A, t(A) %*% b)
sq_loss<-function(A,b,x){
e=A %*% x -b
v=crossprod(e)
return(v[1])
}
sq_loss_gr_approx<-function(A,b,x){
# note, in GD, we need to sum over all data
# here i is just one random index sample
i=sample(1:n_data, 1)
gr=2*(crossprod(A[i,],x)-b[i])*A[i,]
return(gr)
}
x=runif(n_feature)
alpha=0.01
N_iter=300
loss=rep(0,N_iter)
for (i in 1:N_iter){
x=x-alpha*sq_loss_gr_approx(A,b,x)
loss[i]=sq_loss(A,b,x)
}
परिणाम:
as.vector(res1)
[1] 0.4368427 0.3991028
x
[1] 0.3580121 0.4782659
124.1343123.0355
यहां पुनरावृत्तियों पर लागत फ़ंक्शन मान हैं, हम देख सकते हैं कि यह नुकसान को प्रभावी रूप से कम कर सकता है, जो इस विचार को दिखाता है: हम ग्रेडिएंट को अनुमानित करने और "अच्छे पर्याप्त" परिणाम प्राप्त करने के लिए डेटा के सबसेट का उपयोग कर सकते हैं।
1000sq_loss_gr_approx
3001000