تاریخ را ذخیره کنید! Google I / O 18-20 مه بازمی گردد اکنون ثبت نام کنید
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

مطالعه موردی اصلاح مدل

در این نوت بوک ، ما یک طبقه بندی متن را آموزش می دهیم تا محتوای نوشته شده را که ممکن است سمی یا مضر باشد ، شناسایی کند و MinDiff را برای رفع برخی از نگرانی های انصاف اعمال می کنیم. در گردش کار ما:

  1. عملکرد مدل پایه ما را در متن حاوی ارجاع به گروه های حساس ارزیابی کنید.
  2. با آموزش با MinDiff ، عملکرد را در هر گروه کم عملکرد بهبود دهید.
  3. عملکرد مدل جدید را در معیار انتخابی خود ارزیابی کنید.

هدف ما این است که استفاده از تکنیک MinDiff را با کمترین گردش کار نشان دهیم ، نه اینکه رویکردی اصولی در انصاف در یادگیری ماشین داشته باشیم. به همین ترتیب ، ارزیابی ما فقط بر روی یک گروه حساس و یک معیار واحد متمرکز خواهد بود. ما همچنین کمبودهای احتمالی موجود در مجموعه داده را برطرف نمی کنیم و پیکربندی های خود را نیز تنظیم نمی کنیم. در یک محیط تولید ، شما می خواهید با دقت به هر یک از اینها نزدیک شوید. برای کسب اطلاعات بیشتر در مورد ارزیابی انصاف ، به این راهنما مراجعه کنید .

برپایی

ما با نصب شاخص های عدالت و اصلاح مدل TensorFlow شروع می کنیم.

نصب می شود

تمام م allلفه های لازم از جمله MinDiff و شاخص های عدالت را برای ارزیابی وارد کنید.

واردات

ما از یک تابع ابزار برای بارگیری داده های پیش پردازش شده و آماده سازی برچسب ها برای مطابقت با شکل خروجی مدل استفاده می کنیم. این تابع همچنین داده ها را به صورت TFRecords بارگیری می کند تا ارزیابی بعدی سریعتر انجام شود. متناوباً ، شما می توانید Pandas DataFrame را با هر عملکرد تبدیل ابزار موجود به TFRecords تبدیل کنید.

# We use a helper utility to preprocessed data for convenience and speed.
data_train, data_validate, validate_tfrecord_file, labels_train, labels_validate = min_diff_keras_utils.download_and_process_civil_comments_data()
Downloading data from https://storage.googleapis.com/civil_comments_dataset/train_df_processed.csv
345702400/345699197 [==============================] - 12s 0us/step
Downloading data from https://storage.googleapis.com/civil_comments_dataset/validate_df_processed.csv
229974016/229970098 [==============================] - 8s 0us/step
Downloading data from https://storage.googleapis.com/civil_comments_dataset/validate_tf_processed.tfrecord
324943872/324941336 [==============================] - 11s 0us/step

ما چند ثابت مفید تعریف می کنیم. ما مدل را 'comment_text' ویژگی 'comment_text' ، با برچسب هدف خود به عنوان 'toxicity' . توجه داشته باشید که اندازه دسته در اینجا خودسرانه انتخاب می شود ، اما برای داشتن بهترین عملکرد باید آنرا تنظیم کنید.

TEXT_FEATURE = 'comment_text'
LABEL = 'toxicity'
BATCH_SIZE = 512

بذرهای تصادفی تنظیم کنید. (توجه داشته باشید که این به طور کامل نتایج را تثبیت نمی کند.)

دانه

مدل پایه را تعریف و آموزش دهید

برای کاهش زمان کار ، به طور پیش فرض از یک مدل آموزش دیده استفاده می کنیم. این یک مدل ترتیبی ساده Keras است که دارای لایه های تعبیه اولیه و کانولوشن است و یک پیش بینی سمیت را تولید می کند. اگر ترجیح می دهید ، می توانید این مورد را تغییر دهید و از ابتدا با استفاده از عملکرد سودمند ما برای ایجاد مدل آموزش دهید. (توجه داشته باشید که از آنجا که محیط شما احتمالاً متفاوت از محیط ما است ، لازم است آستانه تنظیم و ارزیابی را شخصی سازی کنید).

