NN训练损失为何会变平?

时间:2020-07-03 09:53:28

标签: python deep-learning neural-network

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

问题是无论我在代码中做了什么更改,例如调整学习率,更改层数或不更改。节点或将激活函数从S形变为Relu到泄漏Relu,我最终的训练损失始于6.98,但始终收敛到3.24 ...

为什么?

请查看我的前进和后退道具算法。也许我无法识别出一些错误。

我的隐藏层使用泄漏的relu,最后一层使用S型激活。 我正在尝试对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)
    

#BACKPROPAGATION

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)]

1 个答案:

答案 0 :(得分:0)

实现似乎还可以。尽管您可以使用不同的模型/学习率/超级参数来收敛到相同的值,但令人恐惧的是每次都有相同的起始值,在您的情况下为6.98。

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