אימות מודל ניתוח מודל Tensorflow

סקירה כללית

TFMA תומך באימות מודל על ידי הגדרת ערכי סף ושינוי סף בהתבסס על המדדים הנתמכים .

תְצוּרָה

GenericValueThreshold

סף ערך שימושי לשער את המודל המועמד על ידי בדיקה אם המדדים המתאימים גדולים מגבול תחתון ו/או קטן מגבול עליון. המשתמש יכול להגדיר אחד מהערכים התחתון והגבולי העליון או את שניהם. ה-lower_bound הוא ברירת המחדל לאינסוף שלילי אם אינו מוגדר, וה-upper_bound הוא ברירת המחדל לאינסוף אם אינו מוגדר.

import tensorflow_model_analysis as tfma

lower_bound = tfma.GenericValueThreshold(lower_bound={'value':0})
upper_bound = tfma.GenericValueThreshold(upper_bound={'value':1})
lower_upper_bound = tfma.GenericValueThreshold(lower_bound={'value':0},
                                               upper_bound={'value':1))

GenericChangeThreshold

סף שינוי שימושי כדי להגדיר את המודל המועמד על ידי בדיקה אם המדד המתאים גדול/קטן יותר מזה של מודל בסיס. ישנן שתי דרכים שבהן ניתן למדוד את השינוי: שינוי מוחלט ושינוי יחסי. שינוי מוחלט מחושב כהפרש הערך בין המדדים של המועמד והמודל הבסיסי, כלומר, v_c - v_b כאשר v_c מציין את ערך המדד המועמד ו- v_b מציין את ערך הבסיס. ערך יחסי הוא ההבדל היחסי בין המדד של המועמד לקו הבסיס, כלומר v_c/v_b . הסף המוחלט והיחסי יכולים להתקיים במקביל למודל השער לפי שני הקריטריונים. מלבד הגדרת ערכי סף, המשתמש צריך גם להגדיר את MetricDirection. עבור מדדים עם ערכים גבוהים לטובה (למשל, AUC), הגדר את הכיוון ל- HIGHER_IS_BETTER, עבור מדדים עם ערכים נמוכים יותר (למשל, הפסד), הגדר את הכיוון ל-LOWER_IS_BETTER. ספי שינוי מחייבים להעריך מודל בסיס יחד עם המודל המועמד. ראה מדריך תחילת העבודה לדוגמא.

import tensorflow_model_analysis as tfma

absolute_higher_is_better = tfma.GenericChangeThreshold(absolute={'value':1},
                                                        direction=tfma.MetricDirection.HIGHER_IS_BETTER)
absolute_lower_is_better = tfma.GenericChangeThreshold(absolute={'value':1},
                                                       direction=tfma.MetricDirection.LOWER_IS_BETTER)
relative_higher_is_better = tfma.GenericChangeThreshold(relative={'value':1},
                                                        direction=tfma.MetricDirection.HIGHER_IS_BETTER)
relative_lower_is_better = tfma.GenericChangeThreshold(relative={'value':1},
                                                       direction=tfma.MetricDirection.LOWER_IS_BETTER)
absolute_and_relative = tfma.GenericChangeThreshold(relative={'value':1},
                                                    absolute={'value':0.2},
                                                    direction=tfma.MetricDirection.LOWER_IS_BETTER)

לחבר דברים ביחד

הדוגמה הבאה משלבת ספי ערך ושינוי:

import tensorflow_model_analysis as tfma

lower_bound = tfma.GenericValueThreshold(lower_bound={'value':0.7})
relative_higher_is_better =
    tfma.GenericChangeThreshold(relative={'value':1.01},
                                direction=tfma.MetricDirection.HIGHER_IS_BETTER)
auc_threshold = tfma.MetricThreshold(value_threshold=lower_bound,
                                     change_threshold=relative_higher_is_better)

ייתכן שיהיה קריא יותר לרשום את התצורה בפורמט פרוטו:

from google.protobuf import text_format

auc_threshold = text_format.Parse("""
  value_threshold { lower_bound { value: 0.6 } }
  change_threshold { relative { value: 1.01 } }
""", tfma.MetricThreshold())

ניתן להגדיר את ה-MetricThreshold ל-gate על מדדי זמן אימון של המודל (EvalSavedModel או מודל שמור של Keras) והן מדדי Post Training (מוגדרים בתצורת TFMA). עבור מדדי זמן אימון, הספים מצוינים ב-tfma.MetricsSpec:

metrics_spec = tfma.MetricSpec(thresholds={'auc': auc_threshold})

עבור מדדי פוסט אימון, ספים מוגדרים ישירות ב-tfma.MetricConfig:

metric_config = tfma.MetricConfig(class_name='TotalWeightedExample',
                                  threshold=lower_bound)