use_pretrained_model = True

if use_pretrained_model:
  URL = 'https://storage.googleapis.com/civil_comments_model/baseline_model.zip'
  BASE_PATH = tempfile.mkdtemp()
  ZIP_PATH = os.path.join(BASE_PATH, 'baseline_model.zip')
  MODEL_PATH = os.path.join(BASE_PATH, 'tmp/baseline_model')

  r = requests.get(URL, allow_redirects=True)
  open(ZIP_PATH, 'wb').write(r.content)

  with zipfile.ZipFile(ZIP_PATH, 'r') as zip_ref:
    zip_ref.extractall(BASE_PATH)
  baseline_model = tf.keras.models.load_model(
      MODEL_PATH, custom_objects={'KerasLayer' : hub.KerasLayer})
else:
  optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
  loss = tf.keras.losses.BinaryCrossentropy()

  baseline_model = min_diff_keras_utils.create_keras_sequential_model()

  baseline_model.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])

  baseline_model.fit(x=data_train[TEXT_FEATURE],
                     y=labels_train,
                     batch_size=BATCH_SIZE,
                     epochs=20)

ما مدل را برای ارزیابی با استفاده از شاخص های عدالت ذخیره می کنیم .

base_dir = tempfile.mkdtemp(prefix='saved_models')
baseline_model_location = os.path.join(base_dir, 'model_export_baseline')
baseline_model.save(baseline_model_location, save_format='tf')
INFO:tensorflow:Assets written to: /tmp/saved_modelsowlqmp2b/model_export_baseline/assets
INFO:tensorflow:Assets written to: /tmp/saved_modelsowlqmp2b/model_export_baseline/assets

در مرحله بعدی ما شاخص های عدالت را اجرا می کنیم. برای یادآوری ، ما فقط قصد داریم ارزیابی کاملی را برای نظرات ارجاع به یک گروه ، گروه های مذهبی انجام دهیم . در یک محیط تولید ، ما توصیه می کنیم با رویکردی متفکرانه ، تعیین کنید که کدام دسته و معیارها را در کل ارزیابی کنید.

برای محاسبه عملکرد مدل ، تابع سودمندی چند گزینه مناسب برای معیارها ، برش ها و آستانه های طبقه بندی می کند.

# We use a helper utility to hide the evaluation logic for readability.
base_dir = tempfile.mkdtemp(prefix='eval')
eval_dir = os.path.join(base_dir, 'tfma_eval_result')
eval_result = fi_util.get_eval_results(
    baseline_model_location, eval_dir, validate_tfrecord_file)
WARNING:absl:Tensorflow version (2.4.1) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.
WARNING:tensorflow:5 out of the last 5 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6eac4de0d0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:5 out of the last 5 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6eac4de0d0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:6 out of the last 6 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6eac4de598> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:6 out of the last 6 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6eac4de598> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

نتایج ارزیابی رندر

