日付を保存! Google I / Oが5月18日から20日に戻ってきます今すぐ登録
このページは Cloud Translation API によって翻訳されました。
Switch to English

モデル修復のケーススタディ

このノートブックでは、テキスト分類子をトレーニングして、有毒または有害と見なされる可能性のある書かれたコンテンツを識別し、MinDiffを適用して公平性の懸念を修正します。ワークフローでは、次のことを行います。

  1. 機密グループへの参照を含むテキストに対するベースラインモデルのパフォーマンスを評価します。
  2. MinDiffを使用してトレーニングすることにより、パフォーマンスの低いグループのパフォーマンスを向上させます。
  3. 選択したメトリックで新しいモデルのパフォーマンスを評価します。

私たちの目的は、機械学習の公平性に対する原則的なアプローチを提示することではなく、最小限のワークフローでMinDiff手法の使用法を示すことです。そのため、私たちの評価は、1つのデリケートなカテゴリと1つのメトリックにのみ焦点を当てます。また、データセットの潜在的な欠点に対処したり、構成を調整したりすることもありません。プロダクション環境では、これらのそれぞれに厳密にアプローチする必要があります。公平性の評価の詳細については、このガイドを参照してください

セットアップ

まず、公平性インジケーターとTensorFlowモデル修復をインストールします。

インストール

評価用のMinDiffおよびFairnessIndicatorsを含むすべての必要なコンポーネントをインポートします。

輸入

ユーティリティ関数を使用して、前処理されたデータをダウンロードし、モデルの出力形状に一致するようにラベルを準備します。また、この関数はデータをTFRecordとしてダウンロードして、後の評価を迅速化します。または、利用可能なユーティリティ変換関数を使用して、PandasDataFrameを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

いくつかの有用な定数を定義します。ターゲットラベルを'toxicity'として、 'comment_text'機能でモデルをトレーニングします。ここでのバッチサイズは任意に選択されますが、本番環境では、最高のパフォーマンスを得るために調整する必要があることに注意してください。

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

次に、公平性インジケーターを実行します。念のため、1つのカテゴリである宗教グループを参照するコメントに対してスライス評価を実行します。実稼働環境では、評価するカテゴリとメトリックを決定するために慎重なアプローチを取ることをお勧めします。

モデルのパフォーマンスを計算するために、効用関数は、メトリック、スライス、および分類子のしきい値についていくつかの便利な選択を行います。

# 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': …

評価結果を見てみましょう。しきい値が0.450のメトリック偽陽性率(FPR)を選択してみてください。このモデルは、一部の宗教グループでは他のグループほどパフォーマンスが高くなく、はるかに高いFPRを示していることがわかります。例が少なすぎるため、一部のグループの信頼区間が広いことに注意してください。これにより、これらのスライスのパフォーマンスに大きな違いがあると確実に言うことは困難になります。この問題に対処するために、さらに多くの例を収集することをお勧めします。ただし、パフォーマンスが低いと確信している2つのグループにMinDiffを適用することはできます。

FPRが高いということは、これらのIDグループを参照するコメントが、他のコメントよりも誤って有毒であるとフラグ付けされる可能性が高いことを意味するため、FPRに焦点を当てることを選択しました。これは、宗教についての対話に従事するユーザーにとって不公平な結果につながる可能性がありますが、他の指標の不一致は他の種類の害につながる可能性があることに注意してください。

MinDiffモデルを定義してトレーニングする

今度は、成績の悪い宗教団体のFPRを改善しようとします。トレーニング中のパフォーマンスの不一致にペナルティを課すことにより、データのスライス全体でエラー率のバランスをとろうとする修復手法であるMinDiffを使用してこれを実行しようとします。 MinDiffを適用すると、他のスライスでモデルのパフォーマンスがわずかに低下する可能性があります。そのため、MinDiffの目標は次のとおりです。

  • パフォーマンスの低いグループのパフォーマンスが向上
  • 他のグループの限定的な劣化と全体的なパフォーマンス

データを準備する

MinDiffを使用するために、2つの追加のデータ分割を作成します。

  • マイノリティグループを参照する無毒な例の分割:私たちの場合、これには、パフォーマンスの低いアイデンティティ用語への参照を含むコメントが含まれます。例が少なすぎるため、一部のグループは含まれていません。信頼区間の範囲が広いと、不確実性が高くなります。
  • 大多数のグループを参照する非毒性の例の分割。

パフォーマンスの低いクラスに属する十分な例を用意することが重要です。モデルアーキテクチャ、データ分散、およびMinDiff構成に基づいて、必要なデータの量は大幅に異なる可能性があります。過去のアプリケーションでは、MinDiffが各データ分割で5,000の例でうまく機能することを確認しました。

私たちの場合、少数派のグループの例の数量は9,688と3,906です。データセット内のクラスの不均衡に注意してください。実際には、これは懸念の原因となる可能性がありますが、MinDiffを示すことだけを目的としているため、このノートブックでそれらに対処することはしません。

MinDiffがこれらの例を正しく取得するために最適化できるように、これらのグループには否定的な例のみを選択します。偽陽性率の格差に主に関心がある場合、グラウンドトゥルースネガティブの例のセットを作成することは直感に反するように思われるかもしれませんが、偽陽性予測は、誤ってポジティブとして分類されるグラウンドトゥルースネガティブの例であることに注意してください。これが問題です。対処しようとしています。

MinDiffデータフレームを作成する

# 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]

また、PandasDataFrameをMinDiff入力用のTensorflowデータセットに変換する必要があります。 Pandas DataFramesのKerasモデルAPIとは異なり、データセットを使用するということは、モデルの入力機能とラベルを1つのデータセットにまとめて提供する必要があることを意味します。ここでは、入力特徴として'comment_text'を提供し、モデルの期待される出力に一致するようにラベルの形状を変更します。

MinDiffはバッチ処理されたデータセットを必要とするため、この段階でもデータセットをバッチ処理します。バッチサイズの選択は、ベースラインモデルに合わせて調整するのと同じ方法で調整し、モデルのパフォーマンスとのバランスを取りながら、トレーニング速度とハードウェアの考慮事項を考慮に入れることに注意してください。ここでは、3つのデータセットすべてに同じバッチサイズを選択しましたが、これは必須ではありませんが、2つの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でトレーニングするには、元のモデルを取得し、対応するlossloss_weightを使用してMinDiffModelでラップします。デフォルトのloss_weightとして1.5を使用していますが、これはモデルと製品の要件に依存するため、ユースケースに合わせて調整する必要があるパラメーターです。値を変更してモデルにどのように影響するかを確認できます。値を増やすと、マイノリティグループとマジョリティグループのパフォーマンスが近づきますが、より顕著なトレードオフが発生する可能性があります。

次に、モデルを通常どおりにコンパイルし(通常の非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': …

これらの結果を確認すると、ターゲットグループのFPRが改善されていることに気付くかもしれません。最もパフォーマンスの低いグループと多数派グループの間のギャップは、.024から.006に改善されました。私たちが観察した改善と多数派グループの継続的な好業績を考えると、私たちは両方の目標を達成しました。製品によっては、さらなる改善が必要な場合がありますが、このアプローチにより、モデルはすべてのユーザーに対して公平に実行できるようになりました。