资讯动态

深度学习7:神经网络学习4:随机梯度下降法(代码实现)

发布时间:2026/10/23 4:50:48 来源:尧图企业网站定制
目录标题一、概念二、代码实现三、代码测试四、超参影响一、概念梯度下降法Gradient Descent 是一种用于最小化目标函数的迭代优化算法。核心是沿着目标函数如损失函数的负梯度方向逐步调整参数从而逼近函数的最小值。梯度方向指示了函数增长最快的方向因此负梯度方向是函数下降最快的方向具体来说我们初始找到函数f ( x 1 , x 2 ) f(x_1, x_2)f(x1​,x2​)的一个点( x 1 , x 2 ) (x_1, x_2)(x1​,x2​)按下式进行更新x 1 ′ x 1 − η ∂ f ∂ x 1 x_1 x_1 - \eta \frac{\partial f}{\partial x_1}x1′​x1​−η∂x1​∂f​x 2 ′ x 2 − η ∂ f ∂ x 2 x_2 x_2 - \eta \frac{\partial f}{\partial x_2}x2′​x2​−η∂x2​∂f​这样就可以沿着负梯度方向找到一个新的点( x 1 ′ , x 2 ′ ) (x_1, x_2)(x1′​,x2′​)让函数值更小。这里的η \etaη表示每次的更新量在神经网络的学习过程中就代表了一次学习的步长一次学习多少、多大程度去更新参数称为学习率learning rate。学习率需要预先设定好过大或过小都会导致学习效果不佳。二、代码实现引用梯度方法numerical_gradient在blog: 深度学习5:神经网络学习2:数值微分偏导梯度importnumpyasnpimportmatplotlib.pyplotaspltfromcommon.gradientimportnumerical_gradient# 定义梯度下降法的函数defgradient_descent(f,init_x,lr0.01,num_iter100):xinit_x# 定义列表保存x的变化x_history[]# 循环迭代foriinrange(num_iter):# 这里是值传递不能引用传递不然引用修改这个历史记录list全都跟着改了x_history.append(x.copy())# 计算梯度 目标函数取一点计算梯度下降gradnumerical_gradient(f,x)# 更新参数x-lr*gradreturnx,np.array(x_history)三、代码测试importnumpyasnpimportmatplotlib.pyplotaspltfromcommon.gradientimportnumerical_gradient# 定义梯度下降法的函数defgradient_descent(f,init_x,lr0.01,num_iter100):xinit_x# 定义列表保存x的变化x_history[]# 循环迭代foriinrange(num_iter):# 这里是值传递不能引用传递不然引用修改这个历史记录list全都跟着改了x_history.append(x.copy())# 计算梯度 目标函数取一点计算梯度下降gradnumerical_gradient(f,x)# 更新参数x-lr*gradreturnx,np.array(x_history)# 定义目标函数 f(x1, x2) x1^2 x2^2deff(x):returnx[0]**2x[1]**2if__name____main__:# 1. 定义初始值init_xnp.array([-3.0,4.0])# 2. 定义超参数lr0.1# 定义过大会左右来回震荡,定义正好临界竟然不变下面刚好来回不变num_iter20# 3. 使用梯度下降法计算最小值点x,x_historygradient_descent(f,init_x,lr,num_iter)print(最小值点为,x)# 画图plt.plot([-5,5],[0,0],--b)plt.plot([0,0],[-5,5],--b)plt.scatter(x_history[:,0],x_history[:,1])plt.xlim([-3.5,3.5])plt.ylim([-4.5,4.5])plt.xlabel(x[0])plt.ylabel(x[1])#plt.show()plt.savefig(gradient_descent_result.png)四、超参影响上面测试当学习率为1效果如下

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