【问题标题】:SMOTE with multiple bert inputsSMOTE 具有多个 bert 输入
【发布时间】:2020-08-29 18:49:51
【问题描述】:

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

但是,我还希望能够对输入掩码 id 使用 smote,以允许模型确定填充值的位置。

我的问题是如何将 smote 用于输入 ID 和掩码 ID?到目前为止,我已经完成了以下操作,模型没有抱怨,但我不确定重新采样的掩码是否与重新采样的输入 id 行匹配。 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

这可以接受吗?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python keras scikit-learn huggingface-transformers smote


    【解决方案1】:

    我认为给定的代码不是一个好主意。

    由于掩码 ID 告诉您哪些标记是真实的,哪些来自填充,如果您独立于输入 ID 对它们进行采样,您最终会得到合成输入 ID来自模型忽略的 真实 输入 id,因为相应的合成掩码 id(从完全独立的标记生成)表明您的合成输入 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]

    为简单起见,假设合成创建是通过平均两个张量来完成的。如果您的随机抽样平均了t_1t_2 的输入ID,但t_2t_3 的掩码ID,则生成的合成t_4 没有任何意义:它不是任何的平均值真实的观察。

    对上述问题的合理解决方法:您仅对输入 ID 进行抽样采样,并作为合成令牌的掩码 ID,您采用相同掩码 ID 的平均值。我说 average,但我认为掩码 id 向量的每个条目的 median 值可能更合适。可以通过将输入 id 和掩码 id 展平为一维张量并将 smote 应用于这些来安排(我认为,假设 smote 是按组件工作的)。

    但是,我认为上述修复仍然没有太大意义。我远不是 BERT 专家,但我的理解是每个标记都对应一个精确的整数(最多可能是哈希冲突)。如果是这样的话,通过简单地平均代币,你最终会得到完全的胡言乱语。即使为每个标记(例如,同一类中的 5 个张量)选择中值也会导致一个完整的胡言乱语。

    所以结论是,我不知道如何解决这个问题。当令牌已经被部分处理为浮点数时,也许可以在 BERT 模型中途的某个时刻受到打击。或者甚至可能在标准 Bert 模型的退出和微调到您的特定任务之前。

    最后,我想留给下一个遇到这个问题的人:显然有一个 SMOTE 的修改,SMOTENC,它适用于(在其他任务中)整数值向量。由于上述原因,我认为它不适合此目的,但很高兴知道。

    【讨论】:

      【解决方案2】:

      我只是想澄清一下,这是将 SMOTE 应用于 input_id 的错误方法。您需要将相应的嵌入带到 CLS。使用 BERT 为每条推文获取 CLS 令牌,然后对其应用 SMOTE。然后从分类器(任何分类器)传递它。这应该在没有微调的情况下完成。

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多