อัปเดต (18/04/18): คำตอบเก่าที่พิสูจน์แล้วว่ายังมีประโยชน์กับแบบจำลองของฉัน เคล็ดลับคือการสร้างแบบจำลองฟังก์ชั่นพาร์ทิชันและการกระจายแยกต่างหากจึงใช้ประโยชน์จากพลังของ softmax
พิจารณาสังเกตเวกเตอร์ของคุณจะมีป้าย (1 ถ้าตัวอย่างฉันมีป้ายกำกับ m มิฉะนั้นเป็น 0) ดังนั้นวัตถุประสงค์ก็คือเพื่อสร้างแบบจำลองเมทริกซ์ในลักษณะต่อตัวอย่าง ดังนั้นรูปแบบการประเมินx_i) พิจารณาการขยายเพื่อให้ได้สองคุณสมบัติ:ymyim=δimF(yi,xi)=−logP(yi|xi)yim=Z⋅P(ym)
- ฟังก์ชั่นการกระจาย:∑mP(ym)=1
- ฟังก์ชันการแบ่งพาร์ติชัน:ประมาณจำนวนฉลากZ
จากนั้นมันเป็นเรื่องของการสร้างแบบจำลองทั้งสองแยกจากกัน ฟังก์ชั่นการกระจายเป็นแบบจำลองที่ดีที่สุดกับเลเยอร์softmaxและฟังก์ชันพาร์ติชันสามารถสร้างแบบจำลองด้วยหน่วยเชิงเส้น (ในทางปฏิบัติฉันตัดมันเป็นการสร้างแบบจำลองที่ซับซ้อนมากขึ้นเช่นหน่วยปัวซงอาจทำงานได้ดีขึ้น) จากนั้นคุณสามารถเลือกที่จะใช้การสูญเสียแบบกระจาย (KL ในการกระจายและ MSE บนพาร์ติชัน) หรือคุณสามารถลองการสูญเสียต่อไปนี้บนผลิตภัณฑ์ของพวกเขาmax(0.01,output)
ในทางปฏิบัติตัวเลือกของเครื่องมือเพิ่มประสิทธิภาพยังสร้างความแตกต่างอย่างมาก ประสบการณ์ของฉันกับวิธีการแยกตัวประกอบเป็นวิธีที่ดีที่สุดภายใต้Adadelta (Adagrad ไม่ได้ผลสำหรับฉันไม่ได้ลอง RMSprop เลยการแสดงของ SGD ขึ้นอยู่กับพารามิเตอร์)
ความคิดเห็นด้านข้างของ sigmoid : ฉันได้ลอง sigmoid + crossentropy แล้วและมันก็ไม่ได้ผล แบบจำลองมีแนวโน้มที่จะทำนายเท่านั้นและไม่สามารถจับการเปลี่ยนแปลงในฟังก์ชันการแจกแจง (หรือที่รู้จักว่ามันค่อนข้างมีประโยชน์สำหรับการสร้างแบบจำลองพาร์ติชันและอาจมีเหตุผลทางคณิตศาสตร์อยู่เบื้องหลัง)Z
UPDATE : (ความคิดแบบสุ่ม) ดูเหมือนว่าการใช้กระบวนการ Dirichlet จะอนุญาตให้มีการรวมกลุ่มของก่อนหน้านี้กับจำนวนของป้ายกำกับหรือไม่
อัปเดต : โดยการทดสอบ KL-divergence ที่แก้ไขแล้วยังคงมีแนวโน้มที่จะให้เอาต์พุตหลายระดับมากกว่าเอาท์พุทฉลากหลายรายการ
(คำตอบเก่า)
ประสบการณ์ของฉันกับ sigmoid cross-entropy นั้นไม่น่าพอใจมาก ในขณะนี้ฉันใช้ KL-divergence ที่แก้ไขแล้ว ใช้รูปแบบ
Loss(P,Q)=∑x|P(x)−Q(x)|⋅∣∣∣logP(x)Q(x)∣∣∣=∑x∣∣∣(P(x)−Q(x))⋅logP(x)Q(x)∣∣∣
โดยที่คือการกระจายหลอกเป้าหมายและคือการกระจายหลอกที่ทำนายไว้ (แต่ฟังก์ชั่นนั้นสมมาตรจริงดังนั้นจึงไม่สำคัญ)
P(x)Q(x)
พวกเขาถูกเรียกว่าการกระจายหลอกที่ไม่ได้เป็นปกติ ดังนั้นคุณสามารถมีหากคุณมี 2 ป้ายกำกับสำหรับตัวอย่างเฉพาะ∑xP(x)=2
Keras impelmentation
def abs_KL_div(y_true, y_pred):
y_true = K.clip(y_true, K.epsilon(), None)
y_pred = K.clip(y_pred, K.epsilon(), None)
return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)