【问题标题】:Why does NN training loss flatten?为什么 NN 训练损失会变平?
【发布时间】:2020-10-24 00:43:59
【问题描述】:

我从头开始实现了一个深度学习神经网络,没有使用任何 python 框架,如 tensorflow 或 keras。

问题在于无论我在代码中进行什么更改,例如调整学习率或更改层或更改否。节点数量或将激活函数从 sigmoid 更改为 relu 再到leaky relu,我最终会得到一个从 6.98 开始但总是收敛到 3.24 的训练损失......

这是为什么呢?

请检查我的前进和后退道具算法。也许我无法识别其中有什么问题。

我的隐藏层使用泄漏 relu,最后一层使用 sigmoid 激活。 我正在尝试对 mnist 手写数字进行分类。

代码:

#FORWARDPROPAGATION

for i in range(layers-1):
    
    cache["a"+str(i+1)]=lrelu((np.dot(param["w"+str(i+1)],cache["a"+str(i)]))+param["b"+str(i+1)])


cache["a"+str(layers)]=sigmoid((np.dot(param["w"+str(layers)],cache["a"+str(layers-1)]))+param["b"+str(layers)])

yn=cache["a"+str(layers)]
m=X.shape[1]
cost=-np.sum((y*np.log(yn)+(1-y)*np.log(1-yn)))/m

if j%10==0:
    print(cost)
    costs.append(cost)
    

#反向传播

grad={"dz"+str(layers):yn-y}


for i in range(layers):
    grad["dw"+str(layers-i)]=np.dot(grad["dz"+str(layers-i)],cache["a"+str(layers-i-1)].T)/m
    

    grad["db"+str(layers-i)]=np.sum(grad["dz"+str(layers-i)],1,keepdims=True)/m
    
    if i<layers-1:
        grad["dz"+str(layers-i-1)]=np.dot(param["w"+str(layers-i)].T,grad["dz"+str(layers-i)])*lreluDer(cache["a"+str(layers-i-1)])

for i in range(layers):
    param["w"+str(i+1)]=param["w"+str(i+1)] - alpha*grad["dw"+str(i+1)]
    param["b"+str(i+1)]=param["b"+str(i+1)] - alpha*grad["db"+str(i+1)]

【问题讨论】:

  • 这两个数字 6.98 和 3.24 每次都完全相同吗?
  • 是的,它一直保持在 3.24 直到大约 10000 次迭代,然后我猜它会超调(我得到一些关于除以零的错误)。

标签: python deep-learning neural-network


【解决方案1】:

实施似乎没问题。虽然您可以使用不同的模型/学习率/超参数收敛到相同的值,但令人恐惧的是每次都具有相同的起始值,在您的情况下为 6.98。

我怀疑这与您的初始化有关。如果您最初将所有权重设置为零,则不会破坏对称性。 herehere 对此进行了充分详细的解释。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 2021-06-04
    • 2015-11-03
    • 2021-05-29
    • 2019-02-01
    • 2021-04-06
    • 2018-03-30
    • 2020-01-06
    • 1970-01-01
    相关资源
    最近更新 更多