2 คะแนน โดย GN⁺ 2025-05-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เป็นการแนะนำโดยสังเขปเกี่ยวกับโครงสร้างและจุดประสงค์ของ Boltzmann machine
  • นิยาม ฟังก์ชันพลังงาน และการแจกแจงความน่าจะเป็นด้วยสมการ
  • อนุมานกฎการอัปเดตของ น้ำหนักและไบแอส ผ่านการดิฟเฟอเรนเชียล
  • อธิบายวิธีประมาณค่าคาดหมายของโมเดลผ่าน ขั้นบวก·ขั้นลบ และ Gibbs sampling
  • สรุปอัลกอริทึม Contrastive Divergence แบบครบภาพในตอนท้าย

แนวคิดของ Boltzmann machine และ Contrastive Divergence

  • ใน Boltzmann machine จะมีชั้นอินพุต (visible layer) และชั้นซ่อน (hidden layer) รวมถึง เมทริกซ์น้ำหนัก ที่เชื่อมทั้งสองชั้น และ เวกเตอร์ไบแอส ของแต่ละชั้น

ฟังก์ชันพลังงานและการแจกแจงความน่าจะเป็น

  • ฟังก์ชันพลังงานนิยามในรูปเมทริกซ์ได้ดังนี้

    E(v, h) = -ΣiΣj wij vi hj - Σi bi vi - Σj cj hj
    • v: เวกเตอร์ของชั้นมองเห็น, h: เวกเตอร์ของชั้นซ่อน, w: น้ำหนัก, b/c: ไบแอสของแต่ละชั้น
  • การแจกแจงร่วม ของ Boltzmann machine คือ

    P(v, h) = (1/Z) * exp(-E(v, h))
    • Z (partition function) ทำหน้าที่ทำให้การแจกแจงความน่าจะเป็นเป็น normalized

log-likelihood และการดิฟเฟอเรนเชียล

  • การเรียนรู้ดำเนินไปโดยทำให้ likelihood ของข้อมูลฝึกมีค่าสูงสุด

    log(P(v)) = log(Σh exp(-E(v, h))) - log(Z)
  • อนุพันธ์ย่อยของ log-likelihood ต่อค่าน้ำหนัก wij คือ

    ∂(log P(v))/∂wij = <vi hj>ข้อมูล - <vi hj>โมเดล
    • < · >ข้อมูล: ค่าคาดหมายจากข้อมูลจริง
    • < · >โมเดล: ค่าคาดหมายจากข้อมูลที่โมเดลสร้างขึ้น

กฎการเรียนรู้ของน้ำหนักและไบแอส

  • น้ำหนักและไบแอสอัปเดตดังนี้
    • Δwij = η(<vi hj>ข้อมูล - <vi hj>โมเดล)
    • Δbi = η(<vi>ข้อมูล - <vi>โมเดล)
    • Δcj = η(<hj>ข้อมูล - <hj>โมเดล)
    • η คืออัตราการเรียนรู้

อัลกอริทึม Contrastive Divergence

  • ค่าคาดหมายของโมเดล < · >โมเดล คำนวณโดยตรงได้ยาก จึงใช้ Gibbs sampling
  • Contrastive Divergence ประมาณค่าโดยทำตามขั้นตอนต่อไปนี้
    1. ขั้นบวก: สุ่มชั้นซ่อน h(0) จาก P(h | v(0)=ข้อมูล)
    2. ขั้นลบ: ทำ Gibbs sampling ซ้ำ k ครั้ง
    • สุ่มสลับกันเป็น v(t+1) ~ P(v | h(t)), h(t+1) ~ P(h | v(t))
  • ในมุมมองของการอัปเดต จะใช้ความต่างระหว่างค่าคาดหมายของข้อมูลและค่าคาดหมายของโมเดล
    • Δwij = η(<vi hj>ข้อมูล - <vi hj>โมเดล)
    • Δbi = η(<vi>ข้อมูล - <vi>โมเดล)
    • Δcj = η(<hj>ข้อมูล - <hj>โมเดล)

สรุป

  • แก่นของการเรียนรู้ใน Boltzmann machine คือการเป็น energy-based model ที่มุ่งลดความต่างของค่าคาดหมายระหว่างข้อมูลจริงกับการแจกแจงที่โมเดลสร้างขึ้น
  • Contrastive Divergence คือวิธีฝึกหลักที่ช่วยประมาณความต่างนี้ได้อย่างรวดเร็วและมีประสิทธิภาพ
  • มันทำหน้าที่เชื่อมการแจกแจงของโมเดลกับข้อมูลจริงผ่าน Gibbs sampling และอัปเดตน้ำหนักกับไบแอสซ้ำ ๆ เพื่อให้ Boltzmann machine แทนข้อมูลได้ดี

