ควรมีการสุ่มตัวอย่างตัวอย่างการฝึกอบรมสำหรับโครงข่ายประสาทการฝึกอบรมขนาดเล็กแบบสุ่มโดยไม่ต้องเปลี่ยนใหม่หรือไม่?


18

เรากำหนดยุคเมื่อผ่านตัวอย่างการฝึกอบรมที่มีทั้งหมดและขนาดมินิ - แบทช์เป็นจำนวนตัวอย่างที่เราเฉลี่ยเพื่อค้นหาการอัปเดตสำหรับน้ำหนัก / อคติที่จำเป็นในการไล่ระดับสี

คำถามของฉันคือเราควรวาดโดยไม่เปลี่ยนจากชุดตัวอย่างการฝึกอบรมเพื่อสร้าง mini-batch แต่ละชุดภายในยุค ฉันรู้สึกว่าเราควรหลีกเลี่ยงการแทนที่เพื่อให้แน่ใจว่าเรา "ดึงตัวอย่างทั้งหมด" เพื่อตอบสนองความต้องการในตอนท้ายของยุค แต่มีปัญหาในการหาคำตอบที่ชัดเจนไม่ทางใดก็ทางหนึ่ง

ฉันได้ลองใช้ Google และอ่าน Ch 1 ในเครือข่ายประสาทและการเรียนรู้เชิงลึกของ Nielsen แต่ไม่พบคำตอบที่ชัดเจน ในข้อความนั้น Nielsen ไม่ได้ระบุว่าการสุ่มตัวอย่างจะทำได้โดยไม่ต้องเปลี่ยน แต่ดูเหมือนจะบอกเป็นนัยว่า

การฝึกอบรมอย่างเป็นทางการที่ชัดเจนในยุคนี้สามารถดูได้ที่นี่หากต้องการ - /stats//a/141265/131630

แก้ไข: คำถามนี้ดูเหมือนกับฉัน แต่มันก็ไม่ชัดเจนว่าจะใช้ความจริงที่ว่าความเป็นเส้นตรงของความคาดหวังไม่แยแสกับความเป็นอิสระกับสถานการณ์นี้ - ควรสุ่มตัวอย่างเกิดขึ้นโดยมีหรือไม่มีการเปลี่ยน


ยกเว้นในกรณีที่มีเหตุผลเฉพาะข้อมูล mini-batch สำหรับการฝึกอบรมโครงข่ายประสาทเทียมจะถูกดึงออกมาเสมอโดยไม่ต้องเปลี่ยนใหม่ แนวคิดคือคุณต้องการอยู่ระหว่างโหมดแบตช์ซึ่งคำนวณการไล่ระดับสีด้วยชุดข้อมูลทั้งหมดและ SGD ซึ่งใช้การสุ่มเพียงชุดเดียว
horaceT

SGD ไม่ จำกัด การใช้ตัวอย่างแบบสุ่มหนึ่งตัวอย่าง กระบวนการนั้นเรียกว่าการฝึกอบรมออนไลน์ "เชื้อสายการไล่ระดับสีรุ่นสุดขีดคือการใช้ขนาดมินิแบทช์เพียง 1 ... ขั้นตอนนี้เรียกว่าการเรียนรู้ออนไลน์การเรียนรู้ออนไลน์หรือการเรียนรู้เพิ่มเติม" และ "แนวคิดที่เรียกว่า stochastic gradient descent สามารถใช้เพื่อเพิ่มความเร็วในการเรียนรู้ความคิดคือการประมาณ gradient ientC โดยการคำนวณ [มัน] สำหรับกลุ่มตัวอย่างขนาดเล็กของอินพุตการฝึกอบรมแบบสุ่มเลือกโดยเฉลี่ยจากตัวอย่างขนาดเล็กนี้ .. เราจะได้ค่าประมาณการไล่ระดับสีที่ดีอย่างรวดเร็ว " คำพูดทั้งสองจาก Nielsen Ch 1.
bobo

คำตอบ:


13

การวิเคราะห์เชิงทฤษฎีที่ดีของทั้งที่มีและไม่มีสคีมาทดแทนในบริบทของอัลกอริธึมแบบวนซ้ำตามการสุ่มจับ (ซึ่งเป็นจำนวนเครือข่าย Deep Neural Discriminative (DNNs) ที่มีการเลือกปฏิบัติ) สามารถพบได้ที่นี่

ในระยะสั้นปรากฎว่าการสุ่มตัวอย่างโดยไม่มีการทดแทนนำไปสู่การลู่เข้าที่เร็วกว่าการสุ่มตัวอย่างด้วยการแทนที่

