Adam三连问

Adam能和L2正则一起使用?

不能。
L2正则 在SGD中和weight decay是等价的,但是在Adam中就不等价了。
因为在Adam中,每个参数的梯度的计算和历史梯度相关,不是简单乘上学习率

参考:https://zhuanlan.zhihu.com/p/63982470

Adam能解决梯度爆炸?

不能。
理论上,Adam是不会发生梯度爆炸的问题,因为梯度更新式:
m t = m t − 1 ⋅ β 1 + g t ⋅ ( 1 − β 1 ) v t = v t − 1 ⋅ β 2 + g t 2 ⋅ ( 1 − β 2 ) m t ^ = m t / ( 1 − b e t a 1 t ) v t ^ = m t / ( 1 − b e t a 2 t ) g t ^ = l r ⋅ m t ^ v t ^ \begin{aligned} m_t &= m_{t-1}\cdot \beta_1 + g_t \cdot (1 - \beta_1)\\ v_t &= v_{t-1}\cdot \beta_2 + g_t^2 \cdot (1 - \beta_2)\\ \hat{m_t} &= m_t / (1-beta_1^t)\\ \hat{v_t} &= m_t / (1-beta_2^t)\\ \hat{g_t} &= lr \cdot \frac{\hat{m_t}}{\sqrt{\hat{v_t}}} \end{aligned} mtvtmt^vt^gt^=mt1β1+gt(1β1)=vt1β2+gt2(1β2)=mt/(1beta1t)=mt/(1beta2t)=lrvt^ mt^
理想情况下 g t ^ = l r ⋅ m t ^ v t ^ ≈ l r ⋅ E ( g ) E ( g 2 ) \hat{g_t} = lr \cdot \frac{\hat{m_t}}{\sqrt{\hat{v_t}}} \approx lr \cdot \frac{\mathbb{E}(g)} { \sqrt{\mathbb{E}(g^2)}} gt^=lrvt^ mt^lrE(g2) E(g) ,而其中 ∣ E ( g ) E ( g 2 ) ∣ ≤ 1 | \frac{\mathbb{E}(g)} { \sqrt{\mathbb{E}(g^2)}} |\le1 E(g2) E(g)1,得到 g t ^ ≤ l r \hat{g_t} \le lr gt^lr,即每次更新梯度的大小不会超过学习率,所以不会出现梯度爆炸的问题。

实际情况下,使用滑动平均且去偏之后, g t ^ = l r ⋅ m t ^ v t ^ \hat{g_t} = lr \cdot \frac{\hat{m_t}}{\sqrt{\hat{v_t}}} gt^=lrvt^ mt^仍然是估计。
通常, b e t a 1 = 0.9 beta_1=0.9 beta1=0.9 b e t a 2 = 0.999 beta_2=0.999 beta2=0.999,这样在滑动平均后,分子 m t ^ \hat{m_t} mt^ 会更偏向于当前梯度,分母 v t ^ \hat{v_t} vt^ 相对偏向于历史梯度,导致在梯度 g t g_t gt爆炸后,滑动平均的分子 m t ^ \hat{m_t} mt^ 远大于分母 v t ^ \hat{v_t} vt^,导致最终计算的更新步长 g t ^ \hat{g_t} gt^也偏大,远远超出 l r lr lr。所以,实际情况下Adam无法避免梯度爆炸问题。

Adam不需要学习率衰减?

需要。
在神经网络训练后期,梯度大小变化不大,经过滑动平均后, m t ^ v t ^ \frac{\hat{m_t}}{\sqrt{\hat{v_t}}} vt^ mt^ 在这种情况下是接近 1 的,更新步长 g t ^ \hat{g_t} gt^保持在初始学习率 l r lr lr
如果初始学习率 l r lr lr较大,则在网络训练后期,梯度保持在初始学习率 l r lr lr,导致训练难以进一步收敛到极小值点。
为了在初期快速收敛,而后期稳定进入某个极小值,在设定较大初始学习率后,需要进行学习率衰减。

番外:mini batch

  • 通常batch size是2的幂次,由于GPU并行度主要是2的幂次,而且GPU本身是SIMT架构,为了充分利用GPU资源,防止出现闲置。
  • SGD 是求解 ∇ E ( log ⁡ P ( x , y ∣ θ ) ) \nabla \mathbb{E}(\log \mathbb{P}(x, y|\theta)) E(logP(x,yθ)),也就是 E ( ∇ log ⁡ P ( x , y ∣ θ ) ) \mathbb{E}(\nabla \log \mathbb{P}(x, y|\theta)) E(logP(x,yθ))。所以,本质上也是求梯度的期望。
  • 直接对从数据源对数据进行抽样后,再计算的mini batch梯度是 标准梯度(最小化泛化误差的梯度)的无偏估计,比如在线学习是无偏的,样本使用一次即丢弃;而对于从训练集中进行独立采样,在第一个epoch时,mini batch的梯度都是无偏估计,但在后续再从训练集中进行采样计算,则变成了有偏估计。

参考:http://www.huaxiaozhuan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/chapters/4_optimization.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 导入必要的库和模块,例如TensorFlow或Keras。 2. 定义残差网络的结构,包括输入层、隐藏层和输出层。 3. 在每个隐藏层中实现残差块,其中包括两个卷积层、批量标准化层和跳跃连接。 4. 在模型编译时,将优化器设置为Adam,并指定学习率和其他参数(例如beta_1和beta_2)。 5. 训练模型,并根据需要进行调整。 以下是一个示例代码: ```python import tensorflow as tf from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, Add, Input from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam def res_block(input, filters): x = Conv2D(filters, kernel_size=(3, 3), padding='same')(input) x = BatchNormalization()(x) x = Activation('relu')(x) x = Conv2D(filters, kernel_size=(3, 3), padding='same')(x) x = BatchNormalization()(x) x = Add()([x, input]) x = Activation('relu')(x) return x def res_net(input_shape=(32, 32, 3), num_classes=10): inputs = Input(shape=input_shape) x = Conv2D(64, kernel_size=(3, 3), padding='same')(inputs) x = BatchNormalization()(x) x = Activation('relu')(x) x = res_block(x, 64) x = res_block(x, 64) x = res_block(x, 64) x = Conv2D(128, kernel_size=(3, 3), strides=(2, 2), padding='same')(x) x = BatchNormalization()(x) x = Activation('relu')(x) x = res_block(x, 128) x = res_block(x, 128) x = res_block(x, 128) x = Conv2D(256, kernel_size=(3, 3), strides=(2, 2), padding='same')(x) x = BatchNormalization()(x) x = Activation('relu')(x) x = res_block(x, 256) x = res_block(x, 256) x = res_block(x, 256) x = tf.keras.layers.GlobalAveragePooling2D()(x) outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x) model = Model(inputs=inputs, outputs=outputs) return model model = res_net() optimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-07) model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) ``` 在此示例中,我们定义了一个包含三个残差块的残差网络。我们使用全局平均池化层将输出转换为一维张量,并使用softmax激活函数对分类进行预测。在编译模型时,我们使用Adam优化器,并将学习率设置为0.001,beta_1设置为0.9,beta_2设置为0.999,epsilon设置为1e-07。最后,我们指定损失函数为分类交叉熵,并使用准确度作为指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值