MinDiff를 MinDiffModel과 통합

소개

MinDiff를 모델에 통합하는 두 단계가 있습니다.

  1. 데이터를 준비합니다 ( 입력 준비 가이드 에서 다룹니다).

  2. 훈련 중에 MinDiff를 통합 할 모델을 변경하거나 만듭니다.

이 가이드에서는 두 번째 단계를 완료하는 가장 간단한 방법 인 MinDiffModel 사용을 MinDiffModel .

설정

pip install -q --upgrade tensorflow-model-remediation
import tensorflow as tf
tf.get_logger().setLevel('ERROR')  # Avoid TF warnings.
from tensorflow_model_remediation import min_diff
from tensorflow_model_remediation.tools.tutorials_utils import uci as tutorials_utils

먼저 데이터를 다운로드하십시오. 간결함을 위해 입력 준비 가이드에 설명 된대로 입력 준비 논리가 도우미 함수로 분류되었습니다. 이 프로세스에 대한 자세한 내용은 전체 가이드를 읽을 수 있습니다.

# Original DataFrame for training, sampled at 0.3 for reduced runtimes.
train_df = tutorials_utils.get_uci_data(split='train', sample=0.3)

# Dataset needed to train with MinDiff.
train_with_min_diff_ds = (
    tutorials_utils.get_uci_with_min_diff_dataset(split='train', sample=0.3))

오리지널 모델

이 가이드에서는 keras.Model 사용하여 강조 표시하기 위해 Functional API 를 사용하는 기본 조정되지 않은 keras.Model 사용합니다. 실제 애플리케이션에서는 공정성 문제를 해결하기 전에 모델 아키텍처를 신중하게 선택하고 튜닝을 사용하여 모델 품질을 개선합니다.

MinDiffModel 은 대부분의 Keras Model 클래스와 함께 작동하도록 설계되었으므로 모델을 헬퍼 함수 get_uci_model 로 빌드하는 논리를 고려했습니다.

Pandas DataFrame으로 학습

이 가이드는 속도를 위해 단일 epoch에 대해 학습하지만 epoch 수를 늘려 모델의 성능을 쉽게 향상시킬 수 있습니다.

model = tutorials_utils.get_uci_model()

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

