阿尔伯特没有收敛 - HuggingFace

Posted

技术标签:

【中文标题】阿尔伯特没有收敛 - HuggingFace【英文标题】:ALBERT not converging - HuggingFace 【发布时间】:2020-10-10 21:06:24 【问题描述】:

我正在尝试将预训练的 HuggingFace ALBERT 变换器模型应用于我自己的文本分类任务,但损失并没有减少超过某个点。

这是我的代码:

我的文本分类数据集中有四个标签:

0, 1, 2, 3

定义分词器

maxlen=25
albert_path = 'albert-large-v1'
from transformers import AlbertTokenizer, TFAlbertModel, AlbertConfig
tokenizer = AlbertTokenizer.from_pretrained(albert_path, do_lower_case=True, add_special_tokens=True,
                                                max_length=maxlen, pad_to_max_length=True)

使用分词器对文本中的所有句子进行编码

encodings = []
for t in text:
  encodings.append(tokenizer.encode(t, max_length=maxlen, pad_to_max_length=True, add_special_tokens=True))

定义预训练的 Transformer 模型并在顶部添加 Dense 层

    from tensorflow.keras.layers import Input, Flatten, Dropout, Dense
    from tensorflow.keras import Model

    optimizer = tf.keras.optimizers.Adam(learning_rate= 1e-4)
    token_inputs = Input((maxlen), dtype=tf.int32, name='input_word_ids')
    config = AlbertConfig(num_labels=4, dropout=0.2, attention_dropout=0.2)
    albert_model = TFAlbertModel.from_pretrained(pretrained_model_name_or_path=albert_path, config=config)

    X = albert_model(token_inputs)[1] 
    X = Dropout(0.2)(X)
    output_= Dense(4, activation='softmax', name='output')(X)

    bert_model2 = Model(token_inputs,output_)
    print(bert_model2.summary())
    
    bert_model2.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy')

最后,将编码后的文本和标签输入模型

encodings = np.asarray(encodings)
labels = np.asarray(labels)
bert_model2.fit(x=encodings, y = labels, epochs=20, batch_size=128)


Epoch 11/20
5/5 [==============================] - 2s 320ms/step - loss: 1.2923
Epoch 12/20
5/5 [==============================] - 2s 319ms/step - loss: 1.2412
Epoch 13/20
5/5 [==============================] - 2s 322ms/step - loss: 1.3118
Epoch 14/20
5/5 [==============================] - 2s 319ms/step - loss: 1.2531
Epoch 15/20
5/5 [==============================] - 2s 318ms/step - loss: 1.2825
Epoch 16/20
5/5 [==============================] - 2s 322ms/step - loss: 1.2479
Epoch 17/20
5/5 [==============================] - 2s 321ms/step - loss: 1.2623
Epoch 18/20
5/5 [==============================] - 2s 319ms/step - loss: 1.2576
Epoch 19/20
5/5 [==============================] - 2s 321ms/step - loss: 1.3143
Epoch 20/20
5/5 [==============================] - 2s 319ms/step - loss: 1.2716

损失从 6 减少到 1.23 左右,但似乎没有进一步减少,即使在 30 多个 epoch 之后也是如此。

我做错了什么?

非常感谢所有建议!

【问题讨论】:

您尝试过较小的批量吗?这里可能不是这种情况,但我想知道即使使用不同的批量大小,您是否也能得到相同的结果。 @Pedram 使用 1 和 32 的批量大小无助于将损失降低到 1.23 以上 @beginner 到现在为止你解决了这个问题吗?我正在为不同的架构遇到类似的情况。 【参考方案1】:
    您可以尝试使用 SGD Optimizer 引入批量标准化 尝试在 Albert 层的顶部添加几层(未预训练)。

【讨论】:

以上是关于阿尔伯特没有收敛 - HuggingFace的主要内容,如果未能解决你的问题,请参考以下文章

glmnet 没有从 cv.glmnet 收敛到 lambda.min

GAN没有收敛。判别者损失不断增加

为啥单层感知器在没有归一化的情况下收敛这么慢,即使边距很大?

pytorch+huggingface实现基于bert模型的文本分类(附代码)

为啥随机梯度下降方法能够收敛?

如何在没有 IOB 标签的情况下使用 Hugging Face 的转换器管道重建文本实体?