เพิ่ม MSE สูงสุดของโมเดล keras


11

ฉันมีเครือข่ายผู้ให้กำเนิดที่ไม่เห็นด้วยซึ่งผู้ที่เลือกปฏิบัติได้รับการย่อให้เล็กสุดด้วย MSE และเครื่องกำเนิดควรได้รับการขยายให้ใหญ่สุด เพราะทั้งคู่เป็นคู่ต่อสู้ที่ไล่ตามเป้าหมายตรงกันข้าม

generator = Sequential()
generator.add(Dense(units=50, activation='sigmoid', input_shape=(15,)))
generator.add(Dense(units=1, activation='sigmoid'))
generator.compile(loss='mse', optimizer='adam')

generator.train_on_batch(x_data, y_data)

ฉันต้องปรับอะไรเพื่อให้ได้ตัวแบบเครื่องกำเนิดซึ่งกำไรจากค่า MSE สูง?


1
ทำไมคุณต้องการที่ นี่เป็นปัญหาที่ไม่ถูกต้อง การขยาย MSE ให้ได้มากที่สุดหมายความว่าคุณต้องทำการคาดคะเนขอบเขตของประเภทข้อมูลพื้นฐาน แต่ถ้าคุณต้องการทำเช่นนั้นจริง ๆ การส่งอัตราการเรียนรู้เชิงลบสำหรับเครื่องมือเพิ่มประสิทธิภาพอาจจะทำงานได้ หรือใช้ค่าผกผันของ MSE เป็นฟังก์ชันการสูญเสีย
a_guest

1
ฉันมีเครือข่ายผู้ให้กำเนิดที่ไม่เห็นด้วยซึ่งผู้ที่เลือกปฏิบัติได้รับการย่อให้เล็กสุดด้วย MSE และเครื่องกำเนิดควรได้รับการขยายให้ใหญ่สุด เพราะทั้งคู่เป็นคู่ต่อสู้ที่ไล่ตามเป้าหมายตรงกันข้าม
Emma

โอเคคำถามของคุณค่อนข้างทำให้เข้าใจผิด โปรดอัปเดตให้ชัดเจน
Geeocode

@Geeocode ฉันขอขอบคุณ คุณคิดว่าทางออกจาก Marco ที่มีเครื่องหมายลบถูกต้องหรือไม่?
Emma

ดูการอัปเดตของฉันในไม่กี่นาที
Geeocode

คำตอบ:


5

UPDATE:

การนำMSEดั้งเดิมไปใช้จะมีลักษณะดังนี้:

def mean_squared_error(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return K.mean(K.square(y_pred - y_true), axis=-1)

ฉันคิดว่าฟังก์ชั่นการสูญเสีย maximizer ที่ถูกต้อง:

def mean_squared_error_max(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return K.mean(K.square(1 / (y_pred - y_true)), axis=-1)

วิธีนี้เราจะได้ค่าการสูญเสียที่เป็นบวกเสมอเช่นในกรณีของฟังก์ชัน MSE แต่มีผลกลับด้าน

การปรับปรุง 2: เริ่มแรกฉันเขียนว่าความคิดแรกที่เข้าใจง่ายที่จะลบล้างการสูญเสียจะไม่ให้ผลลัพธ์ที่เราคาดไว้เนื่องจากแนวคิดพื้นฐานของวิธีการปรับให้เหมาะสม (คุณสามารถอ่านการอภิปรายที่น่าสนใจได้ที่นี่ ) หลังจากฉันตรวจสอบทั้งสองวิธีแล้วให้ผลในงานการเรียนรู้เฉพาะ (หมายเหตุ: ฉันไม่ได้ทำแบบทดสอบหมด) คือทั้งสองวิธีให้การสูญเสียสูงสุดแม้ว่า-lossวิธีการจะแปรผันได้เร็วขึ้นเล็กน้อย ผมไม่แน่ใจว่ามันมักจะให้ทางออกที่ดีที่สุดหรือวิธีการแก้ปัญหาใด ๆ เพราะการออกไปได้อธิบายไว้ที่นี่ หากใครมีประสบการณ์อื่นโปรดแจ้งให้เราทราบ

ดังนั้นหากใครต้องการลองทำ-lossเช่นกัน:

def mean_squared_error(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return - K.mean(K.square(y_pred - y_true), axis=-1)


รายละเอียดเพิ่มเติม:

OP เขียนว่า:

ฉันมีเครือข่ายผู้ให้กำเนิดที่ไม่เห็นด้วยซึ่งผู้ที่เลือกปฏิบัติได้รับการย่อให้เล็กสุดด้วย MSE และเครื่องกำเนิดควรได้รับการขยายให้ใหญ่สุด เพราะทั้งคู่เป็นคู่ต่อสู้ที่ไล่ตามเป้าหมายตรงกันข้าม

จากลิงค์ที่จัดทำโดย Ibragil:

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


ดังนั้นนี่เป็นปัญหาที่ไม่ดี:

ในGANเป้าหมายสุดท้ายของเราในการฝึกอบรมของเราสองเคาน์เตอร์ฝ่ายdiscriminatorและเครื่องกำเนิดไฟฟ้าในการดำเนินการที่ดีที่สุดเท่าที่เป็นไปได้กับแต่ละอื่น ๆ มันหมายความว่าการเรียนรู้พื้นฐานทั้งสองมีหน้าที่แตกต่างกัน แต่ฟังก์ชั่นการสูญเสียที่พวกเขาสามารถบรรลุการแก้ปัญหาที่ดีที่สุดคือเช่นเดียวกันbinary_crossentropyดังนั้นงานของแบบจำลองเพื่อลดการสูญเสียนี้

discriminatorรูปแบบวิธีการรวบรวม:

self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)

กำเนิดรูปแบบวิธีการรวบรวม:

self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)

มันเหมือนกับเป้าหมายของนักวิ่งสองคนที่จะลดเวลาในการไปถึงเส้นชัยเพื่อให้พวกเขาเป็นคู่แข่งในงานนี้

ดังนั้น "เป้าหมายตรงกันข้าม" ไม่ได้หมายถึงภารกิจตรงข้ามนั่นคือลดการสูญเสีย (เช่นการลดเวลาในตัวอย่างของนักวิ่ง)

ฉันหวังว่ามันจะช่วย


5

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

คุณสามารถใช้ฟังก์ชั่นการสูญเสียที่กำหนดเองของคุณเองซึ่งคำนวณ -MSE; พลิกสัญญาณของการสูญเสียและทำให้บรรลุการพลิกในทิศทางที่ลาดลงทางลาด

def negative_mse(y,yhat): 
    return - K.mean(K.sum(K.square(y-yhat)))

model.compile(loss=negative_mse, optimizer='adam')

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


คุณลืมเครื่องหมายลบในฟังก์ชั่นของคุณหรือไม่
Emma

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