ゼファーネットのロゴ

自然言語処理用のテスト ライブラリの紹介

日付:

自然言語処理用のテスト ライブラリの紹介

自然言語処理用のテスト ライブラリの紹介
 

 
安全で、堅牢で、公平な AI モデルをトレーニングする必要性については多くの議論がありますが、データ サイエンティストがこれらの目標を達成するために利用できるツールはほとんどありません。 その結果、本番システムにおける自然言語処理 (NLP) モデルの最前線は、残念な状況を反映しています。

現在の NLP システムは、しばしば悲惨なほど失敗します。 [リビエロ 2020] は、上位 9 つのクラウド プロバイダーのセンチメント分析サービスが、ニュートラルな単語を置き換えるときに 16 ~ 7% の確率で失敗すること、ニュートラルな名前付きエンティティを変更するときに 20 ~ 36% の確率で失敗すること、一時的なテストで 42 ~ 100% の確率で失敗することを示しました。一部の否定テストではほぼ XNUMX% の確率で。 [ソング & ラグナタン 2020] は、個人情報の 50 ~ 70% が一般的な単語と文章の埋め込みにデータ漏洩したことを示しました。 [パリッシュら。 アル。 2021年] は、人種、性別、外見、障害、および宗教に関する偏見が最先端の質問応答モデルにどのように根付いているかを示しました。 [ヴァン・アケンら。 アル。 2022年] は、患者メモに民族性についての言及を追加すると、死亡率の予測リスクがどのように低下​​するかを示しました。最も正確なモデルが最大の誤差を生み出します。

要するに、これらのシステムは機能しません。 数字の一部を正しく足すだけの電卓や、入れた食べ物の種類や時間帯に基づいてランダムに強さを変える電子レンジは受け入れられません。 よく設計された生産システムは、共通の入力に対して確実に機能する必要があります。 また、珍しいものを扱うときも安全で堅牢でなければなりません。 ソフトウェア エンジニアリングには、そこに到達するための XNUMX つの基本原則が含まれています。

 
まず、 ソフトウェアをテストする. 今日の NLP モデルが失敗する理由について唯一驚くべきことは、その答えが平凡であるということです。誰もテストしていないからです。 上で引用した論文は、最初の論文の XNUMX つであったため、斬新でした。 機能するソフトウェア システムを提供したい場合は、それが何を意味するのかを定義し、運用環境に展開する前にそれが機能することをテストする必要があります。 NLPモデルも回帰するため、ソフトウェアを変更するときはいつでもそれを行う必要があります[謝ら。 アル。 2021年].

第二に、 アカデミック モデルを本番用モデルとして再利用しないでください. NLP の科学的進歩の素晴らしい側面の XNUMX つは、ほとんどの研究者がモデルを公開し、簡単に再利用できるようにしているということです。 これにより、研究がより速くなり、次のようなベンチマークが可能になります 強力接着剤, LMハーネス, ビッグベンチ. ただし、研究結果を再現するように設計されたツールは、本番環境での使用には適していません。 再現性を確保するには、モデルを最新の状態に維持したり、時間をかけて堅牢にしたりするのではなく、同じままにしておく必要があります。 一般的な例は バイオバート、おそらく最も広く使用されている生物医学埋め込みモデルであり、2019 年初頭に公開されたため、COVID-19 は語彙外の単語と見なされています。

第三に、 精度を超えたテスト. NLP システムのビジネス要件には、堅牢性、信頼性、公平性、毒性、効率性、バイアスの欠如、データ漏洩の欠如、および安全性が含まれるため、テスト スイートはそれを反映する必要があります。 言語モデルの全体論的評価 [梁ら。 al 2022] は、さまざまな文脈におけるこれらの用語の定義と指標の包括的なレビューであり、読む価値があります。 ただし、独自のテストを作成する必要があります。たとえば、アプリケーションにとって包括性とは実際には何を意味するのでしょうか?

優れたテストは、具体的で、分離されており、保守が容易である必要があります。 また、自動ビルドまたは MLOps ワークフローの一部にできるように、バージョン管理および実行可能である必要があります。 nlptest ライブラリは、これを簡単にするシンプルなフレームワークです。

 
nlptest ライブラリ は、XNUMX つの原則に基づいて設計されています。

オープンソース. これは、Apache 2.0 ライセンスに基づくコミュニティ プロジェクトです。 商用利用も含めて、何の警告もなく永久に無料で使用できます。 その背後にはアクティブな開発チームがあり、必要に応じてコードに貢献したり、コードをフォークしたりできます。

