从零开始实现Adam优化算法

320 篇文章 87 订阅
订阅专栏
284 篇文章 56 订阅
订阅专栏

        【翻译自 :   Code Adam Optimization Algorithm From Scratch】

       【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,希望能帮到有需要的人!】

        梯度下降是一种优化算法,遵循目标函数的负梯度以定位函数的最小值。

       梯度下降的局限性是,所有输入变量都使用单个步长(学习率)。像AdaGrad和RMSProp这样的梯度下降的扩展会更新算法,以对每个输入变量使用单独的步长,但可能会导致步长迅速减小到非常小的值。自适应运动估计算法(Adam)是梯度下降的扩展,是AdaGrad和RMSProp等技术的自然继承者,该技术可自动为目标函数的每个输入变量调整学习率,并通过使用以指数方式降低梯度的移动平均值以更新变量。

       在本教程中,您将发现如何从头开始使用Adam优化算法开发梯度下降。完成本教程后,您将知道:

梯度下降是一种优化算法,它使用目标函数的梯度来导航搜索空间。
可以通过使用称为Adam的偏导数的递减平均值,将梯度下降更新为对每个输入变量使用自动自适应步长。
如何从头开始实施Adam优化算法并将其应用于目标函数并评估结果。

教程概述

       本教程分为三个部分:他们是:

梯度下降
Adam优化算法
Adam梯度下降
     二维测试问题
     Adam的梯度下降优化
     Adam可视化


梯度下降

      梯度下降是一种优化算法。它在技术上称为一阶优化算法,因为它明确利用了目标目标函数的一阶导数。一阶导数,或简称为“导数”,是目标函数在特定点(例如,点)上的变化率或斜率。用于特定输入。如果目标函数采用多个输入变量,则将其称为多元函数,并且可以将输入变量视为向量。反过来,多元目标函数的导数也可以视为向量,通常称为梯度。

      梯度:多元目标函数的一阶导数。
      对于特定输入,导数或梯度指向目标函数最陡峭的上升方向。

      梯度下降是指一种最小化优化算法,该算法遵循目标函数的下坡梯度负值来定位函数的最小值。梯度下降算法需要一个正在优化的目标函数和该目标函数的导数函数。目标函数f()返回给定输入集合的分数,导数函数f'()给出给定输入集合的目标函数的导数。梯度下降算法需要问题中的起点(x),例如输入空间中的随机选择点。

       假设我们正在最小化目标函数,然后计算导数并在输入空间中采取一步,这将导致目标函数下坡运动。下坡运动是通过首先计算输入空间中的运动量来进行的,计算方法是将步长(称为alpha或学习率)乘以坡度。然后从当前点减去该值,以确保我们逆梯度移动或向下移动目标函数。

                                                                   x(t)= x(t-1)–step* f'(x(t-1))
       在给定点的目标函数越陡峭,梯度的幅度越大,反过来,在搜索空间中采取的步伐也越大。使用步长超参数来缩放步长的大小。

       步长(alpha):超参数,控制算法每次迭代时相对于梯度在搜索空间中移动多远。
       如果步长太小,则搜索空间中的移动将很小,并且搜索将花费很长时间。如果步长太大,则搜索可能会在搜索空间附近反弹并跳过最优值。

      现在我们已经熟悉了梯度下降优化算法,下面让我们看一下Adam算法。

Adam优化算法

        自适应运动估计算法(简称“Adam”)是梯度下降优化算法的扩展。Diederik Kingma和Jimmy Lei Ba在2014年发表的题为“Adam:随机优化方法”的论文中描述了该算法。Adam旨在加速优化过程,例如减少达到最佳状态所需的功能评估次数,或提高优化算法的功能,例如产生更好的最终结果。这是通过为每个要优化的输入参数计算步长来实现的。重要的是,每个步长都将根据每个变量遇到的梯度(偏导数)自动调整搜索过程的吞吐量。

        让我们逐步介绍该算法的每个元素。首先,对于作为搜索一部分而被优化的每个参数,我们必须维持一个矩矢量和指数加权无穷大范数,分别称为m和v(真是希腊字母nu)。在搜索开始时将它们初始化为0.0。

