增量训练lightgbm模型,深度学习模型
1. 机器学习-增量训练方法(机器学习-增量训练方法 - 知乎)
包含:sklearn, lightgbm增量训练方法。
2. 深度学习模型增量训练
增量训练主要面临的问题:当增量训练时,主要解决的是新增加的训练样本中的新词问题。如果对新增加的新词不做index映射的话,会直接处理成OOV。
原词表有一份数据: old_word2id = {"OOV": 0, "I": 1, "AM": 2}
现在增量在训练的时候,有一条新的训练样本,例如: I LOVE CHINA, LOVE 和 CHINA 没有出现在 old_word2id 词表里,怎么将LOVE 和 CHINA添加进词表呢(这个好像只要更新词表即可)? 以及LOVE 和 CHINA相对应的emb怎么加进到 model的word_emb中呢?
我是用torch训练的深度模型,处理方式是:
# 1. 对新增的词语映射为新的index,即将映射词表变为:
"""
old_word2id = {"OOV": 0, "I": 1, "AM": 2}
"""
new_word2id = {"OOV": 0, "I": 1, "AM": 2, "LOVE": 3, "CHINA":4}
# 2. 为新增的词语赋予一个随机的初始embedding,即将底层词语embedding矩阵改为:
"""
# old_word_emb矩阵代表已经训练完成的 ”OOV“,”I“, ”AM“ 三个词的embedding
old_word_emb = np.array([[0.11, -0.21, 0.32, 0.51, 0.12], \
[-0.2, 1.039, 0.21, 0.42, 0.71], \
[0.24, 8.039, 1.91, 3.02, -0.2]
])
"""
# new_word_emb矩阵的前3行代表已经训练完成的 ”OOV“,”I“, ”AM“ 三个词的embedding
# new_word_emb矩阵的后2行代表随机初始化的 ”LOVE“,”CHINA“ 两个词的embedding
new_word_emb = np.array([[0.11, -0.21, 0.32, 0.51, 0.12], \
[-0.2, 1.039, 0.21, 0.42, 0.71], \
[0.24, 8.039, 1.91, 3.02, -0.2], \
[0.24, 8.039, 1.91, 3.02, -0.2], \
[0.24, 8.039, 1.91, 3.02, -0.2], \
])
# 3. 怎么将新的 new_word_emb 在要增量训练的模型中生效呢?
train_model = torch.load(old_train_model_path, map_location=torch.device('cpu'))
train_model.embedding.weight = torch.nn.Parameter(
torch.tensor(np.array(new_word_emb), dtype=torch.float32), \
requires_grad=True)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
train_model.to(device)
下面用新数据对train_model做正常的模型训练即可。