梯度下降扩展函数示例

Gradient descent extended function example

这是我的梯度下降代码:

import numpy
def gradient_descent(func, grad_func, w_init, n_epochs=100, lr=0.001, verbose=0):
    
    i = 0
    w = w_init
    while i < n_epochs:
        
        delta_w = -lr * grad_func(w)
        w = w + delta_w
                
        if verbose > 0:
            print("f={}; w: {}".format(func(w), w))

        i += 1    
    
    return w

现在向我解释的示例具有简单的功能,即: f(p,q) = p^2 + q^2。 偏导数在向量中:[2p,2q],这很清楚。 该函数及其梯度的代码是:

def f(w):
    return numpy.sum(w*w)

def grad(w):
    return 2*w

所以计算结果是:

# starting point
w_init = numpy.array([10,10])

# learning rate
lr = 0.1

# apply gradient descent
w_opt = gradient_descent(f, grad, w_init, n_epochs=25, lr=lr, verbose=1)

我的问题是为另一个函数计算它,例如:f(p,q) = (p^2 + 2q^3)。我知道偏导数的值,但是如何将这些值实现到这个特定的代码中呢? 如何为其编写新函数f和梯度函数grad并用main函数计算?

可能您正在寻找这样的东西:

def f(w):
    return w[0] ** 2 + 2 * w[1] ** 3

def grad(w):
    return np.array([2 * w[0], 3 * w[1] ** 2])