【问题标题】:Neural network - loss not converging神经网络 - 损失不收敛
【发布时间】:2019-02-20 15:14:07
【问题描述】:

这个网络包含一个输入层和一个输出层,没有非线性。输出只是输入的线性组合。我使用回归损失来训练网络。我根据一个简单的线性函数生成了一些随机的一维测试数据,并添加了高斯噪声。问题是损失函数不会收敛到零。

import numpy as np
import matplotlib.pyplot as plt

n = 100
alp = 1e-4
a0 = np.random.randn(100,1) # Also x
y = 7*a0+3+np.random.normal(0,1,(100,1))

w = np.random.randn(100,100)*0.01
b = np.random.randn(100,1)

def compute_loss(a1,y,w,b):
       return np.sum(np.power(y-w*a1-b,2))/2/n

def gradient_step(w,b,a1,y):

    w -= (alp/n)*np.dot((a1-y),a1.transpose())
    b -= (alp/n)*(a1-y)  
    return w,b

loss_vec = []
num_iterations = 10000

for i in range(num_iterations):

    a1 = np.dot(w,a0)+b
    loss_vec.append(compute_loss(a1,y,w,b))
    w,b = gradient_step(w,b,a1,y)
plt.plot(loss_vec)

【问题讨论】:

    标签: python neural-network gradient-descent convergence


    【解决方案1】:

    如果我正确理解您的代码,尽管您有 2 层,但您只有一个权重矩阵和一个偏置向量。这很奇怪,可能至少是您问题的一部分。

    【讨论】:

    • 是的,一个权重矩阵和一个偏置向量。没有隐藏层。只是输入和输出层。仍然奇怪的是什么?
    • 你有一个权重矩阵 w,但是你的计算损失函数很不稳定。你有np.sum(np.power(y-w*a1-b,2))/2/n,你应该有np.sum(np.power(y-a1,2))/2/n
    【解决方案2】:

    收敛还取决于您使用的 alpha 值。我玩了一下你的代码,并为

    alp = 5e-3
    

    我在对数 x 轴上绘制了以下收敛

    plt.semilogx(loss_vec)
    

    输出

    【讨论】:

    • 我承认,但您将不得不使用 alpha 值。您可以做的是生成一系列 alpha 值并将您的代码放入一个函数中,并为不同的 alpha 值调用它并绘制收敛图以查看最佳值。
    • 是的,我觉得不错。没有什么可以进一步缩短的。尝试生成 alpha = 0.1、0.5、0.01、0.05、0.001、0.005、0.0001 等。
    • 好的。另外,我认为在没有任何隐藏层的情况下期望接近零损失是不合理的,对吧?
    • 嗯,我无法对此发表评论,因为我对 NN 的了解几乎可以忽略不计。我对 alpha 的评论是基于我研究过的其他最小化问题。
    猜你喜欢
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2016-05-13
    • 2016-05-13
    • 1970-01-01
    • 2016-07-10
    • 2018-12-15
    • 2018-02-20
    相关资源
    最近更新 更多