为什么使用 BERT learner.autofit 期间数据项会发生变化?

Why is there is a change in data items during learner.autofit using BERT?

我正在尝试拟合 BERT 文本分类器。我的训练和测试数据如下所示。

x_train = data["TEXT"].head(4500).tolist()
y_train= [label2id[label] for label in data["EMOTION"].head(4500).values.tolist()]
x_test = data["TEXT"].tail(500).tolist()
y_test = [label2id[label] for label in data["EMOTION"].tail(500).values.tolist()]

然后,我下载预训练的 BERT 模型 (uncased_L-12_H-768_A-12.zip)...

(x_train,  y_train), (x_test, y_test), preproc = text.texts_from_array(x_train=x_train, y_train=y_train,
                                                                       x_test=x_test, y_test=y_test,
                                                                       class_names=data['EMOTION'].unique().tolist(),
                                                                       preprocess_mode='bert',
                                                                       ngram_range=1, 
                                                                       maxlen=350, 
                                                                       max_features=35000)

为了分类,我们将bert模型设置为

model = text.text_classifier('bert', train_data=(x_train, y_train), preproc=preproc)
learner = ktrain.get_learner(model, train_data=(x_train, y_train), batch_size=6)

最后,我尝试使用 1cycle 政策利率拟合模型

hist = learner.fit_onecycle(2e-5, 1)

我用 750 个样本而不是 4500 个样本得到结果。我还用各种数据对此进行了测试。所以数据项总是有变化的。你能说说背后的原因吗?

begin training using onecycle policy with max lr of 2e-05...
750/750 [==============================] - 875s 1s/step - loss: 0.3740 - accuracy: 0.8544

感谢您提前回复。

我个人的想法是,当你用 ktrain.get_learner 实例化学习器时,你给它一个 batch size = 6 作为输入参数。

因此,当您尝试通过简单地执行 learner.fit_onecycle (2e-5, 1) 来训练学习器时,它只需要一批进行训练,实际上需要 4500 training data / batch size (6) = 750 个数据来训练。

此时要么尝试更改批量大小,要么像这样执行 for 循环:

for epoch in range(X):
    ....
    for batch in chunker(train, batch_size):
    ....

其中 chunker() 可能是这样的:

def chunker(sequence, size):
    """useful for splitting a sequence into minibatches"""
    for i in range(0, len(sequence), size):
        chunk = sequence[i:i+size]
        # sort sentences in batch by length in descending order
        chunk.sort(key=lambda x: len(x), reverse=True)
        yield chunk

简而言之,这个想法是你必须做一个循环,在这个循环中,每次要使用一组数据(批次)来训练你的模型时,你都会去 select。