ฉันจะให้การวิเคราะห์สั้น ๆ ที่นี่ตามตัวอย่างของเล่นที่พวกเขาให้: สมมติว่าเราต้องการเพิ่มประสิทธิภาพฟังก์ชั่นวัตถุประสงค์ต่อไปนี้:

xopt=argminx12i=1N(xyi)2

ที่เป้าหมาย ) ในตัวอย่างนี้เราพยายามที่จะหาค่าx ที่เหมาะสมโดยระบุN label ของy iอย่างชัดเจนyiN(μ,σ2)xNyผม

ตกลงดังนั้นถ้าเราจะแก้ปัญหาที่ดีที่สุดสำหรับในข้างต้นโดยตรงแล้วเราจะใช้เวลาอนุพันธ์ของฟังก์ชั่นการสูญเสียที่นี่ให้ตั้งเป็น 0 และแก้ปัญหาสำหรับx ดังนั้นสำหรับตัวอย่างข้างต้นการสูญเสียคือxx

L=12i=1N(xyi)2

และมันคืออนุพันธ์อันดับแรกคือ:

δLδx=i=1N(xyi)

การตั้งค่า 0 และแก้สำหรับxอัตราผลตอบแทน:δLδxx

xopt=1Ni=1Nyi

ในคำอื่น ๆ วิธีการแก้ปัญหาที่ดีที่สุดคืออะไร แต่ค่าเฉลี่ยของกลุ่มตัวอย่างทั้งหมดตัวอย่างYNy

ตอนนี้ถ้าเราไม่สามารถทำการคำนวณข้างต้นทั้งหมดได้ในครั้งเดียวเราจะต้องทำมันซ้ำ ๆ ผ่านสมการการปรับปรุงแบบลาดลงทางลาดด้านล่าง:

xi=xi1λi(f(xi1))

และเพียงแค่ใส่เงื่อนไขของเราที่นี่ให้ผลตอบแทน:

xi=xi1λi(xi1yi)

ถ้าเราทำงานข้างต้นทั้งหมดของเราจะทำการอัพเดทนี้อย่างมีประสิทธิภาพโดยไม่ต้องเปลี่ยนใหม่ จากนั้นกลายเป็นคำถามเราจะได้ค่าx ที่ดีที่สุดด้วยวิธีนี้ได้ไหม? (จำไว้ว่าค่าที่ดีที่สุดของxคืออะไรนอกจากค่าเฉลี่ยตัวอย่างของy ) คำตอบคือใช่ถ้าคุณให้λ ฉัน = 1 /ฉัน หากต้องการดูสิ่งนี้เราขยาย:i1,2,...Nxxyλi=1/i

xi=xi1λi(xi1yi) xi=xi11i(xi1yi) xi=ixi1(xi1yi)i xi=(i1)xi1+yii ixi=(i1)xi1+yi 

อย่างไรก็ตามสมการสุดท้ายคืออะไรนอกจากสูตรสำหรับค่าเฉลี่ยการวิ่ง! ดังนั้นเมื่อเราวนรอบชุดจาก , i = 2 , ไปจนถึงi = Nเราจะทำการอัปเดตของเราโดยไม่มีการแทนที่และสูตรการอัพเดทของเราจะให้ทางออกที่ดีที่สุดของxซึ่งเป็น ค่าเฉลี่ยตัวอย่าง!i=1i=2i=Nx

NxN=(N1)xN1+yN==>xN=1Ni=1Nyi=μ

อย่างไรก็ตามในทางกลับกันถ้าเราวาดด้วยการแทนที่แล้วในขณะที่การจับของเราจะเป็นอิสระอย่างแท้จริงค่าที่ปรับให้เหมาะสมจะแตกต่างจากค่าเฉลี่ย (เหมาะสม) μและข้อผิดพลาดของสแควร์จะได้รับจาก:xNμ

E{(xNμ)2}

ซึ่งจะเป็นค่าบวกและตัวอย่างของเล่นง่าย ๆ นี้สามารถขยายไปยังมิติที่สูงขึ้นได้ นี่คือผลลัพธ์ที่เราต้องการจะทำการสุ่มตัวอย่างโดยไม่ต้องเปลี่ยนเป็นวิธีการแก้ปัญหาที่เหมาะสมที่สุด

หวังว่านี่จะทำให้ชัดเจนมากขึ้น!


ตัวอย่างนี้ใช้สมมติฐานค่อนข้างมากเช่นการใช้ข้อผิดพลาดกำลังสองและความนูนของแนวการสูญเสีย ผลลัพธ์จะระงับเมื่อสมมติฐานเหล่านั้นไม่เป็นที่พอใจหรือไม่
bayerj