軽量. ライブラリはラップトップで実行されます。クラスター、ハイメモリ サーバー、または GPU は必要ありません。 インストールには pip install nlptest のみが必要であり、オフラインで実行できます (つまり、VPN またはコンプライアンスの高いエンタープライズ環境で)。 その後、わずか XNUMX 行のコードでテストの生成と実行を行うことができます。

import nlptest
h = nlptest.Harness("ner", "bert_base_token_classifier_few_nerd", hub=”johnsnowlabs”)
h.generate().run().report()

このコードは、ライブラリをインポートし、John Snow Labs の NLP モデル ハブから指定されたモデルの名前付きエンティティ認識 (NER) タスク用の新しいテスト ハーネスを作成し、(既定の構成に基づいて) テスト ケースを自動的に生成し、それらのテストを実行します。レポートを印刷します。

テスト自体は pandas データ フレームに保存されるため、編集、フィルタリング、インポート、またはエクスポートが容易になります。 テスト ハーネス全体を保存して読み込むことができるため、以前に構成したテスト スイートの回帰テストを実行するには、h.load(“filename”).run() を呼び出すだけです。

クロスライブラリ. すぐに使用できるサポートがあります トランスフォーマー, スパークNLP, スペイシー. フレームワークを拡張して追加のライブラリをサポートするのは簡単です。 AI コミュニティとして、テスト生成エンジンと実行エンジンを複数回構築する理由はありません。 これらのライブラリのいずれかからの事前トレーニング済みおよびカスタム NLP パイプラインの両方をテストできます。

# a string parameter to Harness asks to download a pre-trained pipeline or model
h1 = nlptest.Harness("ner", "dslim/bert-base-NER", hub=”huggingface”)
h2 = nlptest.Harness("ner", "ner_dl_bert", hub=”johnsnowlabs”)
h3 = nlptest.Harness("ner", "en_core_web_md", hub=”spacy”) # alternatively, configure and pass an initialized pipeline object
pipe = spacy.load("en_core_web_sm", disable=["tok2vec", "tagger", "parser"])
h4 = nlptest.Harness(“ner”, pipe, hub=”spacy”)

拡張可能. 何百もの潜在的なタイプのテストとメトリクスがサポートされる可能性があり、関心のある追加の NLP タスク、および多くのプロジェクトのカスタム ニーズがあるため、新しいタイプのテストを簡単に実装して再利用できるようにするために多くの考慮が払われてきました。

たとえば、米国英語の偏りに関する組み込みのテスト タイプの XNUMX つは、姓名を白人、黒人、アジア人、またはヒスパニック系の人々に一般的な名前に置き換えます。 しかし、アプリケーションがインドまたはブラジルを対象としている場合はどうなるでしょうか? 年齢や障害に基づくバイアスのテストについてはどうですか? テストがいつ合格するかについて、別のメトリックを思いついたらどうしますか?

nlptest ライブラリは、テスト タイプを簡単に記述して組み合わせて一致させることができるフレームワークです。 TestFactory クラスは、さまざまなテストを構成、生成、および実行するための標準 API を定義します。 私たちは、あなたのニーズに合わせてライブラリを提供したりカスタマイズしたりできるように、できるだけ簡単にできるように努力してきました.

モデルとデータのテスト. モデルが実稼働の準備ができていない場合、問題は多くの場合、モデリング アーキテクチャではなく、トレーニングまたは評価に使用されるデータセットにあります。 よくある問題の XNUMX つは、広く使用されているデータセットに蔓延していることが示されている、誤ってラベル付けされたトレーニング例です [ノースカットら。 アル。 2021年]。 もう XNUMX つの問題は再現性バイアスです。人種間でモデルがどれだけうまく機能するかを見つけるための一般的な課題は、使用可能なメトリックを計算するのに十分なテスト ラベルがないことです。 次に、ライブラリがテストに失敗し、他のグループを表すようにトレーニング セットとテスト セットを変更する必要がある、可能性のある間違いを修正する、またはエッジ ケースのトレーニングを行う必要があると通知する傾向があります。

したがって、テスト シナリオは、タスク、モデル、およびデータセットによって定義されます。

h = nlptest.Harness(task  = "text-classification",
                model = "distilbert_base_sequence_classifier_toxicity",     data  = “german hatespeech refugees.csv”,
           hub = “johnsnowlabs”)

ライブラリがモデルとデータの両方に包括的なテスト戦略を提供できるようにするだけでなく、このセットアップにより、生成されたテストを使用してトレーニングとテスト データセットを補強することもできます。これにより、モデルを修正して生産準備を整えるのに必要な時間を大幅に短縮できます。

