为不同的任务、情绪分析微调预训练的西班牙语 RoBERTa 模型

Posted

技术标签:

【中文标题】为不同的任务、情绪分析微调预训练的西班牙语 RoBERTa 模型【英文标题】:Fine-tuning a pretrained Spanish RoBERTa model for a different task, sentiment analysis 【发布时间】:2021-11-19 23:59:25 【问题描述】:

我正在对西班牙推文进行情绪分析。

在查看了一些最近的文献后,我发现最近有人专门针对西班牙语文本训练 RoBERTa 模型 (roberta-base-bne)。它似乎比目前最先进的西班牙语建模模型BETO表现更好。

RoBERTa 模型已针对各种任务进行了训练,其中不包括文本分类。 我想使用这个RoBERTa model 并对其进行微调以进行文本分类,更具体地说,是情感分析。

我已经完成了所有的预处理并创建了数据集对象,并且想要在本地训练模型。

代码

# Training with native TensorFlow 

from transformers import TFRobertaForSequenceClassification

model = TFRobertaForSequenceClassification.from_pretrained("BSC-TeMU/roberta-base-bne")

optimizer = tf.keras.optimizers.Adam(learning_rate=5e-5)
model.compile(optimizer=optimizer, loss=model.compute_loss) # can also use any keras loss fn
model.fit(train_dataset.shuffle(1000).batch(16), epochs=3, batch_size=16)

问题 我的问题是关于TFRobertaForSequenceClassification: 使用它是否正确,因为它没有在model card 中指定?而不是模型卡中指定的AutoModelForMaskedLM

我们是否通过简单地应用TFRobertaForSequenceClassification 来暗示它将自动将经过训练(和预训练)的知识应用于新任务,即文本分类?

【问题讨论】:

【参考方案1】:

模型卡中的模型实际上引用了模型已在其上训练过的内容。如果您熟悉不同建模任务的架构选择(例如,令牌分类与序列分类),那么应该清楚这些模型将具有略微不同的布局,特别是在 Transformer 输出层之后的层中.对于token分类,这是(一般来说)Dropout和一个额外的线性层,从模型的hidden_size映射到输出类的数量。有关 BERT 的示例,请参阅 here。

这意味着使用不同学习目标预训练的模型检查点将没有在最后一层具有权重,而是在微调期间训练这些(相对较少的)参数.事实上,对于 PyTorch 模型,您通常会在加载可用权重略有不同的模型检查点时收到警告:

在初始化BertForSequenceClassification 时未使用bert-base-uncased 处模型检查点的某些权重:[...]

如果您从在另一个任务上训练的模型的检查点或使用另一个架构(例如,从 BertForPreTraining 模型初始化 BertForSequenceClassification 模型)的检查点初始化 BertForSequenceClassification,则这是预期的。 [...]

这正是你正在做的,所以只要你有相当数量的微调示例(取决于类的数量,我建议 10e3-10e4 作为经验法则),这不会影响大大提高了你的训练量。

不过,我想指出,您可能需要指定 TokenClassification 层具有的标签数量。您可以通过在加载模型时指定它来做到这一点:

from transformers import TFRobertaForSequenceClassification
roberta = TFRobertaForSequenceClassification.from_pretrained("BSC-TeMU/roberta-base-bne", 
                                                             num_labels=<your_value>)

【讨论】:

非常感谢您的详细解释。我不得不对代码进行一些更改(见上文)。我将num_labelsfrom_pt 参数添加到模型变量中。但是,现在,当我尝试训练模型时,出现以下错误:UnimplementedError: Cast string to float is not supported [[node Cast (defined at &lt;ipython-input-25-53a6872f2c55&gt;:9) ]] [Op:__inference_train_function_45018] Function call stack: train_function 对不起,我想我应该澄清一下,这个“食谱”只与加载 TF 模型有关。我认为事后更改问题也不是一个好主意,因为它并不能反映在我写答案时的实际问题状态。相反,我建议您使用更新后的代码打开一个新问题,如果可能的话,将您的问题恢复到之前的状态。 好的,明白了。我就是这么做的。我还设法通过将标签转换为整数来解决上述错误。该模型目前正在训练中。 另外,澄清一下,上面的问题根本与加载 TF 模型无关。相反,这是我后来意识到并添加到代码中的,以便更正确地理解这个问题,而不是与 TF 问题混淆。非常感谢您的提示。

以上是关于为不同的任务、情绪分析微调预训练的西班牙语 RoBERTa 模型的主要内容,如果未能解决你的问题,请参考以下文章

微调后如何使用语言模型进行预测?

微调后如何使用语言模型进行预测?

预训练语言模型整理(ELMo/GPT/BERT...)

《自然语言处理实战入门》深度学习 ---- 预训练模型的使用(ALBERT)

使用预训练语言模型进行文本生成的常用微调策略

使用预训练语言模型进行文本生成的常用微调策略