Traffine I/O

日本語

2023-03-05

カスタムBERTモデルの作り方

はじめに

カスタムBERTモデルクラスの定義には、事前学習済みBERTモデルをベースにした新しいニューラルネットワークアーキテクチャを作成する必要があります。これにより、タスクに特化したレイヤーを追加して、特定のNLPタスクにファインチューニングできるようになります。

カスタムBERTモデルクラスは、PyTorchなどの深層学習フレームワークを使用して定義でき、プロセスには入力および出力の寸法、BERTモデルアーキテクチャ、およびタスクに特化したレイヤーの指定が含まれます。このクラスは、タスクに特化したデータセットで事前学習済みBERTモデルをファインチューニングするために使用できます。

カスタム BERT モデルの定義

以下は、PyTorchを使用してカスタムBERTモデルクラスを定義するためのステップバイステップのガイドとコード例です。

ステップ 1: 必要なライブラリをインポート

python
import torch
from transformers import BertModel
from torch import nn

カスタムBERTモデルを定義するには、PyTorchおよびTransformersライブラリをインポートする必要があります。

ステップ 2: カスタム BERT モデルアーキテクチャを定義

python
class CustomBERTModel(nn.Module):
    def __init__(self, num_classes):
        super(CustomBERTModel, self).__init__()
        self.bert = BertModel.from_pretrained('bert-base-uncased')
        self.dropout = nn.Dropout(0.3)
        self.linear = nn.Linear(768, num_classes)

カスタムBERTモデルのアーキテクチャを定義するには、nn.Moduleクラスをサブクラス化し、必要に応じてカスタマイズする必要があります。この例では、出力レイヤーの数を指定するnum_classes引数を受け取るCustomBERTModelクラスを定義します。

__init__メソッドでは、Transformersライブラリから事前学習済みBERTモデルを初期化し、ドロップアウト率0.3のドロップアウト層と出力用の線形層を追加します。

ステップ 3:モデルの順伝搬を定義

python
    def forward(self, input_ids, attention_mask):
        output = self.bert(input_ids=input_ids, attention_mask=attention_mask)
        output = output[1] # take the pooled output
        output = self.dropout(output)
        output = self.linear(output)
        return output

モデルの順伝搬では、入力テキストがどのように処理され、BERTモデルによって変換されるかを定義する必要があります。これにはTransformersライブラリからBertModelクラスを使用できます。

input_idsとattention_maskをBERTモデルに渡し、BERTモデルの最後のレイヤーのプール出力である2番目の出力を取得します。次に、出力にdropoutと線形レイヤーを適用して最終出力を得ます。

ステップ 4:カスタム BERT モデルを使用

python
model = CustomBERTModel(num_classes=2)
input_ids = torch.tensor([[1, 2, 3, 0, 0], [4, 5, 6, 7, 0]])
attention_mask = torch.tensor([[1, 1, 1, 0, 0], [1, 1, 1, 1, 0]])
output = model(input_ids, attention_mask)

CustomBERTModelクラスのインスタンスを作成し、linearレイヤーの出力クラス数を指定するためにnum_classes引数を渡すことができます。

次に、入力テキストをinput_idsとattention_maskテンソルとしてモデルに渡し、出力予測を取得することができます。

以下は、例の全体的なコードです。

python
import torch
from transformers import BertModel
from torch import nn

class CustomBERTModel(nn.Module):
    def __init__(self, num_classes):
        super(CustomBERTModel, self).__init__()
        self.bert = BertModel.from_pretrained('bert-base-uncased')
        self.dropout = nn.Dropout(0.3)
        self.linear = nn.Linear(768, num_classes)

    def forward(self, input_ids, attention_mask):
        output = self.bert(input_ids=input_ids, attention_mask=attention_mask)
        output = output[1] # take the pooled output
        output = self.dropout(output)
        output = self.linear(output)
        return output

model = CustomBERTModel(num_classes=2)
input_ids = torch.tensor([[1, 2, 3, 0, 0], [4, 5, 6, 7, 0]])
attention_mask = torch.tensor([[1, 1, 1, 0, 0], [1, 1, 1, 1, 0]])
output = model(input_ids, attention_mask)

カスタム BERT モデルの例

以下は、説明付きのカスタムBERTモデルクラスのいくつかの例です。

感情分析のための BERT のファインチューニング

python
class SentimentClassifier(nn.Module):
    def __init__(self, num_classes):
        super(SentimentClassifier, self).__init__()
        self.bert = BertModel.from_pretrained('bert-base-uncased')
        self.dropout = nn.Dropout(0.1)
        self.linear = nn.Linear(768, num_classes)

    def forward(self, input_ids, attention_mask):
        output = self.bert(input_ids=input_ids, attention_mask=attention_mask)
        output = output[1] # take the pooled output
        output = self.dropout(output)
        output = self.linear(output)
        return output