m = 0
v = 0
        该算法在从t = 1开始的时间t内迭代执行,并且每次迭代都涉及计算一组新的参数值x,例如。从x(t-1)到x(t)。如果我们专注于更新一个参数,这可能很容易理解该算法,该算法概括为通过矢量运算来更新所有参数。首先,计算当前时间步长的梯度(偏导数)。

                                                                                                          g(t)= f'(x(t-1))
        接下来,使用梯度和超参数beta1更新第一时刻。

                                                                                      m(t)= beta1 * m(t-1)+(1 – beta1)* g(t)
       然后,使用平方梯度和超参数beta2更新第二时刻。

                                                                                v(t)= beta2 * v(t-1)+(1 – beta2)* g(t)^ 2
       由于第一和第二力矩是用零值初始化的,所以它们是有偏的。接下来,对第一力矩和第二力矩进行偏差校正,并以第一力矩为起点:

                                                                               mhat(t)= m(t)/(1 – beta1(t))
        然后第二个时刻:

                                                                             vhat(t)= v(t)/(1 – beta2(t))
        注意,beta1(t)和beta2(t)指的是beta1和beta2超参数,它们在算法的迭代过程中按时间表衰减。可以使用静态衰减时间表,尽管该论文建议以下内容:

                                                                                                        beta1(t)= beta1 ^ t
                                                                                                      beta2(t)= beta2 ^ t
         最后,我们可以为该迭代计算参数的值。

                                                                             x(t)= x(t-1)– alpha * mhat(t)/(sqrt(vhat(t))+ eps)
         其中alpha是步长超参数,eps是一个较小的值(epsilon),例如1e-8,可确保我们不会遇到被零除的误差,而sqrt()是平方根函数。

         注意,可以使用对本文中列出的更新规则进行更有效的重新排序:

                                                                          alpha(t)= alpha * sqrt(1 – beta2(t))/(1 – beta1(t))
                                                                         x(t)= x(t-1)– alpha(t)* m(t)/(sqrt(v(t))+ eps)
         回顾一下,该算法有三个超参数,它们是:

        alpha:初始步长(学习率),典型值为0.001。
        beta1:第一个动量的衰减因子,典型值为0.9。
        beta2:无穷大范数的衰减因子,典型值为0.999。
接下来,让我们看看如何在Python中从头开始实现该算法。

Adam梯度下降

       在本节中,我们将探讨如何使用Adam实现梯度下降优化算法。

二维测试问题

        首先,让我们定义一个优化函数。我们将使用一个简单的二维函数,该函数将每个维的输入平方,并定义有效输入的范围(从-1.0到1.0)。

        下面的Objective()函数实现了此功能

# objective function
def objective(x, y):
	return x**2.0 + y**2.0

          我们可以创建数据集的三维图,以了解响应面的曲率。下面列出了绘制目标函数的完整示例。

# 3d plot of the test function
from numpy import arange
from numpy import meshgrid
from matplotlib import pyplot

# objective function
def objective(x, y):
	return x**2.0 + y**2.0

# define range for input
r_min, r_max = -1.0, 1.0
# sample input range uniformly at 0.1 increments
xaxis = arange(r_min, r_max, 0.1)
yaxis = arange(r_min, r_max, 0.1)
# create a mesh from the axis
x, y = meshgrid(xaxis, yaxis)
# compute targets
results = objective(x, y)
# create a surface plot with the jet color scheme
figure = pyplot.figure()
axis = figure.gca(projection='3d')
axis.plot_surface(x, y, results, cmap='jet')
# show the plot
pyplot.show()

          运行示例将创建目标函数的三维表面图。我们可以看到全局最小值为f(0,0)= 0的熟悉的碗形状。

          我们还可以创建函数的二维图。 这在以后要绘制搜索进度时会很有帮助。下面的示例创建目标函数的轮廓图。

# contour plot of the test function
from numpy import asarray
from numpy import arange
from numpy import meshgrid
from matplotlib import pyplot

# objective function
def objective(x, y):
	return x**2.0 + y**2.0

# define range for input
bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])
# sample input range uniformly at 0.1 increments
xaxis = arange(bounds[0,0], bounds[0,1], 0.1)
yaxis = arange(bounds[1,0], bounds[1,1], 0.1)
# create a mesh from the axis
x, y = meshgrid(xaxis, yaxis)
# compute targets
results = objective(x, y)
# create a filled contour plot with 50 levels and jet color scheme
pyplot.contourf(x, y, results, levels=50, cmap='jet')
# show the plot
pyplot.show()

          运行示例将创建目标函数的二维轮廓图。我们可以看到碗的形状被压缩为以颜色渐变显示的轮廓。 我们将使用该图来绘制在搜索过程中探索的特定点。

             现在我们有了一个测试目标函数,让我们看一下如何实现Adam优化算法。