次のセクションでは、nlptest ライブラリが自動化に役立つ XNUMX つのタスク (テストの生成、テストの実行、データの拡張) について説明します。

 
自然言語処理用のテスト ライブラリの紹介

自然言語処理用のテスト ライブラリの紹介
 

1. テストを自動生成する

 
nlptest と昔のテスト ライブラリとの大きな違いの XNUMX つは、テストをある程度自動生成できるようになったことです。 各 TestFactory は複数のテスト タイプを定義でき、それぞれにテスト ケース ジェネレーターとテスト ケース ランナーを実装します。 

生成されたテストは、その特定のテストに依存する「テスト ケース」列と「期待される結果」列を含むテーブルとして返されます。 これらの XNUMX つの列は、ビジネス アナリストが必要に応じてテスト ケースを手動で確認、編集、追加、または削除できるように、人間が判読できるようになっています。 たとえば、「I live in Berlin.」というテキストに対して RobustnessTestFactory によって NER タスク用に生成されたテスト ケースの一部を次に示します。

テストタイプ テストケース 期待される結果
句読点の削除 私はベルリンに住んでいます ベルリン: 場所
小文字 私はベルリンに住んでいます。 ベルリン: 場所
タイプミスの追加 私はベルリンに住んでいます。 ベルリン: 場所
追加コンテキスト 私はベルリンに住んでいます。 #街の暮らし ベルリン: 場所

以下は、BiasTestFactory によってテキスト分類タスク用に生成されたテスト ケースであり、「John Smith が担当しています」というテキストから開始するときに、米国の民族性に基づく名前の置換を使用しています。

テストタイプ テストケース 期待される結果
replace_to_asian_name ワン・リーが担当 ポジティブな感情
replace_to_black_name ダーネル・ジョンソンが担当 否定的な感情
ネイティブアメリカン名に置き換える ダコタ・ビゲイが担当 ニュートラル・センチメント
replace_to_hispanic_name フアン・モレノが担当 否定的な感情

以下は、FairnessTestFactory および RepresentationTestFactory クラスによって生成されたテスト ケースです。 たとえば、テスト データセットには、男性、女性、性別不特定の患者が少なくとも 30 人含まれている必要があります。 公平性テストでは、次の各性別カテゴリの人々のデータ スライスでテストした場合、テスト対象のモデルの F1 スコアが少なくとも 0.85 である必要があります。
 

テストタイプ テストケース 期待される結果
min_gender_representation 男性 30
min_gender_representation 女性 30
min_gender_representation 未知の 30
min_gender_f1_score 男性 0.85
min_gender_f1_score 女性 0.85
min_gender_f1_score 未知の 0.85

テスト ケースに関する注意事項:

  • 「テスト ケース」と「期待される結果」の意味は、テストの種類によって異なりますが、それぞれのケースで人間が判読できるようにする必要があります。 これは、 h.generate() を呼び出した後、生成されたテスト ケースのリストを手動で確認し、どれを保持または編集するかを決定できるようにするためです。
  • テストのテーブルは pandas データ フレームであるため、ノートブック内で (Qgrid を使用して) 直接編集するか、CSV としてエクスポートしてビジネス アナリストに Excel で編集させることもできます。
  • 自動化によって作業の 80% が行われますが、通常は手動でテストを確認する必要があります。 たとえば、フェイク ニュース検出器をテストしている場合、replace_to_lower_income_country テストで「パリはフランスの首都」を「パリはスーダンの首都」に編集すると、予想される予測と実際の予測が一致しなくなります。
  • また、テストがソリューションのビジネス要件を捉えていることを検証する必要もあります。 たとえば、上記の FairnessTestFactory の例では、非バイナリまたはその他の性別のアイデンティティをテストしておらず、精度が性別間でほぼ同等である必要はありません。 ただし、これらの決定は明示的で、人間が判読でき、簡単に変更できます。
  • XNUMX つのテスト ケースしか生成しないテスト タイプもあれば、何百ものテスト ケースを生成するテスト タイプもあります。 これは構成可能です。各 TestFactory は一連のパラメーターを定義します。
  • TestFactory クラスは通常、タスク、言語、ロケール、およびドメインに固有です。 これは、よりシンプルでモジュール化されたテスト ファクトリを作成できるため、設計によるものです。

