2018年に導入されて以来、Bertは自然言語処理を変革しました。センチメント分析、質問応答、言語の推論などのタスクでうまく機能します。双方向トレーニングと変圧器ベースの自己関節を使用して、バートはテキストの単語間の関係を理解するための新しい方法を導入しました。しかし、その成功にもかかわらず、バートには制限があります。計算効率、より長いテキストの処理、解釈可能性を提供することに苦労しています。これにより、これらの課題に対処するために設計されたモデルであるModernBertの開発が行われました。 ModernBertは処理速度を向上させ、より長いテキストをより良く処理し、開発者により透明性を高めます。この記事では、ModernBertをセンチメント分析に使用する方法を検討し、Bertの機能と改善を強調します。
学習目標この記事は、 データサイエンスブログの一部として公開されました。 目次
Modernbertは、フラッシュの注意やローカルグロバル交互の注意などのより効率的なアルゴリズムを組み込むことにより、これらの制限に対処します。さらに、ModernBertは、より長いコンテキストの長さをサポートするために、ロータリー位置埋め込み(ロープ)などのテクニックを統合することにより、より長いコンテキストの長さをより効果的に処理するための機能強化を導入します。
より透明で使いやすいことを目指すことにより、解釈可能性が向上し、開発者がモデルを特定のタスクに簡単にデバッグして適応させます。さらに、ModernBertは、常識の推論で進歩を取り入れており、提供された明示的な情報を超えて、文脈、ニュアンス、および論理的な関係をよりよく理解できるようにします。 Nvidia T4、A100、RTX 4090などの一般的なGPUに適しています。ModernBertは、Webドキュメント、コード、科学記事など、さまざまな英語のソースからのデータについてトレーニングされています。以前のエンコーダーで人気のある標準の20-40の繰り返しとは異なり、2兆個のユニークなトークンでトレーニングされています。
次のサイズでリリースされています:22層と1億4900万のパラメーターを備えたModernBert-Base
28層と3億9,500万のパラメーターを備えたModernBert-Large
Modernbertの最も斬新な特徴の1つは、完全なグローバルな注意ではなく、注意を交互にすることです。
その間、他のすべてのレイヤーにはスライドウィンドウがあります。このスライディングウィンドウでは、すべてのトークンが最寄りの128トークンのみに出席します。これは局所的な注意です。
回転位置埋め込み(ロープ)は、回転行列を使用してシーケンスでトークンの位置をコードするトランスモデル技術です。絶対的および相対的な位置情報が組み込まれ、トークン間の順序と距離を理解するための注意メカニズムを調整します。ロープは、回転マトリックスを使用してトークンの絶対位置をエンコードし、相対的な位置情報またはトークン間の順序と距離にも注意してください。
upadding and Sequencing通常、パディングは最長のトークンを見つけるために使用され、意味のないパディングトークンを追加して、残りの短いシーケンスをそれらの長さに等しく埋めます。これにより、意味のないトークンでの計算が増加します。貼り付けて、シーケンスから不必要なパディングトークンを削除し、無駄な計算を減らします。
注:
A100 GPUを使用して、Google Colabでより速い処理を行いました。詳細については、次を参照してください:AnswerDotai/ModernBert-Base
#install libraries !pip install git+https://github.com/huggingface/transformers.git datasets accelerate scikit-learn -Uqq !pip install -U transformers>=4.48.0 import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer,AutoModelForMaskedLM,AutoConfig from datasets import load_dataset
ステップ3:トークン化
#Load the dataset from datasets import load_dataset imdb = load_dataset("imdb") #print the first test sample imdb["test"][0]
#install libraries !pip install git+https://github.com/huggingface/transformers.git datasets accelerate scikit-learn -Uqq !pip install -U transformers>=4.48.0 import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer,AutoModelForMaskedLM,AutoConfig from datasets import load_dataset
センチメントラベル列(ラベル)を「ラベル」に名前を変更し、不要な列を削除してデータセットを準備してください。
#Load the dataset from datasets import load_dataset imdb = load_dataset("imdb") #print the first test sample imdb["test"][0]
#initialize the tokenizer and the model tokenizer = AutoTokenizer.from_pretrained("answerdotai/ModernBERT-base") model = AutoModelForMaskedLM.from_pretrained("answerdotai/ModernBERT-base") #define the tokenizer function def tokenizer_function(example): return tokenizer( example["text"], padding="max_length", truncation=True, max_length=512, ## max length can be modified return_tensors="pt" ) #tokenize training and testing data set based on above defined tokenizer function tokenized_train_dataset = imdb["train"].map(tokenizer_function, batched=True) tokenized_test_dataset = imdb["test"].map(tokenizer_function, batched=True) #print the tokenized output of first test sample print(tokenized_test_dataset[0])
#initialize the model config = AutoConfig.from_pretrained("answerdotai/ModernBERT-base") model = AutoModelForSequenceClassification.from_config(config)
データセットのテストでトレーニングされたモデルを評価します
#data preparation step - train_dataset = tokenized_train_dataset.remove_columns(['text']).rename_column('label', 'labels') test_dataset = tokenized_test_dataset.remove_columns(['text']).rename_column('label', 'labels')
ステップ10:微調整されたモデルを保存
import numpy as np from sklearn.metrics import f1_score # Metric helper method def compute_metrics(eval_pred): predictions, labels = eval_pred predictions = np.argmax(predictions, axis=1) score = f1_score( labels, predictions, labels=labels, pos_label=1, average="weighted" ) return {"f1": float(score) if score == 1 else score}
微調整されたモデルとトークネイザーを保存して、さらに再利用します
ここ:0は否定的なレビューを示し、1は肯定的なレビューを示します。私の新しい例では、退屈は否定的なレビュー(0)を示し、壮大な意見を示すため、出力は[0,1]である必要があります。したがって、1は出力として与えられます。
ModernBertの制限
#define training arguments train_bsz, val_bsz = 32, 32 lr = 8e-5 betas = (0.9, 0.98) n_epochs = 2 eps = 1e-6 wd = 8e-6 training_args = TrainingArguments( output_dir=f"fine_tuned_modern_bert", learning_rate=lr, per_device_train_batch_size=train_bsz, per_device_eval_batch_size=val_bsz, num_train_epochs=n_epochs, lr_scheduler_type="linear", optim="adamw_torch", adam_beta1=betas[0], adam_beta2=betas[1], adam_epsilon=eps, logging_strategy="epoch", eval_strategy="epoch", save_strategy="epoch", load_best_model_at_end=True, bf16=True, bf16_full_eval=True, push_to_hub=False, )
moderbertドキュメント
以上がModernbertによる感情分析の強化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。