Adam梯度下降优化

          我们可以将带有Adam的梯度下降应用于测试问题。首先,我们需要一个函数来计算此函数的导数。

f(x)= x ^ 2
f'(x)= x * 2
           x ^ 2的导数在每个维度上均为x * 2。 derived()函数在下面实现了这一点。

# derivative of objective function
def derivative(x, y):
	return asarray([x * 2.0, y * 2.0])

        接下来,我们可以实现梯度下降优化。首先,我们可以选择问题范围内的随机点作为搜索的起点。假定我们有一个数组,该数组定义搜索范围,每个维度一行,并且第一列定义最小值,第二列定义维度的最大值。

# generate an initial point
x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
score = objective(x[0], x[1])

        接下来,我们需要将第一时刻和第二时刻初始化为零。

# initialize first and second moments
m = [0.0 for _ in range(bounds.shape[0])]
v = [0.0 for _ in range(bounds.shape[0])]

        然后,我们运行由“ n_iter”超参数定义的算法的固定迭代次数。

...
# run iterations of gradient descent
for t in range(n_iter):
	...

        第一步是使用导数()函数计算当前解决方案的梯度。

# calculate gradient
gradient = derivative(solution[0], solution[1])

        第一步是计算当前参数集的导数。

# calculate gradient g(t)
g = derivative(x[0], x[1])

        接下来,我们需要执行Adam更新计算。 为了提高可读性,我们将使用命令式编程样式一次执行一个变量的这些计算。

         在实践中,我建议使用NumPy向量运算以提高效率。

...
# build a solution one variable at a time
for i in range(x.shape[0]):
	...

        首先,我们需要计算力矩。

# m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)
m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]

         然后是第二个时刻。

# v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2
v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2

         然后对第一和第二时刻进行偏差校正。

# mhat(t) = m(t) / (1 - beta1(t))
mhat = m[i] / (1.0 - beta1**(t+1))
# vhat(t) = v(t) / (1 - beta2(t))
vhat = v[i] / (1.0 - beta2**(t+1))

        然后最后是更新的变量值。

# x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + eps)
x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)

         然后,针对要优化的每个参数重复此操作。在迭代结束时,我们可以评估新的参数值并报告搜索的性能。

# evaluate candidate point
score = objective(x[0], x[1])
# report progress
print('>%d f(%s) = %.5f' % (t, x, score))

         我们可以将所有这些结合到一个名为adam()的函数中,该函数采用目标函数和派生函数的名称以及算法超参数,并返回在搜索及其评估结束时找到的最佳解决方案。

        下面列出了完整的功能。

# gradient descent algorithm with adam
def adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2, eps=1e-8):
	# generate an initial point
	x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
	score = objective(x[0], x[1])
	# initialize first and second moments
	m = [0.0 for _ in range(bounds.shape[0])]
	v = [0.0 for _ in range(bounds.shape[0])]
	# run the gradient descent updates
	for t in range(n_iter):
		# calculate gradient g(t)
		g = derivative(x[0], x[1])
		# build a solution one variable at a time
		for i in range(x.shape[0]):
			# m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)
			m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]
			# v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2
			v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2
			# mhat(t) = m(t) / (1 - beta1(t))
			mhat = m[i] / (1.0 - beta1**(t+1))
			# vhat(t) = v(t) / (1 - beta2(t))
			vhat = v[i] / (1.0 - beta2**(t+1))
			# x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + eps)
			x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)
		# evaluate candidate point
		score = objective(x[0], x[1])
		# report progress
		print('>%d f(%s) = %.5f' % (t, x, score))
	return [x, score]

        注意:为了提高可读性,我们有意使用列表和命令式编码样式,而不是矢量化操作。 随意将实现改编为带有NumPy数组的矢量化实现,以实现更好的性能。

       然后,我们可以定义我们的超参数并调用adam()函数来优化我们的测试目标函数。

      在这种情况下,我们将使用算法的60次迭代,初始步长为0.02,beta1和beta2值分别为0.8和0.999。 经过一些反复试验后,发现了这些超参数值。

# seed the pseudo random number generator
seed(1)
# define range for input
bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])
# define the total iterations
n_iter = 60
# steps size
alpha = 0.02
# factor for average gradient
beta1 = 0.8
# factor for average squared gradient
beta2 = 0.999
# perform the gradient descent search with adam
best, score = adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2)
print('Done!')
print('f(%s) = %f' % (best, score))

        综合所有这些,下面列出了使用Adam进行梯度下降优化的完整示例。