この例では、感情分析のためのカスタムBERTモデルクラスSentimentClassifierを定義します。

このモデルのアーキテクチャは、前の回答の例と似ています。私たちはTransformersライブラリの事前学習済みBERTモデルからBERTモデルを初期化し、ドロップアウト率0.1のドロップアウト層と出力用の線形層を追加します。

フォワードパスでは、input_idsとattention_maskをBERTモデルに渡し、BERTモデルの最後のレイヤーのpooled outputとなる2番目の出力を取得します。その後、ドロップアウトと線形層をpooled outputに適用して最終出力を得ます。

名前付きエンティティ認識のための BERT のファインチューニング

python
class NERClassifier(nn.Module):
    def __init__(self, num_classes):
        super(NERClassifier, self).__init__()
        self.bert = BertModel.from_pretrained('bert-base-uncased')
        self.dropout = nn.Dropout(0.1)
        self.classifier = nn.Linear(768, num_classes)

    def forward(self, input_ids, attention_mask):
        output = self.bert(input_ids=input_ids, attention_mask=attention_mask)
        output = output.last_hidden_state
        output = self.dropout(output)
        output = self.classifier(output)
        return output

この例では、名前付きエンティティ認識(NER)のためのカスタムBERTモデルクラスNERClassifierを定義しています。

このモデルのアーキテクチャは、前の例と同様であり、分類用の線形層が追加されています。

フォワードパスでは、入力テキストをinput_idsとattention_maskとしてBERTモデルに渡し、BERTモデルの最後のレイヤーの最後の隠れ層を取得します。次に、ドロップアウトと線形層を適用して最終出力を得ます。

質問応答のための BERT の微調整

python
class QAClassifier(nn.Module):
    def __init__(self, num_classes):
        super(QAClassifier, self).__init__()
        self.bert = BertModel.from_pretrained('bert-base-uncased')
        self.qa_outputs = nn.Linear(768, num_classes)

    def forward(self, input_ids, attention_mask):
        outputs = self.bert(input_ids, attention_mask=attention_mask)
        sequence_output = outputs.last_hidden_state
        logits = self.qa_outputs(sequence_output)
        start_logits, end_logits = logits.split(1, dim=-1)
        start_logits = start_logits.squeeze(-1)
        end_logits = end_logits.squeeze(-1)
        return start_logits, end_logits

この例では、質問応答用にカスタムBERTモデルクラスQAClassifierを定義しています。

このモデルのアーキテクチャは、前の例と同様であり、質問応答用の線形層が追加されています。

フォワードパスでは、入力テキストをinput_idsとattention_maskとしてBERTモデルに渡し、BERTモデルの最後のレイヤーの最後の隠れ層を取得します。次に、隠れ層に線形層を適用してロジットを得ます。ロジットを回答の開始位置と終了位置の2つに分割し、splitメソッドを使用します。最後に、ロジットの最後の次元をsqueezeして開始位置ロジットと終了位置ロジットを別々に返します。

カスタム BERT モデルの保存と共有

カスタムBERT PyTorchモデルの保存と共有には、いくつかの簡単なステップがあります。

モデルの保存

カスタムBERTモデルのトレーニング後、torch.save()メソッドを使用して、モデルの状態辞書(アーキテクチャと重みを含む)をファイルに保存できます。

python
torch.save(model.state_dict(), 'my_bert_model.pth')

これにより、モデルの状態辞書がmy_bert_model.pthという名前のファイルに保存されます。

保存したモデルファイルを圧縮

保存したモデルファイルを他の人と共有するには、保存したモデルファイルをZIPファイルに圧縮できます。

bash
$ zip my_bert_model.zip my_bert_model.pth

これにより、my_bert_model.zipという名前のZIPファイルが作成され、保存したモデルファイルが含まれます。

ZIP ファイルを共有

ZIPファイルは、メール、クラウドストレージサービス、その他の手段を通じて他の人と共有できます。

保存したモデルの読み込み

別のスクリプトやアプリケーションで保存したモデルを読み込むには、まずモデルのアーキテクチャを定義し、load_state_dict()メソッドを使用して保存された状態辞書をロードする必要があります。

python
from transformers import BertModel

model = BertModel.from_pretrained('bert-base-uncased')
model.load_state_dict(torch.load('my_bert_model.pth'))

これにより、保存された状態辞書が事前学習されたBERTモデルに読み込まれ、新しいPyTorchモデルオブジェクトが作成されます。これを使用して、新しいデータに対して予測を行うことができます。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!