基本的な概要
カスタム データセットで事前トレーニングされたマスク言語モデル (Longformer
正確にはバニラ) の事前トレーニングに取り組んでいます。Huggingface のtransformers
lib を使用していますが、監視されたタスクで MLM を微調整すると、次のエラーが表示されます:-
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-175-83ded7c85bb3> in <module>()
45 )
46
---> 47 train_results = trainer.train()
4 frames
/usr/local/lib/python3.7/dist-packages/transformers/trainer.py in train(self, resume_from_checkpoint, trial, **kwargs)
1118 tr_loss += self.training_step(model, inputs)
1119 else:
-> 1120 tr_loss += self.training_step(model, inputs)
1121 self._total_flos += float(self.floating_point_ops(inputs))
1122
/usr/local/lib/python3.7/dist-packages/transformers/trainer.py in training_step(self, model, inputs)
1522 loss = self.compute_loss(model, inputs)
1523 else:
-> 1524 loss = self.compute_loss(model, inputs)
1525
1526 if self.args.n_gpu > 1:
/usr/local/lib/python3.7/dist-packages/transformers/trainer.py in compute_loss(self, model, inputs, return_outputs)
1554 else:
1555 labels = None
-> 1556 outputs = model(**inputs)
1557 # Save past state if it exists
1558 # TODO: this needs to be fixed and made cleaner later.
/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
887 result = self._slow_forward(*input, **kwargs)
888 else:
--> 889 result = self.forward(*input, **kwargs)
890 for hook in itertools.chain(
891 _global_forward_hooks.values(),
/usr/local/lib/python3.7/dist-packages/transformers/models/longformer/modeling_longformer.py in forward(self, input_ids, attention_mask, global_attention_mask, head_mask, token_type_ids, position_ids, inputs_embeds, labels, output_attentions, output_hidden_states, return_dict)
1841 if global_attention_mask is None:
1842 logger.info("Initializing global attention on CLS token...")
-> 1843 global_attention_mask = torch.zeros_like(input_ids)
1844 # global attention on cls token
1845 global_attention_mask[:, 0] = 1
TypeError: zeros_like(): argument 'input' (position 1) must be Tensor, not NoneType
現在、これはおそらくモデルに与えられた入力に起因しているようです。Huggingface は直接datasets
オブジェクトを処理するようにアップグレードされ、以前の BPE クラスは廃止されました。
私のデータについては、両方の配列train
とvalidation
NumPy 配列を 2 つの別々のファイルにダンプしました。
src{tgt
....{17
{
---> delimiter およびsrc
andはtgt
列です。この構造は、train ファイルと val ファイルの両方を対象としています。重要なのは、 my src
= string; tgt
= 番号 (数値ラベル)。これはシーケンス分類タスクです。
次にdatasets
、CSV スクリプトを使用してファイルからオブジェクトを作成します。
from datasets import load_dataset
train_dataset = load_dataset('csv', data_files="HF_train.txt", delimiter='{')
val_dataset = load_dataset('csv', data_files="HF_val.txt", delimiter='{')
このステップが完了しtokenizer = AutoTokenizer.from_pretrained('......')
たら、トークナイザーをインポートします --> 事前トレーニング済みの言語モデルからtruncation & padding = True
コードの疑わしい部分
さて、トークン化の時間です。この方法を使用し.map()
て、データセット全体にトークン化関数を適用しました。これは私のトークン化関数がどのように見えるかです:-
def tok(example):
encodings = tokenizer(example['src'], truncation=True)
return encodings
私がそれを適用する理由src
は、ラベルが数値であるためです。トークン化はなく、長い文字列である「X」値のみです。
これは、その関数を使用してデータセットに適用する方法です (を使用.map()
):-
train_encoded_dataset = train_dataset.map(tok, batched=True)
val_encoded_dataset = val_dataset.map(tok, batched=True)
datasets
ほとんどの場合、オブジェクトの使用方法がわからないため、これは私が台無しにした部分です。
これは私のデータセット オブジェクトがどのように見えるかです。うまくいけば、私よりもその構造を理解できるかもしれません:-
>>> train_dataset
>>> DatasetDict({
train: Dataset({
features: ['src', 'tgt'],
num_rows: 4572
})
})
>>> train_dataset['train']
>>> Dataset({
features: ['src', 'tgt'],
num_rows: 4572
})
>>> train_dataset['train']['src']
>>> [..Giant list of all sequences.present..in.dataset --> **(untokenized)**]
>>>train_dataset['train'][0]
>>>{'src': 'Kasam.....',
'tgt': 13}
ここで、いわゆるトークン化されたデータセット ( train_encoded_dataset
) を調べます:-
>>> train_encoded_dataset
>>> DatasetDict({
train: Dataset({
features: ['attention_mask', 'input_ids', 'src', 'tgt'],
num_rows: 4572
})
})
>>> train_encoded_dataset['train']
>>> Dataset({
features: ['attention_mask', 'input_ids', 'src', 'tgt'],
num_rows: 4572
})
>>> print(train_encoded_dataset['train'][0])
>>> {'attention_mask': [1, 1, 1, 1, 1, 1, 1,...Long list of several numbers than increase..], 'src': 'Kasa....Long string which is a focument', 'tgt': 13} #tgt being label
この後、このデータセットを次の場所に渡しますTrainer
:-
from transformers import Trainer, TrainingArguments, AutoModelForSequenceClassification
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
def compute_metrics(pred):
labels = pred.label_ids
preds = pred.predictions.argmax(-1)
precision, recall, f1, _ = precision_recall_fscore_support(labels, preds, average='weighted',zero_division=1) #none gives score for each class
acc = accuracy_score(labels, preds)
return {
'accuracy': acc,
'f1': f1,
'precision': precision,
'recall': recall
}
training_args = TrainingArguments(
output_dir='/content/results/', # output directory
overwrite_output_dir = True,
num_train_epochs=16, # total number of training epochs
per_device_train_batch_size=32, # batch size per device during training
per_device_eval_batch_size=32, # batch size for evaluation
warmup_steps=600, # number of warmup steps for learning rate scheduler
weight_decay=0.01, # strength of weight decay
logging_dir='/content/logs', # directory for storing logs
logging_steps=10,
evaluation_strategy='epoch',
learning_rate=1e-6,
#fp16 = True,
load_best_model_at_end = True,
metric_for_best_model = 'eval_loss',
greater_is_better = False,
seed = 101,
save_total_limit=5,
)
model = AutoModelForSequenceClassification.from_pretrained(".....", num_labels=20)
trainer = Trainer(
model=model, # the instantiated Transformers model to be trained
args=training_args, # training arguments, defined above
train_dataset=train_dataset['train'], # training dataset
eval_dataset=val_dataset['train'], # evaluation dataset
compute_metrics=compute_metrics
)
train_results = trainer.train()
上記のエラーにつながります。
どこで問題が発生したのかわかりません (トークン化は別として)。誰かがそれを指摘できますか?
Update1:メソッドを使用してデータセットを構築するfrom_dict
と (numpy 配列をdatasets
オブジェクトにネイティブ変換するため)、同じエラーが発生します。
Update2:どうやら、いくつかの変更により、新しいエラーが発生しています:-これは新しいtok
関数です:
def tok(example):
encodings = tokenizer(example['src'], truncation=True, padding=True)
return encodings
パディングと切り捨てが再び追加されます。適切なトレーニング引数の後 (トークン化されていないものではなくトークン化されたものを渡す)
trainer = Trainer(
model=model, # the instantiated Transformers model to be trained
args=training_args, # training arguments, defined above
train_dataset=train_encoded_dataset, # training dataset
eval_dataset=val_encoded_dataset, # evaluation dataset
compute_metrics=compute_metrics
)
これが得られます:-
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-78-6068ea33d5d4> in <module>()
45 )
46
---> 47 train_results = trainer.train()
4 frames
/usr/local/lib/python3.7/dist-packages/transformers/trainer.py in train(self, resume_from_checkpoint, trial, **kwargs)
1099 self.control = self.callback_handler.on_epoch_begin(self.args, self.state, self.control)
1100
-> 1101 for step, inputs in enumerate(epoch_iterator):
1102
1103 # Skip past any already trained steps if resuming training
/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py in __next__(self)
515 if self._sampler_iter is None:
516 self._reset()
--> 517 data = self._next_data()
518 self._num_yielded += 1
519 if self._dataset_kind == _DatasetKind.Iterable and \
/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py in _next_data(self)
555 def _next_data(self):
556 index = self._next_index() # may raise StopIteration
--> 557 data = self._dataset_fetcher.fetch(index) # may raise StopIteration
558 if self._pin_memory:
559 data = _utils.pin_memory.pin_memory(data)
/usr/local/lib/python3.7/dist-packages/torch/utils/data/_utils/fetch.py in fetch(self, possibly_batched_index)
45 else:
46 data = self.dataset[possibly_batched_index]
---> 47 return self.collate_fn(data)
/usr/local/lib/python3.7/dist-packages/transformers/data/data_collator.py in default_data_collator(features)
78 batch[k] = torch.stack([f[k] for f in features])
79 else:
---> 80 batch[k] = torch.tensor([f[k] for f in features])
81
82 return batch
ValueError: expected sequence of length 2033 at dim 1 (got 2036)
これは予想外です。これについてさらに掘り下げます。