อะไรคือความแตกต่างระหว่างการไล่ระดับสีแบบโมเมนตัมที่มีโมเมนตัมและการไล่ระดับสีแบบเร่งรัดของ Nesterov


48

ดังนั้นการไล่ระดับสีตามโมเมนตัมจึงทำงานดังนี้:

v=self.momentummlrg

โดยที่คือการปรับปรุงน้ำหนักก่อนหน้านี้และคือการไล่ระดับสีในปัจจุบันที่เกี่ยวกับพารามิเตอร์ ,คืออัตราการเรียนรู้และเป็นค่าคงที่กรัมพีลิตรR s อีลิตร o อีn T U เมตรmgplrself.momentum

pnew=p+v=p+self.momentummlrg

และโคตรลาดชันของ Nesterov ที่เร่งได้ดังนี้

pnew=p+self.momentumvlrg

ซึ่งเทียบเท่ากับ:

pnew=p+self.momentum(self.momentummlrg)lrg

หรือ

pnew=p+self.momentum2m(1+self.momentum)lrg

แหล่งที่มา: https://github.com/fchollet/keras/blob/master/keras/optimizers.py

ดังนั้นสำหรับฉันดูเหมือนว่าเชื้อสายการไล่ระดับสีเร่งความเร็วของ Nesterov ให้น้ำหนักมากกว่าคำ lr * g ในเทอมการเปลี่ยนน้ำหนักที่แปรปรวน m (เทียบกับโมเมนตัมแบบเก่า) การตีความนี้ถูกต้องหรือไม่


7
ขอให้คุณพิมพ์ถามมากเกินไปไหม LATEX
Rodrigo de Azevedo

คำตอบ:


35

คำตอบของ Arech เกี่ยวกับโมเมนตัมของ Nesterov นั้นถูกต้อง แต่รหัสนั้นทำสิ่งเดียวกัน ดังนั้นในเรื่องนี้วิธี Nesterov จะให้น้ำหนักมากขึ้นกับเทอมและน้ำหนักน้อยกว่าในเทอมvlrgv

เพื่อแสดงให้เห็นว่าทำไมการดำเนิน Keras' ถูกต้องผมจะยืมเจฟฟรีย์ฮินตันของตัวอย่าง
ป้อนคำอธิบายรูปภาพที่นี่

วิธี Nesterov ใช้วิธี "การพนัน -> การแก้ไข" เวกเตอร์สีน้ำตาลคือ (การพนัน / กระโดด) เวกเตอร์สีแดงคือ (การแก้ไข) และเวกเตอร์สีเขียวคือ (ซึ่งเราควรย้ายไป) เป็นฟังก์ชันไล่ระดับสี
v=mvlr(w+mv)
w=w+v
mvlr(w+mv)mvlr(w+mv)()

รหัสที่มีลักษณะแตกต่างกันเพราะมันเคลื่อนโดยเวกเตอร์สีน้ำตาลแทนของเวกเตอร์สีเขียวเป็นวิธี Nesterov เพียง แต่ต้องใช้การประเมินแทน(w) ดังนั้นในแต่ละขั้นตอนที่เราต้องการ(w+mv)=:g(w)

  1. กลับไปยังที่ที่เราอยู่(10)
  2. ติดตามเวกเตอร์สีเขียวไปยังที่ที่เราควรจะเป็น(02)
  3. ทำการพนันอีกครั้ง(23)

รหัสของ Keras เขียนโดยย่อคือและเราทำการคำนวณบางอย่างp=p+m(mvlrg)lrg

p=pmv+mv+m(mvlrg)lrg=pmv+mvlrg+m(mvlrg)=pmv+(mvlrg)+m(mvlrg)

และที่ว่า3 ที่จริงรหัสเดิมใช้เส้นทางที่สั้นลง3 1023123

มูลค่าโดยประมาณจริง (เวกเตอร์สีเขียว) ควรเป็นซึ่งควรใกล้เคียงกับเมื่อการเรียนรู้มาบรรจบกันpmvp


2
@youkaichao ทดลองใช้youtube.com/watch?v=LdkkZglLZ0Q
dontloo

13

สำหรับฉันแล้วดูเหมือนว่าคำถามของ OP ได้ตอบไปแล้ว แต่ฉันจะพยายามอธิบายอีกครั้งเกี่ยวกับแรงผลักดันและความแตกต่างระหว่าง Classical Momentum (CM) และ Nastov's Accelerated Gradient (NAG)


tl; dr
เพียงข้ามไปที่ภาพในตอนท้าย
เหตุผลของ NAG_ball เป็นอีกส่วนที่สำคัญ แต่ฉันไม่แน่ใจว่ามันจะง่ายต่อการเข้าใจหากไม่มีที่เหลือทั้งหมด



