即使在较大的 alpha 值下,梯度下降也不会收敛

问题描述

我正在尝试实现合适的梯度,但它没有收敛。我无法弄清楚问题所在。 当我使用 for 循环实现梯度下降时,它收敛了。 当我切换到使用矢量化方法时,它停止收敛,即使在很大的 alpha 值上也是如此。以下是我用来执行梯度下降的函数

def GenerateData():
    ds = pd.read_csv('./housing.csv',)
    ds = ds.dropna()
    ds = ds.iloc[:400,:]
    X = ds['median_income'].copy()
    y = ds['median_house_value'].copy()
    X = X.to_numpy()
    y = y.to_numpy()
    return X,y

#Non-Vectorized Approach
def average(X,y,W,b):
    N = X.shape[0]
    t_err = 0.0
    for i in range(N):
        t_err += (y[i] - (W * X[i] + b)) ** 2
    
    return t_err/ float(N)
def Grad_descent(X,b,alpha=0.01):

    N = X.shape[0]
    df_dw = 0
    df_db = 0
    for i in range(N):
        df_dw += -2 * X[i] * (y[i] - ( W * X[i] + b))
        df_db += -2*(y[i] - (W * X[i] + b))
    
    W = W - (1/float(N)) * df_dw * alpha
    b = b - (1/float(N)) * df_db * alpha

    return W,b
# Vectorized approach
def average(X,b):
    M = X.shape[0]
    t_err = 0.0
    t_err = np.sum(np.power(y - (X @ W + b),2))
    return t_err/ (2 * float(M))

def Grad_descent(X,alpha=0.01,epcs=10):
    N = X.shape[1]
    M = X.shape[0]

    W = np.zeros(N)
    b = np.ones(M)
    
    df_dW = 0
    df_db = 0
    for e in range(epcs):
        df_dW = np.transpose(X) @ ((X @ W + b) - y)
        df_db = (X @ W + b) - y

        W = W - (1/(2 *float(M))) * df_dW * alpha
        b = b - (1/(2 *float(M))) * df_db * alpha

        print('Epoch:',e,'loss: ',average(X,b))

    return W,b

我不明白为什么使用矢量化方法时梯度体面会发散。

x 形状为 (400,8),y 形状为 (400,1) 数据取自房价预测数据集 housing Ds

解决方法

好吧,我在 alpha [学习率] 上有点乱,发现 0.001 太高了 我将其更改为 1e-10 并开始收敛! 我还重构并更改了代码。

def average(X,y,W):
    M = X.shape[0]
    t_err = 0.0
    t_err = np.sum(np.power((X @ W) - y,2))
    return t_err/ (2 * float(M))

def Grad_descent(X,alpha=0.1,epcs=10):
    N = X.shape[1]
    M = X.shape[0]

    W = np.random.randn(N,1)

    for e in range(epcs):

        df_dW = (2/M) * X.T @ (X @ W - y)
        W = W - alpha * df_dW

        print('Epoch:',e,' loss:',average(X,W))

在我单独计算偏差项之前,但现在我将偏差列与 X 矩阵合并,因此权重向量的第一个元素用于偏差项。 学习率是我猜梯度下降不收敛的问题,而且成本函数结果非常大,导致从全局最小值跳得更高。