2. テストの実行

 
テスト ケースを生成し、思いのままに編集したら、次のように使用します。

  1. h.run() を呼び出して、すべてのテストを実行します。 ハーネスのテーブル内のテスト ケースごとに、関連する TestFactory が呼び出されてテストが実行され、合格/不合格のフラグと説明メッセージが返されます。
  2. h.run() を呼び出した後、h.report() を呼び出します。 これにより、合格率がテスト タイプ別にグループ化され、結果を要約した表が出力され、モデルがテスト スイートに合格したかどうかを示すフラグが返されます。
  3. h.save() を呼び出して、tests テーブルを含むテスト ハーネスを一連のファイルとして保存します。 これにより、たとえば回帰テストを実行する場合などに、まったく同じテスト スイートを後で読み込んで実行できます。

XNUMX つのテスト ファクトリからのテストを適用して、名前付きエンティティ認識 (NER) モデル用に生成されたレポートの例を次に示します。

カテゴリー テストタイプ 失敗数 パス数 合格率 最低合格率 パス?
丈夫 句読点の削除 45 252 視聴者の38%が 視聴者の38%が TRUE
バイアス replace_to_asian_name 110 169 視聴者の38%が 視聴者の38%が 間違った情報
表現 min_gender_representation 0 3 視聴者の38%が 視聴者の38%が TRUE
公平 min_gender_f1_score 1 2 視聴者の38%が 視聴者の38%が 間違った情報
精度 min_macro_f1_score 0 1 視聴者の38%が 視聴者の38%が TRUE

nlptest が行うことの一部はメトリクスの計算ですが、モデルの F1 スコアは何ですか? バイアススコア? 堅牢性スコア? – すべてがバイナリ結果 (合格または不合格) のテストとして組み立てられます。 適切なテストと同様に、これには、アプリケーションが行うことと行わないことを明示する必要があります。 これにより、モデルをより迅速かつ自信を持って展開できます。 また、テストのリストを規制当局と共有することもできます。規制当局はそれを読んだり、自分で実行して結果を再現したりできます。

3.データ拡張

 
モデルにロバスト性やバイアスが欠けていることがわかった場合、モデルを改善する一般的な方法の XNUMX つは、これらのギャップを具体的に対象とする新しいトレーニング データを追加することです。 たとえば、元のデータセットのほとんどがきれいなテキスト (ウィキペディアのテキストなど - タイプミス、スラング、または文法上の誤りがない) を含んでいる場合、またはイスラム教徒またはヒンディー語の名前の表現が欠けている場合、そのような例をトレーニング データセットに追加すると、モデルがより適切に学習するのに役立ちます。それらを処理します。

幸いなことに、場合によってはそのような例を自動的に生成する方法が既にあります。これは、テストの生成に使用するものと同じです。 データ拡張のワークフローは次のとおりです。

  1. テストを生成して実行したら、 h.augment() を呼び出して、テストの結果に基づいて拡張トレーニング データを自動的に生成します。 これは新しく生成されたデータセットである必要があることに注意してください。テスト スイートを使用してモデルを再トレーニングすることはできません。これは、モデルの次のバージョンをそれに対して再度テストすることができないためです。 トレーニングに使用されたデータでモデルをテストすることは、データ漏えいの一例であり、人為的にテスト スコアを膨らませることになります。
  2. 新たに生成された拡張データセットは、pandas データフレームとして利用できます。これを確認し、必要に応じて編集してから、元のモデルを再トレーニングまたは微調整するために使用できます。
  3. 次に、新しいテスト ハーネスを作成し、h.load() に続いて h.run() と h.report() を呼び出すことにより、以前に失敗した同じテスト スイートで新しくトレーニングされたモデルを再評価できます。

この反復プロセスにより、NLP データ サイエンティストは、独自の道徳規範、企業ポリシー、および規制機関によって定められた規則を順守しながら、モデルを継続的に強化できます。

 
nlptest ライブラリは公開されており、現在無料で利用できます。 pip install nlptest から始めるか、訪問してください nlptest.org ドキュメントを読み、例を開始します。

nlptest は、初期段階のオープンソース コミュニティ プロジェクトでもあり、参加を歓迎します。 John Snow Labs には、プロジェクトに割り当てられた完全な開発チームがあり、他のオープンソース ライブラリと同様に、何年にもわたってライブラリの改善に取り組んでいます。 新しいテスト タイプ、タスク、言語、およびプラットフォームが定期的に追加される頻繁なリリースを期待してください。 ただし、貢献したり、例やドキュメントを共有したり、最も必要なものについてフィードバックを提供したりすると、必要なものをより早く入手できます。 訪問 GitHub の nlptest 会話に参加します。

私たちは、安全で信頼性が高く、責任ある NLP を日常的に実現するために協力できることを楽しみにしています。
 

スポット画像

最新のインテリジェンス

スポット画像