widget_view.render_fairness_indicator(eval_result)
FairnessIndicatorViewer(slicingMetrics=[{'sliceValue': 'Overall', 'slice': 'Overall', 'metrics': {'accuracy': …

بیایید نتایج ارزیابی را بررسی کنیم. نرخ مثبت غلط متریک (FPR) را با آستانه 0.450 انتخاب کنید. می توانیم ببینیم که این مدل برای برخی از گروههای مذهبی مانند برخی دیگر عملکرد خوبی ندارد و FPR بسیار بالاتری را نشان می دهد. به فواصل اطمینان گسترده در برخی گروه ها توجه داشته باشید زیرا نمونه های آنها بسیار کم است. این مسئله باعث می شود که با اطمینان بگوییم که تفاوت قابل توجهی در عملکرد این برش ها وجود دارد. ممکن است بخواهیم نمونه های بیشتری را برای حل این مسئله جمع آوری کنیم. با این حال ، می توانیم سعی کنیم MinDiff را برای دو گروهی که مطمئن هستیم عملکرد خوبی ندارند ، اعمال کنیم.

ما تمرکز بر FPR را انتخاب کرده ایم ، زیرا FPR بالاتر به این معنی است که نظرات ارجاع دهنده این گروه های هویتی به احتمال زیاد از نظرات دیگر به عنوان سمی پرچم گذاری نمی شوند. این می تواند منجر به نتایج نابرابر کاربرانی شود که در مورد دین گفتگو می کنند ، اما توجه داشته باشید که اختلاف در سایر معیارها می تواند آسیب های دیگری را به دنبال داشته باشد.

مدل MinDiff را تعریف و آموزش دهید

اکنون ، ما سعی خواهیم کرد FPR را برای گروه های مذهبی کم عملکرد بهبود بخشیم. ما سعی خواهیم کرد این کار را با استفاده از MinDiff انجام دهیم ، یک روش اصلاح که سعی در تعادل بخشیدن به میزان خطا در میان برش داده های شما با جریمه کردن اختلاف در عملکرد در طول آموزش دارد. هنگامی که MinDiff را اعمال می کنیم ، عملکرد مدل ممکن است در سایر برش ها اندکی کاهش یابد. به همین ترتیب ، اهداف ما با MinDiff عبارتند از:

  • عملکرد بهتر برای گروه های کم عملکرد
  • تخریب محدود برای گروه های دیگر و عملکرد کلی

داده های خود را آماده کنید

برای استفاده از MinDiff ، دو تقسیم داده اضافی ایجاد می کنیم:

  • تقسیم برای مثالهای غیر سمی که به گروه های اقلیت اشاره می کنند: در مورد ما ، این شامل نظراتی با اشاره به اصطلاحات هویتی کم عملکرد ما خواهد بود. برخی از گروه ها را شامل نمی شویم زیرا مثالهای بسیار کمی وجود دارد که منجر به عدم اطمینان بالاتر با دامنه اطمینان گسترده می شود.
  • شکافی برای مثالهای غیر سمی با مراجعه به گروه اکثریت.

داشتن مثالهای کافی متعلق به طبقات کم عملکرد بسیار مهم است. براساس معماری مدل ، توزیع داده و پیکربندی MinDiff ، مقدار داده مورد نیاز می تواند به طور قابل توجهی متفاوت باشد. در برنامه های گذشته ، MinDiff را مشاهده کردیم که با 5000 مثال در هر تقسیم داده به خوبی کار می کند.

در مورد ما ، گروه های تقسیم شده در اقلیت مقادیر نمونه ای از 9،688 و 3،906 را دارند. به عدم تعادل کلاس در مجموعه داده توجه کنید. در عمل ، این می تواند باعث نگرانی شود ، اما ما نمی خواهیم آنها را در این دفتر یادداشت کنیم زیرا هدف ما فقط نشان دادن MinDiff است.

ما فقط نمونه های منفی را برای این گروه ها انتخاب می کنیم تا MinDiff بتواند به درستی این نمونه ها را بهینه کند. اگر در درجه اول اختلافات در میزان مثبت کاذب نگران باشد ، تهیه نمونه هایی از منفی حقیقت زمین خلاف به نظر می رسد ، اما به یاد داشته باشید که پیش بینی مثبت کاذب یک مثال منفی برای حقیقت زمین است که به طور نادرست به عنوان مثبت طبقه بندی شده است ، مسئله ای که ما دارم سعی می کنم آدرس دهم

MinDiff DataFrames ایجاد کنید

# Create masks for the sensitive and nonsensitive groups
minority_mask = data_train.religion.apply(
    lambda x: any(religion in x for religion in ('jewish', 'muslim')))
majority_mask = data_train.religion.apply(lambda x: x == "['christian']")

# Select nontoxic examples, so MinDiff will be able to reduce sensitive FP rate.
true_negative_mask = data_train['toxicity'] == 0

data_train_main = copy.copy(data_train)
data_train_sensitive = data_train[minority_mask & true_negative_mask]
data_train_nonsensitive = data_train[majority_mask & true_negative_mask]

ما همچنین باید Pandas DataFrames خود را به مجموعه داده های Tensorflow برای ورودی MinDiff تبدیل کنیم. توجه داشته باشید که برخلاف API مدل Keras برای Pandas DataFrames ، استفاده از مجموعه داده به این معنی است که ما باید ویژگی های ورودی و برچسب های مدل را با هم در یک مجموعه داده ارائه دهیم. در اینجا ما 'comment_text' به عنوان یک ویژگی ورودی ارائه می دهیم و برچسب را مطابق با خروجی مورد انتظار مدل تغییر می دهیم.

ما Dataset را نیز در این مرحله دسته بندی می کنیم ، زیرا MinDiff به مجموعه داده های دسته ای نیاز دارد. توجه داشته باشید که ما با توجه به سرعت آموزش و ملاحظات سخت افزاری ضمن تعادل با عملکرد مدل ، انتخاب اندازه دسته را به همان روشی که برای مدل پایه تنظیم می شود تنظیم می کنیم. در اینجا ما اندازه دسته ای یکسانی را برای هر سه مجموعه داده انتخاب کرده ایم اما این یک الزام نیست ، اگرچه معادل سازی دو اندازه دسته MinDiff روش خوبی است.

مجموعه داده های MinDiff ایجاد کنید

# Convert the pandas DataFrames to Datasets.
dataset_train_main = tf.data.Dataset.from_tensor_slices(
    (data_train_main['comment_text'].values, 
     data_train_main.pop(LABEL).values.reshape(-1,1) * 1.0)).batch(BATCH_SIZE)
dataset_train_sensitive = tf.data.Dataset.from_tensor_slices(
    (data_train_sensitive['comment_text'].values, 
     data_train_sensitive.pop(LABEL).values.reshape(-1,1) * 1.0)).batch(BATCH_SIZE)
dataset_train_nonsensitive = tf.data.Dataset.from_tensor_slices(
    (data_train_nonsensitive['comment_text'].values, 
     data_train_nonsensitive.pop(LABEL).values.reshape(-1,1) * 1.0)).batch(BATCH_SIZE)

مدل را آموزش دهید و ارزیابی کنید

برای آموزش با MinDiff ، به سادگی مدل اصلی را بگیرید و آن را در یک مدل MinDiff با loss و loss loss_weight . ما از 1.5 به عنوان پیش فرض loss_weight ، اما این پارامتری است که باید برای مورد استفاده شما تنظیم شود ، زیرا به مدل و نیازهای محصول شما بستگی دارد. شما می توانید با تغییر مقدار آزمایش کنید تا ببینید چگونه بر مدل تأثیر می گذارد ، توجه داشته باشید که افزایش آن عملکرد گروه های اقلیت و اکثریت را به هم نزدیک می کند اما ممکن است معاملات واضح تری داشته باشد.

سپس ما مدل را به طور معمول کامپایل می کنیم (با استفاده از ضرر منظم غیر MinDiff) و مناسب آموزش است.

آموزش MinDiffModel

use_pretrained_model = True

base_dir = tempfile.mkdtemp(prefix='saved_models')
min_diff_model_location = os.path.join(base_dir, 'model_export_min_diff')

if use_pretrained_model:
  BASE_MIN_DIFF_PATH = tempfile.mkdtemp()
  MIN_DIFF_URL = 'https://storage.googleapis.com/civil_comments_model/min_diff_model.zip'
  ZIP_PATH = os.path.join(BASE_PATH, 'min_diff_model.zip')
  MIN_DIFF_MODEL_PATH = os.path.join(BASE_MIN_DIFF_PATH, 'tmp/min_diff_model')
  DIRPATH = '/tmp/min_diff_model'

  r = requests.get(MIN_DIFF_URL, allow_redirects=True)
  open(ZIP_PATH, 'wb').write(r.content)

  with zipfile.ZipFile(ZIP_PATH, 'r') as zip_ref:
    zip_ref.extractall(BASE_MIN_DIFF_PATH)
  min_diff_model = tf.keras.models.load_model(
      MIN_DIFF_MODEL_PATH, custom_objects={'KerasLayer' : hub.KerasLayer})

  min_diff_model.save(min_diff_model_location, save_format='tf')

else:
  min_diff_weight = 1.5

  # Create the dataset that will be passed to the MinDiffModel during training.
  dataset = md.keras.utils.input_utils.pack_min_diff_data(
      dataset_train_main, dataset_train_sensitive, dataset_train_nonsensitive)

  # Create the original model.
  original_model = min_diff_keras_utils.create_keras_sequential_model()

  # Wrap the original model in a MinDiffModel, passing in one of the MinDiff
  # losses and using the set loss_weight.
  min_diff_loss = md.losses.MMDLoss()
  min_diff_model = md.keras.MinDiffModel(original_model,
                                         min_diff_loss,
                                         min_diff_weight)

  # Compile the model normally after wrapping the original model.  Note that
  # this means we use the baseline's model's loss here.
  optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
  loss = tf.keras.losses.BinaryCrossentropy()
  min_diff_model.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])

  min_diff_model.fit(dataset, epochs=20)

  min_diff_model.save_original_model(min_diff_model_location, save_format='tf')
WARNING:tensorflow:7 out of the last 7 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6e287e07b8> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:7 out of the last 7 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6e287e07b8> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:8 out of the last 8 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6e2871b048> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:8 out of the last 8 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6e2871b048> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:9 out of the last 9 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6e2871bd08> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:9 out of the last 9 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6e2871bd08> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:10 out of the last 10 calls to <function recreate_function.<locals>.restored_function_body at 0x7f69f4e32378> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:10 out of the last 10 calls to <function recreate_function.<locals>.restored_function_body at 0x7f69f4e32378> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
INFO:tensorflow:Assets written to: /tmp/saved_modelst7yg_ghr/model_export_min_diff/assets
INFO:tensorflow:Assets written to: /tmp/saved_modelst7yg_ghr/model_export_min_diff/assets

بعد نتایج را ارزیابی می کنیم.

min_diff_eval_subdir = os.path.join(base_dir, 'tfma_eval_result')
min_diff_eval_result = fi_util.get_eval_results(
    min_diff_model_location,
    min_diff_eval_subdir,
    validate_tfrecord_file,
    slice_selection='religion')
WARNING:absl:Tensorflow version (2.4.1) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:11 out of the last 11 calls to <function recreate_function.<locals>.restored_function_body at 0x7f69f545b840> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:11 out of the last 11 calls to <function recreate_function.<locals>.restored_function_body at 0x7f69f545b840> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:11 out of the last 11 calls to <function recreate_function.<locals>.restored_function_body at 0x7f69f5443378> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:11 out of the last 11 calls to <function recreate_function.<locals>.restored_function_body at 0x7f69f5443378> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:11 out of the last 11 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6eac4dea60> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
WARNING:tensorflow:11 out of the last 11 calls to <function recreate_function.<locals>.restored_function_body at 0x7f6eac4dea60> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.

برای اطمینان از ارزیابی صحیح یک مدل جدید ، باید آستانه ای را به همان روشی که مدل پایه انتخاب می کنیم ، انتخاب کنیم. در شرایط تولید ، این به معنای اطمینان از مطابقت معیارهای ارزیابی با استانداردهای راه اندازی است. در مورد ما ، ما آستانه ای را انتخاب خواهیم کرد که منجر به FPR کلی مشابه مدل پایه می شود. این آستانه ممکن است با آنچه شما برای مدل پایه انتخاب کرده اید متفاوت باشد. نرخ مثبت نادرست را با آستانه 0.400 انتخاب کنید. (توجه داشته باشید که زیرگروه هایی با مثالهای کم تعداد دارای فواصل دامنه اطمینان بسیار گسترده ای هستند و نتایج قابل پیش بینی ندارند).

widget_view.render_fairness_indicator(min_diff_eval_result)
FairnessIndicatorViewer(slicingMetrics=[{'sliceValue': 'Overall', 'slice': 'Overall', 'metrics': {'accuracy': …

با مرور این نتایج ، ممکن است متوجه شوید که FPRs برای گروه های هدف ما بهبود یافته است. شکاف بین گروه کم عملکرد و گروه اکثریت از 024/0 به 006/0 بهبود یافته است. با توجه به پیشرفت هایی که مشاهده کرده ایم و ادامه عملکرد قوی برای گروه اکثریت ، ما هر دو هدف خود را برآورده کرده ایم. بسته به محصول ، بهبودهای بیشتری ممکن است لازم باشد ، اما این رویکرد باعث شده است که مدل ما یک قدم به عملکرد عادلانه برای همه کاربران نزدیک شود.