# gradient descent optimization with adam for a two-dimensional test function
from math import sqrt
from numpy import asarray
from numpy.random import rand
from numpy.random import seed

# objective function
def objective(x, y):
	return x**2.0 + y**2.0

# derivative of objective function
def derivative(x, y):
	return asarray([x * 2.0, y * 2.0])

# gradient descent algorithm with adam
def adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2, eps=1e-8):
	# generate an initial point
	x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
	score = objective(x[0], x[1])
	# initialize first and second moments
	m = [0.0 for _ in range(bounds.shape[0])]
	v = [0.0 for _ in range(bounds.shape[0])]
	# run the gradient descent updates
	for t in range(n_iter):
		# calculate gradient g(t)
		g = derivative(x[0], x[1])
		# build a solution one variable at a time
		for i in range(x.shape[0]):
			# m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)
			m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]
			# v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2
			v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2
			# mhat(t) = m(t) / (1 - beta1(t))
			mhat = m[i] / (1.0 - beta1**(t+1))
			# vhat(t) = v(t) / (1 - beta2(t))
			vhat = v[i] / (1.0 - beta2**(t+1))
			# x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + eps)
			x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)
		# evaluate candidate point
		score = objective(x[0], x[1])
		# report progress
		print('>%d f(%s) = %.5f' % (t, x, score))
	return [x, score]

# seed the pseudo random number generator
seed(1)
# define range for input
bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])
# define the total iterations
n_iter = 60
# steps size
alpha = 0.02
# factor for average gradient
beta1 = 0.8
# factor for average squared gradient
beta2 = 0.999
# perform the gradient descent search with adam
best, score = adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2)
print('Done!')
print('f(%s) = %f' % (best, score))

          运行示例将Adam优化算法应用于我们的测试问题,并报告算法每次迭代的搜索性能。

          注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。 考虑运行该示例几次并比较平均结果。

        在这种情况下,我们可以看到在搜索53次迭代后找到了接近最佳的解决方案,输入值接近0.0和0.0,评估为0.0。

>50 f([-0.00056912 -0.00321961]) = 0.00001
>51 f([-0.00052452 -0.00286514]) = 0.00001
>52 f([-0.00043908 -0.00251304]) = 0.00001
>53 f([-0.0003283  -0.00217044]) = 0.00000
>54 f([-0.00020731 -0.00184302]) = 0.00000
>55 f([-8.95352320e-05 -1.53514076e-03]) = 0.00000
>56 f([ 1.43050285e-05 -1.25002847e-03]) = 0.00000
>57 f([ 9.67123406e-05 -9.89850279e-04]) = 0.00000
>58 f([ 0.00015359 -0.00075587]) = 0.00000
>59 f([ 0.00018407 -0.00054858]) = 0.00000
Done!
f([ 0.00018407 -0.00054858]) = 0.000000

Adam可视化

       我们可以在域的轮廓图上绘制Adam搜索的进度。这可以为算法迭代过程中的搜索进度提供直观的认识。我们必须更新adam()函数以维护在搜索过程中找到的所有解决方案的列表,然后在搜索结束时返回此列表。下面列出了具有这些更改的功能的更新版本。

# gradient descent algorithm with adam
def adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2, eps=1e-8):
	solutions = list()
	# generate an initial point
	x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
	score = objective(x[0], x[1])
	# initialize first and second moments
	m = [0.0 for _ in range(bounds.shape[0])]
	v = [0.0 for _ in range(bounds.shape[0])]
	# run the gradient descent updates
	for t in range(n_iter):
		# calculate gradient g(t)
		g = derivative(x[0], x[1])
		# build a solution one variable at a time
		for i in range(bounds.shape[0]):
			# m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)
			m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]
			# v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2
			v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2
			# mhat(t) = m(t) / (1 - beta1(t))
			mhat = m[i] / (1.0 - beta1**(t+1))
			# vhat(t) = v(t) / (1 - beta2(t))
			vhat = v[i] / (1.0 - beta2**(t+1))
			# x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + ep)
			x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)
		# evaluate candidate point
		score = objective(x[0], x[1])
		# keep track of solutions
		solutions.append(x.copy())
		# report progress
		print('>%d f(%s) = %.5f' % (t, x, score))
	return solutions

        然后,我们可以像以前一样执行搜索,这一次将检索解决方案列表,而不是最佳的最终解决方案。