1 ความคิดเห็น

 
GN⁺ 2025-05-17
ความคิดเห็นบน Hacker News
  • เท่าที่เข้าใจ Harmonium (Smolensky) คือ restricted Boltzmann machine ตัวแรก โดยเป็นแนวคิดที่พยายามทำให้ “harmony” สูงสุดแทนที่จะทำให้ “energy” ต่ำสุด ตอนที่ Smolensky, Hinton และ Rummelhart ทำงานร่วมกัน พวกเขาเรียกมันว่า “goodness of fit” บทความ Harmonium เป็นงานอ่านที่น่าประทับใจมาก Hinton กลายเป็นซูเปอร์สตาร์ในวงการปัญญาประดิษฐ์ ส่วน Smolensky ไปเขียนหนังสือเล่มยาวเกี่ยวกับภาษาศาสตร์ สงสัยว่ามีใครรู้ประวัติศาสตร์ช่วงนี้มากกว่านี้ไหม

  • บทความเกี่ยวกับ David Ackley น่าสนใจมาก นอกจากนี้ T2 Tile Project ก็น่าลองไปดู

    • ประเด็นสำคัญคือมีคนจำนวนมากจริง ๆ ที่มีส่วนร่วมในความก้าวหน้าสำคัญแบบนี้ นักศึกษาปริญญาโทเอกมีส่วนช่วยอย่างมาก และงานที่พวกเขาทำก็มักถูกพัฒนาต่อในภายหลัง ไม่เข้าใจว่าทำไมในสหรัฐฯ ถึงมองว่างานวิจัยเป็นความสิ้นเปลือง ทั้งที่งานวิจัยเป็นสิ่งที่ผลักดันทุกอย่างให้ก้าวหน้าอย่างมาก
  • ผู้เขียนเอง ขอบคุณสำหรับคอมเมนต์มากมาย ไม่คิดว่าจะได้รับความนิยมขนาดนี้ กำลังแก้คำผิด ระยะห่าง ปัญหาการเลื่อนหน้าจอ ฯลฯ ขอบคุณที่ช่วยแจ้ง

    • แก้คำผิดเสร็จแล้ว ตอนนี้บนมือถือดูดีขึ้นมาก
  • ตอนแรกอ่านชื่อเป็น "A Tiny Boltzmann Brain" สมองธรรมชาติของฉันก็รีบจัดการความสับสนนี้ทันที เดาไปว่าอาจเป็นการทดลองทดสอบว่าถ้าใส่น้ำหนักแบบสุ่มให้โมเดลเล็กมาก ๆ แล้วจะทำอะไรที่มีความหมายได้ไหม ยิ่งโมเดลเล็กเท่าไร ก็ยิ่งมีโอกาสสัมพัทธ์ที่จะสุ่มแล้วได้อะไรน่าสนใจมากขึ้น เดาผิด แต่ก็ยังไม่หมดกำลังใจ ขอนำเสนอโมเดลตระกูลใหม่ชื่อ “Unbiased-Architecture Instant Boltzmann Model” (UA-IBM) จินตนาการว่าวันหนึ่งถ้ามีคอมพิวเตอร์ควอนตัมที่ใหญ่พอ ก็อาจซ้อนทับทั้งชุดข้อมูล พารามิเตอร์ทั้งหมดของโมเดล และสถาปัตยกรรมทั้งหมดไว้ในสถานะควอนตัม แล้วอนุมานทุกอย่างพร้อมกันได้ในครั้งเดียว มีใครมี qubit เหลือพอจะลองทำการทดลองนี้ไหม (ที่น่าขันคือ จริง ๆ แล้วทุกอย่างก็เป็นควอนตัมอยู่แล้ว แต่เรายังใช้ประโยชน์จากมันอย่างเหมาะสมได้ยากมาก และก็ชวนให้จินตนาการว่าถ้าอารยธรรมต่างดาวพัฒนาจาก quantum sensor เดี่ยวไปเป็นสิ่งมีชีวิตที่มีระบบประสาทควอนตัมทั้งชุด พวกเขาจะมีเส้นทางทางสังคมและเทคโนโลยีแบบไหน)

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

  • ถ้าเข้าใจไม่ผิด ต่างจากโครงข่ายประสาทที่เราใช้กันทุกวันนี้ ตรงที่การอัปเดต weight ต้องใช้ gibbs sampling แทนการทำ forward/backward pass แบบอิง gradient อยากรู้ว่าทำไม

    • เท่าที่คิด gibbs sampling ใช้เพื่อประมาณค่าคาดหมายของการแจกแจงของโมเดล เพราะการคำนวณ gradient ของ log likelihood ต้องอินทิเกรตบนการแจกแจงนั้น ซึ่งคำนวณตรง ๆ ไม่ได้ คล้ายกับการสุ่มตัวอย่างแทนด้วย MCMC ใน VAE ในดีปเลิร์นนิง เราประมาณ gradient ผ่านแบตช์ของชุดข้อมูล แต่ใน RBM เราต้องการค่าคาดหมายของการแจกแจงความน่าจะเป็นที่โมเดลระบุไว้อย่างชัดเจน
    • ไม่ใช่ผู้เชี่ยวชาญ แต่เคยเรียนสาย Bayesian แบบเป็นทางการมาบ้าง ปกติ gibbs มักใช้เมื่อ gradient ไม่ชัดเจน หรือเมื่อคุณอยากกู้คืนการแจกแจงนั้นขึ้นมาเอง visible node แต่ละตัวขึ้นกับ hidden node และ hidden node ก็มีอิทธิพลต่อ visible node ด้วย ทำให้ gradient ซับซ้อนมาก ดังนั้นการใช้ gibbs sampling บนพื้นฐานของ marginal likelihood จึงง่ายกว่ามาก
    • อาจจะเข้าใจผิด แต่คิดว่าน่าจะเป็นเพราะโครงสร้างแบบ undirected ของ RBM ต่างจาก feed-forward network ตรงที่สร้าง computational graph ไม่ได้
  • อ่านแล้วทำให้นึกถึงสมัยก่อน ในปี 1990 ฉันเคยสร้าง neural network node เป็นอาร์เรย์ด้วย void pointer แล้วเขียน Boltzmann machine กับ perceptron ด้วย C ตอนนั้นการใช้ “AI” คือเอาไว้ทำนายโน้ตถัดไปจากเมโลดี้ MIDI หรือรู้จำรูปร่างตัวโน้ตอย่าง minim, crotchet, quaver บนกริดจุดขนาด 5x9 แค่ได้อัตราการรู้จำ 85% ก็ถือว่า “ดี” แล้ว

    • น่าสนใจดีที่ใช้กริดจุด 5x9 มารู้จำรูปร่างโน้ต ให้ความรู้สึกเหมือนตัวอย่าง neural network ของ 3Blue1Brown ที่ลงมือทำเองตั้งแต่ต้นจริง ๆ ถ้าเอาอะไรอย่าง Chuck มาประกอบกัน ทุกวันนี้ก็น่าจะทำโปรแกรมแบบนี้ให้รันฝั่งไคลเอนต์ในเบราว์เซอร์ได้
    • อยากรู้เหมือนกันว่าเสียงของผลลัพธ์ฟังออกมาเป็นดนตรีไหม
  • บทความเขียนง่ายและชัดเจนมาก ทำให้นึกถึงวันเก่า ๆ เยอะเลย ขอขายของนิดหน่อยแบบเขิน ๆ ว่าเมื่อก่อนฉันเคยทำวิดีโอแสดงภาพกระบวนการฝึก RBM ไว้ด้วย

  • เดโมสะอาดมาก ทำให้นึกถึงตอนเคยฟังเลกเชอร์ของ Geoff Hinton เกี่ยวกับ neural network ที่พูดถึง Boltzmann machine อยู่หลายครั้ง มีข้อสังเกตอย่างหนึ่งคือ คำอธิบายทำนองว่า “restricted Boltzmann machine ไม่มีการเชื่อมต่อกันระหว่าง visible กับ hidden neuron” เป็นการใช้ถ้อยคำที่ไม่ถูก เพราะอาจทำให้เข้าใจว่า visible node กับ hidden node ไม่ได้เชื่อมถึงกัน จริง ๆ แล้วความหมายที่ถูกต้องคือไม่มีการเชื่อมต่อภายในประเภทเดียวกัน นั่นคือไม่มี visible-to-visible หรือ hidden-to-hidden หรือจะอธิบายว่า visible และ hidden node ไม่มีการเชื่อมต่อภายในกลุ่มชนิดเดียวกับตัวเองก็ได้

    • ตอนเห็นประโยคว่า “ไม่มีการเชื่อมต่อภายในระหว่าง visible/hidden neuron” ก็แอบงงเหมือนกันว่าแล้วมันต่างจาก MLP ตรงไหน แต่สุดท้ายก็เพิ่งนึกได้ว่าต้องเลื่อนกลับขึ้นไปอ่านบทนำอีกครั้ง และก็เห็นด้วยเต็มที่ว่าการเขียนระบบเลื่อนหน้าจอขึ้นมาใหม่เองหรือพยายามซ่อมมัน ไม่ใช่ไอเดียที่ดีนัก