new optimization

本文介绍了深度学习中常用的五种优化器:SGD、带有动量的SGD、Adagrad、RMSProp及Adam,并对比了它们在训练过程中的表现。其中详细解释了Adam如何动态调整学习率以加速收敛,以及SGDM在不同场景下的优势。

new optimizer for deep learning

1、SGD

2、SGD with momentum

前一步的累积会移动到下一步当中,就算达到鞍点和局部最低点,带有动量的SGD还是会继续前行,下一步的movement等于: -u*梯度+v*动量

3、Adagrad

即在梯度方向乘了一个数,如果过去的梯度很大,就要降低学习率,因为梯度很大,说明在一个很崎岖的路上寻找全局最低,比如上面图的绿色方向,梯度比较大,所以需要用一个比较小的学习率

4、RMSProp

原理和Adagrad很像,同时借用了Momentum的思想;Adagrad的分母是不断累加的,加入一开始就很大,导致后面学习率特别小,而RMSprop在时间上有缓冲,上式中的vt表示的就是EMA (exponential moving  average)of gradient is not monotonically increasing 不会永无止尽的增加。

5、Adam

之前的算法无法解决初始化的梯度就为0 的情况

example:BERT\ Transformer

 

Adam:在训练集上达到很好成绩,SGD+momentum在验证集有很好的成绩

原因:其中一个原因是Adam能够在比较sharp 的地方找到minimum,相反SGDM在flat的地方找到

ADAM因为能够动态地调整学习率,所以收敛速度很快,而SGDM没有这样的效果

 

 

 

SWATS:先使用Adam(比较快),再使用SGDM

问题1:什么时候切换

问题2:学习率怎么改变

 

Adam有个trouble,当训练的开始阶段,梯度会很小而且没有什么信息,这时候梯度就是漫无目的的走,但是当梯度很大的时候,因为有之前的影响,导致movement不会很大,最大也只会是\sqrt{\frac{1}{1-\beta _{2}}}\eta,作者的改进方法是AMSGrad,AMSGrad中的V在现在的V和上一次的V中选最大值,减小了无意义的梯度(Adam梯度小,但是学习率大)影响。

 

AdaBound是对学习率设置边界,有 上界和下界,相比较于AMSGrad,即能处理很大的学习率,又能处理小学习率

ADAM:因为能够动态地调整学习率,所以收敛速度很快,而SGDM没有这样的效果,因此可以从SGDM进行调整

 

LR range:不断调整学习率来寻找最好的学习率

不断地调大调小学习率,另外两种方法:

 

 

在 Webpack 中,`optimization` 配置项用于控制代码的优化行为,特别是在生产环境下对输出结果进行压缩、拆分和优化加载性能。以下是一些常用的配置方法及最佳实践: ### 1. 使用 `splitChunks` 进行代码分割 通过 `splitChunks` 可以将代码拆分为多个块,减少单个文件的体积,从而提升加载速度。例如: ```javascript module.exports = { optimization: { splitChunks: { chunks: 'all', // 对所有类型的 chunk 进行拆分 minSize: 20000, // 拆分的最小大小 maxSize: 0, // 最大大小,0 表示不限制 minChunks: 1, // 被引用次数最少的模块数量 maxAsyncRequests: 30, // 异步加载时的最大请求数 maxInitialRequests: 30, // 初始加载时的最大请求数 automaticNameDelimiter: '~', // 拆分块名称的连接符 cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, // 匹配 node_modules 中的模块 name: 'vendors', // 拆分块的名称 priority: -10, // 优先级 }, default: { minChunks: 2, // 默认情况下,至少被引用两次才拆分 priority: -20, reuseExistingChunk: true, // 如果当前块已存在,则复用 }, }, }, }, }; ``` ### 2. 使用 `minimize` 和 `minimizer` 压缩代码 Webpack 支持通过 `minimize` 选项启用代码压缩,并可以通过 `minimizer` 自定义压缩工具(如 TerserWebpackPlugin): ```javascript const TerserPlugin = require('terser-webpack-plugin'); module.exports = { optimization: { minimize: true, minimizer: [ new TerserPlugin({ parallel: true, // 启用多线程压缩 terserOptions: { ecma: undefined, warnings: false, parse: {}, compress: {}, // 压缩选项 }, }), ], }, }; ``` ### 3. 使用 `runtimeChunk` 分离运行时代码 通过 `runtimeChunk` 可以将 Webpack 的运行时代码(如模块加载器)提取到单独的文件中,避免主文件频繁变动: ```javascript module.exports = { optimization: { runtimeChunk: 'single', // 将运行时代码提取为一个单独的 chunk }, }; ``` ### 4. 使用 `concatenateModules` 合并模块 `concatenateModules` 可以将多个模块合并为一个文件,减少运行时开销: ```javascript module.exports = { optimization: { concatenateModules: true, }, }; ``` ### 5. 使用 `usedExports` 进行 Tree Shaking Tree Shaking 是一种优化技术,可以移除未使用的代码。启用 `usedExports` 可以标记未使用的导出项: ```javascript module.exports = { optimization: { usedExports: true, }, }; ``` ### 6. 使用 `sideEffects` 控制副作用 通过 `sideEffects` 可以告诉 Webpack 哪些文件具有副作用,避免误删: ```javascript module.exports = { optimization: { sideEffects: true, }, }; ``` ### 7. 使用 `noEmitOnErrors` 防止错误输出 在构建过程中出现错误时,`noEmitOnErrors` 可以阻止生成无效的输出文件: ```javascript module.exports = { optimization: { noEmitOnErrors: true, }, }; ``` ### 8. 使用 `removeAvailableModules` 移除无用模块 `removeAvailableModules` 可以移除未使用的模块,进一步减小输出体积: ```javascript module.exports = { optimization: { removeAvailableModules: true, }, }; ``` ### 9. 使用 `providedExports` 导出模块信息 `providedExports` 可以记录模块的导出信息,帮助优化依赖分析: ```javascript module.exports = { optimization: { providedExports: true, }, }; ``` ### 10. 使用 `usedExports` 标记未使用导出 结合 `usedExports` 和 `sideEffects`,可以更精确地控制哪些代码需要保留: ```javascript module.exports = { optimization: { usedExports: true, sideEffects: true, }, }; ``` ### 最佳实践总结 - **按需加载**:通过 `splitChunks` 将代码拆分为多个块,减少初始加载时间。 - **压缩代码**:使用 `minimize` 和 `minimizer` 减小输出体积。 - **分离运行时代码**:通过 `runtimeChunk` 提取运行时代码,避免主文件频繁变化。 - **Tree Shaking**:启用 `usedExports` 和 `sideEffects` 移除未使用的代码。 - **防止错误输出**:使用 `noEmitOnErrors` 确保输出文件的完整性。 这些配置可以帮助开发者充分利用 Webpack 的优化功能,提高项目的编译效率和加载性能 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值