BERT は、感情分類などのさまざまなタスクに広く使用できる自然言語処理テクノロジーです。センチメント分類は、テキスト分類の特別な形式であり、その目的は、テキストによって表現されるセンチメント (ポジティブ、ネガティブ、ニュートラルなど) を判断することです。 BERT モデルは Transformer アーキテクチャに基づいており、モデルのパフォーマンスを向上させるための事前トレーニングに大量のラベルなしテキスト データを使用します。事前トレーニングを通じて、BERT は語彙、構文、セマンティクスなどを含む豊富な言語知識を学習でき、モデルがさまざまなタスクで優れたパフォーマンスを達成できるようになります。したがって、BERT は自然言語処理の分野で重要なツールとなり、感情分類などのタスクを強力にサポートします。
BERT モデルの事前トレーニング プロセスは、マスクされた言語モデルと次の文の予測の 2 つの段階に分けることができます。 マスクされた言語モデルの段階では、BERT モデルは入力テキストからいくつかの単語をランダムに選択し、それらを特別な [MASK] タグに置き換えます。モデルの目標は、これらの不明瞭な単語を予測することです。このプロセスを通じて、BERT モデルは単語間の文脈上の関係を学習し、テキストをよりよく理解して生成できます。 次の文予測ステージでは、BERT モデルは 2 つの文を入力として受け取り、その 2 つの文が意味的に相互に関連しているかどうかを判断することが目的です。このタスクを通じて、BERT モデルは文間の相関関係を学習し、文の意味論とコンテキストをより深く理解できます。 これら 2 つの事前トレーニング段階を通じて、BERT モデルは豊富なセマンティック情報とコンテキスト情報を取得できます。これにより、BERT モデルは、テキスト分類、固有表現認識、質問応答システムなど、さまざまな自然言語処理タスクで適切に実行されます。同時に、BERT の事前トレーニング プロセスでは大規模なラベルなしテキスト データも使用され、モデルが大規模なデータから一般的な言語知識を学習できるようになり、パフォーマンスがさらに向上します。 要約すると、BERT モデルの事前トレーニング プロセスには以下が含まれます。
事前トレーニング後、BERT モデルは感情分類タスクに使用できます。 BERT は特徴抽出器として使用でき、分類のために他の機械学習アルゴリズム (ロジスティック回帰、サポート ベクター マシンなど) と組み合わせることができます。さらに、BERT を微調整して、特定の感情分類データセットに対するエンドツーエンドのトレーニングを通じて分類パフォーマンスをさらに向上させることもできます。
特徴抽出メソッドの場合、BERT モデルの出力ベクトルを入力特徴ベクトルとして使用できます。その後、分類器を他の機械学習アルゴリズムと組み合わせてトレーニングできます。分類する前に、テキストは単語の分割、ストップワードの削除、単語の語幹の抽出などの前処理を行う必要があります。 BERT の事前トレーニング済みモデルを使用すると、単語の埋め込みを生成し、これらの埋め込みを特徴ベクトルとして使用できます。これにより、テキストの意味情報を効果的に抽出でき、分類器がさまざまなテキスト サンプルをよりよく理解して区別できるようになります。
微調整方法の場合、感情分類データセットに対してエンドツーエンドのトレーニングを実行することで BERT モデルを微調整できます。このアプローチでは、特定のタスクのニーズに合わせて BERT モデルのすべての層を再トレーニングできます。微調整中に、必要に応じてさまざまな学習率、バッチ サイズ、トレーニング エポック数を使用してモデルを最適化できます。 BERT モデルを微調整することで、特定のタスクの要件に応じて重みを調整するため、モデルのパフォーマンスを向上させることができます。このパーソナライズ機能により、BERT モデルはさまざまな自然言語処理タスクで適切に実行されます。
BERT モデルを感情分類に使用する場合は、次の点に注意する必要があります:
1. データの前処理: 使用する前にBERT モデルでは、テキストは単語の分割、ストップワードの削除、ステミングなどの前処理が必要です。
2. データの注釈: テキストの感情分類には正確に注釈を付ける必要があります。注釈付きデータには、モデルがさまざまな感情の分類を確実に学習できるように、十分な範囲が含まれている必要があります。
3. モデルの選択: 感情分類に事前トレーニング済み BERT モデルまたは微調整された BERT モデルの使用を選択できます。 BERT モデルを微調整するとモデルのパフォーマンスを向上させることができますが、より多くのコンピューティング リソースと時間が必要になります。
4. ハイパーパラメータの調整: モデルのパフォーマンスを最適化するには、学習率、バッチ サイズ、トレーニング ラウンド数などのモデルのハイパーパラメータを調整する必要があります。 。
5. モデルの評価: モデルのパフォーマンスが期待を満たしているかどうかを判断するには、モデルを評価する必要があります。精度、再現率、F1 スコアなどのメトリックを使用して、モデルのパフォーマンスを評価できます。
BERT モデルは、特徴抽出と特徴抽出という 2 つの方法で感情分類を実装できます。微調整。この記事では、感情分類のための BERT モデルを微調整する例を取り上げ、その実装方法を示す Python コードも示します。
1) データセット
デモンストレーションには IMDB センチメント分類データセットを使用します。このデータセットには IMDB 映画レビューからの 50,000 のテキストが含まれており、そのうち 25,000 はトレーニングに使用され、残りの 25,000 はテストに使用されます。各サンプルには、ポジティブ (1) またはネガティブ (0) のセンチメントを示すバイナリ ラベルが付いています。
2) データ セットの取得
まず、IMDB データ セットをダウンロードする必要があります。データセットは、次のコードを使用してダウンロードできます:
!wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz !tar -xf aclImdb_v1.tar.gz
3) 必要なライブラリをインポートします
接下来,我们需要导入必要的Python库,包括PyTorch、Transformers和NumPy。可以使用以下代码导入这些库:
import torch import transformers as ppb import numpy as np
4)加载BERT模型和标记器
我们将使用Pretrained BERT模型(ppb)库中的BERT模型和标记器。可以使用以下代码加载模型和标记器:
<code>model_class, tokenizer_class, pretrained_weights = (ppb.BertModel, ppb.BertTokenizer, 'bert-base-uncased')<br/>tokenizer = tokenizer_class.from_pretrained(pretrained_weights)<br/>model = model_class.from_pretrained(pretrained_weights)</code>
5)加载数据集
接下来,我们需要加载IMDB数据集。可以使用以下代码加载数据集:
import pandas as pd import io # Load data train = pd.read_csv('aclImdb/train.tsv', delimiter='\t', header=None) test = pd.read_csv('aclImdb/test.tsv', delimiter='\t', header=None) # Split data into input and labels train_sentences = train[0].values train_labels = train[1].values test_sentences = test[0].values test_labels = test[1].values
6)预处理数据
在微调BERT模型之前,我们需要对数据进行预处理。这包括对文本进行标记化、截断和填充。可以使用以下代码对数据进行预处理:
# Tokenize the input texts train_tokenized = np.array([tokenizer.encode(sent, add_special_tokens=True) for sent in train_sentences]) test_tokenized = np.array([tokenizer.encode(sent, add_special_tokens=True) for sent in test_sentences]) # Truncate and pad the input texts max_len = 128 train_padded = np.array([i[:max_len] + [0]*(max_len-len(i)) for i in train_tokenized]) test_padded = np.array([i[:max_len] + [0]*(max_len-len(i)) for i in test_tokenized]) # Create attention masks train_attention_mask = np.where(train_padded != 0, 1, 0) test_attention_mask = np.where(test_padded != 0, 1, 0) # Convert the input texts to PyTorch tensors train_input_ids = torch.tensor(train_padded) train_attention_mask = torch.tensor(train_attention_mask) train_labels = torch.tensor(train_labels) test_input_ids = torch.tensor(test_padded) test_attention_mask = torch.tensor(test_attention_mask) test_labels = torch.tensor(test_labels)
7)微调BERT模型
我们将使用PyTorch框架对BERT模型进行微调。可以使用以下代码对模型进行微调:
from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler from transformers import AdamW, get_linear_schedule_with_warmup #Create a data loader for training data batch_size = 32 train_data = TensorDataset(train_input_ids, train_attention_mask, train_labels) train_sampler = RandomSampler(train_data) train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=batch_size) #Create a data loader for test data test_data = TensorDataset(test_input_ids, test_attention_mask, test_labels) test_sampler = SequentialSampler(test_data) test_dataloader = DataLoader(test_data, sampler=test_sampler, batch_size=batch_size) #Set up the optimizer and scheduler epochs = 3 optimizer = AdamW(model.parameters(), lr=2e-5, eps=1e-8) total_steps = len(train_dataloader) * epochs scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps) #Train the model device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device) for epoch in range(epochs): print(f'Epoch {epoch + 1}/{epochs}') print('-' * 10) total_loss = 0 model.train() for step, batch in enumerate(train_dataloader): # Get batch input data batch_input_ids = batch[0].to(device) batch_attention_mask = batch[1].to(device) batch_labels = batch[2].to(device) # Clear gradients model.zero_grad() # Forward pass outputs = model(batch_input_ids, attention_mask=batch_attention_mask, labels=batch_labels) loss = outputs[0] # Backward pass loss.backward() # Update parameters optimizer.step() # Update learning rate schedule scheduler.step() # Accumulate total loss total_loss += loss.item() # Print progress every 100 steps if (step + 1) % 100 == 0: print(f'Step {step + 1}/{len(train_dataloader)}: Loss = {total_loss / (step + 1):.4f}') # Evaluate the model on test data model.eval() with torch.no_grad(): total_correct = 0 total_samples = 0 for batch in test_dataloader: # Get batch input data batch_input_ids = batch[0].to(device) batch_attention_mask = batch[1].to(device) batch_labels = batch[2].to(device) # Forward pass outputs = model(batch_input_ids, attention_mask=batch_attention_mask) logits = outputs[0] predictions = torch.argmax(logits, dim=1) # Accumulate total correct predictions and samples total_correct += torch.sum(predictions == batch_labels).item() total_samples += len(batch_labels) # Print evaluation results accuracy = total_correct / total_samples print(f'Test accuracy: {accuracy:.4f}')
代码解析:
首先,我们使用PyTorch的数据加载器加载数据。我们将训练数据和测试数据分别放入train_data和test_data张量中,并使用RandomSampler和SequentialSampler对它们进行采样。然后,我们将train_data和test_data输入到DataLoader中,并设置batch_size为32。
接下来,我们设置优化器和学习率调度器。我们使用AdamW优化器和get_linear_schedule_with_warmup学习率调度器。我们将epochs设置为3,并使用total_steps计算总的训练步数。
然后,我们将模型移动到GPU设备上(如果可用)。在每个epoch中,我们将模型设置为训练模式,并遍历train_dataloader以进行训练。对于每个批次,我们将批次输入数据传递给模型,并计算损失。然后,我们使用反向传播更新模型参数,并使用scheduler更新学习率。我们还累计了总损失,并在每100个步骤后打印进度。
在每个epoch结束时,我们将模型设置为评估模式,并使用torch.no_grad()上下文计算在测试数据上的准确度。我们对test_dataloader进行遍历,并对每个批次进行预测。我们将预测结果与真实标签进行比较,并累计总正确预测数和样本数。最后,我们计算测试准确度并打印结果。
以上がBERT モデルを感情分類に使用する方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。