CM และจู้จี้มีทั้งสองวิธีการเลือกเวกเตอร์ต่อไปในพารามิเตอร์พื้นที่เพื่อหาต่ำสุดของฟังก์ชันtheta)θf(θ)

ในข่าวอื่น ๆ เมื่อเร็ว ๆ นี้ทั้งสองลูกตื่นเต้นป่าปรากฏ:
CM_ball NAG_ball

มันจะเปิดออก (ตามสังเกตพฤติกรรมของลูกและเป็นไปตามกระดาษที่เกี่ยวกับความสำคัญของการเริ่มต้นและแรงผลักดันในการเรียนรู้ลึกที่อธิบายทั้ง CM และจู้จี้ในส่วนที่ 2) ที่แต่ละพฤติกรรมลูกเหมือนหนึ่งในวิธีการเหล่านี้ , และเราจะเรียกพวกเขาว่า "CM_ball" และ "NAG_ball":
(NAG_ball กำลังยิ้มเพราะเขาเพิ่งดูจุดจบของบทบรรยายที่ 6c - วิธีการโมเมนตัมโดย Geoffrey Hinton กับ Nitish Srivastava และ Kevin Swerskyมากกว่าเดิม พฤติกรรมของเขานำไปสู่การค้นหาขั้นต่ำได้เร็วขึ้น)

นี่คือลักษณะการทำงานของลูก:

  • แทนที่จะกลิ้งเหมือนลูกบอลธรรมดาพวกมันกระโดดไปมาระหว่างจุดในพื้นที่พารามิเตอร์
    ให้เป็นตำแหน่งที่ -th ของลูกบอลในพื้นที่พารามิเตอร์และให้เป็นการกระโดด -th ของลูกบอล จากนั้นกระโดดระหว่างจุดในพื้นที่พารามิเตอร์สามารถอธิบายได้ด้วย\θttvttθt=θt1+vt
  • ไม่เพียง แต่พวกเขากระโดดแทนที่จะเป็นม้วน แต่ยังมีการกระโดดพิเศษ: การกระโดดแต่ละครั้งเป็นจริงการกระโดดสองครั้งซึ่งเป็นองค์ประกอบของการกระโดดสองครั้ง vt
    • Momentum Jump - การกระโดดที่ใช้โมเมนตัมจากซึ่งเป็นการกระโดดครั้งสุดท้าย ส่วนเล็ก ๆ ของโมเมนตัมของจะหายไปเนื่องจากแรงเสียดทานกับอากาศ ให้เป็นเศษส่วนของโมเมนตัมที่เหลือ (ลูกบอลค่อนข้างแอโรไดนามิกตามปกติแล้ว ) แล้วกระโดดโมเมนตัมเท่ากับ{t-1} (ทั้งใน CM และ NAGเป็นพารามิเตอร์ที่เรียกว่า "สัมประสิทธิ์โมเมนตัม")vt1
      vt1
      μ0.9μ<1μvt1
      μ
    • Slope Jump - การกระโดดที่เตือนฉันถึงผลของการวางลูกบอลปกติบนพื้นผิว - ลูกบอลเริ่มกลิ้งไปในทิศทางที่ลาดชันชันลงล่างในขณะที่ชันชันการเร่งจะยิ่งใหญ่ขึ้น
      ในทำนองเดียวกัน Slope Jump นั้นอยู่ในทิศทางของความชันที่ลาดชันลง (ทิศทางตรงข้ามกับการไล่ระดับสี) และยิ่งการไล่ระดับสีมีขนาดใหญ่เท่าไร
      Slope Jump ยังขึ้นอยู่กับระดับความกระตือรือร้นของลูกบอล (ตามธรรมชาติ ): ยิ่งอยากเล่นลูกบอลมากเท่าไหร่ (ทั้งใน CM และ NAGเป็นพารามิเตอร์ที่เรียกว่า "อัตราการเรียนรู้") ให้ϵϵ>0
      ϵ
      gเป็นระดับความลาดชันในตำแหน่งเริ่มต้นของ Slope Jump แล้วลาดกระโดดเท่ากับกรัมϵg
  • ดังนั้นสำหรับทั้งสองลูก Double Jump มีค่าเท่ากับ: ความแตกต่างเพียงอย่างเดียวระหว่างลูกบอลคือลำดับของการกระโดดสองครั้งใน Double Jump
    vt=μvt1ϵg
  • CM_ball ไม่คิดว่ามันมีความสำคัญดังนั้นเขาจึงตัดสินใจเริ่มต้นด้วย Slope Jump เสมอ
    ดังนั้น Double Jump ของ CM_ball คือ:
    vt=μvt1ϵf(θt1)
  • ในทางกลับกัน NAG_ball คิดเกี่ยวกับมันซักพักแล้วตัดสินใจเริ่มต้นด้วย Momentum Jump เสมอ
    ดังนั้นการกระโดดสองครั้งของ NAG_ball คือ:

    vt=μvt1ϵf(θt1+μvt1)

    เหตุผลของ NAG_ball

    • ไม่ว่าการกระโดดจะมาก่อนอะไรโมเมนตัมการกระโดดของฉันจะเป็นเหมือนเดิม
      ดังนั้นฉันควรพิจารณาสถานการณ์ราวกับว่าฉันได้ทำโมเมนตัมกระโดดของฉันแล้วและฉันกำลังจะทำให้ลาดชันของฉัน
    • ตอนนี้ Slope Jump ของฉันกำลังจะเริ่มจากที่นี่ แต่ฉันสามารถเลือกได้ว่าจะคำนวณว่า Slope Jump ของฉันจะเป็นยังไงถ้ามันเริ่มต้นก่อน Momentum Jump หรือราวกับว่ามันเริ่มที่นี่
    • เมื่อคิดถึงวิธีนี้จะทำให้เห็นได้ชัดว่าหลังดีกว่าโดยทั่วไปการไล่ระดับสีในบางจุดจะชี้ให้คุณในทิศทางจากไปจนถึงระดับต่ำสุด (ที่มีขนาดค่อนข้างถูกต้อง) ในขณะที่ระดับความลาดเอียงที่เหมาะสม จุดอื่นมีโอกาสน้อยที่จะชี้คุณไปในทิศทางจากไปยังจุดต่ำสุด (โดยมีขนาดที่ค่อนข้างเหมาะสม)θθθ

