0

基本的な概要

カスタム データセットで事前トレーニングされたマスク言語モデル (Longformer正確にはバニラ) の事前トレーニングに取り組んでいます。Huggingface のtransformerslib を使用していますが、監視されたタスクで 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 クラスは廃止されました。

私のデータについては、両方の配列trainvalidationNumPy 配列を 2 つの別々のファイルにダンプしました。

src{tgt
....{17

{---> delimiter およびsrcandは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)

これは予想外です。これについてさらに掘り下げます。

4

0 に答える 0