@bayerj ตัวอย่างของเล่นนี้โดยเฉพาะใช่ อย่างไรก็ตามบทความจะขยายออกไปสำหรับกรณีทางทฤษฎีอื่น ๆ เพิ่มเติม ฉันเชื่อว่าแหล่งข้อมูลอื่น [Boutou ฉันคิดว่า] แสดงการสนับสนุนเชิงประจักษ์สำหรับการสุ่มตัวอย่างแบบไม่มีการเปลี่ยนที่ดี
Tarin Ziyaee

@TarinZiyaee ขอบคุณสำหรับคำตอบนี้คุณช่วยอธิบายλ_k = 1 / k ได้ไหม? เรากำลังพูดถึง k อันไหน, k จากสมการข้างบน? ฉันไม่ได้ติดตามคุณที่นี่ซึ่งทำให้การสรุปและการสรุปตามมาเป็นเรื่องยาก ขอบคุณ
bobo

1
@bobo ฉันจะพยายามชี้แจงโพสต์ในคืนนี้
Tarin Ziyaee

1
@bobo ฉันอัปเดตคำตอบพวงของฉัน โปรดดูและแจ้งให้เราทราบหากสิ่งนั้นช่วยได้
Tarin Ziyaee

5

ตามรหัสในที่เก็บของ Nielsen จะมีการวาดมินิแบทช์โดยไม่มีการแทนที่:

    def SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):
    n = len(training_data)
    for j in range(epochs):
            random.shuffle(training_data)
            mini_batches = [
                training_data[k:k+mini_batch_size]
                for k in range(0, n, mini_batch_size)
            ]
            for mini_batch in mini_batches:
                self.update_mini_batch(mini_batch, eta)

เราจะเห็นได้ว่าไม่มีการเปลี่ยนตัวอย่างการฝึกอบรมภายในช่วงเวลา ที่น่าสนใจคือเราสามารถเห็นได้ว่า Nielsen เลือกที่จะไม่กังวลเกี่ยวกับการปรับeta(อัตราการเรียนรู้) สำหรับขนาด mini_batch สุดท้ายซึ่งอาจไม่ได้มีตัวอย่างการฝึกอบรมมากเท่ากับชุดมินิก่อนหน้านี้ สันนิษฐานว่านี่เป็นการดัดแปลงขั้นสูงที่เขาทิ้งไว้สำหรับบทต่อ ๆ มา **

** แก้ไข: ที่จริงแล้วสเกลนี้เกิดขึ้นในdef update_mini_batchฟังก์ชั่น ตัวอย่างเช่นด้วยน้ำหนัก:

self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)]     

สิ่งนี้จำเป็นเนื่องจาก mini_batch สุดท้ายอาจเล็กกว่า mini_batches ก่อนหน้าหากจำนวนตัวอย่างการฝึกอบรมต่อ mini_batch ไม่แบ่งเท่า ๆ กันเป็นจำนวนตัวอย่างการฝึกอบรมทั้งหมดที่มี

mylist = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
n = len(mylist)
mini_batch_size = 2
mini_batches = [
    mylist[k:k+mini_batch_size]
    for k in range(0, n, mini_batch_size)
    ]
for mini_batch in mini_batches:
    print(mini_batch)

เอาท์พุท:

['1', '2']
['3', '4']
['5', '6']
['7', '8']
['9', '10']

การเปลี่ยนmini_batch_sizeไปใช้3ซึ่งไม่ได้แบ่งตัวอย่างการฝึกอบรม 10 ตัวอย่าง สำหรับผลลัพธ์เราได้รับ:

['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
['10']

เมื่อประเมินช่วงเหนือดัชนีรายการ (บางสิ่งบางอย่างของรูปแบบ[x:y]ที่xและyเป็นดัชนีบางส่วนในรายการ) ถ้ามูลค่าทางด้านขวาของเราเกินความยาวของรายการหลามเพียงส่งคืนรายการจากรายการจนถึงค่าออกไปนอกช่วงดัชนี .

ดังนั้นมินิแบทช์สุดท้ายอาจมีขนาดเล็กกว่าแบตช์ก่อนหน้านี้ แต่ถ้ามีการถ่วงน้ำหนักเหมือนกันetaตัวอย่างการฝึกอบรมเหล่านั้นจะมีส่วนช่วยในการเรียนรู้มากกว่าตัวอย่างในชุดอื่นมินิแบตช์ขนาดใหญ่ เนื่องจากนี่เป็นเพียงมินิแบทช์สุดท้ายจึงอาจไม่คุ้มค่าที่จะกังวลมากเกินไป แต่สามารถแก้ไขได้อย่างง่ายดายโดยการปรับขนาดetaตามความยาวของมินิแบทช์

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