モデル概要
モデル特徴
モデル能力
使用事例
🚀 ポルベルト - ポーランド語版BERT
BERT言語モデルのポーランド語版が登場しました!現在、大文字小文字を区別するバージョンと区別しないバージョンの2種類が利用可能で、どちらもHuggingFaceのtransformersライブラリを通じてダウンロードして使用することができます。私は大文字小文字を区別するモデルの使用をおすすめします。違いとベンチマーク結果については以下で詳しく説明します。
🚀 クイックスタート
ポルベルトはHuggingFace Transformersライブラリを通じてリリースされています。言語モデルとしての使用例については、このノートブックファイルを参照してください。
✨ 主な機能
大文字小文字を区別するバージョンと区別しないバージョン
- 最初に大文字小文字を区別しないモデルを学習させました。コーパスと学習の詳細については以下で参照できます。大文字小文字を区別しないモデルを公開した後に見つけた問題点は以下の通りです。
- 小文字化を適用する際に、BERTのトークナイザーで一部のポーランド語の文字とアクセントが正しくトークナイズされません。これはシーケンス分類にはあまり影響しませんが、トークン分類タスクには大きく影響する可能性があります。
- 学習コーパスを占めるOpen Subtitlesデータセットに多くの重複があることに気づきました。
- ホールワードマスキングを使用していませんでした。
- 大文字小文字を区別するモデルは、大文字小文字を区別しないモデルに対して以下の点で改善されています。
- すべてのポーランド語の文字とアクセントが正しくトークナイズされるようになりました。
- Open Subtitlesデータセットから重複を削除しました。コーパスは小さくなりましたが、よりバランスが取れた状態になりました。
- モデルはホールワードマスキングを使用して学習されています。
📦 インストール
ポルベルトはHuggingFace Transformersライブラリを通じて利用できます。
💻 使用例
基本的な使用法
大文字小文字を区別しない場合
from transformers import *
model = BertForMaskedLM.from_pretrained("dkleczek/bert-base-polish-uncased-v1")
tokenizer = BertTokenizer.from_pretrained("dkleczek/bert-base-polish-uncased-v1")
nlp = pipeline('fill-mask', model=model, tokenizer=tokenizer)
for pred in nlp(f"Adam Mickiewicz wielkim polskim {nlp.tokenizer.mask_token} był."):
print(pred)
# Output:
# {'sequence': '[CLS] adam mickiewicz wielkim polskim poeta był. [SEP]', 'score': 0.47196975350379944, 'token': 26596}
# {'sequence': '[CLS] adam mickiewicz wielkim polskim bohaterem był. [SEP]', 'score': 0.09127858281135559, 'token': 10953}
# {'sequence': '[CLS] adam mickiewicz wielkim polskim człowiekiem był. [SEP]', 'score': 0.0647173821926117, 'token': 5182}
# {'sequence': '[CLS] adam mickiewicz wielkim polskim pisarzem był. [SEP]', 'score': 0.05232388526201248, 'token': 24293}
# {'sequence': '[CLS] adam mickiewicz wielkim polskim politykiem był. [SEP]', 'score': 0.04554257541894913, 'token': 44095}
大文字小文字を区別する場合
model = BertForMaskedLM.from_pretrained("dkleczek/bert-base-polish-cased-v1")
tokenizer = BertTokenizer.from_pretrained("dkleczek/bert-base-polish-cased-v1")
nlp = pipeline('fill-mask', model=model, tokenizer=tokenizer)
for pred in nlp(f"Adam Mickiewicz wielkim polskim {nlp.tokenizer.mask_token} był."):
print(pred)
# Output:
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim pisarzem był. [SEP]', 'score': 0.5391148328781128, 'token': 37120}
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim człowiekiem był. [SEP]', 'score': 0.11683262139558792, 'token': 6810}
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim bohaterem był. [SEP]', 'score': 0.06021466106176376, 'token': 17709}
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim mistrzem był. [SEP]', 'score': 0.051870670169591904, 'token': 14652}
# {'sequence': '[CLS] Adam Mickiewicz wielkim polskim artystą był. [SEP]', 'score': 0.031787533313035965, 'token': 35680}
📚 ドキュメント
事前学習コーパス
以下は、wc
コマンドの出力(行数、単語数、文字数をカウント)とともに使用されたコーパスのリストです。これらのコーパスはsrxsegmenterを使用して文に分割され(参照を参照)、連結され、HuggingFaceのBERTトークナイザーでトークナイズされました。
大文字小文字を区別しない場合
テーブル | 行数 | 単語数 | 文字数 |
---|---|---|---|
Open Subtitlesのポーランド語サブセット | 236635408 | 1431199601 | 7628097730 |
ParaCrawlのポーランド語サブセット | 8470950 | 176670885 | 1163505275 |
ポーランド議会コーパス | 9799859 | 121154785 | 938896963 |
2020年2月のポーランド語ウィキペディア | 8014206 | 132067986 | 1015849191 |
合計 | 262920423 | 1861093257 | 10746349159 |
大文字小文字を区別する場合
テーブル | 行数 | 単語数 | 文字数 |
---|---|---|---|
Open Subtitlesのポーランド語サブセット(重複削除済み) | 41998942 | 213590656 | 1424873235 |
ParaCrawlのポーランド語サブセット | 8470950 | 176670885 | 1163505275 |
ポーランド議会コーパス | 9799859 | 121154785 | 938896963 |
2020年2月のポーランド語ウィキペディア | 8014206 | 132067986 | 1015849191 |
合計 | 68283960 | 646479197 | 4543124667 |
事前学習の詳細
大文字小文字を区別しない場合
- ポルベルトはGoogleのBERTのGitHubリポジトリ(https://github.com/google-research/bert)に提供されているコードを使用して学習されました。
- 現在公開されているモデルはbert-base-uncasedモデルアーキテクチャ(12層、768隠れ層、12ヘッド、1億1000万パラメータ)に従っています。
- 学習設定:合計100万ステップの学習
- 10万ステップ - シーケンス長128、バッチサイズ512、学習率1e-4(1万ステップのウォームアップ)
- 80万ステップ - シーケンス長128、バッチサイズ512、学習率5e-5
- 10万ステップ - シーケンス長512、バッチサイズ256、学習率2e-5
- モデルは単一のGoogle Cloud TPU v3-8で学習されました。
大文字小文字を区別する場合
- 大文字小文字を区別しないモデルと同じアプローチで、以下の違いがあります。
- ホールワードマスキング
- 学習設定:
- 10万ステップ - シーケンス長128、バッチサイズ2048、学習率1e-4(1万ステップのウォームアップ)
- 10万ステップ - シーケンス長128、バッチサイズ2048、学習率5e-5
- 10万ステップ - シーケンス長512、バッチサイズ256、学習率2e-5
評価
Allegroのおかげで、ポーランド語の言語理解のための9つの評価タスクからなるKLEJベンチマークが利用可能になりました。以下の結果は、ポルベルトの大文字小文字を区別するバージョンと区別しないバージョンの両方を利用して、標準的な評価スクリプトを実行することで得られています(トリックは使用していません!)。
モデル | 平均 | NKJP-NER | CDSC-E | CDSC-R | CBD | PolEmo2.0-IN | PolEmo2.0-OUT | DYK | PSC | AR |
---|---|---|---|---|---|---|---|---|---|---|
ポルベルト(大文字小文字を区別する) | 81.7 | 93.6 | 93.4 | 93.8 | 52.7 | 87.4 | 71.1 | 59.1 | 98.6 | 85.2 |
ポルベルト(大文字小文字を区別しない) | 81.4 | 90.1 | 93.9 | 93.5 | 55.0 | 88.1 | 68.8 | 59.4 | 98.8 | 85.4 |
大文字小文字を区別しないモデルが一部のタスクで大文字小文字を区別するモデルよりも良い性能を示していることに気づきましたか?これはOpen Subtitlesデータセットのオーバーサンプリングと、一部のタスクのデータとの類似性が原因だと思われます。これらのベンチマークタスクはすべてシーケンス分類であるため、大文字小文字を区別するモデルの相対的な強みはここではあまり見られません。
バイアス
モデルを学習するために使用されたデータにはバイアスが含まれています。これは性別、民族性などに関連するステレオタイプを反映している可能性があります。ダウンストリームタスクでモデルを使用する際には、これらのバイアスを考慮し、軽減するように注意してください。
謝辞
- GoogleのTensorFlow Research Cloud (TFRC)に無料のTPUクレジットを提供していただき、感謝の意を表します。ありがとうございます!
- deepsetのTimo Möller氏が、ドイツ語のBERTモデルを学習させた経験に基づいたアドバイスとスクリプトを共有してくれたことに感謝します。
- AllegroがKLEJベンチマークを公開してくれたこと、特にPiotr Rybak氏が評価に協力し、トークナイズに関するいくつかの問題点を指摘してくれたことに大きな感謝を申し上げます。
- 最後に、fastaiのRachel Thomas氏、Jeremy Howard氏、Sylvain Gugger氏に、彼らのNLPとディープラーニングのコースに感謝します!
作者
Darek Kłeczek - Twitterで@dk21までご連絡ください。
参考文献
- https://github.com/google-research/bert
- https://github.com/narusemotoki/srx_segmenter
- Marcin Miłkowskiによって書かれた、ポーランド語の文分割用のSRXルールファイル:https://raw.githubusercontent.com/languagetool-org/languagetool/master/languagetool-core/src/main/resources/org/languagetool/resource/segment.srx
- KLEJベンチマーク



