为什么在最后一层使用线性激活函数损失是nan?

数据挖掘 深度学习 Python
2022-03-01 22:20:17

我想用神经网络来解决一个简单的回归问题,我尝试自己编程,参考Backpropagation and Neural Networks讲座。但是,我遇到了损失分歧问题。

我的神经网络可以描述为:

l1=11+e(W0x+b0)

l2=W1l1+b1

损失是:

loss=(yl2)T(yl2)

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1)
x_pre = 2*np.random.normal(size = (1000,1))
y = x_pre**2 + -0.2*np.cos(3*np.pi*x_pre) 
y = y.reshape(y.shape[0],1)

def standard(data):
    mu = np.mean(data)
    std = np.var(data)
    return (data - mu)/std
x = standard(x_pre)

ndim = 10
w0 = 2*np.random.random((1,ndim))-1
w1 = 2*np.random.random((ndim,1))-1
np.random.seed(10)
b0 = np.random.normal(size = (1000,ndim))
b1 = np.random.normal(size = (1000,1))
lr = 1
for j in range(4):
    l1 = 1/(1+ np.exp(-(np.dot(x,w0)+ b0))) 
    l2 = np.dot(l1,w1)+ b1#1/(1+ np.exp(-(np.dot(l1,w1)+ b1)))
    l2_delta= np.mean(y - l2)*2*(y-l2)#mse
    l1_delta = l2_delta.dot(w1.T)*(l1*(1-l1))
    w1 += lr*l1.T.dot(l2_delta)
    w0 += lr*x.T.dot(l1_delta)
    b0 += lr* l1_delta
    b1 += lr*l2_delta
    print('loss',np.mean(y - l2))
l1 = 1/(1+ np.exp(-(np.dot(x,w0))))
l2 = 1/(1+ np.exp(-np.dot(l1,w1)))
y_hap =  l2

print(np.sum(np.square(y-y_hap)))
plt.plot(np.arange(len(y)),y,'r')
plt.plot(np.arange(len(y_hap)),y_hap,'g')
plt.show()

输出结果:

loss 3.485080512494127
loss -30525.316587393125
loss -3293457250652.145
loss -5.777133209515429e+28

任何人都知道如何解决它?

1个回答

似乎有很多初始化问题。

  1. 没有太多的偏见。每层只有 1 个。你的偏见形式似乎是错误的。
  2. 您可能已经使网络的形状正确,因为它不会返回形状错误。但请记住,#1 似乎很有可能是真的。

  3. w0 和 w1 也是如此。

考虑再次检查所有暗淡。如果需要,我将在 python 中附加一个示例神经网络实现。

https://raw.githubusercontent.com/MasterSkepticista/NEAT_py/master/network.py

这是因为它恰好在 Andrew Ng 的课程中​​教授。