当前位置: 首页 > news >正文

AI学习指南深度学习篇-Adadelta的数学原理

AI学习指南深度学习篇 - Adadelta的数学原理

引言

在深度学习的训练过程中,优化算法的选择对模型的收敛速度和最终效果至关重要。Adadelta是一种自适应学习率方法,它在许多实际应用中证明了其有效性。本文旨在深入探讨Adadelta的数学原理,包括梯度累积项的计算、参数更新的计算以及学习率的计算公式。希望通过本篇文章,让读者对Adadelta有一个全面的理解,并掌握其在深度学习中的应用。

1. Adadelta简介

在介绍Adadelta的具体数学原理之前,有必要简要了解其背景。Adadelta是一种自适应学习率方法,主要目的是为了解决Adagrad算法在训练的后期学习率过小的问题。Adadelta通过对过去的梯度信息进行累积,动态调整每个参数的学习率,进而提升收敛速度。

1.1 Adagrad的局限性

Adagrad通过对每个参数单独调整学习率,使得学习率随着训练迭代次数的增加而减小,这是其优点。然而,这种方法的缺点在于:在训练过程后期,学习率快速减小,导致了模型难以继续优化,甚至无法逃离局部最优解。

1.2 Adadelta的改进

Adadelta旨在克服Adagrad的缺点,它不仅考虑了过去的梯度信息,还通过对参数更新的历史进行累积,使得学习率在训练过程中保持动态,从而有效避免学习率被“冻住”的问题。

2. Adadelta的数学原理

Adadelta在对参数进行更新时,主要涉及到三个核心概念:梯度的累积、参数更新的计算和学习率的计算公式。

2.1 梯度累积项的计算

在Adadelta中,梯度的累积被称为“梯度平方的指数加权平均”,其计算公式为:
[ E [ g 2 ] t = γ E [ g 2 ] t − 1 + ( 1 − γ ) g t 2 ] [ E[g^2]_t = \gamma E[g^2]_{t-1} + (1 - \gamma) g_t^2 ] [E[g2]t=γE[g2]t1+(1γ)gt2]

  • ( E [ g 2 ] t ) ( E[g^2]_t ) (E[g2]t):在时间步( t )上的梯度平方的加权平均值。
  • ( g t ) ( g_t ) (gt):在时间步( t )的梯度。
  • ( γ ) ( \gamma ) (γ):一个介于0和1之间的超参数,通常为0.95。

这个公式的意义在于,以( \gamma )为权重将过去的梯度信息与当前的梯度信息结合,从而形成新的累积项。这个累积项能够为后续的学习率调整提供支持。

示例

假如我们有以下梯度序列:

  • ( g 1 = 0.1 ) ( g_1 = 0.1 ) (g1=0.1)
  • ( g 2 = 0.2 ) ( g_2 = 0.2 ) (g2=0.2)
  • ( g 3 = 0.15 ) ( g_3 = 0.15 ) (g3=0.15)

使用 ( γ = 0.95 ) ( \gamma = 0.95 ) (γ=0.95)进行梯度的累积计算:

[ E [ g 2 ] 1 = 0.95 ⋅ 0 + 0.05 ⋅ ( 0. 1 2 ) = 0.0005 ] [ E[g^2]_1 = 0.95 \cdot 0 + 0.05 \cdot (0.1^2) = 0.0005 ] [E[g2]1=0.950+0.05(0.12)=0.0005]
[ E [ g 2 ] 2 = 0.95 ⋅ 0.0005 + 0.05 ⋅ ( 0. 2 2 ) = 0.000475 + 0.002 = 0.002475 ] [ E[g^2]_2 = 0.95 \cdot 0.0005 + 0.05 \cdot (0.2^2) = 0.000475 + 0.002 = 0.002475 ] [E[g2]2=0.950.0005+0.05(0.22)=0.000475+0.002=0.002475]
[ E [ g 2 ] 3 = 0.95 ⋅ 0.002475 + 0.05 ⋅ ( 0.1 5 2 ) = 0.00235125 + 0.001125 = 0.00347625 ] [ E[g^2]_3 = 0.95 \cdot 0.002475 + 0.05 \cdot (0.15^2) = 0.00235125 + 0.001125 = 0.00347625 ] [E[g2]3=0.950.002475+0.05(0.152)=0.00235125+0.001125=0.00347625]

2.2 参数更新的计算

在有了梯度平方的累积项后,计算参数更新的公式如下:

