你是否遇到过数据集中有多个文本个性的状况? 例如,依据音讯的上下文正确地对音讯进行分类,即了解后面的音讯。比如说咱们有上面的数据集,须要对其进行分类。
当只思考 message 时,你能够看到它的情绪是踊跃的,因为“incredible”这个词。然而当思考到背景时,咱们能够看到它时消极的
所以对于上下文来说, 咱们须要晓得更多的信息, 例如:
- 是否值得将上下文作为一个独自的特色来思考?
- 将两个文本特色集中在一起是否会进步模型的性能?
- 是否应该引入上下文和信息的衡量? 如果是,适合的权重比例是多少?
本文有一个简略的实现, 就是: 将两个文本字段连接起来。与仅应用最新消息相比,它能给模型带来改良——然而咱们应该深入研究两个文本的权重比例。所以能够创立一个神经网络,它有两种模式,每个模式上的密集层大小可调? 这样,咱们就能主动找到适合的权重!
这里咱们介绍的 TwoModalBERT 反对在 nn 中查找两个文本模式的适当权重比例! 让咱们看看外面的神经网络是如何构建的。
TwoModalBERT 体系结构
上面能够看到 TwoModalBERT 是如何结构的以及类参数
首先,在最初一个 BERT 层之上增加一个线性层。咱们还是沿用 BERT 的配置, 将其利用在 CLS 令牌之上。因为 CLS 令牌聚合了整个序列示意,它常常用于分类工作中。为了更好地了解,让咱们看看相干的三行代码。
outputs = self.model(input_ids=input_ids, attention_mask=attention_mask)
last_hidden_states = outputs['hidden_states'][-1]
# last layer size: (batch_size, seq_len, hs)
cls_hidden_states = last_hidden_states[:, 0, :]
last_hidden_states_reduced = linear_layer(cls_hidden_states)
线性层将暗藏大小与 BERT 模型相干的输出特色转换为暗藏大小等于预约义的 context_size 和 text_size 的特色,对于 transformer 包中可用的模型,暗藏层大小通常为 768。
而后增加一个 dropout 层使神经网络对神经元的具体权重不那么敏感,不容易过拟合。
最初,将两个相似创立的分支组合在一起,前面跟着另一个 dropout 层。
TwoModalBERT 包
TwoModalBERT 包容许咱们用下面形容的双模态神经网络体系结构疾速运行试验。它容许在 Pytorch 和 transformer 库之上疾速构建模型,并容许对两个输出文本的权重进行试验。
咱们应该应用下表中形容的参数创立 config.ini 文件。
在设置了初始参数之后,咱们能够查看这个示例。这里将应用蕴含该系列所有对话的“The Office”数据集 (https://www.kaggle.com/datase…)。咱们的指标是验证: 依据前一行和以后行比照仅以后行的文原本辨认谈话的角色是否具备更高的准确率。
咱们对数据集进行简略的预处理后,数据集如下所示:
这里的三个列是
- line 谈话人说的话
- context 前一位谈话人所说的内容
- label 与每个演讲者相干的数字
# intialize modules
DataPreparation = TwoModalDataPreparation(config=config)
Trainer = TwoModalBertTrainer(device=DEVICE, config=config)
# create data loaders
(
train_data_loader,
train,
val_data_loader,
val,
test_data_loader,
test,
) = DataPreparation.prepare_data(
df,
text_column="line",
context_column="context",
label_column="label",
train_size=0.8,
val_size=0.1,)
在创立数据加载器之后,就能够训练模型了。这里应用的所有神经网络参数都在后面的列表中给出了。咱们设置 text_size = 100 和 context_size = 1。
# train the model
model, history = Trainer.train_model(
train_data_loader,
train,
val_data_loader,
val,
text_size=100,
context_size=50,
binary=False,
text_p=0.3,
context_p=0.3,
output_p=0.3,
)
# evaluate the model on a test set
y_pred, y_test = test_model(model, test_data_loader)
y_pred, y_test = [e.cpu() for e in y_pred], [e.cpu() for e in y_test]
因为模型通过了训练,咱们能够在测试集上对其进行评估 (能够在 y_pred 和 y_test 上利用任何度量)。上面咱们查看混同矩阵。
除了 Michael,模特没有学会辨认任何角色。咱们把 context_size 减少到 50,看看混同矩阵如何变动?
能够察看到,模型学会了辨认 Dwight, Michael, Jim。对于一些其余角色来说,这种办法并不实用。然而与前一个选项相比,有很大的改良,并且通过配置 context_size 咱们还有更多的晋升空间
而后咱们看看模型如何做推理:
# run on new pair of text inputs
line = "Dwight is my best friend."
context = "What do you think about Dwight?"
predict_on_text(model, line, context)
模型能够返回正确的后果:Stanley
总结
本文介绍的 TwoModalBERT 包的能够说是一个非常简单的魔改模型,它不须要对模型外部进行批改,只须要批改内部的梳理过就就能够疾速进步两个输出文本字段的不同加权模式对分类神经网络性能的影响。本文的残缺代码请见:https://avoid.overfit.cn/post…
作者:Zuzanna Deutschman