# seed the pseudo random number generator
seed(1)
# define range for input
bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])
# define the total iterations
n_iter = 60
# steps size
alpha = 0.02
# factor for average gradient
beta1 = 0.8
# factor for average squared gradient
beta2 = 0.999
# perform the gradient descent search with adam
solutions = adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2)

           然后,我们可以像以前一样创建目标函数的轮廓图。

# sample input range uniformly at 0.1 increments
xaxis = arange(bounds[0,0], bounds[0,1], 0.1)
yaxis = arange(bounds[1,0], bounds[1,1], 0.1)
# create a mesh from the axis
x, y = meshgrid(xaxis, yaxis)
# compute targets
results = objective(x, y)
# create a filled contour plot with 50 levels and jet color scheme
pyplot.contourf(x, y, results, levels=50, cmap='jet')

       最后,我们可以将在搜索过程中找到的每个解决方案绘制成一条由一条线连接的白点。

# plot the sample as black circles
solutions = asarray(solutions)
pyplot.plot(solutions[:, 0], solutions[:, 1], '.-', color='w')

         综上所述,下面列出了对测试问题执行Adam优化并将结果绘制在轮廓图上的完整示例。

# example of plotting the adam search on a contour plot of the test function
from math import sqrt
from numpy import asarray
from numpy import arange
from numpy.random import rand
from numpy.random import seed
from numpy import meshgrid
from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D

# objective function
def objective(x, y):
	return x**2.0 + y**2.0

# derivative of objective function
def derivative(x, y):
	return asarray([x * 2.0, y * 2.0])

# gradient descent algorithm with adam
def adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2, eps=1e-8):
	solutions = list()
	# generate an initial point
	x = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0])
	score = objective(x[0], x[1])
	# initialize first and second moments
	m = [0.0 for _ in range(bounds.shape[0])]
	v = [0.0 for _ in range(bounds.shape[0])]
	# run the gradient descent updates
	for t in range(n_iter):
		# calculate gradient g(t)
		g = derivative(x[0], x[1])
		# build a solution one variable at a time
		for i in range(bounds.shape[0]):
			# m(t) = beta1 * m(t-1) + (1 - beta1) * g(t)
			m[i] = beta1 * m[i] + (1.0 - beta1) * g[i]
			# v(t) = beta2 * v(t-1) + (1 - beta2) * g(t)^2
			v[i] = beta2 * v[i] + (1.0 - beta2) * g[i]**2
			# mhat(t) = m(t) / (1 - beta1(t))
			mhat = m[i] / (1.0 - beta1**(t+1))
			# vhat(t) = v(t) / (1 - beta2(t))
			vhat = v[i] / (1.0 - beta2**(t+1))
			# x(t) = x(t-1) - alpha * mhat(t) / (sqrt(vhat(t)) + ep)
			x[i] = x[i] - alpha * mhat / (sqrt(vhat) + eps)
		# evaluate candidate point
		score = objective(x[0], x[1])
		# keep track of solutions
		solutions.append(x.copy())
		# report progress
		print('>%d f(%s) = %.5f' % (t, x, score))
	return solutions

# seed the pseudo random number generator
seed(1)
# define range for input
bounds = asarray([[-1.0, 1.0], [-1.0, 1.0]])
# define the total iterations
n_iter = 60
# steps size
alpha = 0.02
# factor for average gradient
beta1 = 0.8
# factor for average squared gradient
beta2 = 0.999
# perform the gradient descent search with adam
solutions = adam(objective, derivative, bounds, n_iter, alpha, beta1, beta2)
# sample input range uniformly at 0.1 increments
xaxis = arange(bounds[0,0], bounds[0,1], 0.1)
yaxis = arange(bounds[1,0], bounds[1,1], 0.1)
# create a mesh from the axis
x, y = meshgrid(xaxis, yaxis)
# compute targets
results = objective(x, y)
# create a filled contour plot with 50 levels and jet color scheme
pyplot.contourf(x, y, results, levels=50, cmap='jet')
# plot the sample as black circles
solutions = asarray(solutions)
pyplot.plot(solutions[:, 0], solutions[:, 1], '.-', color='w')
# show the plot
pyplot.show()

       运行示例将像以前一样执行搜索,但是在这种情况下,将创建目标函数的轮廓图。

        在这种情况下,我们可以看到在搜索过程中找到的每个解决方案都显示一个白点,从最优点开始,逐渐靠近图中心的最优点。

 

 

 

 

 

 

 

 

 