הנה דוגמה יחד עם ההגדרות האחרות ב-EvalConfig:

# Run in a Jupyter Notebook.
from google.protobuf import text_format

eval_config = text_format.Parse("""
  model_specs {
    # This assumes a serving model with a "serving_default" signature.
    label_key: "label"
    example_weight_key: "weight"
  }
  metrics_spec {
    # Training Time metric thresholds
    thresholds {
      key: "auc"
      value: {
        value_threshold {
          lower_bound { value: 0.7 }
        }
        change_threshold {
          direction: HIGHER_IS_BETTER
          absolute { value: -1e-10 }
        }
      }
    }
    # Post Training metrics and their thesholds.
    metrics {
      # This assumes a binary classification model.
      class_name: "AUC"
      threshold {
        value_threshold {
          lower_bound { value: 0 }
        }
      }
    }
  }
  slicing_specs {}
  slicing_specs {
    feature_keys: ["age"]
  }
""", tfma.EvalConfig())

eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path='/path/to/saved/candiate/model',
      eval_config=eval_config),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path='/path/to/saved/baseline/model',
      eval_config=eval_config),
]

eval_result = tfma.run_model_analysis(
    eval_shared_models,
    eval_config=eval_config,
    # This assumes your data is a TFRecords file containing records in the
    # tf.train.Example format.
    data_location="/path/to/file/containing/tfrecords",
    output_path="/path/for/output")

tfma.view.render_slicing_metrics(eval_result)
tfma.load_validation_result(output_path)

תְפוּקָה

בנוסף לפלט של קובץ המדדים על ידי המעריך, כאשר נעשה שימוש בוולידציה, מופק גם קובץ "וולידציות" נוסף. פורמט המטען הוא ValidationResult . הפלט יהיה "validation_ok" מוגדר כ-True כאשר אין כשלים. כאשר יש כשלים, מסופק מידע על המדדים המשויכים, הספים והערכים המטריים שנצפו. להלן דוגמה שבה "ספירת_examle_weighted" נכשלת בסף ערך (1.5 אינו קטן מ-1.0, ובכך הכשל):

  validation_ok: False
  metric_validations_per_slice {
    failures {
      metric_key {
        name: "weighted_example_count"
        model_name: "candidate"
      }
      metric_threshold {
        value_threshold {
          upper_bound { value: 1.0 }
        }
      }
      metric_value {
        double_value { value: 1.5 }
      }
    }
  }
,

סקירה כללית

TFMA תומך באימות מודל על ידי הגדרת ערכי סף ושינוי סף בהתבסס על המדדים הנתמכים .

תְצוּרָה

GenericValueThreshold

סף ערך שימושי לשער את המודל המועמד על ידי בדיקה אם המדדים המתאימים גדולים מגבול תחתון ו/או קטן מגבול עליון. המשתמש יכול להגדיר אחד מהערכים התחתון והגבולי העליון או את שניהם. ה-lower_bound הוא ברירת המחדל לאינסוף שלילי אם אינו מוגדר, וה-upper_bound הוא ברירת המחדל לאינסוף אם אינו מוגדר.

import tensorflow_model_analysis as tfma

lower_bound = tfma.GenericValueThreshold(lower_bound={'value':0})
upper_bound = tfma.GenericValueThreshold(upper_bound={'value':1})
lower_upper_bound = tfma.GenericValueThreshold(lower_bound={'value':0},
                                               upper_bound={'value':1))

GenericChangeThreshold

סף שינוי שימושי כדי להגדיר את המודל המועמד על ידי בדיקה אם המדד המתאים גדול/קטן יותר מזה של מודל בסיס. ישנן שתי דרכים שבהן ניתן למדוד את השינוי: שינוי מוחלט ושינוי יחסי. שינוי מוחלט מחושב כהפרש הערך בין המדדים של המועמד והמודל הבסיסי, כלומר, v_c - v_b כאשר v_c מציין את ערך המדד המועמד ו- v_b מציין את ערך הבסיס. ערך יחסי הוא ההבדל היחסי בין המדד של המועמד לקו הבסיס, כלומר v_c/v_b . הסף המוחלט והיחסי יכולים להתקיים במקביל למודל השער לפי שני הקריטריונים. מלבד הגדרת ערכי סף, המשתמש צריך גם להגדיר את MetricDirection. עבור מדדים עם ערכים גבוהים לטובה (למשל, AUC), הגדר את הכיוון ל- HIGHER_IS_BETTER, עבור מדדים עם ערכים נמוכים יותר (למשל, הפסד), הגדר את הכיוון ל-LOWER_IS_BETTER. ספי שינוי מחייבים להעריך מודל בסיס יחד עם המודל המועמד. ראה מדריך תחילת העבודה לדוגמא.

import tensorflow_model_analysis as tfma

