การใช้งาน Python ของฟังก์ชั่นต้นทุนในการถดถอยโลจิสติก: เหตุใดการคูณดอทในนิพจน์หนึ่ง แต่การคูณองค์ประกอบที่ชาญฉลาดในอีกอันหนึ่ง


18

ฉันมีคำถามพื้นฐานที่เกี่ยวข้องกับ Python จำนวน numpy และการคูณเมทริกซ์ในการตั้งค่าของการถดถอยโลจิสติก

ก่อนอื่นให้ฉันขอโทษที่ไม่ได้ใช้สัญกรณ์คณิตศาสตร์

ฉันสับสนเกี่ยวกับการใช้การคูณเมทริกซ์ดอทกับการแบ่งส่วนที่ชาญฉลาด ฟังก์ชันต้นทุนได้รับจาก:

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

และในไพ ธ อนฉันได้เขียนสิ่งนี้เป็น

    cost = -1/m * np.sum(Y * np.log(A) + (1-Y) * (np.log(1-A)))

แต่สำหรับตัวอย่างการแสดงออกนี้ (อันแรก - อนุพันธ์ของ J เทียบกับ w)

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

คือ

   dw = 1/m * np.dot(X, dz.T)

ฉันไม่เข้าใจว่าทำไมมันถูกต้องที่จะใช้การคูณดอทในข้างต้น แต่ใช้การคูณองค์ประกอบที่ชาญฉลาดในฟังก์ชั่นค่าใช้จ่ายเช่นทำไมไม่:

   cost = -1/m * np.sum(np.dot(Y,np.log(A)) + np.dot(1-Y, np.log(1-A)))

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


2
คุณกำลังตั้งคำถามสูตรคณิตศาสตร์หรือการแปลระหว่างสูตรคณิตศาสตร์และรหัสหรือไม่ คือคุณต้องการทราบว่าทำไมฟังก์ชันต้นทุนแสดงเป็นผลรวมและการคำนวณการไล่ระดับสีแสดงเป็นการคูณเมทริกซ์ หรือคุณต้องการที่จะเข้าใจว่าทำไมกลายเป็นในขณะที่กลายเป็น? yilog(ai)Y * np.log(A)X(AY)Tnp.dot(X, dz.T)
Neil Slater

2
ขอบคุณนีล ขออภัยในความคลุมเครือ ที่สอง. ฉันเข้าใจสูตรคณิตศาสตร์ ฉันไม่สามารถมุ่งไปที่สัญชาตญาณสำหรับการคูณดอทในอันใดอันหนึ่งและการคูณที่ชาญฉลาดในองค์ประกอบอื่น ๆ
GhostRider

คำตอบ:


12

ในกรณีนี้สูตรคณิตศาสตร์สองสูตรแสดงประเภทการคูณที่ถูกต้อง:

  • yiและในฟังก์ชันต้นทุนคือค่าสเกลาร์ การรวมค่าเซนต์คิตส์และเนวิสเป็นผลรวมที่กำหนดให้ในแต่ละตัวอย่างจะไม่เปลี่ยนแปลงสิ่งนี้และคุณจะไม่รวมค่าตัวอย่างหนึ่งกับอีกหนึ่งในผลรวมนี้ ดังนั้นแต่ละองค์ประกอบของจะโต้ตอบกับองค์ประกอบการจับคู่ในเท่านั้นซึ่งโดยพื้นฐานแล้วนิยามขององค์ประกอบที่ชาญฉลาดlog(ai)ya

  • คำศัพท์ในการคำนวณการไล่ระดับสีคือเมทริกซ์และถ้าคุณเห็นเมทริกซ์และคูณด้วยสัญกรณ์อย่างคุณสามารถเขียนสิ่งนี้เป็นผลรวมที่ซับซ้อนมากขึ้น:{JK} มันคือผลรวมภายในของคำศัพท์หลายคำที่กำลังทำงานอยู่ABC=ABCik=jAijBjknp.dot

ในส่วนของความสับสนของคุณเกิดจากการvectorisationที่ถูกนำไปใช้กับสมการในสื่อการเรียนการสอนซึ่งกำลังรอสถานการณ์ที่ซับซ้อนมากขึ้น ในความเป็นจริงคุณสามารถใช้cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))หรือcost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))ขณะที่YและAมีรูปร่าง(m,1)และควรให้ผลลัพธ์เดียวกัน NB the np.sumเป็นเพียงค่าแบนเดียวในนั้นดังนั้นคุณสามารถวางมันและแทนที่จะมี[0,0]ในตอนท้าย อย่างไรก็ตามสิ่งนี้ไม่ได้พูดถึงรูปร่างของเอาท์พุทอื่น ๆ(m,n_outputs)ดังนั้นหลักสูตรไม่ได้ใช้มัน