ในที่สุดเมื่อวานนี้ฉันโชคดีพอที่สังเกตลูกบอลแต่ละลูกกระโดดไปรอบ ๆ ในพื้นที่พารามิเตอร์ 1 มิติ
ฉันคิดว่าการดูตำแหน่งที่เปลี่ยนแปลงของพวกเขาในพื้นที่พารามิเตอร์นั้นไม่ได้ช่วยอะไรมากนักกับสัญชาตญาณเนื่องจากพื้นที่พารามิเตอร์นี้เป็นเส้น
ดังนั้นแทนที่จะสำหรับแต่ละลูกผมร่างกราฟ 2 มิติซึ่งในแนวแกน\ จากนั้นฉันดึงโดยใช้แปรงสีดำและดึงลูกบอลแต่ละลูกในตำแหน่งแรกตำแหน่งของเขาพร้อมด้วยตัวเลขเพื่อแสดงลำดับของตำแหน่งตามลำดับเวลา สุดท้ายฉันก็ดึงลูกศรสีเขียวเพื่อแสดงระยะทางในพื้นที่พารามิเตอร์ (เช่นระยะทางแนวนอนในกราฟ) ของโมเมนตัมกระโดดและลาดชันθf ( θ ) 7
f(θ)7

ตัวอย่าง CM_ball กับ NAG_ball


ภาคผนวก 1 - การสาธิตการใช้เหตุผลของ NAG_ball

ใน gif ที่ชวนให้หลงใหลนี้โดยAlec Radfordคุณสามารถเห็น NAG ทำงานได้ดีกว่า CM ("โมเมนตัม" ใน gif)
(ขั้นต่ำคือตำแหน่งของดาวและเส้นโค้งเป็นเส้นชั้นความสูง ) สำหรับคำอธิบายเกี่ยวกับเส้นชั้นความสูงและสาเหตุที่เส้นตั้งฉากกับการไล่ระดับสีดูวิดีโอ1และ2โดย3Blue1Brownในตำนาน)

NAG ดีกว่า CM (โมเมนตัม)

การวิเคราะห์ช่วงเวลาที่เฉพาะเจาะจงแสดงให้เห็นถึงเหตุผลของ NAG_ball:

CM vs NAG ในช่วงเวลาที่เฉพาะเจาะจง

  • ลูกศรสีม่วง (ยาว) เป็นขั้นตอนย่อยของโมเมนตัม
  • ลูกศรสีแดงโปร่งใสเป็นขั้นตอนย่อยการไล่ระดับสีหากเริ่มต้นก่อนขั้นตอนย่อยของโมเมนตัม
  • ลูกศรสีดำเป็นขั้นตอนย่อยการไล่ระดับสีถ้ามันเริ่มต้นหลังจากขั้นตอนย่อยของโมเมนตัม
  • CM จะสิ้นสุดในเป้าหมายของลูกศรสีแดงเข้ม
  • NAG จะสิ้นสุดในเป้าหมายของลูกศรสีดำ

