คำตอบสั้น ๆ :
- ในการตั้งค่าข้อมูลขนาดใหญ่จำนวนมาก (บอกว่ามีจุดข้อมูลหลายล้านจุด) การคำนวณต้นทุนหรือการไล่ระดับสีใช้เวลานานมากเนื่องจากเราจำเป็นต้องรวมคะแนนข้อมูลทั้งหมด
- เราไม่จำเป็นต้องมีการไล่ระดับสีที่แน่นอนเพื่อลดต้นทุนในการทำซ้ำที่กำหนด การประมาณการไล่ระดับสีบางอย่างจะใช้งานได้
- การไล่ระดับสีแบบสุ่ม Stochastic (SGD) ใกล้เคียงกับการไล่ระดับสีโดยใช้จุดข้อมูลเพียงจุดเดียว ดังนั้นการประเมินการไล่ระดับสีจะช่วยประหยัดเวลาได้มากเมื่อเทียบกับการรวมข้อมูลทั้งหมด
- ด้วยจำนวนการทำซ้ำ "สมเหตุสมผล" (ตัวเลขนี้อาจเป็นสองพันและน้อยกว่าจำนวนจุดข้อมูลซึ่งอาจเป็นล้าน) การไล่ระดับสีสุ่มที่เหมาะสมอาจได้รับการแก้ปัญหาที่เหมาะสม
คำตอบยาว:
สัญกรณ์ของฉันเป็นไปตามหลักสูตรการเรียนรู้ Coursera ของ Andrew NG หากคุณยังไม่คุ้นเคยกับมันคุณสามารถตรวจสอบการบรรยายชุดที่นี่
สมมติว่าถดถอยจากการสูญเสียกำลังสองฟังก์ชันต้นทุนคือ
J( θ ) = 12 มΣi = 1ม.( ชมθ( x( i )) - y( i ))2
และการไล่ระดับสีคือ
dJ( θ )dθ= 1ม.Σi = 1ม.( ชมθ( x( i )) - y( i )) x(i )
สำหรับการไล่ระดับสีที่เหมาะสม (GD) เราจะอัปเดตพารามิเตอร์ตาม
θn E W= θo l d- α 1ม.Σi = 1ม.( ชมθ( x( i )) - y( i )) x( i )
1 /มx( i ), y( i )
θn E W= θo l d- อัลฟ่า⋅ ( เอชθ(x(i )) -y(i ))x( i )
นี่คือเหตุผลที่เราประหยัดเวลา:
สมมติว่าเรามีจุดข้อมูล 1 พันล้านจุด
ใน GD เพื่ออัปเดตพารามิเตอร์หนึ่งครั้งเราต้องมีการไล่ระดับสี (แน่นอน) ต้องมีการรวมจุดข้อมูล 1 พันล้านจุดเหล่านี้เพื่อดำเนินการอัปเดต 1 รายการ
ใน SGD เราสามารถคิดว่ามันเป็นความพยายามที่จะได้รับลาดห้วงแทนการไล่ระดับสีที่แน่นอน การประมาณมาจากจุดข้อมูลเดียว (หรือหลายจุดข้อมูลที่เรียกว่ามินิแบทช์) ดังนั้นใน 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