ทำไมการเพิ่มความน่าจะเป็นของบันทึกจึงเร็วกว่าการคูณความน่าจะเป็น


21

ในการวางกรอบคำถามในวิทยาการคอมพิวเตอร์บ่อยครั้งที่เราต้องการคำนวณผลคูณของความน่าจะเป็น:

P(A,B,C) = P(A) * P(B) * P(C)

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

log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C))

นี่จะให้ความน่าจะเป็นของบันทึก แต่เราสามารถได้ความน่าจะเป็นหลังจากนั้นถ้าจำเป็น:

P(A,B,C) = e^log(P(A,B,C))

การเพิ่มบันทึกถือว่าดีกว่าด้วยเหตุผลสองประการ:

  1. มันป้องกัน "underflow" โดยผลิตภัณฑ์ของความน่าจะเป็นมีขนาดเล็กจนมันถูกปัดเศษเป็นศูนย์ สิ่งนี้มักเป็นความเสี่ยงเนื่องจากความน่าจะเป็นมีขนาดเล็กมาก
  2. มันเร็วกว่าเพราะสถาปัตยกรรมคอมพิวเตอร์จำนวนมากสามารถทำการเพิ่มได้เร็วกว่าการคูณ

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

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

ในที่สุดเหตุผลที่ว่า "คอมพิวเตอร์ทำการเพิ่มเร็วกว่าการคูณ" นั้นค่อนข้างคลุมเครือ นั่นเป็นคำเฉพาะสำหรับชุดคำสั่ง x86 หรือเป็นคุณลักษณะพื้นฐานเพิ่มเติมของสถาปัตยกรรมโปรเซสเซอร์


18
ประโยชน์แรก (หลีกเลี่ยงอันเดอร์โฟล์) มักจะสำคัญกว่าการเพิ่มประสิทธิภาพดังนั้นแม้ว่ามันจะไม่เร็วกว่า แต่เราก็ยังใช้ความน่าจะเป็นของบันทึก
DW

หากต้องการขยายสิ่งที่ @DW กล่าวว่ามี "เคล็ดลับการบันทึกผลรวม - ค่าใช้จ่าย" ที่คล้ายกันซึ่งใช้เป็นพิเศษเพื่อจัดการกับอันเดอร์โฟล์โดยไม่คำนึงถึงประสิทธิภาพใด ๆ อันที่จริงนี่เป็นครั้งแรกที่ฉันเห็นคนที่คิดว่าการใช้ลอการิทึมเป็นเทคนิคการปรับปรุงประสิทธิภาพ!
Mehrdad

คำตอบ:


14

นอกจากนี้หน้า Wikipedia ( https://en.wikipedia.org/wiki/Log_probability ) ทำให้เกิดความสับสนในส่วนนี้โดยระบุว่า "การแปลงเป็นไฟล์บันทึกมีราคาแพง แต่เกิดขึ้นเพียงครั้งเดียวเท่านั้น" ฉันไม่เข้าใจสิ่งนี้เพราะฉันคิดว่าคุณจะต้องใช้บันทึกของทุกคำศัพท์อย่างอิสระก่อนที่จะเพิ่ม ฉันพลาดอะไรไป

ถ้าคุณแค่ต้องการคำนวณหนึ่งครั้งคุณก็คิดถูก คุณจะต้องคำนวณลอการิทึมnและส่วนเพิ่มเติมn - 1ในขณะที่วิธีการไร้เดียงสาต้องใช้n - 1P(A1)P(An)nn1n1คูณ

อย่างไรก็ตามเป็นเรื่องธรรมดามากที่คุณต้องการตอบแบบสอบถามของแบบฟอร์ม:

Compute สำหรับบางเซตผมของ{ 1 , ... n }iIP(Ai)I{1,n}

ในกรณีนั้นคุณสามารถประมวลผลข้อมูลของคุณล่วงหน้าเพื่อคำนวณเพียงครั้งเดียวและตอบแบบสอบถามแต่ละข้อโดยทำ| ฉัน| เพิ่มเติมlogP(Ai)|I|

ในที่สุดเหตุผลที่ว่า "คอมพิวเตอร์ทำการเพิ่มเร็วกว่าการคูณ" นั้นค่อนข้างคลุมเครือ นั่นเป็นคำเฉพาะสำหรับชุดคำสั่ง x86 หรือเป็นคุณลักษณะพื้นฐานเพิ่มเติมของสถาปัตยกรรมโปรเซสเซอร์

นี่เป็นคำถามที่กว้างขึ้น โดยทั่วไปแล้วการคำนวณการคูณทวีคูณจะยากกว่านี้อีก การคำนวณเป็นเส้นตรงในขนาดของaและb (โดยใช้อัลกอริธึมเล็กน้อย) ในขณะที่เราไม่ทราบวิธีการคำนวณa × bด้วยความซับซ้อนในเวลาเดียวกัน (ตรวจสอบอัลกอริธึมที่ดีที่สุดa+baba×bที่นี่ )

แน่นอนว่าไม่มีคำตอบที่ชัดเจนตัวอย่างเช่นหากคุณจัดการกับจำนวนเต็มเท่านั้นและคุณคูณด้วยกำลัง2แล้วคุณควรเปรียบเทียบกะกับการดำเนินการเพิ่ม

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


1
คุณไม่จำเป็นต้องคำนึงถึงความซับซ้อนของเวลาที่จำเป็นในการคำนวณลอการิทึมสำหรับความน่าจะเป็นทั้งหมดหรือไม่? P(Ai)
David C

สิ่งที่เกี่ยวกับ exp สุดท้าย ()? ไม่ช้าอย่างนั้นเหรอ?
Mehrdad

@DavidC: ฉันไม่ได้พยายามคำนวณความซับซ้อนของเวลาโดยรวม ฉันเพิ่งตอบคำถามว่า "การคูณเร็วกว่าการเติม" แต่โดยทั่วไปการคำนวณลอการิทึมของตัวเลขจุดลอยตัวในระดับซอฟต์แวร์อาจใช้เวลาโดยที่M ( n )เป็นความซับซ้อนของอัลกอริทึมการคูณ ดังนั้นมันจะให้Θ ( n M ( n ) บันทึกn + n q Q | ฉันq | )ความซับซ้อน (โดยที่QΘ(M(n)logn)M(n)Θ(nM(n)logn+nqQ|Iq|)Qคือชุดของข้อความค้นหา)
md5

2
@ Mehrdad: มันยากเท่ากับการคำนวณลอการิทึม อย่างไรก็ตามฉันไม่แน่ใจว่าคุณจะต้องทำเช่นนั้น ตัวอย่างเช่นถ้าคุณจะเปรียบเทียบความน่าจะเป็นคุณไม่ต้องการคำนวณสุดท้ายประสบการณ์คูณของnตัวเลขใน( 0 , 1 )ได้อย่างรวดเร็วอาจจะกลายเป็นขนาดเล็กมากดังนั้นด้วยเหตุผลเดียวกันกับที่เราพยายามที่จะหลีกเลี่ยงการ underflow โดยใช้ความน่าจะเป็นบันทึกของเราควรจะอยู่ในรูปแบบลอการิทึมที่สิ้นสุด (เช่นโดยการคำนวณบันทึกในฐาน10เพื่อให้เป็น "มนุษย์อ่าน" มากขึ้น) expn(0,1)log10
md5

1
นอกจากนี้ยังเร็วกว่าการคูณหากคุณใช้ IEEE ลอย - ซึ่งในกรณีนี้คุณจะแน่นอน? ซีพียูสมัยใหม่นั้นค่อนข้างดีในการคูณตัวเลขในขณะที่การเพิ่มทุ่นมีสองขั้นตอนที่ไม่สามารถดำเนินการได้พร้อมกัน - จัดวาง mantissas (เลื่อนไปทางซ้ายตามผลของการลบ) จากนั้นเพิ่มจริงแล้วทำให้เป็นปกติ ล้น, ใช่) ในวงจรมันค่อนข้างตายมากในไมโครโค้ดแต่ละขั้นตอนมีค่าใช้จ่ายต่อรอบหรือไม่กี่รอบ
John Dvorak

