tensorflow - 从头开始学习过程以获得最佳效果?
问题描述
我对深度学习相当陌生,刚刚开始修补一些简单的小模型,在这种情况下是一个小的 unet,基本上是从:https://github.com/zhixuhao/unet/blob/master/trainUnet 复制粘贴的。 ipynb
我发现在我的大部分运行中,我都会达到一定的损失水平,从那时起它不想进一步收敛。然而,每隔一段时间我从头开始重新开始学习过程,它突然收敛到比上面提到的高原低 1000 倍左右的损失......最终的模型相当出色 - 没有抱怨,但每个人都必须重新开始学了那么多遍?
我知道这可能是由于偶然分配了模型的初始权重。我提高了学习率并减小了批量大小以尝试逃避局部最小值,但这似乎没有多大帮助。
一遍又一遍地重新启动模型是常见的做法吗?
解决方案
无论模型训练多长时间,在不同的运行中看到少量差异是很正常的,尽管不是你看到的幅度。
损失的减少是否真的反映在测试集的准确率上?损失可能是一个有用的衡量标准,但至少根据我的经验,损失和准确性(或您感兴趣的任何指标)通常只是松散相关。我观察到异常高的训练准确率/低训练损失通常会导致模型泛化能力差。
损失景观并不总是朝着全球最小值平滑,你的可能有两个不同的山谷。H Li 等人的这篇论文是一篇非常有趣的文章: Visualizing the Loss Landscape of Neural Nets
总而言之,特征重用和正则化可以极大地帮助创建朝向最小值的平滑梯度。
您可能还想研究学习率策略,以尝试让您的模型进入损失情况更平滑的区域。我会推荐 Leslie Smith 的 One-Cycle Policy。总体思路是提高学习率并降低动量以使您的模型进入全局最小值区域(并沿途跳过局部最小值),然后降低学习率以使模型落入最低限度。
推荐阅读
- php - iis 对波斯名称文件夹有错误?
- python - 在地图函数中打印出每个可迭代的更简单的方法?
- python - 散景可以动态更新网格图中的列数吗?
- c++ - 在不同类的运算符重载中访问/更改私有变量的问题
- rust - 为什么 Rust 的示例猜谜游戏允许具有不同返回类型的 match 语句?
- auth0 - 无法注销身份提供者 Auth0 Office 插件
- haskell - 为什么haskell不能推断出这种类型?
- android - 如何将 LinearLayout 转换为 Bitmap 而无需在 android 中重塑?
- c# - 从自定义控件的另一个属性中获取设计器中设置的属性值
- regex - 查找数字,然后将其替换为 number+1 Google Sheet