Matlab教程之了解 Adam 优化算法:深入研究公式
code2day的博客
08-01 1326
Adam 优化算法因其高效性和适应性而在训练机器学习和深度学习模型中变得流行。Adam由Diederik Kingma 和 Jimmy Ba开发,结合​​了Momentum和RMSprop优化算法的优点。在这篇文章中,我们将重点了解 Adam 优化算法背后的公式,逐步分解其组件,以全面了解其内部工作原理。
Adam优化算法原理详解(吴恩达深度学习笔记)
01-06
在介绍Adam之前首先介绍一下momentum和RMSprop优化算法。 一、momentum 1、指数加权平均数 指数加权平均数不仅考虑了当前数值也涵盖了以前的数据对现在的影响。 解释指数加权平均值名称的由来: 指数加权平均值的...
Adam随机梯度下降优化:Adam随机梯度下降优化算法的Matlab实现-matlab开发
05-29
`fmin_adam` 是来自 Kingma 和 Ba [1] 的 Adam 优化算法(具有自适应学习率的梯度下降,每个参数单独使用 Momentum)的实现Adam 设计用于处理随机梯度下降问题; 即当仅使用小批量数据来估计每次迭代的梯度时,或使用随机 dropout 正则化时 [2]。 有关示例,请参阅 GIT 存储库: https://github.com/DylanMuir/fmin_adam 用法: [x, fval, exitflag, output] = fmin_adam(fun, x0 <, stepSize, beta1, beta2, epsilon, nEpochSize, options>) 有关详细参考,请参见功能帮助。 github 存储库有几个示例。 参考: [1] Diederik P. Kingma,Jimmy Ba。 “亚当:随机优化方法”
Adam 实现
zlhn123的博客
01-26 990
 