1
Neil - ใช่ถูกต้องแล้ว Andrew Ngs หลักสูตร DL ใหม่ และคำตอบของคุณก็สมเหตุสมผลดี ขอบคุณสำหรับการป้อนข้อมูล
GhostRider

"ดังนั้นแต่ละองค์ประกอบของ y จะโต้ตอบกับองค์ประกอบการจับคู่ใน a เท่านั้นซึ่งโดยพื้นฐานแล้วนิยามขององค์ประกอบที่ฉลาด" - คำอธิบายที่ชัดเจนอย่างไม่น่าเชื่อ
GhostRider

2

คุณกำลังถามว่าอะไรคือความแตกต่างระหว่างผลคูณของจุดสองเวกเตอร์กับผลรวมของผลคูณตามองค์ประกอบ? พวกเขาก็เหมือน ๆ กัน. เป็นnp.sum(X * Y) np.dot(X, Y)รุ่นจุดจะมีประสิทธิภาพมากขึ้นและเข้าใจง่ายโดยทั่วไป

แต่ในฟังก์ชั่นค่าใช้จ่ายคือเมทริกซ์ไม่ใช่เวกเตอร์ จริง ๆ แล้วคำนวณผลิตภัณฑ์เมทริกซ์และผลรวมขององค์ประกอบเหล่านั้นไม่เหมือนกับผลรวมขององค์ประกอบของผลิตภัณฑ์คู่ (การคูณจะไม่ถูกกำหนดแม้แต่กรณีเดียวกัน)Ynp.dot

ดังนั้นฉันเดาว่าคำตอบคือพวกมันกำลังปฏิบัติการที่แตกต่างกันที่ทำสิ่งที่แตกต่างกันและสถานการณ์เหล่านี้แตกต่างกันและความแตกต่างหลักคือการจัดการเวกเตอร์กับเมทริกซ์


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

2
ในกรณีของ OP np.sum(a * y)จะไม่เหมือนกันnp.dot(a, y)เพราะaและyเป็นรูปร่างเวกเตอร์ของคอลัมน์(m,1)ดังนั้นdotฟังก์ชันจะทำให้เกิดข้อผิดพลาด ฉันค่อนข้างมั่นใจว่าทั้งหมดนี้มาจากcoursera.org/learn/neural-networks-deep-learning (หลักสูตรที่ฉันเพิ่งดูเมื่อเร็ว ๆ นี้) เนื่องจากเครื่องหมายและรหัสตรงกับที่แน่นอน
Neil Slater

0

เกี่ยวกับ "ในกรณีของ OP np.sum (a * y) จะไม่เหมือนกับ np.dot (a, y) เพราะ a และ y เป็นรูปร่างเวกเตอร์คอลัมน์ (m, 1) ดังนั้นฟังก์ชันจุดจะ เพิ่มข้อผิดพลาด "...

(ฉันไม่มีความรุ่งโรจน์เพียงพอที่จะแสดงความคิดเห็นโดยใช้ปุ่มแสดงความคิดเห็น แต่ฉันคิดว่าฉันจะเพิ่ม .. )

หากเวกเตอร์เป็นคอลัมน์เวกเตอร์และมีรูปร่าง (1, m) รูปแบบทั่วไปคือตัวดำเนินการที่สองสำหรับฟังก์ชันจุดถูก postfixed ด้วยตัวดำเนินการ ".T" เพื่อย้ายไปเป็นรูปร่าง (m, 1) และจุด ผลิตภัณฑ์ทำงานเป็น (1, m). (m, 1) เช่น

np.dot (np.log (1-A), (1-Y) .T)

ค่าทั่วไปสำหรับ m ช่วยให้สามารถใช้ผลิตภัณฑ์ dot (การคูณเมทริกซ์)

ในทำนองเดียวกันสำหรับคอลัมน์เวกเตอร์หนึ่งจะเห็นการแปลงที่ใช้กับหมายเลขแรกเช่น np.dot (wT, X) เพื่อวางมิติที่> 1 ใน 'ตรงกลาง'

รูปแบบที่จะได้รับสเกลาร์จาก np.dot คือการทำให้รูปร่างเวกเตอร์สองตัวมีมิติ '1' ที่ 'ภายนอก' และทั่วไป> 1 มิติที่ 'ภายใน':

(1, X). (X, 1) หรือ np.dot (V1, V2) โดยที่ V1 คือรูปร่าง (1, X) และ V2 คือรูปร่าง (X, 1)

ผลลัพธ์คือเมทริกซ์ (1,1) นั่นคือสเกลาร์

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