[ Δ x t = − E [ Δ x 2 ] t − 1 + ϵ E [ g 2 ] t + ϵ g t ] [ \Delta x_t = -\frac{\sqrt{E[\Delta x^2]_{t-1} + \epsilon}}{\sqrt{E[g^2]_t + \epsilon}} g_t ] [Δxt=E[g2]t+ϵ E[Δx2]t1+ϵ gt]

  • ( Δ x t ) ( \Delta x_t ) (Δxt):在时间步 ( t ) ( t ) (t)上的参数更新。
  • ( E [ Δ x 2 ] t − 1 ) ( E[\Delta x^2]_{t-1} ) (E[Δx2]t1):在时间步 ( t − 1 ) ( t-1 ) (t1)的参数变化量的平方的累积。
  • ( ϵ ) ( \epsilon ) (ϵ):一个微小的常数,为了防止分母为零,通常取值为 ( 1 0 − 6 ) ( 10^{-6} ) (106)

此公式表明,更新的参数不仅与当前步的梯度有关,还与之前的参数更新大小和梯度的累积信息相互关系。

示例

假设在某次迭代中,我们得到了以下信息:

  • ( g t = 0.1 ) ( g_t = 0.1 ) (gt=0.1)
  • ( E [ g 2 ] t = 0.002475 ) ( E[g^2]_t = 0.002475 ) (E[g2]t=0.002475)
  • ( E [ Δ x 2 ] t − 1 = 0.0001 ) ( E[\Delta x^2]_{t-1} = 0.0001 ) (E[Δx2]t1=0.0001)

将这些值代入公式中得:

[ Δ x t = − 0.0001 + 1 0 − 6 0.002475 + 1 0 − 6 0.1 ] [ \Delta x_t = -\frac{\sqrt{0.0001 + 10^{-6}}}{\sqrt{0.002475 + 10^{-6}}} 0.1 ] [Δxt=0.002475+106 0.0001+106 0.1]

计算后得到:

[ Δ x t = − 0.0001 0.002475 ⋅ 0.1 = − 0.01 0.049749224 ⋅ 0.1 ≈ − 0.002014 ] [ \Delta x_t = -\frac{\sqrt{0.0001}}{\sqrt{0.002475}} \cdot 0.1 = -\frac{0.01}{0.049749224} \cdot 0.1 \approx -0.002014 ] [Δxt=0.002475 0.0001 0.1=0.0497492240.010.10.002014]

2.3 学习率的计算公式

在Adadelta中,学习率并不是一个静态的值,而是根据梯度的累积和参数更新的历史自适应调整的。学习率的计算公式为:

[ η t = E [ Δ x 2 ] t − 1 + ϵ E [ g 2 ] t + ϵ ] [ \eta_t = \frac{\sqrt{E[\Delta x^2]_{t-1} + \epsilon}}{\sqrt{E[g^2]_t + \epsilon}} ] [ηt=E[g2]t+ϵ E[Δx2]t1+ϵ ]

- ( η t ) ( \eta_t ) (ηt):在时间步 ( t ) ( t ) (t)的学习率。

再次强调,公式中的 ( ϵ ) ( \epsilon ) (ϵ)也起到避免被零除的作用。

示例

通过之前的步骤的结果,我们可以继续计算学习率:

假设此时我们知道:

  • ( E [ Δ x 2 ] t − 1 = 0.0001 ) ( E[\Delta x^2]_{t-1} = 0.0001 ) (E[Δx2]t1=0.0001)
  • ( E [ g 2 ] t = 0.002475 ) ( E[g^2]_t = 0.002475 ) (E[g2]t=0.002475)

那么:
[ η t = 0.0001 + 1 0 − 6 0.002475 + 1 0 − 6 ] [ \eta_t = \frac{\sqrt{0.0001 + 10^{-6}}}{\sqrt{0.002475 + 10^{-6}}} ] [ηt=0.002475+106 0.0001+106 ]

带入公式进行计算:

[ η t = 0.0001 0.002475 ≈ 0.01 0.049749224 ≈ 0.201 ] [ \eta_t = \frac{\sqrt{0.0001}}{\sqrt{0.002475}} \approx \frac{0.01}{0.049749224} \approx 0.201 ] [ηt=0.002475 0.0001 0.0497492240.010.201]

3. Adadelta的优缺点

