ML 커뮤니티 데이는 11월 9일입니다! TensorFlow, JAX에서 업데이트를 우리와 함께, 더 자세히 알아보기

MinDiffModel없이 MinDiff 통합

소개

MinDiff를 모델의 구현에 직접 통합 할 수 있습니다. 이렇게하면 MinDiffModel 을 사용하는 편리함은 MinDiffModel 이 옵션은 모델이 tf.keras.Model 의 하위 클래스 일 때 특히 유용 할 수있는 최고 수준의 제어를 제공합니다.

이 가이드는 train_step 메서드를 추가하여 train_step 를 사용자 지정 모델의 구현에 직접 통합하는 방법을 보여줍니다.

설정

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 Dataset for training, sampled at 0.3 for reduced runtimes.
train_df = tutorials_utils.get_uci_data(split='train', sample=0.3)
train_ds = tutorials_utils.df_to_dataset(train_df, batch_size=128)

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

원래 사용자 지정 모델 사용자 지정

tf.keras.Model 은 서브 클래 싱을 통해 쉽게 사용자 지정할 수 있도록 설계되었습니다. 이것은 보통의 호출로 발생하는 변경 포함 fit 설명 된대로 여기 .

이 가이드에서는 train_step 이 기본 tf.keras.Model.train_step 과 매우 유사한 사용자 지정 구현을 사용합니다. 일반적으로 그렇게해도 이점은 없지만 여기에서는 MinDiff를 통합하는 방법을 보여주는 데 도움이됩니다.

class CustomModel(tf.keras.Model):

  def train_step(self, data):
    # Unpack the data.
    x, y, sample_weight = tf.keras.utils.unpack_x_y_sample_weight(data)

    with tf.GradientTape() as tape:
      y_pred = self(x, training=True)  # Forward pass.
      loss = self.compiled_loss(
          y, y_pred, sample_weight, regularization_losses=self.losses)
      # Compute the loss value.
      loss = self.compiled_loss(
          y, y_pred, sample_weight, regularization_losses=self.losses)

    # Compute gradients and update weights.
    self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
    # Update and return metrics.
    self.compiled_metrics.update_state(y, y_pred, sample_weight)
    return {m.name: m.result() for m in self.metrics}

당신이 일반적인 것처럼 모델을 훈련 Model 기능성 API를 사용하여.

model = tutorials_utils.get_uci_model(model_class=CustomModel)  # Use CustomModel.

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

_ = model.fit(train_ds, epochs=1)
77/77 [==============================] - 3s 22ms/step - loss: 0.7273

MinDiff를 모델에 직접 통합

받는 MinDiff 추가 train_step

MinDiff를 통합하려면 여기에서 CustomModelWithMinDiff 로 이름이 변경된 CustomModel 몇 줄을 추가해야합니다.

명확성을 위해이 가이드에서는 apply_min_diff 라는 부울 플래그를 사용합니다. MinDiff와 관련된 모든 코드는 True 로 설정된 경우에만 실행됩니다. False 로 설정하면 모델이 CustomModel 과 정확히 동일하게 작동합니다.

min_diff_loss_fn = min_diff.losses.MMDLoss()  # Hard coded for convenience.
min_diff_weight = 2  # Arbitrary number for example, hard coded for convenience.
apply_min_diff = True  # Flag to help show where the additional lines are.

class CustomModelWithMinDiff(tf.keras.Model):

  def train_step(self, data):
    # Unpack the data.
    x, y, sample_weight = tf.keras.utils.unpack_x_y_sample_weight(data)

    # Unpack the MinDiff data.
    if apply_min_diff:
      min_diff_data = min_diff.keras.utils.unpack_min_diff_data(x)
      min_diff_x, membership, min_diff_sample_weight = (
          tf.keras.utils.unpack_x_y_sample_weight(min_diff_data))
      x = min_diff.keras.utils.unpack_original_inputs(x)

    with tf.GradientTape() as tape:
      y_pred = self(x, training=True)  # Forward pass.
      loss = self.compiled_loss(
          y, y_pred, sample_weight, regularization_losses=self.losses)
      # Compute the loss value.
      loss = self.compiled_loss(
          y, y_pred, sample_weight, regularization_losses=self.losses)

      # Calculate and add the min_diff_loss. This must be done within the scope
      # of tf.GradientTape().
      if apply_min_diff:
        min_diff_predictions = self(min_diff_x, training=True)
        min_diff_loss = min_diff_weight * min_diff_loss_fn(
            min_diff_predictions, membership, min_diff_sample_weight)
        loss += min_diff_loss

    # Compute gradients and update weights.
    self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
    # Update and return metrics.
    self.compiled_metrics.update_state(y, y_pred, sample_weight)
    return {m.name: m.result() for m in self.metrics}

이 모델을 사용한 학습은 사용 된 데이터 세트를 제외하고 이전 모델과 정확히 동일합니다.

model = tutorials_utils.get_uci_model(model_class=CustomModelWithMinDiff)

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

_ = model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 4s 30ms/step - loss: 0.7799

입력 변경 (선택 사항)

이 접근 방식이 모든 권한을 제공하므로이 기회를 통해 입력을 약간 더 깔끔한 형태로 변경할 수 있습니다. 사용하는 경우 MinDiffModelmin_diff_data 모든 배치의 첫 번째 구성 요소로 포장 될 필요가있다. 이것은 train_with_min_diff_ds 데이터 세트의 경우입니다.

for x, y in train_with_min_diff_ds.take(1):
  print('Type of x:', type(x))  # MinDiffPackedInputs
  print('Type of y:', type(y))  # Tensor (original labels)
Type of x: <class 'tensorflow_model_remediation.min_diff.keras.utils.input_utils.MinDiffPackedInputs'>
Type of y: <class 'tensorflow.python.framework.ops.EagerTensor'>

이 요구 사항이 해제되면 원본 데이터와 MinDiff 데이터를 깔끔하게 분리하여 약간 더 직관적 인 구조로 데이터를 재구성 할 수 있습니다.

def _reformat_input(inputs, original_labels):
  min_diff_data = min_diff.keras.utils.unpack_min_diff_data(inputs)
  original_inputs = min_diff.keras.utils.unpack_original_inputs(inputs)
  original_data = (original_inputs, original_labels)

  return {
      'min_diff_data': min_diff_data,
      'original_data': original_data}

customized_train_with_min_diff_ds = train_with_min_diff_ds.map(_reformat_input)

이 단계는 완전히 선택 사항이지만 데이터를 더 잘 구성하는 데 유용 할 수 있습니다. 그렇게하면 CustomModelWithMinDiff 를 구현하는 방법의 유일한 차이점은 처음에 data 를 압축 해제하는 방법입니다.

class CustomModelWithMinDiff(tf.keras.Model):

  def train_step(self, data):
    # Unpack the MinDiff data from the custom structure.
    if apply_min_diff:
      min_diff_data = data['min_diff_data']
      min_diff_x, membership, min_diff_sample_weight = (
          tf.keras.utils.unpack_x_y_sample_weight(min_diff_data))
      data = data['original_data']

    ... # possible preprocessing or validation on data before unpacking.

    x, y, sample_weight = tf.keras.utils.unpack_x_y_sample_weight(data)

    ...

이 마지막 단계에서는 입력 형식과 MinDiff를 적용하기 위해 모델 내에서 사용되는 방법을 모두 완전히 제어 할 수 있습니다.

추가 자료

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