冻结训练的解释

        在机器迁移下有个思路为“冻结训练”,目的是把backbone冻结起来训练,加快训练效率的同时防止权值被破坏。

        经过训练之后发现冻结训练里unfreeze_epoch跟freeze_epoch的概念跟我预设想的不太一样,我一开始以为启用了冻结训练那训练的迭代次数为freeze_epoch所设置的值,unfreeze_epoch的值就无关紧要了,于是乎我就减小冻结训练迭代次数大小,在我的小破机器上训练,但是跑起来才发现有问题,跑起来的总迭代次数是freeze_epoch+unfreeze_epoch得到的和,冻结训练减小“训练成本”的方法并不是减小迭代次数,而是通过在冻结训练时调用更小的显存,从而将资源放置到解冻训练中。举个例子,如果有两个筐,一个筐里装香蕉,另一个筐里装苹果,机器一开始需要学习的是区分谁是香蕉,谁是苹果,在得到较优的区分结果之后就需要去箩筐里去快速拿对应的苹果或香蕉。在实际训练中,去区分苹果和香蕉时利用冻结训练,在利用较小的计算资源得到能够区分苹果跟香蕉的能力之后,就解冻训练利用更大的计算资源去筐里拿对应的水果儿,区别就在于如果不利用冻结+解冻的话一次只能拿出一个苹果,冻结+解冻之后就有能力每次都从筐里拿出两个甚至更多的苹果了,因为计算资源已经都放在了后面拿水果的过程中。

        综上所述,冻结训练的初衷其实是给算力不足或比较小的机器来服务的,所以如果机器的算力够高。换句话说你脑子跟力气都好使的情况下,一训练就知道谁是苹果谁是香蕉的前提下,去执行拿水果儿的任务过程中你一次能抱起五六个苹果甚至更多,那就不需要考虑冻结训练了。

### 中途冻结训练的原因 在深度学习的迁移学习场景下,中途冻结某些层是一种常见的策略。其主要原因在于减少计算开销以及防止破坏预训练模型中的重要特征表示。具体来说: - **保护已有特征**:如果直接对整个模型进行端到端的微调,可能会因为梯度下降而导致预训练权重被过度调整,从而失去原有的泛化能力[^1]。 - **降低过拟合风险**:当目标数据集较小或者噪声较大时,完全解冻所有层可能导致模型快速陷入局部最优甚至严重过拟合。通过逐步解冻的方式可以让模型更稳健地适应新任务。 ### 解决方法 针对中途冻结带来的挑战,以下是几种有效的解决方案及其技术实现细节: #### 方法一:分阶段训练 此方法分为两个主要阶段执行: 1. 初期仅允许新增加部分(如全连接层)参与反向传播过程; 2. 后续解锁更多原有结构以便进一步精细化调节整体架构表现力。 ```python import torch.nn as nn from torchvision import models def train_with_freeze(model, num_epochs_stage_one=5, num_epochs_stage_two=10): # 阶段一:只训练最后一层 for param in model.parameters(): param.requires_grad = False # 修改最后几层使其可训练 for layer_name, child in list(model.named_children())[-2:]: for params_child in child.parameters(): params_child.requires_grad = True optimizer = ... # 定义优化器 criterion = ... # 定义损失函数 print("Stage One Training...") for epoch in range(num_epochs_stage_one): pass # 执行一次完整的epoch循环 # 阶段二:全部参数开放训练 unfreeze_all_layers(model) print("Stage Two Training...") for epoch in range(num_epochs_stage_two): pass # 继续完成剩余轮次的学习流程 def unfreeze_all_layers(model): """解除所有图层锁定状态""" for param in model.parameters(): param.requires_grad = True ``` 上述代码展示了如何构建一个两步走式的训练机制,在初始阶段专注于特定区域内的改进,随后扩展至全局范围内的探索^。 #### 方法二:动态调整学习率 对于不同层次采用差异化的学习速率也是一种常见做法。这种方法能够确保浅表级联不会受到剧烈变动影响的同时给予深层节点足够的灵活性去匹配目标任务特性。 ```python optimizer = torch.optim.Adam([ {'params': base_model.parameters(), 'lr': 0.0001}, {'params': classifier.parameters(), 'lr': 0.01} ]) ``` 这里设置了base_model较低水平的学习速度而classifier则保持较高数值,以此达成平衡效果[^3]. 另外值得注意的是无论采取何种措施都需要密切监控验证集合上的指标变化趋势来判断当前设定是否合理有效. ### 结论 综上所述,无论是从理论角度还是实际操作层面来看,“中途冻结”都是提升迁移效率不可或缺的一环。它不仅有助于维持源域知识的价值还能促进目标领域特性的挖掘与发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值