การรวม MinDiff กับ MinDiffModel

บทนำ

มีสองขั้นตอนในการรวม MinDiff เข้ากับโมเดลของคุณ:

  1. เตรียมข้อมูล (ครอบคลุมใน คู่มือการเตรียมการป้อนข้อมูล )

  2. แก้ไขหรือสร้างแบบจำลองที่จะรวม MinDiff ระหว่างการฝึก

คู่มือนี้จะครอบคลุมวิธีที่ง่ายที่สุดที่จะเสร็จสิ้นขั้นตอนที่สอง: การใช้ 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))

รุ่นดั้งเดิม

คู่มือนี้ใช้พื้นฐาน untuned keras.Model ใช้ 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)
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

การประเมินผลและการทำนายด้วย 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)
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

แต่ถ้ารูปแบบของคุณเป็น subclass ของ 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 โดยตรง แต่คุณจะต้อง subclass มันตามที่อธิบายไว้ใน คู่มือการปรับแต่ง

แหล่งข้อมูลเพิ่มเติม