【问题标题】:Gradient Descent algorithm resulting in Nan's梯度下降算法导致 Nan's
【发布时间】:2020-07-03 06:59:23
【问题描述】:

我正在尝试在 Python 中实现梯度下降算法,但我很难完成它。我有一个稀疏矩阵(X_sparse),我试图在其中找到两个矩阵(p 和 q),它们的乘积非常接近稀疏矩阵的非零条目上的条目。因此,为了找到构成矩阵 p 和 q 的向量 p[i] 和 q[j],我正在应用梯度下降。

代码如下:

def Gradient_Descent(X_sparse):
n_factors = 10
n_steps = 10
alpha = 0.01

#initializing the vectors randomly:
p = np.random.normal(0, .1, (X_sparse.shape[0], n_factors))
q = np.random.normal(0, .1, (X_sparse.shape[1], n_factors))

for k in range(0,n_steps):
    for (i,j) in zip(X_sparse.nonzero()[0],X_sparse.nonzero()[1]):
        err = X_sparse[i,j] - np.dot(p[i],q[j])
        p[i] = p[i] + alpha*q[j]*err
        q[j] = q[j] + alpha*p[i]*err
return (p,q)    

调用时,此函数同时返回 p 和 q:

array([[nan, nan, nan, ..., nan, nan, nan],
   [nan, nan, nan, ..., nan, nan, nan],
   [nan, nan, nan, ..., nan, nan, nan],
   ...,
   [nan, nan, nan, ..., nan, nan, nan],
   [nan, nan, nan, ..., nan, nan, nan],
   [nan, nan, nan, ..., nan, nan, nan]])

(至少 p 和 q 各有正确的形状)。谁能帮我弄清楚为什么?

编辑:我也收到这些警告

C:\Users\Bernard\anaconda3\lib\site-packages\ipykernel_launcher.py:14: RuntimeWarning: overflow encountered in multiply
C:\Users\Bernard\anaconda3\lib\site-packages\ipykernel_launcher.py:13: RuntimeWarning: overflow encountered in multiply del sys.path[0]
C:\Users\Bernard\anaconda3\lib\site-packages\ipykernel_launcher.py:13: RuntimeWarning: invalid value encountered in add del sys.path[0]

【问题讨论】:

    标签: python machine-learning gradient-descent


    【解决方案1】:

    您应该在 np.dot() 中将整行和整列相乘,而不仅仅是单个元素。并且还可以训练更长的迭代。

    您的错误是由于 X_sparse 中的大量数字导致梯度爆炸问题。所以你应该标准化你的数据。

    使用这个:

    def Gradient_Descent(X):
        X_sparse = X/np.max(X)           # normalizing values
        print(X_sparse)
        n_factors = 10
        n_steps = 10000                  # optimized
        alpha = 0.1                      # optimized
        
        #initializing the vectors randomly:
        p = np.random.normal(0, .01, (X_sparse.shape[0], n_factors))
        q = np.random.normal(0, .01, (n_factors, X_sparse.shape[1]))      # changed so as to follow matrix multiplication rule
        
        for k in range(0,n_steps):
            for (i,j) in zip(X_sparse.nonzero()[0],X_sparse.nonzero()[1]):
                err = X_sparse[i,j] - np.dot(p[i, :],q[:, j])              # multiply whole row and column
                p[i, :] = p[i, :] + alpha*q[:, j]*err                      # update whole row and column
                q[:, j] = q[:, j] + alpha*p[i, :]*err                      # update whole row and column
        print(np.dot(p, q)) 
        p = p*np.sqrt(np.max(X))                         # matrix multiplication rule for normalized values
        q = q*np.sqrt(np.max(X))                         # matrix multiplication rule for normalized values
        return (p,q)   
    

    因为在开始时,我们除以 np.max(X),所以我们应该将 p 和 q 乘以 np.sqrt(np.max(X))。

    它对我有用:

    Input: 
        X = np.array([[12, 0],
                      [16, 11],
                      [0, 230]])
        p, q = Gradient_Descent(X)
        print(np.dot(p, q))
    Output:
        array([[ 12.        ,  16.12096025],
               [ 16.        ,  11.        ],
               [ 26.17067276, 230.        ]])
    

    【讨论】:

    • 嗨,拉胡尔。它对我不起作用。仍然让 Nan 用这种方法。我不知道这是否重要,但我的稀疏矩阵的形状为 (69600, 9927)
    • 编辑:对于 n_steps = 2 它有效。不太清楚为什么它在多次迭代后不断返回 Nan's。
    • 您能否提供一些 X_sparse 无法正常工作的示例。
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 2014-01-11
    • 2017-07-17
    • 2019-06-24
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多