神经网络的Numpy梯度-下降优化器

神经网络的Numpy梯度-下降优化器

在微分学中,一个函数的导数告诉我们,当输入变量发生微小变化时,输出会有多大变化。这个想法也可以扩展到多变量函数。本文展示了使用NumPy实现梯度下降算法的过程。这个想法非常简单–从一个任意的起点开始,向最小值移动(即梯度值的-v),并返回一个尽可能接近最小值的点。

GD()是一个用户定义的函数,用于这一目的。它接受以下参数。

  • gradient是一个函数,也可以是一个Python可调用对象,它接收一个向量并返回我们试图最小化的函数的梯度。
  • start是我们给函数的任意起点,它是一个单一的独立变量。它也可以是一个列表,多变量的Numpy数组。
  • learn_rate控制了向量被更新的幅度。
  • n_iter是该操作应该运行的迭代次数。
  • tol是规定每次迭代中最小移动量的公差水平。

下面是产生所需功能的实现。

示例:

import numpy as np
  
  
def GD(f, start, lr, n_iter=50, tol=1e-05):
    res = start
      
    for _ in range(n_iter):
        
        # gradient is calculated using the np.gradient 
        # function.
        new_val = -lr * np.gradient(f)
        if np.all(np.abs(new_val) <= tol):
            break
        res += new_val
          
    # we return a vector as the gradient can be
    # multivariable function. if the function has 1
    # dependent variable then it returns a scalar value.
    return res
  
  
# Example 1
f = np.array([1, 2, 4, 7, 11, 16], dtype=float)
print(f"The vector notation of global minima:{GD(f,10,0.01)}")
  
# Example 2
f = np.array([2, 4], dtype=float)
print(f'The vector notation of global minima: {GD(f,10,0.1)}')

输出:

全局最小值的矢量符号:[9.5 9.25 8.75 8.25 7.75 7.5 ] 。

全局最小值的向量符号:[2.0539126e-15 2.0539126e-15] 。

让我们详细看看这个函数中使用的相关概念。

容忍水平的应用

下面这行代码使GD()提前终止,如果更新小于或等于容忍度,则在n_iter完成之前返回,这特别加快了我们到达局部最小值或鞍点时的进程,由于梯度很低,增量运动非常缓慢,因此它加快了收敛速度。

if np.all(np.abs(new_val) <= tol):
   break

学习率的使用(超参数)

  • 学习率是一个非常关键的超参数,因为它影响到梯度下降算法的行为。例如,如果我们将学习率从0.2改为0.7,我们会得到另一个非常接近0的解决方案,但由于高学习率,x有很大的变化,即它多次通过最小值,因此它在结算到0之前会出现振荡。这种震荡增加了整个算法的收敛时间。
  • 一个小的学习率会导致缓慢的收敛,而且如果迭代次数过少,会使事情变得更糟,那么算法甚至可能在找到最小值之前就返回。

下面是一个例子,说明学习率是如何影响结果的。

示例:

import numpy as np
  
  
def GD(f, start, lr, n_iter=50, tol=1e-05):
    res = start
    for _ in range(n_iter):
        # gradient is calculated using the np.gradient function.
        new_val = -lr * np.gradient(f)
        if np.all(np.abs(new_val) <= tol):
            break
        res += new_val
  
    # we return a vector as the gradient can be multivariable function.
    # if the function has 1 dependent variable then it returns a scalar value.
    return res
  
  
f = np.array([2, 4], dtype=float)
# low learing rate doesn't allow to converge at global minima
print(f'The vector notation of global minima: {GD(f,10,0.001)}')

输出 :

[9.9 9.9]

算法返回的值甚至不接近0,这表明我们的算法在收敛到全局最小值之前就返回了。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程