케 라스 모델의 MSE 최대화


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로 차별자가 최소화되고 발전기가 최대화되어야하는 생성적인 적대적 네트워크를 가지고 있습니다. 둘 다 반대 목표를 추구하는 상대이기 때문입니다.
엠마

네 질문은 오해의 소지가있었습니다. 명확하게 업데이트하십시오.
Geeocode

@Geeocode 감사합니다. 음수 부호가있는 Marco의 솔루션이 맞다고 생각하십니까?
Emma

몇 분 내 업데이트 확인
Geeocode

답변:


5

최신 정보:

원래 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)

올바른 최대 손실 기능을 생각합니다.

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 : 처음에 나는에 대한 직관적 인 첫번째 생각은 단순히 손실됩니다 부정 것을 썼다 NOT (당신이 흥미있는 토론을 읽을 수있는 우리 때문에 최적화 방법의 기본 개념의 기대했던 결과를 제공 여기에 ). 두 방법 모두를 두 번 확인한 후 특정 학습 작업의 결과 (참고 : 전체 테스트를 수행하지는 않음)는 두 방법 모두 손실 최대화를 제공했지만 -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 에서는 두 상대방에게 차별 자발전기 가 서로에 대해 가능한 한 우수한 성능을 발휘 하도록 훈련시키는 최종 목표 입니다. 그것은 두 개의 기본 학습 algorythm가 다른 작업 만 가지고, 의미 손실 기능 들이 최적의 솔루션을 달성 할 수있는 동일 즉, binary_crossentropy모델의 작업이 손실 최소화 할 수있는 정도.

판별 모델은 컴파일 방법입니다 :

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.