4

โดย "เกิดขึ้นครั้งเดียว" มันอาจหมายถึงว่าถ้าคุณมีน่าจะเป็นP 1 , . . p Nจากนั้นคุณเปลี่ยนเป็นพื้นที่บันทึกเพียงครั้งเดียวโดยการบันทึกของแต่ละp ฉันNp1,...pNpiทำการคูณความน่าจะเป็นในพื้นที่บันทึกโดยเพิ่ม (ซึ่งใช้เวลาน้อยลง) จากนั้นสลับกลับไปยังพื้นที่เริ่มต้นโดยใช้การยกกำลัง

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

ในที่สุดการเพิ่มจะเร็วกว่าการคูณไม่ใช่เพราะสถาปัตยกรรมของเครื่อง การเติมจะเร็วกว่าการคูณ ในแง่ของความซับซ้อนจะใช้เวลา (เชิงเส้น) เพื่อดำเนินการเพิ่มจำนวนเต็มสองจำนวนn-บิตในขณะที่การคูณใช้เวลาO ( n 2 ) (กำลังสอง)O(n)nO(n2)

อย่างไรก็ตามแนวคิดนี้คล้ายกับการคูณแบบแยกส่วนของ Montgomery ซึ่งการคูณจะดำเนินการในรูปแบบ Montgomery ซึ่งค่อนข้างเร็วกว่าการคูณปกติแล้วลดลง



1
@ Mehrdad ฉันหวังว่าคุณจะได้เรียนรู้การคูณเลขสองตัวในโรงเรียน Algoritnm นั้นยังคงใช้กันอย่างแพร่หลายในชิปคอมพิวเตอร์โปรดดูที่นี่สิ่งที่คุณหมายถึงอัลกอริทึมระดับซอฟต์แวร์ซึ่งยังคงแย่กว่าเวลาเชิงเส้น อัลกอริทึมการคูณเหล่านี้ใช้กันอย่างแพร่หลายในวงจรการคูณหรือไม่
fade2black


1
วิญญาณของคำตอบนั้นยังคงถูกต้องใช่ไหม? หากไม่มีอัลกอริทึมการคูณจะตรงกับเวลาเชิงเส้นของการเพิ่มหรือไม่
Stephen

1
@ สตีเฟ่นในความเป็นจริงคำถามไม่ได้เกี่ยวกับความซับซ้อนที่ดีที่สุดที่แน่นอนของอัลกอริทึมการคูณคืออะไร ฉันสามารถให้ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้หากผู้แสดงความคิดเห็นต้องการ ฉันคิดว่าการอภิปรายที่ยาวนานเกี่ยวกับเรื่องนี้จะเป็นเรื่องนอกเรื่องที่นี่ )))
fade2black
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.