Tối đa hóa MSE của một mô hình máy ảnh


11

Tôi có một mạng đối nghịch rộng rãi, trong đó người phân biệt đối xử được giảm thiểu với MSE và trình tạo sẽ được tối đa hóa. Bởi vì cả hai đều là đối thủ theo đuổi mục tiêu ngược lại.

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)

Tôi phải làm gì để thích nghi, để có được một mô hình máy phát có lợi từ giá trị MSE cao?


1
Tại sao bạn lại muốn điều đó? Đây là một vấn đề đặt ra. Tối đa hóa MSE có nghĩa là bạn cần đưa dự đoán của mình đi đến ranh giới của kiểu dữ liệu cơ bản. Nhưng nếu bạn thực sự muốn làm điều đó, việc cung cấp một tỷ lệ học tập tiêu cực cho trình tối ưu hóa có lẽ nên thực hiện công việc. Hoặc sử dụng nghịch đảo của MSE như là một hàm mất.
a_guest

1
Tôi có một mạng đối nghịch rộng rãi, trong đó người phân biệt đối xử được giảm thiểu với MSE và trình tạo sẽ được tối đa hóa. Bởi vì cả hai đều là đối thủ theo đuổi mục tiêu ngược lại.
Emma

Ok câu hỏi của bạn là khá sai lệch. Hãy cập nhật nó để được rõ ràng.
Geeocode

@Geeocode Tôi đã làm, cảm ơn bạn. Bạn có nghĩ rằng giải pháp từ Marco với dấu hiệu tiêu cực là chính xác?
Emma

Xem cập nhật của tôi trong vài phút
Geeocode

Câu trả lời:


5

CẬP NHẬT:

Việc thực hiện MSE ban đầu trông như sau:

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)

Tôi nghĩ rằng chức năng mất tối đa hóa chính xác:

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)

Bằng cách này, chúng ta luôn nhận được giá trị tổn thất dương, như trong trường hợp hàm MSE, nhưng có hiệu ứng đảo ngược.

CẬP NHẬT 2: Ban đầu tôi đã viết, rằng suy nghĩ trực quan đầu tiên chỉ đơn giản là phủ nhận sự mất mát sẽ KHÔNG mang lại kết quả như chúng ta mong đợi vì khái niệm cơ bản của các phương pháp tối ưu hóa (bạn có thể đọc một cuộc thảo luận thú vị ở đây ). Sau khi tôi kiểm tra kỹ cả hai phương pháp để đạt kết quả trong một nhiệm vụ học tập cụ thể (Lưu ý: Tôi không thực hiện kiểm tra toàn diện) là cả hai phương pháp đều cho tối đa hóa tổn thất, mặc dù -losscách tiếp cận hội tụ nhanh hơn một chút. Tôi không chắc chắn nếu nó luôn đưa ra giải pháp tốt nhất hoặc bất kỳ giải pháp nào vì vấn đề có thể được mô tả ở đây . Nếu ai đó có kinh nghiệm khác, xin vui lòng cho tôi biết.

Vì vậy, nếu ai đó muốn thử -lossquá:

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)


Chi tiết bổ sung:

OP đã viết:

Tôi có một mạng đối nghịch rộng rãi, trong đó người phân biệt đối xử được giảm thiểu với MSE và trình tạo sẽ được tối đa hóa. Bởi vì cả hai đều là đối thủ theo đuổi mục tiêu ngược lại.

Từ liên kết được cung cấp bởi Ibragil:

Trong khi đó, trình tạo đang tạo ra những hình ảnh tổng hợp mới mà nó truyền cho người phân biệt đối xử. Nó làm như vậy với hy vọng rằng họ cũng sẽ được coi là xác thực, mặc dù chúng là giả. Mục tiêu của trình tạo là tạo ra các chữ số viết tay có thể vượt qua: nói dối mà không bị bắt. Mục tiêu của người phân biệt đối xử là xác định hình ảnh đến từ máy phát điện là giả mạo.


Vì vậy, đây là một vấn đề đặt ra:

Trong GAN, mục tiêu cuối cùng của chúng tôi là đào tạo hai bên đối tác của mình là người phân biệt đối xử và người tạo ra để thực hiện tốt nhất có thể với nhau. Điều đó có nghĩa, rằng việc học tập algorythm hai cơ sở có nhiệm vụ khác nhau nhưng hàm tổn thất mà họ có thể đạt được giải pháp tối ưu là như nhau ví dụ binary_crossentropy, vì vậy nhiệm vụ của mô hình là để giảm thiểu này mất.

Một phân biệt mô hình là phương pháp biên dịch:

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

Một máy phát điện mô hình là phương pháp biên dịch:

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

Nó giống như mục tiêu của hai vận động viên là giảm thiểu thời gian đạt đến đích ngay cả khi họ là đối thủ trong nhiệm vụ này.

Vì vậy, "mục tiêu ngược lại" không có nghĩa là nhiệm vụ ngược lại tức là giảm thiểu tổn thất (tức là giảm thiểu thời gian trong ví dụ về người chạy).

Tôi hy vọng nó sẽ giúp.


5

Câu hỏi không rõ ràng lắm đối với tôi. Tôi cho rằng bạn muốn tối đa hóa thay vì tối thiểu hóa, trong khi sử dụng tiêu chí của MSE.

Bạn có thể thực hiện chức năng mất tùy chỉnh của riêng mình, tính toán -MSE; lật dấu hiệu của sự mất mát, và do đó đạt được một cú lật theo hướng giảm dần.

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

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

Một lựa chọn khác là chỉ đơn giản là cung cấp một bước học tập tiêu cực - nhưng tôi không chắc chắn rằng Keras cho phép bạn làm điều này. Đáng để thử.


Bạn đã quên dấu hiệu tiêu cực trong chức năng của bạn?
Emma

Quả thực tôi có. Chỉ cần chỉnh sửa câu trả lời.
Mano
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.