absolute_higher_is_better = tfma.GenericChangeThreshold(absolute={'value':1},
                                                        direction=tfma.MetricDirection.HIGHER_IS_BETTER)
absolute_lower_is_better = tfma.GenericChangeThreshold(absolute={'value':1},
                                                       direction=tfma.MetricDirection.LOWER_IS_BETTER)
relative_higher_is_better = tfma.GenericChangeThreshold(relative={'value':1},
                                                        direction=tfma.MetricDirection.HIGHER_IS_BETTER)
relative_lower_is_better = tfma.GenericChangeThreshold(relative={'value':1},
                                                       direction=tfma.MetricDirection.LOWER_IS_BETTER)
absolute_and_relative = tfma.GenericChangeThreshold(relative={'value':1},
                                                    absolute={'value':0.2},
                                                    direction=tfma.MetricDirection.LOWER_IS_BETTER)

לחבר דברים ביחד

הדוגמה הבאה משלבת ספי ערך ושינוי:

import tensorflow_model_analysis as tfma

lower_bound = tfma.GenericValueThreshold(lower_bound={'value':0.7})
relative_higher_is_better =
    tfma.GenericChangeThreshold(relative={'value':1.01},
                                direction=tfma.MetricDirection.HIGHER_IS_BETTER)
auc_threshold = tfma.MetricThreshold(value_threshold=lower_bound,
                                     change_threshold=relative_higher_is_better)

ייתכן שיהיה קריא יותר לרשום את התצורה בפורמט פרוטו:

from google.protobuf import text_format

auc_threshold = text_format.Parse("""
  value_threshold { lower_bound { value: 0.6 } }
  change_threshold { relative { value: 1.01 } }
""", tfma.MetricThreshold())

ניתן להגדיר את ה-MetricThreshold ל-gate על מדדי זמן אימון של המודל (EvalSavedModel או מודל שמור של Keras) והן מדדי Post Training (מוגדרים בתצורת TFMA). עבור מדדי זמן אימון, הספים מצוינים ב-tfma.MetricsSpec:

metrics_spec = tfma.MetricSpec(thresholds={'auc': auc_threshold})

עבור מדדי פוסט אימון, ספים מוגדרים ישירות ב-tfma.MetricConfig:

metric_config = tfma.MetricConfig(class_name='TotalWeightedExample',
                                  threshold=lower_bound)

הנה דוגמה יחד עם ההגדרות האחרות ב-EvalConfig:

# Run in a Jupyter Notebook.
from google.protobuf import text_format

eval_config = text_format.Parse("""
  model_specs {
    # This assumes a serving model with a "serving_default" signature.
    label_key: "label"
    example_weight_key: "weight"
  }
  metrics_spec {
    # Training Time metric thresholds
    thresholds {
      key: "auc"
      value: {
        value_threshold {
          lower_bound { value: 0.7 }
        }
        change_threshold {
          direction: HIGHER_IS_BETTER
          absolute { value: -1e-10 }
        }
      }
    }
    # Post Training metrics and their thesholds.
    metrics {
      # This assumes a binary classification model.
      class_name: "AUC"
      threshold {
        value_threshold {
          lower_bound { value: 0 }
        }
      }
    }
  }
  slicing_specs {}
  slicing_specs {
    feature_keys: ["age"]
  }
""", tfma.EvalConfig())

eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path='/path/to/saved/candiate/model',
      eval_config=eval_config),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path='/path/to/saved/baseline/model',
      eval_config=eval_config),
]

eval_result = tfma.run_model_analysis(
    eval_shared_models,
    eval_config=eval_config,
    # This assumes your data is a TFRecords file containing records in the
    # tf.train.Example format.
    data_location="/path/to/file/containing/tfrecords",
    output_path="/path/for/output")

tfma.view.render_slicing_metrics(eval_result)
tfma.load_validation_result(output_path)

תְפוּקָה

בנוסף לפלט של קובץ המדדים על ידי המעריך, כאשר נעשה שימוש בוולידציה, מופק גם קובץ "וולידציות" נוסף. פורמט המטען הוא ValidationResult . הפלט יהיה "validation_ok" מוגדר כ-True כאשר אין כשלים. כאשר יש כשלים, מסופק מידע על המדדים המשויכים, הספים והערכים המטריים שנצפו. להלן דוגמה שבה "ספירת_examle_weighted" נכשלת בסף ערך (1.5 אינו קטן מ-1.0, ובכך הכשל):

  validation_ok: False
  metric_validations_per_slice {
    failures {
      metric_key {
        name: "weighted_example_count"
        model_name: "candidate"
      }
      metric_threshold {
        value_threshold {
          upper_bound { value: 1.0 }
        }
      }
      metric_value {
        double_value { value: 1.5 }
      }
    }
  }