ฉันสับสนเล็กน้อยเกี่ยวกับวิธีใช้ KL Divergence โดยเฉพาะใน Keras แต่ฉันคิดว่าคำถามนี้เป็นคำถามทั่วไปสำหรับแอปพลิเคชันการเรียนรู้เชิงลึก ใน keras ฟังก์ชันการสูญเสีย KL ถูกกำหนดไว้ดังนี้:
def kullback_leibler_divergence(y_true, y_pred):
y_true = K.clip(y_true, K.epsilon(), 1)
y_pred = K.clip(y_pred, K.epsilon(), 1)
return K.sum(y_true * K.log(y_true / y_pred), axis=-1)
ในแบบจำลองของฉัน y_true
และ y_pred
เป็นเมทริกซ์ แต่ละแถวของ y_true
การเข้ารหัสแบบร้อนแรงสำหรับตัวอย่างการฝึกอบรมหนึ่งตัวอย่าง และแต่ละแถวของ y_pred
เอาต์พุตของแบบจำลอง (การแจกแจงความน่าจะเป็น) สำหรับตัวอย่างนั้น
ฉันสามารถรันการคำนวณความแตกต่างของ KL นี้กับคู่ของแถวที่กำหนดตั้งแต่ y_true
และ y_pred
และรับผลลัพธ์ที่คาดหวัง ค่าเฉลี่ยของผลลัพธ์ความแตกต่างของ KL เหล่านี้ในแถวตรงกับการสูญเสียที่รายงานโดย Keras ในประวัติการฝึกอบรม แต่การรวมนั้น - การเรียกใช้ KL Divergence ในแต่ละแถวและรับค่าเฉลี่ย - จะไม่เกิดขึ้นในฟังก์ชันการสูญเสีย ในทางตรงกันข้าม ฉันเข้าใจว่า MAE หรือ MSE จะรวมตัวอย่างต่างๆ:
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
สำหรับความแตกต่างของ KL ฉันไม่เห็นชัดเจนเลยว่าการหาค่าเฉลี่ยจากตัวอย่างต่างๆ เป็นสิ่งที่ถูกต้อง ฉันเดาว่าแนวคิดก็คือตัวอย่างต่างๆ เป็นตัวอย่างแบบสุ่มจากการแจกแจงที่แท้จริง ดังนั้นมันจึงควรปรากฏตามสัดส่วนของความน่าจะเป็น แต่ดูเหมือนว่าจะเป็นข้อสันนิษฐานที่ชัดเจนเกี่ยวกับวิธีการรวบรวมข้อมูลการฝึกอบรม ฉันไม่ได้เห็นแง่มุมนี้จริงๆ (การรวมกลุ่มตัวอย่างจากชุดข้อมูล) ที่กล่าวถึงในการรักษาแบบออนไลน์ของความแตกต่างของ KL ฉันเพิ่งเห็นคำจำกัดความใหม่ของสูตรพื้นฐานมากมาย
ดังนั้นคำถามของฉันคือ:
การตีความสิ่งที่ Keras กำลังทำอยู่นี้เกิดขึ้นกับการสูญเสียความแตกต่างของ KL (เช่น ค่าเฉลี่ยเหนือความแตกต่างของ KL ของแถว) ถูกต้องหรือไม่
เหตุใดจึงเป็นสิ่งที่ถูกต้องที่จะทำ?
จากมุมมองของการนำไปปฏิบัติ เหตุใดคำจำกัดความของฟังก์ชันการสูญเสียใน Keras จึงไม่ทำการรวมกลุ่มเหนือแถวแบบที่ MAE หรือ MSE ทำ