Numpy 矢量化正则化梯度下降未通过数值检查

Numpy 矢量化正则化梯度下降未通过数值检查,numpy,machine-learning,logistic-regression,gradient-descent,Numpy,Machine Learning,Logistic Regression,Gradient Descent,我已经用Python编写了一个实现,使用对数回归的向量化正则化梯度下降的NumPy。我使用了数字检查方法来检查我的实现是否正确。数值检查验证了我的线性回归GD的实现,但是Logisitc失败了,我无法找到答案。任何帮助都将不胜感激。下面是: 这些是我计算成本和梯度的方法(更新函数计算梯度并更新参数): 代价函数没有包含正则化,但是我做的测试是正则化向量等于零,所以这无关紧要。我如何测试: def numerical_check(features, parameters, targets, cos

我已经用Python编写了一个实现,使用对数回归的向量化正则化梯度下降的NumPy。我使用了数字检查方法来检查我的实现是否正确。数值检查验证了我的线性回归GD的实现,但是Logisitc失败了,我无法找到答案。任何帮助都将不胜感激。下面是:

这些是我计算成本和梯度的方法(更新函数计算梯度并更新参数):

代价函数没有包含正则化,但是我做的测试是正则化向量等于零,所以这无关紧要。我如何测试:

def numerical_check(features, parameters, targets, cost_function, update_function, extra_param, delta):
gradients = - update_function(parameters, features, targets, extra_param)

parameters_minus = np.copy(parameters)
parameters_plus = np.copy(parameters)
parameters_minus[0, 0] = parameters_minus[0, 0] + delta
parameters_plus[0, 0] = parameters_plus[0, 0] - delta

approximate_gradient = - (cost_function(parameters_plus, features, targets) -
                          cost_function(parameters_minus, features, targets)) / (2 * delta) / parameters.shape[0]

return abs(gradients[0, 0] - approximate_gradient) <= delta
def数值检查(功能、参数、目标、成本函数、更新函数、额外参数、增量):
梯度=-更新函数(参数、特征、目标、额外参数)
参数_减号=np.copy(参数)
参数\u plus=np.copy(参数)
参数_减[0,0]=参数_减[0,0]+增量
参数加上[0,0]=参数加上[0,0]-增量
近似梯度=-(成本函数(参数加、特征、目标)-
成本函数(参数减去、特征、目标))/(2*delta)/参数。形状[0]

返回abs(梯度[0,0]-近似梯度)我想我在代码中发现了一个可能的错误,请告诉我这是否正确

numeric\u check
函数中,调用
update\u函数来初始化
梯度。但是,在上面的
\u update_函数
中,实际上并没有返回渐变,而是返回
参数的更新值

也就是说,请注意
\u update\u函数的返回语句如下:

return parameters - alpha / m * (
    features.T.dot(LogisticRegression._hypothesis(parameters, features) - targets)) + \
       (regularization_vector / m) * parameters
我想告诉你们的是,我在我的ML算法中做的是,为计算梯度创建一个单独的函数,例如

def _gradient(features, parameters, target):
    m = features.shape[0]
    return features.T.dot(LogisticRegression._hypothesis(parameters, features) - targets)) / m
然后更改
numeric\u check
函数以初始化
梯度,如下所示:

gradient = _gradient(features, parameters, target)

我希望这能解决您的问题。

您的成本函数中有一个错误。错误是由于括号的分布无效。我已经修好了

def _cost_function(parameters, features, targets):
    m = features.shape[0]
    
    return -np.sum(
        (    targets) * (np.log(    LogisticRegression._hypothesis(parameters, features)))
      + (1 - targets) * (np.log(1 - LogisticRegression._hypothesis(parameters, features)))
    ) / m

尝试干净地编写代码,如果最后一行不是
返回abs(梯度[0,0]…
),它有助于检测此类错误。此外,您确实不应该在最后一行的检查中重复使用
delta
。负的
delta
是完全有效的,但最后一行的
delta
必须是正的(和小的)。谢谢,保罗,是的,它实际上是
渐变[0,0]
,这是复制过程中的一个错误。是的,我会重新考虑在这里使用增量。看起来在我们看不到的地方有一个可变的默认值。顺便说一句,如果
\u update\u function
属于
LogisticRegression
,它可能是一个错误,因为它求助于
~。\u假设
。谢谢,我会编辑它。为了分离梯度但在当前情况下,并不是因为初始参数为零,所以我们更新参数的事实并不重要,我们仍然会在最后得到梯度。参数为零仍然不会抵消正则化和乘以α的效果,所以最后你必须做一个分离e函数来获得
梯度
。如果这有帮助,请升级投票并将其标记为正确,哈哈。非常感谢!今晚我将试一试。希望它有效,我可以批准答案:)
def _cost_function(parameters, features, targets):
    m = features.shape[0]
    
    return -np.sum(
        (    targets) * (np.log(    LogisticRegression._hypothesis(parameters, features)))
      + (1 - targets) * (np.log(1 - LogisticRegression._hypothesis(parameters, features)))
    ) / m