目录
尝试1-问题格式化(无效果)
我尝试调整输入格式,例如,将问题和答案之间的分隔符或提示更清晰地定义,这可能有助于模型更好地理解任务。
清晰的分隔符
在输入文本中使用更明显的分隔符。用多个换行符或特定的符号来区分问题和答案的部分:
input_text = f"问题是:{question}\n请提供答案:\n---\n"
明确的提示
添加指示性文本,说明模型应该如何回答:
input_text = f"请根据以下问题提供准确答案。\n问题:{question}\n答案:"
包含示例
提供一两个示例问题和答案作为背景,帮助模型理解预期的格式:
input_text = "下面是一些示例:\n示例问题1:基尼奇的天赋1是什么?\n示例答案1:基尼奇的天赋1是...\n\n请回答下面的问题:\n问题:" + question + "\n答案:"
综合
将前面提到的几点调整进行综合:
input_text = (
"下面是一些示例:\n"
"示例问题1:山王长牙的武器效果是什么?\n"
"示例答案1:绿松石之狩,元素战技命中敌人后,会获得1层「悬木祝赐」,该效果每0.5秒至多触发1次;队伍中附近的角色触发了燃烧或烈绽放反应后,装备者会获得3层悬木祝赐...请根据以下问题提供准确答案\n"
f"问题:{question}\n"
"答案:"
)
调整后的效果
可以看到,如果直接问示例问题,它会直接回答示例回答的内容。问其他的问题时,能打出一些内容,但并不正确。
结论
问题格式化应该能对回答的形式能起到一些效果,但并不能提高模型回答的准确率
尝试2-超参数调整
调整学习率learning_rate(有效果)
尝试更低的学习率1e-5
调整后得到的结果:
可以看到,也像点样子,但是依然不正确。
我原本尝试进一步调大学习率,但搜索相关资料发现,较大的学习率可能会让模型更加发散,这与我的目标背道而驰。
那么我只能进一步较低学习率
尝试更低的学习率1e-7
可以看到,这次得到的效果更不好,甚至还扯到了《我的世界》,学习率更低似乎才更发散。
所以,我决定再试一次,这次学习率调高一些:5e-4。同时迭代次数提升到500
调整后的效果
这是我的训练集部分数据:
可以看到,这次效果还行,不过我同时改了两个地方,学习率5e-4,迭代次数500,之前迭代次数都是200,所以不确定是学习率的影响还是迭代次数的影响,还是两个共同的影响。因此我还需要再试一次迭代次数为200的情况。
这次学习率:5e-4。同时迭代次数为200
调整后的效果:
可以看到,这次的回答甚至比上一次更加精准。所以能肯定是学习率为5e-4所造成的效果。
但是还存在问题,比如我现在换个问法,它就不行了:
所以,接下来我将针对这个问题,继续进行改进的尝试,即:在学习率为5e-4的基础上,改进配置,使得模型对于一个问题的不同问法,依然可以回答正确的内容。
增加正则化weight_decay(无效果)
在 TrainingArguments
中适当提高 weight_decay
参数值(例如从 0.01
增加到 0.05
或 0.1
)。提高正则化可以帮助模型减少过度记忆原有的问答格式。
weight_decay
是一种正则化方法,用于在训练神经网络时抑制过拟合。具体来说,它通过对模型的权重施加一个惩罚,使得权重值不会变得过大,帮助模型避免对训练集的过度记忆。
这里改成0.1
调整后的效果:
训练集的数据:
可以看到,换一个问法,回答依然不准确。说明修改weight_decay
参数值得到的效果并不大。
数据增强-应用随机遮盖(无效果)
使用 DataCollatorForLanguageModeling
可以在训练时随机遮盖一些单词,使得模型在训练时对某些词或词组稍微“模糊”,这可以帮助模型更好地泛化。
from transformers import DataCollatorForLanguageModeling
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=True,
mlm_probability=0.15
)
调整后的效果:
这是训练集的数据:
可以看到,调整后效果还更差,我按原本的question进行提问都有错误,而且回答的内容非常多,大概有几百个字(图中没展示全,实际上字非常多)。所以这个尝试也以失败告终。
我想可能是遮盖的概率太高了,所以我再试一次0.01:
调整后的效果:
训练集数据:
可以看到,调整后效果还是很差,我按原本的question进行提问都有错误。
经过随机遮盖的两次尝试,得出结论:不仅没有解决因不同问法而导致结果错误的问题,甚至按原本的问题内容进行提问也得不到正确结果。所以这个尝试不太行。