RoBERTa:教師あり自然言語処理システムの事前学習のための最適化された手法

事前訓練された言語モデルは、自然言語処理(NLP)において目覚ましい成功を収め、教師あり学習から事前訓練に続く微調整へのパラダイムシフトをもたらした。言語モデリングの目標は、特定の情報でラベル付けされていない大量の生のテキストデータである、注釈のないテキストの履歴が与えられたときに、シーケンス内の次のトークンを予測することである。BERT (Bidirectional Encoder Representations from Transformers)は、一度に1つの単語だけでなく、文全体を見ることで、双方向の言語理解を可能にし、この概念に新しい基準を設定します。よりよく意味を理解するために、前後の単語も考慮する。
しかし、BERTで見つかった主な問題は、訓練不足であり、NLPタスクでの性能が制限されていた。この制限のため、研究者たちは、RoBERTaのような後続のモデルで改善された学習方法を模索することになった。
RoBERTa (A Robustly Optimized BERT Pretraining Approach)は、その限界に対処するために設計されたBERTの改良バージョンです。RoBERTaは、様々なNLP問題にわたってその性能を向上させるいくつかの重要な改良を導入した。
この記事では、RoBERTaのトレーニングアプローチを含む開発に使用された方法論と技術、RoBERTaが達成した結果、およびRoBERTaが切り開く潜在的な将来の研究機会について説明する。
BERT (トランスフォーマーからの双方向エンコーダ表現)の簡単な紹介
RoBERTaを理解するためには、その前身であるBERTと、BERTが直面した課題を理解することが不可欠である。**BERTは双方向トランスフォーマーの概念を導入し、ディープラーニングモデルが以前は実現できなかった方法でコンテキストを理解することを可能にした。
しかし、BERTがどのように機能するかを本当に理解するためには、それを分解する必要がある。そこで、そのアーキテクチャと学習方法を詳しく見てみよう。
BERTのアーキテクチャと事前訓練プロセス
BERTのアーキテクチャは、Devlin et al. in 2018によって紹介されたtransformersに基づいている。多層双方向(左から右、右から左)エンコーダを使用し、文中の異なる単語の重要度を計量する。
BERTアーキテクチャ](https://assets.zilliz.com/BERT_Architecture_9e1ea351ff.png)
図1:_ BERTアーキテクチャ
単語は、埋め込み層からの埋め込み表現から始まる。埋め込みは、高次元空間における単語またはトークンの密なベクトル(数値表現)である。エンベッディング層はニューラルネットワークの最初の層で、入力単語をこの密なベクトルに変換する。各層は前の層の単語表現に対して多頭注意計算を行い、新しい中間表現を生成する。これらの中間表現はすべて等しい大きさである。上図では、E1が埋め込み表現、T1が最終出力、Trmがトークンの中間表現である。
BERTの事前学習プロセスには、主に2つのタスクが含まれる:
マスク言語モデリング(MLM)。
次文予測 (NSP)
言語モデリングは、一連の単語が与えられたときに次の単語を予測する。しかしMLMタスクでは、すべての次のトークンを予測するのではなく、入力トークンの一定割合をランダムにマスクし、マスクされたトークンのみを予測する。一方、NSPタスクは二値分類タスクであり、与えられた2つの文が原文の中で互いに続いているかどうかを予測する。このアプローチは、モデルが文間の関係を理解するのに役立つ。
次の文予測](https://assets.zilliz.com/Next_Sentence_Prediction_bf69c2e908.png)
図2:_ 次の文予測
BERT の事前学習プロセスには、その潜在能力を十分に発揮できない限界があった。主な問題の 1 つは、MLM タスクで静的なマスキング・パターンを使用していたことである。BERT では、訓練中に単語がマスキングされると、すべての反復で同じ単語がマスキングされた。この静的なアプローチは、多様なマスキングシナリオへのモデルの適用を制限し、汎化能力を低下させた。さらに、訓練データのサイズと期間も限られていた。
これらの限界は、法律や医学のテキスト解析のようなドメイン固有のタスクや、感情分析や多段階推論のような複雑な言語理解シナリオにおける BERT の性能の一貫性の欠如につながった。これらの欠点に対処するには、さらなる研究開発が必要である。
RoBERTa の出現
RoBERTaの開発の主な動機は、BERTの事前学習プロセスで観察された課題に対処することであった。しかし、RoBERTaはBert Largeと同じコア・アーキテクチャを維持しており、24層、1024の隠れユニット、16の注意ヘッドで構成され、合計3億5500万のパラメータを持つ。
RoBERTa が解決しようとした課題は以下の通りである:
静的マスキング・パターン:** BERTの静的マスキングは、訓練シナリオを制限し、オーバーフィッティングを引き起こした。オーバーフィッティングは、モデルが訓練データに対しては非常に良好な性能を示すが、テストデータ(新しいデータ)に対しては低い性能を示す場合に発生する。RoBERTaは動的マスキングを導入し、エポックごとに新しいマスクを生成し、新しいデータへの対応能力を向上させた。
不十分な学習データ:** BERT の学習は約 16 GB のテキストデータセットに基づいており、言語の多様性を完全に把握するには不十分である。RoBERTa は、様々なソースから 160 GB を超えるテキストを使用して、学習データをスケールアップした。
短い訓練期間:*** 元の BERT モデルは比較的短い期間で訓練されたが、RoBERTa は訓練期間を大幅に延長し、より多くのエポックと反復を実行した。
BERT の事前訓練では、比較的小さなバッチサイズと保守的な学習率が使用されており、安全ではあ るが限界のあるアプローチであった。一方、RoBERTaは、より大きなバッチサイズとより積極的な学習率を実験的に使用し、より優れたモデル性能につながった。
RoBERTaとは何か、どのように機能するのか?
RoBERTa (A Robustly Optimized BERT Pretraining Approach)は、性能向上のためにその限界に対処するよう設計された BERT の改良版である。これは、自然言語処理 タスクでの性能を向上させる BERT の訓練プロセスの修正を導入した。
これらの修正には以下が含まれる:
動的マスキング
NSPの除去
より大きなトレーニングデータと継続時間の延長
バッチサイズの拡大
バイト・テキスト・エンコーディング
ダイナミック・マスキング
BERT のアーキテクチャから、事前学習中、BERT は、マスクされた[トークン](https://zilliz.com/learn/introduction-to-natural-language-processing-tokens-ngrams-bag-of-words-models)の一定パーセンテージを予測しようとすることで、マスクされた言語モデリング(MLM)を実行したことを覚えている。これらの選択されたマスクされたトークンは、各反復で同じ(静的)であった。
RoBERTa は、ダイナミック・マスキングと呼ばれる少し優れたアプローチを実装することで、この問題に対処した。このアプローチは、訓練中にシーケンスが BERT に渡されるたびにマスキングスキームを変更する。この変更により、訓練データがより多様になり、モデルがより幅広い言語パターンを学習できるようになった。その結果、RoBERTa は文脈をより深く理解するようになり、下流タスクのパフォーマンスが向上した。
静的マスキング vs. 動的マスキング](https://assets.zilliz.com/Static_masking_vs_dynamic_masking_3bea7302db.png)
RoBERTを開発した研究者たちは、訓練データを10回複製することによって、静的マスキングアプローチも再実装した。この複製により、各シーケンスは40回の訓練エポックにわたって10通りの方法でマスキングされた。したがって、各トレーニングシーケンスは、トレーニング中に4回同じマスクで見られることになる。静的マスキングの再実装と元の BERT モデルを比較すると、性能はほぼ同じであった。しかし、動的マスキングは静的マスキングよりもわずかに優れた性能を示した。
静的マスキングと動的マスキングの比較](https://assets.zilliz.com/Comparison_between_static_and_dynamic_masking_08a2c71f3a.png)
次文予測(NSP)の除去
RoBERTa におけるもう一つの重要な修正は、NSP タスクの削除である。NSP では、モデルには文のペアが与えられ、原文において第 2 文が第 1 文に続くかどうかを予測する必要があった。しかし、RoBERTa の開発では、NSP タスクが下流タスクにおけるモデルの性能にほとんど寄与しないことが判明した。
RoBERTa は、FULL-SENTENCES アプローチ(複数の文書からシーケンスをパックする)を採用している。 モデルへの各入力は、1 つまたは複数の文書から連続的にサンプリングされた全文でパックされ、最大シーケンス長 512 トークンまでである。これにより、モデルは長距離の依存関係をより効果的に学習することができる。
NSPを含むBERTと含まないBERT](https://assets.zilliz.com/BERT_with_and_without_NSP_b558c39a4a.png)
さらに、研究者たちは、言語モデルの入力データをフォーマットする4つの異なる方法を検討した。オリジナルのSEGMENT-PAIRとSENTENCE-PAIRである。どちらの形式もNSPを使用するが、SENTENCE-PAIR形式はペアではなく単一センテンスを使用する。研究者たちは、単一センテンスを使用すると、テキスト中の離れた単語間のつながりを理解するのに苦労するため、モデルのパフォーマンスが低下することを発見した。
次に、NSP方式を使わず、DOC-SENTENCESと呼ばれる文書のテキストブロックを使ってモデルをテストした。ほとんどの場合、オリジナルのBERTよりも良い結果が得られ、NSP損失を使用しなくてもモデルの性能は落ちなかった。
単一文書からのテキスト(DOC-SENTENCES)法は、複数文書からのテキスト(FULL-SENTENCES)よりもわずかに優れていた。しかし、DOC-SENTENCESでは訓練時のバッチサイズが異なるため、残りの実験ではFULL-SENTENCESを使用することにした。この選択により、他の関連研究の結果との比較が容易になった。
BOOK CORPUSとWIKIPEDIAで事前訓練したベースモデルの結果](https://assets.zilliz.com/Results_for_base_models_pre_trained_over_BOOK_CORPUS_and_WIKIPEDIA_c3510a6544.png)
図6:BOOK CORPUSとWIKIPEDIAで事前学習したベースモデルの結果
より大きな学習データと学習期間の延長
おそらく最も単純な最適化であるが、それに劣らず重要なのは、より多くのデータでより長い時間訓練すること である。BERT は、約 16 GB のテキストの データセット で訓練され、RoBERTa は 160 GB を超えるテキストを使用した。
RoBERTa データセット:
BOOK-CORPUS および WIKIPEDIA:** BERT と同じ。
CC-NEWS:**RoBERTaは、CC-NEWSと呼ばれる新しいデータセットを導入している。CC-NEWSは、 現代的な言語と幅広いトピック、スタイル、視点を特徴とする大規模なニュースデータセットである。
追加データセット:** RoBERTa は、上記のデータセットと論文で説明された他の 3 つのプライベート・データセットを組み合 わせて、下流のタスクのパフォーマンスを向上させる。
より大きな訓練データを使用し、訓練期間を延長し、より多くのエポックと反復を実行することで、RoBERTaは、当初報告されたBERTの結果(Devlin et al. in 2018)と比較して、ダウンストリームタスクで4~6%の大きな改善を示している。
BERTに対するRoBERTaの結果](https://assets.zilliz.com/Results_for_Ro_BER_Ta_over_the_BERT_cf6c2edbb5.png)
バッチ・サイズの増加
ニューラル機械翻訳における過去の研究は、非常に大きなミニバッチで学習することで、マスクされた言語モデリングのプレプレキシティを改善できることを示している。このアプローチでは、学習率を適切に増加させるとエンドタスク性能が向上する(Ott et al., 2018)。当惑度は、言語モデルの性能を測定するために使用される指標である。これは、シーケンスの次の単語を予測する際にモデルが持つ不確実性(確率分布)を定量化するものである。例えば、パープレキシティが低いほど予測は正確である。
この概念に基づき、RoBERTa は学習時に非常に大きなミニバッチを使用する。BERTが100万ステップに対して256シーケンスのバッチサイズを使用したのに対し、RoBERTaは学習率値を1e-3として、31kステップに対して8kシーケンスに増やした。しかし、最適な性能は125kステップに対して2kシーケンスで見られた。
BERTとRoBERTaの単純性とエンドタスク性能の比較](https://assets.zilliz.com/Comparison_of_Perplexity_and_End_Task_Performance_of_BERT_vs_Ro_BER_Ta_ae817fed91.png)
図 8:BERTとRoBERTaのプレプレキシティとエンドタスク性能の比較
バイトテキスト符号化
RoBERTa は、バイトレベルのバイトペアエンコーディング(BPE)を採用することによって、語彙外(OOV)語 を処理するための代替方法も導入した。BERT は、30K 単位の文字レベルのバイトペアエンコーディング(BPE)語彙を使用した。RoBERTa は、追加の入力前処理やトークン化なしで、これを 50K サブワード単位のバイトレベル BPE 語彙に拡張している。BERT と比較して、この方法によって RoBERTa は、未知のトークンを使用せずに、ほとんどすべての単語またはサブ ワードをエンコードすることができた。
バイト・テキスト符号化](https://assets.zilliz.com/Byte_text_encoding_7bf84b698e.png)
実験結果
BERT(Devlin et al. 2019) を修正した後、RoBERTa を NLP ベンチマークでテストした。GLUE](https://gluebenchmark.com/tasks)、SQuAD、RACEの3つのベンチマークでの性能について説明する。
GLUE(General Language Understanding Evaluation):**NLU(自然言語理解)タスクのための9つのデータセット集。
SQuAD (Stanford Question Answering Dataset): 質問応答システムの訓練と評価のために設計されたデータセット。ウィキペディアの記事に対して人間が投げかけた実際の質問から構成されており、各質問に対する答えは、対応する記事内の特定のテキストの範囲である。
RACE (Reading Comprehension from Examinations): 英語の試験から収集された大規模な読解力データセット。
GLUEデータセットでのテスト結果
RoBERTa は、2 つの微調整設定を用いてテストされた。最初の設定(シングルタスク)では、RoBERTa は各 GLUE タスクごとに、対応するタスクの学習データのみを使用して、10 エポックずつ個別に微調整された。RoBERTaは、9つのGLUEタスクすべてにおいて、BERTとXLNetの両方を凌駕する最先端の結果を達成した。2つ目の設定(アンサンブル)では、RoBERTaはGLUE leaderboardで88.5を記録し、XLNetが設定した前回の最先端と肩を並べた。RoBERTaは、9つのGLUEタスクのうち、4つのタスクで新たな最先端結果を達成した:MNLI、QNLI、RTE、STS-B。
GLUEの結果](https://assets.zilliz.com/Results_on_GLUE_8ebb390177.png)
図10: GLUEでの結果
SQuAD
RoBERTaは、SQuADの学習データを用いて微調整を行った。SQuAD v1.1](https://datarepository.wolframcloud.com/resources/SQuAD-v1.1)では、RoBERTaはXLNetが設定した最先端技術と一致した。SQuAD v2.0](https://rajpurkar.github.io/SQuAD-explorer/)上で、RoBERTaは89.4のF1スコアを達成し、データ補強を行わない単一モデルの新たな最先端を打ち立てた。これは、RoBERTaがSQuADに特化したテクニックを使用しておらず、SQuADデータでのみ微調整されていることを考えると、特に印象的である。
SQuADでの結果](https://assets.zilliz.com/Results_on_S_Qu_AD_f8b1eed124.png)
図11: SQuADでの結果
RACE データセットでのテスト結果
RACE は難易度の高い読解ベンチマークであり、英語試験のパッセージに基づく多肢選択問題に答えることをモデルに要求する。このベンチマークは、複雑な文章を理解し、文脈に基づいて正解を推測することをモデルに要求するため、特に困難です。RoBERTaは、RACEベンチマークで83.2%の精度を達成し、最先端の基準を打ち立てました。
RACEテストセットでの結果](https://assets.zilliz.com/Results_on_the_RACE_test_set_00eff370bd.png)
図12:_ RACEテストセットでの結果
感傷分析のための RoBERTa の微調整
RoBERTaは標準的なベンチマークでの性能だけでなく、センチメント分析のような特定のタスクのファインチューニングにも非常に有効であることが証明されている。ファインチューニングとは、事前に訓練されたモデルを、より小さなタスク固有のデータセットで訓練することにより、特定のタスクに適応させることである。この記事で使用しているソースコードは、Hugging Faceのものです。
データセットのインポートと準備
ここでは、Kaggle Competitionで公開されているデータセットを使用し、データダンプから最初のcsvファイル: train.tsvのみを参照する。
Python ライブラリのインポート:
pip install transformers==3.0.2
このステップで、スクリプトの実行に必要なライブラリとモジュールをインポートする。
# 必要なライブラリのインポート
import pandas as pd
import numpy as np
インポートトーチ
import transformers
インポート json
from tqdm import tqdm
from torch.utils.data import Dataset, DataLoader
from transformers import RobertaModel, RobertaTokenizer
import logging
logging.basicConfig(level=logging.ERROR)
# GPU 使用のためのデバイスのセットアップ
from torch import cuda
デバイス = 'cuda' if cuda.is_available() else 'cpu'
データセットの準備
まず、データセットをロードし、Pandasパッケージを使って読み込む。
train = pd.read_csv('train.tsv', delimiter='\t')
new_df = train[['Phrase', 'Sentiment']] ````.
変数を定義しよう:
MAX_LEN:**入力テキストの最大長(256)。
TRAIN_BATCH_SIZEとVALID_BATCH_SIZE:** 訓練と検証のバッチサイズ(それぞれ8と4)。
LEARNING_RATE:**モデルの学習率(1e-05)。
Tokenizer:**テキストデータの前処理にRobertaTokenizerインスタンスが使用されます。
SentimentData クラスはカスタム・データセット・クラスを実装しており、データ・フレーム、トー クナイザ、最大長を入力として受け取ります。テキストデータの前処理を行い、入力 ID、アテンションマスク、トークンタイプ ID、およびターゲットのセンチメントラベルを含む辞書を返します。
DataLoaderクラスは、トレーニングセットとテストセットのデータローダーを作成し、トレーニング中と検証中にバッチでデータを反復処理します。
# 後のトレーニングで使用されるキーとなる変数を定義します。
MAX_LEN = 256
train_batch_size = 8
有効バッチサイズ = 4
LEARNING_RATE = 1e-05
tokenizer = RobertaTokenizer.from_pretrained('roberta-base', truncation=True, do_lower_case=True)
class SentimentData(Dataset):
def __init__(self, dataframe, tokenizer, max_len):
self.tokenizer = tokenizer
self.data = dataframe
self.text = dataframe.Phrase
self.targets = self.data.Sentiment
self.max_len = max_len
def __len__(self):
return len(self.text)
def __getitem__(self, index):
text = str(self.text[index])
text = ".join(text.split())
inputs = self.tokenizer.encode_plus(
text、
なし、
add_special_tokens=True、
max_length=self.max_len、
pad_to_max_length=True、
return_token_type_ids=True
)
ids = inputs['input_ids'].
mask = inputs['attention_mask'] (マスク = inputs['attention_mask'])
token_type_ids = inputs["token_type_ids"]。
return {
'ids': torch.tensor(ids, dtype=torch.long)、
'mask': torch.tensor(mask, dtype=torch.long)、
'token_type_ids': torch.tensor(token_type_ids, dtype=torch.long)、
'targets': torch.tensor(self.targets[index], dtype=torch.float)
}
train_size = 0.8
train_data=new_df.sample(frac=train_size,random_state=200)
test_data=new_df.drop(train_data.index).reset_index(drop=True)
train_data = train_data.reset_index(drop=True)
print("FULL Dataset:print("FULL Dataset: {}".format(new_df.shape))
print("TRAIN Dataset:print("TESTデータセット: {}".format(train_data.shape))
print("TEST データセット:print("TESTデータセット: {}".format(test_data.shape))
training_set = SentimentData(train_data, tokenizer, MAX_LEN)
testing_set = SentimentData(test_data, tokenizer, MAX_LEN)
train_params = {'batch_size':train_batch_size、
'shuffle':true、
num_workers': 0
}
test_params = {'batch_size':valid_batch_size、
'shuffle':True、
num_workers': 0
}
training_loader = DataLoader(training_set, **train_params)
testing_loader = DataLoader(testing_set, **test_params)
微調整のためのニューラルネットワークの作成
RobertaClassでニューラルネットワークを作成します。
このネットワークにはRoberta言語モデル、ドロップアウト、そして最後に最終出力を得るための線形層があります。
データはデータセットで定義されたRoberta言語モデルに供給されます。
最終層の出力は、モデルの予測精度を判断するために、感情カテゴリと比較される。
Model というネットワークのインスタンスを開始します。このインスタンスはトレーニングに使用されます。
class RobertaClass(torch.nn.Module):
def __init__(self):
super(RobertaClass, self).__init__()
self.l1 = RobertaModel.from_pretrained("roberta-base")
self.pre_classifier = torch.nn.Linear(768, 768)
self.dropout = torch.nn.Dropout(0.3)
self.classifier = torch.nn.Linear(768, 5)
def forward(self, input_ids, attention_mask, token_type_ids):
output_1 = self.l1(input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)
hidden_state = output_1[0].
pooler = hidden_state[:, 0].
pooler = self.pre_classifier(pooler)
pooler = torch.nn.ReLU()(pooler)
pooler = self.dropout(プールアウト)
output = self.classifier(プーラー)
出力を返す
model = RobertaClass()
model.to(device)
モデルの微調整
データセットの読み込みと準備、そしてモデルの作成。これはおそらく、プロセスの中で最も簡単なステップであろう。
ここでは、上記のトレーニングデータセットに対して、指定されたエポック数でモデルをトレーニングするトレーニング関数を定義します。エポックとは、完全なデータがネットワークを通過する頻度を定義します。
# 損失関数とオプティマイザの作成
loss_function = torch.nn.CrossEntropyLoss()
オプティマイザ = torch.optim.Adam(params = model.parameters(), lr=LEARNING_RATE)
def calcuate_accuracy(preds, targets):
n_correct = (preds==targets).sum().item()
return n_correct
# distilbert モデルのチューニングのために、データセットの 80% に対して学習関数を定義する。
def train(epoch):
tr_loss = 0
n_correct = 0
nb_tr_steps = 0
nb_tr_examples = 0
model.train()
for _,data in tqdm(enumerate(training_loader, 0)):
ids = data['ids'].to(device, dtype = torch.long)
mask = data['mask'].to(device, dtype = torch.long)
token_type_ids = data['token_type_ids'].to(device, dtype = torch.long)
targets = data['targets'].to(device, dtype = torch.long)
outputs = model(ids, mask, token_type_ids)
loss = loss_function(outputs, targets)
tr_loss += loss.item()
big_val, big_idx = torch.max(outputs.data, dim=1)
n_correct += calcuate_accuracy(big_idx, targets)
nb_tr_steps += 1
nb_tr_examples+=targets.size(0)
if _%5000==0:
loss_step = tr_loss/nb_tr_steps
accu_step = (n_correct*100)/nb_tr_examples
print(f "5000ステップあたりのトレーニング損失: {loss_step}")
print(f "5000ステップあたりのトレーニング精度:{accu_step}")
optimizer.zero_grad()
loss.backward()
# GPUを使う場合
オプティマイザ.ステップ()
print(f'The Total Accuracy for Epoch {epoch}:(n_correct*100)/nb_tr_examples}')
epoch_loss = tr_loss/nb_tr_steps
epoch_accu = (n_correct*100)/nb_tr_examples
print(f "Training Loss Epoch: {epoch_loss}")
print(f "Training Accuracy Epoch: {epoch_accu}")
リターン
EPOCHS = 1
for epoch in range(EPOCHS):
train(epoch)
出力:
図13- モデルトレーニングの詳細](https://assets.zilliz.com/Figure_12_Details_of_the_model_training_9066a9191c.png)
モデル性能の検証
検証段階では、未見のデータ(テストデータセット)をモデルに渡す。この段階は、データセット作成段階で分離されたtrain.tsvの20%である未経験データに対して、モデルがどの程度の性能を発揮するかを決定する。
検証段階は、新しい未見のデータに対するモデルの汎化能力をチェックする。モデルの重みは更新されない。最終出力のみが実際の値と比較され、それがモデルの精度を計算するために使用されます。
valid関数は、モデルとテストローダーを入力として、検証ステージを実装します。モデルを評価モードに設定し、予測値の正誤を追跡する変数を初期化し、テストローダーを繰り返し実行します。各バッチについて、損失と精度を計算し、5000ステップごととエポック終了時に検証損失と精度を表示します。最後に、エポック精度を返します。
def valid(model, testing_loader):
model.eval()
n_correct = 0; n_wrong = 0; total = 0; tr_loss=0; nb_tr_steps=0; nb_tr_examples=0
torch.no_grad():
for _, data in tqdm(enumerate(testing_loader, 0)):
ids = data['ids'].to(device, dtype = torch.long)
mask = data['mask'].to(device, dtype = torch.long)
token_type_ids = data['token_type_ids'].to(device, dtype=torch.long)
targets = data['targets'].to(device, dtype = torch.long)
outputs = model(ids, mask, token_type_ids).squeeze()
loss = loss_function(outputs, targets)
tr_loss += loss.item()
big_val, big_idx = torch.max(outputs.data, dim=1)
n_correct += calcuate_accuracy(big_idx, targets)
nb_tr_steps += 1
nb_tr_examples+=targets.size(0)
if _%5000==0:
loss_step = tr_loss/nb_tr_steps
accu_step = (n_correct*100)/nb_tr_examples
print(f "100ステップあたりの検証損失: {loss_step}")
print(f "100ステップあたりの検証精度:{accu_step}")
epoch_loss = tr_loss/nb_tr_steps
epoch_accu = (n_correct*100)/nb_tr_examples
print(f "Validation Loss Epoch: {epoch_loss}")
print(f "Validation Accuracy Epoch: {epoch_accu}")
return epoch_accu
acc = valid(model, testing_loader)
print("Accuracy on test data = %0.2f%%" % acc)
出力:
図14-モデル検証の詳細](https://assets.zilliz.com/Figure_14_Details_of_the_model_validation_f9aa6e5607.png)
ご覧のように、このモデルは与えられたサンプルの正しいカテゴリーを69.47%の精度で予測します。
今後の研究の可能性
RoBERTaの成功は、NLPとモデル最適化の研究に新たな扉を開いた。 以下は潜在的な研究機会である:
データセットの拡張
より大きなデータセットとより長い学習時間により、RoBERTa は改善された。将来の研究では、動的なデータセットのスケーリングを調査することができる。このアプローチは、モデルが新しいデータからどのように学習するのか、また、データが拡大してもモデルが改善し続けることができるのかを理解するのに役立つだろう。
マルチタスク微調整
RoBERTaの性能は、高度なマルチタスク微調整手順を探求することで、さらに向上する可能性がある。現在、RoBERTa は、複数のタスクを同時に訓練することなく、多くのことを得意としている。しかし研究者は、微調整の段階で複数のタスクを統合することで、さまざまなベンチマークでどのように性能を向上させることができるかを調査する可能性がある。
事前トレーニング目標の探索
RoBERTa において、NSP 目標を削除し、静的マスキングではなく動的マスキングアプローチを使用す ることで、言語モデルを学習するためのより良い方法があるかどうかについての懸念が生じる。今後の研究では、RoBERTa がどの程度タスクを理解し完了するかに影響する、さまざまな事前学習方法を 探究することができる。
結論
RoBERTaの論文は、NLPの分野にいくつかの重要な貢献をしている。著者らは、訓練データのマスキングパターンを動的に変更すること、より長いシーケンスで訓練すること、NSPタスクを削除することで、下流のタスクのパフォーマンスが向上することを発見した。
さらに、より大きなバッチサイズと訓練データセットを使用することも、この改善に寄与している。RoBERTaはGLUE、RACE、SQuADにおいて、GLUEではマルチタスクの微調整、SQuADでは追加データなしで、最先端の結果を達成している。
さらに、RoBERTa と BERT の論争は、どちらのモデルが優れているかということだけではありません。それは、計算リソース、モデル性能、およびこれらのモデルを展開することの倫理的意味合いの間のトレードオフを理解することです。RoBERTaのBERTに対する進歩は、NLPの分野が静的なものから遠く離れており、より高度で複雑な言語処理能力への道を開いていることを示している。
その他のリソース
RoBERTa GitHubリポジトリ](https://github.com/facebookresearch/fairseq)
あなたのGenAIアプリのためのトップパフォーマンスAIモデル ](https://zilliz.com/ai-models)
ジェネレーティブAIリソースハブ|Zilliz](https://zilliz.com/learn/generative-ai)
NLPとMilvusによるインテリジェントQA](https://milvus.io/blog/building-intelligent-chatbot-with-nlp-and-milvus.md)
言語モデルのためのニューラルネットワークと埋め込み](https://zilliz.com/learn/Neural-Networks-and-Embeddings-for-Language-Models)
ベクトルデータベースとは何か?
RAG (Retrieval Augmented Generation)とは](https://zilliz.com/learn/Retrieval-Augmented-Generation)
読み続けて

Vector Databases vs. NewSQL Databases
Use a vector database for AI-powered similarity search; use a NewSQL database for scalable transactional workloads requiring strong consistency and relational capabilities.

GLiNER: Generalist Model for Named Entity Recognition Using Bidirectional Transformer
GLiNER is an open-source NER model using a bidirectional transformer encoder.

Advanced RAG Techniques: Bridging Text and Visuals for More Accurate Responses
This blog explores how RAG works, RAG challenges, and advanced RAG techniques like Small to Slide RAG and ColPali.