2024-04-10 问AI: 在深度学习中,Adam优化器是什么?
最新发布
baidu_24377669的博客
04-10 1025
Adam优化器(Adaptive Moment Estimation)是一种在深度学习中广泛使用的优化算法,用于更新和计算模型中的参数,以便最小化或最大化损失函数。综上所述,Adam优化器以其自适应的特性、高效的内存使用和在多种问题上的优秀表现,成为了深度学习领域中最受欢迎的优化算法之一。在使用Adam优化器时,通常需要设置一些超参数,如学习率、beta1(一阶矩估计的指数衰减率)和beta2(二阶矩估计的指数衰减率)。由于它适应性强的学习率,因此在训练深度神经网络时,通常能够提供良好的收敛速度和稳定性。
Adam优化器实现
wxyczhyza的博客
06-27 927
Adam实现
机器学习之Adam(Adaptive Moment Estimation)自适应学习率
qq_42244167的博客
08-24 5973
然而,对于特定任务和问题,有时候可能需要调整Adam的超参数,如学习率、动量参数等,以获得最佳的性能。它是一种自适应学习率的优化算法,可以根据不同参数的梯度信息来动态调整学习率,以提高训练的效率和稳定性。:Adam算法使用了每个参数的自适应学习率,这意味着不同参数可以具有不同的学习率。它使用梯度的平方的移动平均来估计每个参数的适当学习率。这允许算法对不同参数的更新速度进行调整,从而更好地适应不同参数的特性。动量项的引入使得更新的方向不仅取决于当前梯度,还受到历史梯度的影响。
Adam优化算法
Steve Wang's blog
12-05 7803
Adam Optimization Algorithm. Adam refer to Adaptive Moment estimation. 要看懂这篇博文,你需要先看懂: 指数加权平均 使用动量的梯度下降法 RMSprop 整理并翻译自吴恩达深度学习系列视频: https://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn...
深度学习最常用的学习算法:Adam优化算法
热门推荐
leadai的博客
01-26 11万+
正文共6547个字,32张图,预计阅读时间17分钟。听说你了解深度学习最常用的学习算法:Adam优化算法?-深度学习世界。深度学习常常需要大量的时间和机算资源进行训练,这也是困扰深度学习算法开发的重大原因。虽然我们可以采用分布式并行训练加速模型的学习,但所需的计算资源并没有丝毫减少。而唯有需要资源更少、令模型收敛更快的最优化算法,才能从根本上加速机器的学习速度和效果,Adam 算法正为此而生!Ad
myCNN.rar_ADAM_Adam算法_CNN_OAI_adam优化
09-24
CNN实现手写数字识别,sk-learn实现Adam优化算法
吴恩达深度学习Mini-batch Gradient Descent 以及Momentum、Adam算法Python亲测调通版本
12-27
自己微调版本,含注释和数据集,一个程序就能运行,是吴恩达深度学习课程的课后作业
优化算法的matlab代码
04-22
关于欠定盲分离问题的算法,基于矩阵的稀疏性,建立在稀疏成分分析上的matlab代码
reguralization_Adam算法_python优化算法_ADAM_adam优化_discovervol_
10-02
利用python的深度学习优化算法,比如优化算法Adam
fmin_adam:亚当随机梯度下降优化算法的Matlab实现
02-04
fmin_adam:亚当随机梯度下降优化算法的Matlab实现
Adam 优化器
m0_50534425的博客
05-23 3万+
深度学习中的神经网络优化。它结合了RMSProp和Momentum两种优化算法的思想,并且对参数的更新进行了归一化处理,使得每个参数的更新都有一个相似的量级,从而提高训练效果。具体来说,Adam优化器定义了两个指数加权平均值:第一个指数加权平均值是梯度的指数加权平均值,第二个指数加权平均值是梯度的平方的指数加权平均值。1.自适应调整学习率:Adam 优化器可以根据历史梯度信息来自适应地调节学习率,使得在训练初期使用较大的学习率,能够快速收敛,在训练后期使用较小的学习率,能够更加准确地找到损失函数的最小值。
Adam优化器(通俗理解)
BeiErGeLaiDe的博客
07-29 6万+
Adam,名字来自:Adaptive Moment Estimation,自适应矩估计。是2014年提出的一种万金油式的优化器,使用起来非常方便,梯度下降速度快,但是容易在最优值附近震荡。竞赛中性能会略逊于SGD,毕竟最简单的才是最有效的。但是超强的易用性使得Adam被广泛使用。...
Adam优化算法(Adam optimization algorithm)
bestrivern的博客
01-11 4万+
一.算法概述及实现步骤 Adam优化算法基本上就是将Momentum和RMSprop结合在一起。 1.初始化 2.在第t次迭代中,用mini-batch梯度下降法计算出和 3.计算Momentum指数加权平均数 4.用RMSprop进行更新 5.计算Momentum和RMSprop的偏差修正 6.更新权重   Adam的参数配置: :同样也称为学习率或步长因子,它控制了权重...
Adam优化算法详细解析
luoxuexiong的博客
05-21 10万+
本文转载于以下博客地址:http://www.atyun.com/2257.html 如有冒犯,还望谅解! Adam优化算法是一种对随机梯度下降法的扩展,最近在计算机视觉和自然语言处理中广泛应用于深度学习应用。在引入该算法时,OpenAI的Diederik Kingma和多伦多大学的Jimmy Ba在他们的2015 ICLR发表了一篇名为“Adam: A Method for Stochast...
h3-CNN-记录遇到的API,各种库函数
weixin_43963453的博客
02-17 276
库函数总结Python Build-in Python Build-in sorted()函数 image_dir = sorted(os.listdir(path)) 函数返回:
Adam优化算法实现
06-10
Adam(Adaptive Moment Estimation)是一种常用的优化算法,它结合了 AdaGrad 和 RMSprop 的优点,在梯度下降过程中自适应地调整每个参数的学习率和动量,从而更快地收敛。其更新方法如下: 1. 初始化时间步 $t=0$,参数 $\theta$,一阶矩估计变量 $m_0=0$,二阶矩估计变量 $v_0=0$。 2. 在时间步 $t$,计算当前的梯度 $g_t$。 3. 计算一阶矩估计变量 $m_t=\beta_1 m_{t-1}+(1-\beta_1)g_t$,其中 $m_t$ 表示当前时间步的梯度平均值,$\beta_1$ 是超参数,通常取值为0.9。 4. 计算二阶矩估计变量 $v_t=\beta_2 v_{t-1}+(1-\beta_2)g_t^2$,其中 $v_t$ 表示当前时间步的梯度平方的指数加权移动平均数,$\beta_2$ 是超参数,通常取值为0.999。 5. 计算偏差修正后的一阶矩估计变量 $\hat{m}_t=\frac{m_t}{1-\beta_1^t}$,以及偏差修正后的二阶矩估计变量 $\hat{v}_t=\frac{v_t}{1-\beta_2^t}$。 6. 计算参数的更新量 $\Delta\theta_t=-\frac{\eta}{\sqrt{\hat{v}_t}+\epsilon}\hat{m}_t$,其中 $\eta$ 是学习率,$\epsilon$ 是一个很小的常数,防止分母为0。 7. 更新参数 $\theta_{t+1}=\theta_t+\Delta\theta_t$。 通过 Adam 算法,可以实现在训练过程中自适应地调整每个参数的学习率和动量,从而更快地收敛。同时,Adam 算法还可以防止梯度变化剧烈导致的参数更新震荡,提高模型的训练效率和准确率。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • windows下kafka环境完整搭建,Python调用kafka构建完整实例分析与应用 118265
  • python神奇函数之eval()学习 72702
  • 解决python错误提示“non-default argument follows default argument” 55402
  • 【剑指Offer学习】【所有面试题汇总】 51474
  • python四种方法实现去除列表中的重复元素 51443