3.1 优点

  1. 自适应学习率:Adadelta根据历史梯度和参数更新动态调整学习率,避免了学习率过小导致的无法收敛问题。
  2. 无需手动调节学习率:与其他优化器相比,Adadelta不需要提前设定固定的学习率,可以在训练过程中自动调整。
  3. 适用于大规模问题:由于其自适应性质,Adadelta适合处理具有大规模数据集和复杂模型的问题。

3.2 缺点

  1. 超参数选择:虽然Adadelta在调节学习率方面表现优异,但换句话说,其有效性部分依赖于超参数( \gamma )的选择。
  2. 稳定性问题:在某些情况下,若参数更新幅度过大,模型可能会面临不稳定的问题。
  3. 对计算资源的要求:相较于一些更简单的优化算法,Adadelta在每轮迭代中需要更多的存储和计算资源,以记录梯度的历史信息。

4. Adadelta的应用示例

4.1 深度学习框架中的实现

我们以一个常见的深度学习框架为例,展示如何使用Adadelta进行模型训练。以TensorFlow为例,实施步骤如下:

import tensorflow as tf# 生成虚拟数据
data = ...
labels = ...# 建立基础模型
model = tf.keras.models.Sequential([tf.keras.layers.Dense(64, activation="relu", input_shape=(input_dim,)),tf.keras.layers.Dense(64, activation="relu"),tf.keras.layers.Dense(num_classes, activation="softmax")
])# 编译模型,使用Adadelta优化器
model.compile(optimizer=tf.keras.optimizers.Adadelta(learning_rate=1.0), loss="sparse_categorical_crossentropy", metrics=["accuracy"])# 训练模型
model.fit(data, labels, epochs=10, batch_size=32)

4.2 在真实数据集上的应用

在处理真实数据集时,例如MNIST数字分类任务,可以按照以下步骤应用Adadelta优化器:

import tensorflow as tf
from tensorflow.keras.datasets import mnist# 加载数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape((60000, 28*28)).astype("float32") / 255
x_test = x_test.reshape((10000, 28*28)).astype("float32") / 255# 建立模型
model = tf.keras.models.Sequential([tf.keras.layers.Dense(512, activation="relu", input_shape=(28*28,)),tf.keras.layers.Dense(10, activation="softmax")
])# 编译模型
model.compile(optimizer=tf.keras.optimizers.Adadelta(), loss="sparse_categorical_crossentropy", metrics=["accuracy"])# 训练模型
model.fit(x_train, y_train, epochs=10, batch_size=128)# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"\nTest accuracy: {test_acc}")

5. 总结

本文深入探讨了Adadelta的数学原理,包括梯度累积项的计算、参数更新的计算以及学习率的计算公式。Adadelta通过结合历史信息,为各个参数自适应地调整学习率,从而克服了Adagrad在训练后期学习率过低的问题。在实际应用中,Adadelta展示了良好的效果,尤其在处理大规模神经网络时,能够有效加速收敛过程。

然而,Adadelta也并非无懈可击,其在一些情况下可能导致不稳定的学习过程,并需要合理选择超参数。通过对Adadelta的理解与实践,我们能够更好地应用此优化器于深度学习模型中,从而提升模型的性能。

希望本文的内容能够为你的深度学习旅程提供帮助。如有更多问题,欢迎交流学习!


http://www.mrgr.cn/news/33927.html

相关文章:

  • Project Online 高级版部署方案
  • 7款国内AI搜索引擎大全网站
  • Kotlin Android 环境搭建
  • uniapp map设置高度为100%后,会拉伸父容器的高度
  • MateBook 16s 2023在Deepin下开启性能模式,调节风扇转速到最大,全网首发!
  • 返利机器人在电商返利系统中的负载均衡实现
  • 【C语言零基础入门篇 - 17】:排序算法
  • PHP isset() 和 empty() 区别
  • 【C++】继承(上)
  • 定了,东湖高新区下半年中高级职称申报时间
  • java日志框架之Log4j
  • Golang | Leetcode Golang题解之第430题扁平化多级双向链表
  • C++标准库双向链表 list 中的insert函数实现。
  • C++离线查询
  • Golang | Leetcode Golang题解之第429题N叉树的层序遍历
  • Codeforces Round 969 (Div. 1) C. Eri and Expanded Sets(线段树维护差分数组gcd+双指针+尺取)
  • git-repo系列教程(4) windows平台下安装git-repo客户端
  • Leetcode 每日一题:Diameter of Binary Tree
  • AI教你学Python 第18天 : 线性数据结构
  • 程序员如何保持与提升核心竞争力