df_without_target = train_df.drop(['target'], axis=1)  # Drop 'target' for x.
_ = model.fit(
    x=dict(df_without_target),  # The model expects a dictionary of features.
    y=train_df['target'],
    batch_size=128,
    epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.8589

tf.data.Dataset 훈련

tf.data.Dataset 사용한 동등한 학습은 매우 유사 해 보입니다 (초기화 및 입력 임의성이 약간 다른 결과를 생성 할 수 있음).

model = tutorials_utils.get_uci_model()

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

_ = model.fit(
    tutorials_utils.df_to_dataset(train_df, batch_size=128),  # Converted to Dataset.
    epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.6416

훈련을 위해 MinDiff 통합

데이터가 준비되면 다음 단계에 따라 MinDiff를 모델에 적용합니다.

  1. MinDiff를 사용하지 않고 원래 모델을 만듭니다.
original_model = tutorials_utils.get_uci_model()
  1. MinDiffModel 감싸십시오.
min_diff_model = min_diff.keras.MinDiffModel(
    original_model=original_model,
    loss=min_diff.losses.MMDLoss(),
    loss_weight=1)
  1. MinDiff없이 컴파일하십시오.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
  1. MinDiff 데이터 세트 (이 경우 train_with_min_diff_ds 를 사용하여 훈련합니다.
_ = min_diff_model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 6s 31ms/step - loss: 0.7883 - min_diff_loss: 0.0379

MinDiffModelMinDiffModel 평가 및 예측

MinDiffModel 사용한 평가 및 예측은 모두 원래 모델을 사용한 것과 유사합니다.

evaluate 를 호출 할 때 원래 데이터 세트 또는 MinDiff 데이터를 포함하는 데이터를 전달할 수 있습니다. 당신이 후자를 선택하는 경우, 당신은 또한 얻을 것이다 min_diff_loss 측정하는 다른 측정 기준에 추가하여 메트릭을 loss 도 포함됩니다 min_diff_loss .

evaluate 를 호출 할 때 원래 데이터 세트 또는 MinDiff 데이터를 포함하는 데이터를 전달할 수 있습니다. 평가할 호출에 MinDiff를 포함하면 다음 두 가지가 다릅니다.

  • min_diff_loss 라는 추가 메트릭이 출력에 표시됩니다.
  • loss 지표의 값은 원래 loss 지표 (출력에 표시되지 않음)와 min_diff_lossmin_diff_loss 됩니다.
_ = min_diff_model.evaluate(
    tutorials_utils.df_to_dataset(train_df, batch_size=128))
# Calling with MinDiff data will include min_diff_loss in metrics.
_ = min_diff_model.evaluate(train_with_min_diff_ds)
77/77 [==============================] - 2s 22ms/step - loss: 0.4638
77/77 [==============================] - 3s 32ms/step - loss: 0.5087 - min_diff_loss: 0.0451

predict 를 호출 할 때 기술적으로 MinDiff 데이터와 함께 데이터 세트를 전달할 수도 있지만 무시되고 출력에 영향을주지 않습니다.

_ = min_diff_model.predict(
    tutorials_utils.df_to_dataset(train_df, batch_size=128))
_ = min_diff_model.predict(train_with_min_diff_ds)  # Identical to results above.

MinDiffModel 직접 사용의 제한 사항

위에서 설명한대로 MinDiffModel 을 사용하는 경우 대부분의 메서드는 tf.keras.Model 의 기본 구현을 사용합니다 ( API 문서에 나열된 예외).

print('MinDiffModel.fit == keras.Model.fit')
print(min_diff.keras.MinDiffModel.fit == tf.keras.Model.fit)
print('MinDiffModel.train_step == keras.Model.train_step')
print(min_diff.keras.MinDiffModel.train_step == tf.keras.Model.train_step)
MinDiffModel.fit == keras.Model.fit
True
MinDiffModel.train_step == keras.Model.train_step
True

keras.Sequential 또는 keras.Model 경우 동일한 기능을 사용하므로 완벽하게 괜찮습니다.

print('Sequential.fit == keras.Model.fit')
print(tf.keras.Sequential.fit == tf.keras.Model.fit)
print('tf.keras.Sequential.train_step == keras.Model.train_step')
print(tf.keras.Sequential.train_step == tf.keras.Model.train_step)
Sequential.fit == keras.Model.fit
True
tf.keras.Sequential.train_step == keras.Model.train_step
True

그러나 모델은 경우 의 서브 클래스 keras.Model 로 포장, MinDiffModel 효과적으로 사용자 정의를 잃게됩니다은.

class CustomModel(tf.keras.Model):

  def train_step(self, **kwargs):
    pass  # Custom implementation.

print('CustomModel.train_step == keras.Model.train_step')
print(CustomModel.train_step == tf.keras.Model.train_step)
CustomModel.train_step == keras.Model.train_step
False

이것이 유스 케이스라면 MinDiffModel 직접 사용해서는 안됩니다. 대신 맞춤 설정 가이드에 설명 된대로 하위 클래스를 지정해야합니다.

추가 자료

  • 공정성 평가에 대한 자세한 내용은 공정성 지표 지침을 참조하십시오.
  • 수정 및 MinDiff에 대한 일반 정보는 수정 개요를 참조하십시오.
  • MinDiff와 관련된 요구 사항에 대한 자세한 내용은 이 가이드를 참조하십시오.
  • Keras에서 MinDiff를 사용하는 방법에 대한 종단 간 자습서를 보려면 이 자습서를 참조하십시오.