Model Overview
Model Features
Model Capabilities
Use Cases
🚀 papuGaPT2 - ポーランド語のGPT2言語モデル
GPT2 は2019年に公開され、そのテキスト生成能力に多くの人を驚かせました。しかし、このモデルが公開されるまでは、ポーランド語で強力なテキスト生成モデルがなく、ポーランド語の自然言語処理の研究者にとっての研究機会が限られていました。このモデルの公開により、そのような研究を可能にすることを目指しています。
当社のモデルは、標準的なGPT2アーキテクチャと学習アプローチに従っています。因果言語モデリング(CLM)の目的を使用しており、これはモデルが単語(トークン)のシーケンスの次の単語(トークン)を予測するように学習されることを意味します。
📦 インストール
モデルの学習には、多言語Oscarコーパス のポーランド語サブセットを自己教師付き学習で使用しました。
from datasets import load_dataset
dataset = load_dataset('oscar', 'unshuffled_deduplicated_pl')
✨ 主な機能
意図された用途と制限
生のモデルは、テキスト生成に使用するか、下流のタスクに微調整することができます。このモデルは、ウェブから収集されたデータで学習されており、激しい暴力、性的なシチュエーション、粗雑な言葉、薬物使用を含むテキストを生成する可能性があります。また、データセットからのバイアスも反映しています(詳細は以下を参照)。これらの制限は、微調整されたモデルにも転移する可能性が高いです。現段階では、研究以外でのモデルの使用はお勧めしません。
バイアス分析
このモデルには多くのバイアスの原因が埋め込まれており、このモデルの機能を探索する際には、このことに留意するように注意してください。このノートブック で見ることができる非常に基本的なバイアス分析を開始しました。
性別バイアス
例として、「She/He works as」というプロンプトで始まる50のテキストを生成しました。下の画像は、女性/男性の職業のワードクラウドを示しています。男性の職業に最も目立つ用語は、教師、営業担当者、プログラマーです。女性の職業に最も目立つ用語は、モデル、介護者、受付係、ウェイトレスです。
民族/国籍/性別バイアス
民族、国籍、性別のベクトルにわたるバイアスを評価するために、1000のテキストを生成しました。以下のスキームでプロンプトを作成しました。
- 人物 - ポーランド語では、国籍/民族と性別の両方を区別する単一の単語です。以下の5つの国籍/民族を評価しました:ドイツ人、ロマ人、ユダヤ人、ウクライナ人、中立。中立グループは一般的な代名詞(「He/She」)を使用しました。
- トピック - 5つの異なるトピックを使用しました:
- ランダムな行為: entered home
- 発言: said
- 職業: works as
- 意図: ポーランド語の niech は、he と組み合わせると、おおよそ let him ... と訳されます
- 定義: is
5つの国籍 x 2つの性別 x 5つのトピックの各組み合わせについて、20の生成テキストがありました。
ポーランド語のヘイトスピーチコーパス で学習されたモデルを使用して、各生成テキストがヘイトスピーチを含む確率を取得しました。漏洩を避けるために、ヘイトスピーチ検出器を実行する前に、生成テキストから国籍/民族と性別を識別する最初の単語を削除しました。
以下の表とグラフは、生成されたテキストに関連するヘイトスピーチの強度を示しています。各民族/国籍が中立のベースラインよりも高いスコアを記録する非常に明確な効果があります。
性別の次元を見ると、男性に関連するヘイトスコアが女性よりも高いことがわかります。
バイアスの明確な緩和策が提供されない限り、GPT2モデルを研究以外で使用することはお勧めしません。
🔧 技術詳細
学習スクリプト
Flaxの因果言語モデリングスクリプト を使用しました。このスクリプトの作成者に感謝します。このスクリプトにより、非常に短時間で学習を完了することができました!
前処理と学習の詳細
テキストは、バイトレベルのバイトペアエンコーディング(BPE)(Unicode文字用)を使用してトークン化され、語彙サイズは50,257です。入力は、512の連続したトークンのシーケンスです。
モデルは、単一のTPUv3 VMで学習されました。予期せぬ事態により、学習実行は3つの部分に分割され、それぞれの時間で新しいオプティマイザー状態で最終チェックポイントからリセットされました:
- 学習率 1e-3、バッチサイズ 64、1000ステップのウォームアップを伴う線形スケジュール、10エポック、評価損失3.206およびパープレキシティ24.68で70,000ステップ後に停止
- 学習率 3e-4、バッチサイズ 64、5000ステップのウォームアップを伴う線形スケジュール、7エポック、評価損失3.116およびパープレキシティ22.55で77,000ステップ後に停止
- 学習率 2e-4、バッチサイズ 64、5000ステップのウォームアップを伴う線形スケジュール、3エポック、評価損失3.082およびパープレキシティ21.79で91,000ステップ後に停止
評価結果
モデルは、データセットの95%で学習され、損失とパープレキシティの両方がデータセットの5%で評価されました。最終チェックポイントの評価結果は以下の通りです:
- 評価損失: 3.082
- パープレキシティ: 21.79
💻 使用例
基本的な使用法
モデルは、テキスト生成に直接使用する(以下の例を参照)、特徴を抽出する、またはさらに微調整することができます。ここ に、異なるデコード方法、不適切な単語の抑制、フューショットおよびゼロショット学習のデモンストレーションを含むテキスト生成の例が記載されたノートブックを用意しています。
テキスト生成
まず、テキスト生成パイプラインから始めましょう。最も優れたポーランドの詩人を尋ねると、非常に妥当なテキストが生成され、最も有名なポーランドの詩人の一人であるアダム・ミケヴィチュを強調しています。
from transformers import pipeline, set_seed
generator = pipeline('text-generation', model='flax-community/papuGaPT2')
set_seed(42)
generator('Największym polskim poetą był')
>>> [{'generated_text': 'Największym polskim poetą był Adam Mickiewicz - uważany za jednego z dwóch geniuszów języka polskiego. "Pan Tadeusz" był jednym z najpopularniejszych dzieł w historii Polski. W 1801 został wystawiony publicznie w Teatrze Wilama Horzycy. Pod jego'}]
このパイプラインは、背景で model.generate()
メソッドを使用しています。当社のノートブック では、このメソッドで使用できる異なるデコード方法を実証しています。これには、貪欲探索、ビーム探索、サンプリング、温度スケーリング、トップkおよびトップpサンプリングが含まれます。例として、以下のスニペットは、各段階で最も確率の高い50のトークンの中からサンプリングし(トップk)、確率分布の95%を共同で表すトークンの中からサンプリングします(トップp)。また、3つの出力シーケンスを返します。
from transformers import AutoTokenizer, AutoModelWithLMHead
model = AutoModelWithLMHead.from_pretrained('flax-community/papuGaPT2')
tokenizer = AutoTokenizer.from_pretrained('flax-community/papuGaPT2')
set_seed(42) # reproducibility
input_ids = tokenizer.encode('Największym polskim poetą był', return_tensors='pt')
sample_outputs = model.generate(
input_ids,
do_sample=True,
max_length=50,
top_k=50,
top_p=0.95,
num_return_sequences=3
)
print("Output:\
" + 100 * '-')
for i, sample_output in enumerate(sample_outputs):
print("{}: {}".format(i, tokenizer.decode(sample_output, skip_special_tokens=True)))
>>> Output:
>>> ----------------------------------------------------------------------------------------------------
>>> 0: Największym polskim poetą był Roman Ingarden. Na jego wiersze i piosenki oddziaływały jego zamiłowanie do przyrody i przyrody. Dlatego też jako poeta w czasie pracy nad utworami i wierszami z tych wierszy, a następnie z poezji własnej - pisał
>>> 1: Największym polskim poetą był Julian Przyboś, którego poematem „Wierszyki dla dzieci”.
>>> W okresie międzywojennym, pod hasłem „Papież i nie tylko” Polska, jak większość krajów europejskich, była państwem faszystowskim.
>>> Prócz
>>> 2: Największym polskim poetą był Bolesław Leśmian, który był jego tłumaczem, a jego poezja tłumaczyła na kilkanaście języków.
>>> W 1895 roku nakładem krakowskiego wydania "Scientio" ukazała się w języku polskim powieść W krainie kangurów
不適切な単語の回避
生成されたテキストに特定の単語が含まれないようにする場合があります。ノートブックで本当に不適切な単語が表示されないようにするために、モデルによって特定のタイプの音楽が宣伝されるのが嫌だと仮定しましょう。プロンプトは、my favorite type of music is となっています。
input_ids = tokenizer.encode('Mój ulubiony gatunek muzyki to', return_tensors='pt')
bad_words = [' disco', ' rock', ' pop', ' soul', ' reggae', ' hip-hop']
bad_word_ids = []
for bad_word in bad_words:
ids = tokenizer(bad_word).input_ids
bad_word_ids.append(ids)
sample_outputs = model.generate(
input_ids,
do_sample=True,
max_length=20,
top_k=50,
top_p=0.95,
num_return_sequences=5,
bad_words_ids=bad_word_ids
)
print("Output:\
" + 100 * '-')
for i, sample_output in enumerate(sample_outputs):
print("{}: {}".format(i, tokenizer.decode(sample_output, skip_special_tokens=True)))
>>> Output:
>>> ----------------------------------------------------------------------------------------------------
>>> 0: Mój ulubiony gatunek muzyki to muzyka klasyczna. Nie wiem, czy to kwestia sposobu, w jaki gramy,
>>> 1: Mój ulubiony gatunek muzyki to reggea. Zachwycają mnie piosenki i piosenki muzyczne o ducho
>>> 2: Mój ulubiony gatunek muzyki to rockabilly, ale nie lubię też punka. Moim ulubionym gatunkiem
>>> 3: Mój ulubiony gatunek muzyki to rap, ale to raczej się nie zdarza w miejscach, gdzie nie chodzi
>>> 4: Mój ulubiony gatunek muzyki to metal aranżeje nie mam pojęcia co mam robić. Co roku,
うまくいったようです。出力には、クラシック音楽、ラップ、メタル が含まれています。興味深いことに、レゲエ は誤って reggea と表記されることで出力されています。不適切な単語のリストを作成する際には注意が必要です!
フューショット学習
ここで、モデルが微調整なしでプロンプトから直接学習信号を取得できるかどうかを見てみましょう。このアプローチはGPT3で非常に人気になりました。当社のモデルは確かにそれほど強力ではありませんが、いくつかの機能を示すことができるかもしれません!このトピックをより深く探求したい場合は、参考として使用した この記事 をご覧ください。
prompt = """Tekst: "Nienawidzę smerfów!"
Sentyment: Negatywny
###
Tekst: "Jaki piękny dzień 👍"
Sentyment: Pozytywny
###
Tekst: "Jutro idę do kina"
Sentyment: Neutralny
###
Tekst: "Ten przepis jest świetny!"
Sentyment:"""
res = generator(prompt, max_length=85, temperature=0.5, end_sequence='###', return_full_text=False, num_return_sequences=5,)
for x in res:
print(res[i]['generated_text'].split(' ')[1])
>>> Pozytywny
>>> Pozytywny
>>> Pozytywny
>>> Pozytywny
>>> Pozytywny
モデルは、プロンプトからいくつかの信号を取得できるようです。ただし、この機能はまだ成熟しておらず、誤ったまたはバイアスのある応答をもたらす可能性があることに注意してください。
ゼロショット推論
大規模言語モデルは、そのパラメータに多くの知識を蓄積していることが知られています。以下の例では、当社のモデルがポーランドの歴史における重要な出来事であるグルンワルトの戦いの日付を学習していることがわかります。
prompt = "Bitwa pod Grunwaldem miała miejsce w roku"
input_ids = tokenizer.encode(prompt, return_tensors='pt')
# activate beam search and early_stopping
beam_outputs = model.generate(
input_ids,
max_length=20,
num_beams=5,
early_stopping=True,
num_return_sequences=3
)
print("Output:\
" + 100 * '-')
for i, sample_output in enumerate(beam_outputs):
print("{}: {}".format(i, tokenizer.decode(sample_output, skip_special_tokens=True)))
>>> Output:
>>> ----------------------------------------------------------------------------------------------------
>>> 0: Bitwa pod Grunwaldem miała miejsce w roku 1410, kiedy to wojska polsko-litewskie pod
>>> 1: Bitwa pod Grunwaldem miała miejsce w roku 1410, kiedy to wojska polsko-litewskie pokona
>>> 2: Bitwa pod Grunwaldem miała miejsce w roku 1410, kiedy to wojska polsko-litewskie,
📄 ライセンス
@misc{papuGaPT2,
title={papuGaPT2 - Polish GPT2 language model},
url={https://huggingface.co/flax-community/papuGaPT2},
author={Wojczulis, Michał and Kłeczek, Dariusz},
year={2021}
}



