整合 MinDiff 與 MinDiffModel

簡介

整合 MinDiff 到模型中有兩個步驟

  1. 準備資料 (涵蓋於輸入準備指南中)。

  2. 修改或建立將在訓練期間整合 MinDiff 的模型。

本指南將涵蓋完成第二個步驟的最簡單方法:使用 MinDiffModel

設定

pip install --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 來重點說明 MinDiff 的用法。在實際應用中,您會先仔細選擇模型架構並使用調整來改善模型品質,然後再嘗試解決任何公平性問題。

由於 MinDiffModel 的設計目的是與大多數 Keras Model 類別搭配使用,因此我們已將建構模型的邏輯分解為輔助函式:get_uci_model

使用 Pandas DataFrame 進行訓練

本指南訓練單一週期以求快速,但可以透過增加週期數來輕鬆改善模型的效能。

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)

使用 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)

整合 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)

使用 MinDiffModel 進行評估和預測

使用 MinDiffModel 進行評估和預測與使用原始模型非常相似。

在呼叫 evaluate 時,您可以傳入原始資料集或包含 MinDiff 資料的資料集。如果您選擇後者,除了測量的任何其他指標外,您還會取得 min_diff_loss 指標,loss 也會包含 min_diff_loss

在呼叫 evaluate 時,您可以傳入原始資料集或包含 MinDiff 資料的資料集。如果您在呼叫評估時包含 MinDiff,則會有兩件事不同

  • 輸出中會出現一個名為 min_diff_loss 的額外指標。
  • loss 指標的值將是原始 loss 指標 (未在輸出中顯示) 和 min_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)

在呼叫 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)

對於 keras.Sequentialkeras.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)

但是,如果您的模型是 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)

如果這是您的使用案例,則不應直接使用 MinDiffModel。相反地,您需要對其進行子類別化,如自訂指南中所述。

其他資源

  • 如需關於公平性評估的深入討論,請參閱公平性指標指南
  • 如需關於修正和 MinDiff 的一般資訊,請參閱修正總覽
  • 如需關於 MinDiff 周圍需求的詳細資訊,請參閱本指南
  • 若要查看關於在 Keras 中使用 MinDiff 的端對端教學課程,請參閱本教學課程