ภาคผนวก 2 - สิ่ง / คำศัพท์ที่ฉันสร้างขึ้น (เพื่อประโยชน์ของสัญชาตญาณ)

  • CM_ball
  • NAG_ball
  • กระโดดสองครั้ง
  • โมเมนตัมกระโดด
  • โมเมนตัมหายไปเนื่องจากแรงเสียดทานกับอากาศ
  • Slope Jump
  • ความกระตือรือร้นของลูก
  • ฉันเฝ้าดูลูกบอลเมื่อวานนี้

ภาคผนวก 3 - ศัพท์ที่ฉันไม่ได้แต่งหน้า


1
ฉันพบส่วนจาก "นี่คือลักษณะการทำงานของลูก: ... " ถึง "เพื่อชี้คุณไปในทิศทางจากθถึงขั้นต่ำ (โดยมีขนาดที่ค่อนข้างเหมาะสม)" ยอดเยี่ยมเป็นคำอธิบายของความแตกต่าง
Poete Maudit

12

ฉันไม่คิดอย่างนั้น

มีคำอธิบายที่ดี Nesterov โมเมนตัม (aka Nesterov เร่งไล่โทนสี) มีสรรพคุณในการยกตัวอย่างเช่นSutskever, Martens et al. "เกี่ยวกับความสำคัญของการเริ่มต้นและแรงผลักดันในการเรียนรู้ลึก" 2013

ความแตกต่างที่สำคัญคือในโมเมนตัมแบบคลาสสิกก่อนอื่นคุณต้องแก้ไขความเร็วของคุณจากนั้นทำขั้นตอนใหญ่ตามความเร็วนั้น (และจากนั้นทำซ้ำ) แต่ในโมเมนตัม Nesterov คุณต้องก้าวไปสู่ทิศทางความเร็วแล้วทำการแก้ไขเวกเตอร์ความเร็วตาม ในตำแหน่งใหม่ (จากนั้นทำซ้ำ)

เช่นโมเมนตัมคลาสสิก:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) )
W(t+1) = W(t) + vW(t+1)

ในขณะที่โมเมนตัม Nesterov คือ:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) + momentum.*vW(t) )
W(t+1) = W(t) + vW(t+1)

จริงๆแล้วมันสร้างความแตกต่างอย่างมากในทางปฏิบัติ ...


5

เพิ่มเติม: หลักสูตรสแตนฟอร์ดเกี่ยวกับโครงข่ายประสาทเทียม cs231nให้ขั้นตอนในรูปแบบอื่น:

v = mu * v_prev - learning_rate * gradient(x)   # GD + momentum
v_nesterov = v + mu * (v - v_prev)              # keep going, extrapolate
x += v_nesterov

นี่vคือความเร็ว aka ขั้นตอน aka state และmuเป็นปัจจัยโมเมนตัมโดยทั่วไป 0.9 หรือมากกว่านั้น ( v, xและlearning_rateสามารถเป็นพาหะนานมากกับ numpy รหัสเหมือนกัน.)

vในบรรทัดแรกคือการไล่ระดับสีด้วยโมเมนตัม v_nesterovประมาณการณ์ต่อไป ตัวอย่างเช่นด้วย mu = 0.9

v_prev  v   --> v_nesterov
---------------
 0  10  -->  19
10   0  -->  -9
10  10  -->  10
10  20  -->  29

คำอธิบายต่อไปนี้มี 3 คำ:
เทอม 1 เพียงอย่างเดียวคือการไล่ระดับสีแบบเกรเดียนต์ (GD),
1 + 2 ให้ GD + โมเมนตัม,
1 + 2 + 3 ให้ Nesterov GD

xtytytxt+1

yt=xt+m(xtxt1) - โมเมนตัมตัวทำนาย
xt+1=yt+h g(yt) - การไล่ระดับสี

gtf(yt)h

yt

yt+1=yt
+ h gt - การไล่ระดับสี
+ m (ytyt1) - โมเมนตัมขั้นตอน
+ m h (gtgt1) - โมเมนตัมการไล่ระดับสี

เทอมสุดท้ายคือความแตกต่างระหว่าง GD กับโมเมนตัมธรรมดาและ GD กับ Nesterov โมเมนตัม


mmgrad
+ m (ytyt1) - โมเมนตัมขั้นตอน
+ mgrad h (gtgt1) - โมเมนตัมการไล่ระดับสี

mgrad=0mgrad=m
mgrad>0
mgrad.1

mtht



(x/[cond,1]100)+ripple×sin(πx)

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.