分类专栏

  • 目标检测实战 付费 43篇
  • 完整源码项目实战 付费 13篇
  • 数据建模实战专栏 付费 31篇
  • CNN、LSTM建模实战专栏 付费 32篇
  • python实践 320篇
  • Linux基础 13篇
  • leetcode 3篇
  • 面试准备 17篇
  • web页面计算 8篇
  • 结构计算 8篇
  • 软件安装 34篇
  • 计算机并行处理 2篇
  • 算法 96篇
  • 编程技术 369篇
  • 机器学习 284篇
  • 杂谈 42篇
  • 面试工作 151篇
  • 软件工具使用 130篇
  • 数学 11篇
  • 社交网络 8篇
  • 页面更新识别 29篇
  • 深度学习 167篇
  • Linux 13篇
  • 读书笔记 12篇
  • java、scala 7篇
  • 数据库 11篇
  • 大数据 14篇

最新评论

  • 助力质检维护,基于超轻量级分割模型ege-unet开发构建水泥基建裂缝分割识别系统

    wqybiss: 你好,有推理代码了吗

  • 再度进化,ChatGLM2-6B详细学习实践记录与资料分享

    qq_42011501: 请问glm3-6bnei的hua环境txt里transformers=4.30。而权重文件下要求是transformers>=4.30.2,是以那个为准?

  • 技术革新引领钢材质量智能化检测新纪元,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3spp】参数模型开发构建钢材工业生产场景下钢材缺陷智能检测识别系统

    菜鸟的追梦旅行: 恳请您能帮帮忙,感谢

  • 无人机助力违法毒品种植智能监测预警,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3spp】参数模型开发构建无人机航拍场景下的农村田园场景下非法种植罂粟花检测预警识别系统

    E18288263922: 哪里可以获取这个源代码和训练数据

  • 技术革新引领钢材质量智能化检测新纪元,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3spp】参数模型开发构建钢材工业生产场景下钢材缺陷智能检测识别系统

    菜鸟的追梦旅行: 请问文中的数据集能否分享

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 助力草莓智能自动化采摘,基于YOLO家族最新端到端实时目标检测算法YOLOv10全系列【n/s/m/b/l/x】参数模型开发构建果园种植采摘场景下草莓成熟度智能检测识别系统
  • 助力草莓智能自动化采摘,基于YOLOv9全系列【yolov9/t/s/m/c/e】+GELAN全系列【gelan/t/s/m/c/e】参数模型开发构建果园种植采摘场景下草莓成熟度智能检测识别系统
  • 助力草莓智能自动化采摘,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建果园种植采摘场景下草莓成熟度智能检测识别系统
2024
06月 37篇
05月 36篇
04月 33篇
03月 38篇
02月 32篇
01月 59篇
2023年359篇
2022年116篇
2021年106篇
2020年77篇
2019年170篇
2018年96篇
2017年536篇
2016年23篇

目录

目录

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码平湖网站设计坑梓网站排名优化观澜至尊标王惠州seo坪山SEO按天计费龙华外贸网站制作横岗网站关键词优化龙华seo网站优化爱联建站福永关键词按天扣费坪地模板推广横岗网站优化按天收费观澜设计网站沙井外贸网站设计大芬企业网站设计观澜企业网站建设南联网站开发坑梓外贸网站设计同乐网站优化软件惠州模板推广广州网站定制塘坑企业网站制作木棉湾品牌网站设计横岗网站推广方案塘坑网站优化龙华建网站盐田高端网站设计塘坑企业网站建设民治外贸网站设计南山网站优化推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化