gpt4 book ai didi

python - 具有多个 bert 输入的 SMOTE

转载 作者:行者123 更新时间:2023-12-03 23:47:29 25 4
gpt4 key购买 nike

我正在使用 Keras 和 Bert (HuggingFace) 构建多类文本分类模型,但我的数据集非常不平衡。我使用了 Sklearn 的 SMOTE 来为欠平衡类生成额外的样本(我总共有 45 个),当我使用来自 Bert Tokenizer 的输入 id 时,它工作正常。

但是,我还希望能够将 smote 用于输入掩码 ID,以便让模型确定填充值的位置。

我的问题是如何将 smote 用于输入 ID 和掩码 ID?到目前为止,我已经完成了以下操作,并且模型没有提示,但我不确定重新采样的掩码是否与重新采样的输入 ids 行匹配。
Smote 需要两个输入,输入和标签,所以我用相同的随机状态复制了这个过程,并只返回了所需的元素:

def smote(input_ids, input_masks, labels):

smote = SMOTE("not majority", random_state=27)

input_ids_resampled, labels_resampled = smote.fit_sample(input_ids, labels)
input_masks_resampled, _ = smote.fit_sample(input_masks, labels)

return input_ids_resampled, input_masks_resampled, labels_resampled

这是可以接受的吗?有一个更好的方法吗?

最佳答案

我认为给定的代码不是一个好主意。
由于掩码 id 告诉您哪些标记是真实的,哪些来自填充,如果您独立于输入 id 对它们进行 smote 采样,您最终会得到来自模型忽略的真实输入 id 的合成输入 id因为相应的合成掩码 ID(从完全独立的 token 生成)表明您的合成输入 ID 是填充的。
愚蠢的例子:

  • t_1: input ids = [1209, 80183, 290], mask ids = [1,1,0,]
  • t_2: input ids = [39103, 38109, 2931], mask ids = [1,1,1]
  • t_3: input ids = [1242, 1294, 3233], mask ids = [1,0, 0]

  • 为简单起见,假设合成创建是通过平均两个张量来完成的。如果您的随机 smote 采样平均了 t_1 的输入 ID和 t_2 ,但 t_2 的掩码 ID和 t_3 ,由此产生的合成 t_4没有任何意义:它不是任何实际观察的平均值。
    对上述问题的合理解决方案:您仅对输入 id 进行采样,并且作为合成 token 的掩码 id,您取相同掩码 id 的平均值。我说的是平均值,但我认为掩码 id 向量的每个条目的中值可能更合适。可以通过将输入 id 和掩码 id 展平为一维张量并将 smote 应用于这些(我认为,假设 smote 是按组件工作的)来安排它。
    但是,我认为上述修复仍然没有太大意义。我远非 BERT 专家,但我的理解是每个 token 都对应于一个精确的整数(最多可能是哈希冲突)。如果是这种情况,通过简单地平均 token ,你最终会得到完全的胡言乱语。即使为每个标记(例如,同一类中的 5 个张量)选择中位数也会导致一个完整的胡言乱语。
    所以结论是,我不知道如何解决这个问题。也许当 token 已经部分处理为浮点数时,可以在 BERT 模型中途的某个点进行 smote。或者甚至可能在标准 Bert 模型的导出处以及在微调到您的特定任务之前。
    最后,我想离开这里给遇到这个问题的下一个人:显然 SMOTE、SMOTENC 有一个修改,它适用于(在其他任务中)整数值向量。由于上述原因,我认为它不适合此目的,但很高兴知道。

    关于python - 具有多个 bert 输入的 SMOTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61776977/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com