目次
1.はじめに
2.バイアスと限界
3.検証1
4.検証2
5.おわりに
1. はじめに
自然言語処理を学ぶ上で、Hugging Faceが提供してくれているNLPコースは、お勧めです。
コースにおいて、「バイアスと限界」という項目があり、ちょっと、ビックリしましたので、内容の共有となります。
一言で言うと、事前学習データ自体にバイアスが含まれているので、注意しないといけないということのようです。
2. バイアスと限界
以下、上記ページからの引用となります。
事前学習済みモデルやファインチューニング済みのモデルを使う場合、これらのモデルは強力なツールですが、一方で限界もあることに注意しなければなりません。 その代表例は、大量のデータによる事前学習を行うために、研究者はインターネット上にある利用可能なデータを良いものから悪いものまで手当たりしだいに集めてしまうことです。
簡単に説明するために、BERTによるfill-maskパイプラインの例に戻りましょう:
という説明後、以下のコードがあります。
from transformers import pipeline
unmasker = pipeline("fill-mask", model="bert-base-uncased")
result = unmasker("This man works as a [MASK].")
print([r["token_str"] for r in result])
result = unmasker("This woman works as a [MASK].")
print([r["token_str"] for r in result])
['lawyer', 'carpenter', 'doctor', 'waiter', 'mechanic']
['nurse', 'waitress', 'teacher', 'maid', 'prostitute']
その後、以下の説明が続きます。
これらの2つの文の欠落した単語を埋めさせたときに、モデルはジェンダーフリーの回答を一つだけしか与えません(waiter/waitress)。他はたいていの場合、特定の性別と関連付けられる職業です。そして、モデルは「女性」と「仕事」から連想される可能性のある職業としてトップ5に「売春婦(prostitute)」を上げています。 BERTはインターネット上のあらゆるところからデータをかき集めて構築されたのではなく、中立的なデータ(English WikipediaとBookCorpusを用いて学習されています) を用いて構築されためずらしいTransformerモデルであるにも関わらず、このような現象が発生してしまいます。
したがって、これらのツールを使用する際は、オリジナルのモデルがとても簡単に性的、差別的、あるいは同性愛嫌悪のコンテンツを生成してしまうことを念頭に置く必要があります。この本質的なバイアスは、あるデータでファインチューニングしても消えることはありません。
3. 検証1
ビックリしましたので、自分でも、やってみました。
結果は以下の通りです。
['carpenter', 'lawyer', 'farmer', 'businessman', 'doctor']
['nurse', 'maid', 'teacher', 'waitress', 'prostitute']
同一モデルに対して、同一コードを使いましたので、ほぼ同一の結果となっています。
上記説明にもある通り、「女性」と「仕事」から連想される可能性のある職業としてトップ5に「売春婦(prostitute)」が上がっています。
本当に、ビックリしました。
4. 検証2
日本語だと、どうなるの、と思い、日本語が適用できるモデルを使って、やってみました。
なるべく、似たモデルを使いたかったので、bert-base-multilingual-uncasedを使いました。
先ほど使ったbert-base-uncasedとbert-base-multilingual-uncasedの違いは、単言語用か、多言語用か、という点です。
bert-base-uncasedは英語のみに特化したBERTモデルです。つまり、英文を処理するために訓練されています。
一方、bert-base-multilingual-uncasedは、多言語対応のBERTモデルであり、さまざまな言語のテキストを処理できるように設計されています。
なお、どちらのモデルもuncasedであり、大文字と小文字を区別しません。
コードは、以下の通りです。
from transformers import pipeline
unmasker = pipeline("fill-mask", model="bert-base-multilingual-uncased")
result = unmasker("この男性の職業は [MASK]です。")
print([r["token_str"] for r in result])
result = unmasker("この女性の職業は [MASK]です。")
print([r["token_str"] for r in result])
結果は、以下の通りです。
['何', '見', '誰', '経', '満']
['何', '見', '満', '経', '誰']
なんか、イマイチですよね。
ちなみに、モデルをbert-base-multilingual-casedに変えると、以下の結果となり、多少、良くなる感じです。
['、', '何', '愛', '父', '。']
['、', '何', '愛', '女', '母']
冒頭の事例を、多言語用でトライしてみました。
from transformers import pipeline
unmasker = pipeline("fill-mask", model="bert-base-multilingual-uncased")
result = unmasker("This man works as a [MASK].")
print([r["token_str"] for r in result])
result = unmasker("This woman works as a [MASK].")
print([r["token_str"] for r in result])
こちらの結果は、以下の通りです。
['man', 'teacher', 'child', 'doctor', 'writer']
['teacher', 'lawyer', 'nurse', 'doctor', 'painter']
なんか、こちらの方が、単言語用のモデルよりも、変な単語が少ない気がします(笑)
5. おわりに
モデルによっては、バイアス、ありますね、、、
bert-base-uncased
とbert-base-multilingual-uncased
の事前学習データの量については、公式な文書に記載されていないため、不明です。
ただし、bert-base-uncased
は英語に特化したモデルであり、英語の事前学習データを重点的に利用しています。一方、bert-base-multilingual-uncased
は多言語対応のため、複数の言語のデータを組み合わせて事前学習されています。
前述のHugging Faceの説明のように、
事前学習済みモデルやファインチューニング済みのモデルを使う場合、これらのモデルは強力なツールですが、一方で限界もあることに注意しなければなりません。 その代表例は、大量のデータによる事前学習を行うために、研究者はインターネット上にある利用可能なデータを良いものから悪いものまで手当たりしだいに集めてしまうことです。
ということなのですね。
頭の片隅に置いておいても良い留意点だと思いましたので、連携させていただきます。
それから、やはり、日本語での自然言語処理は、「検証2」で見た通り、まだ道半ば、という感じですね、、、