我一直在努力研究人工智能,但我对此有疑问。
def sigmoid(x):
return 1/(1+np.exp(-x))
# Derivative of the sigmoid function
def sigmoid_prime(x):
return sigmoid(x) * (1 - sigmoid(x))
x = np.array([0.1, 0.3])
y = 0.2
weights = np.array([-0.8, 0.5])
# The learning rate, eta in the weight step equation
learnrate = 0.5
# The neural network output
nn_output = sigmoid(x[0]*weights[0] + x[1]*weights[1])
# or nn_output = sigmoid(np.dot(x, w))
# output error
error = y - nn_output
# error gradient
error_grad = error * sigmoid_prime(np.dot(x,w))
# Gradient descent step
del_w = [ learnrate * error_grad * x[0],
learnrate * error_grad * x[1]]
# or del_w = learnrate * error_grad * x
疑惑:
为什么我们只将权重乘以x,而不是y?
nn_output = sigmoid(x[0]*weights[0] + x[1]*weights[1])
为什么我们在计算梯度下降时增加x的值?
del_w = [ learnrate * error_grad * x[0],
learnrate * error_grad * x[1]]
与x[0]
和x[1]
答案 0 :(得分:2)
嗯。比喻救援!
想象一下,你正在将大炮瞄准目标。您可以调整目标曲柄(w
)以移动大炮(x
)以击中目标(y
)。所以你试图通过将曲柄设置(w
)应用到大炮(x
); 您无法使用目标本身(y
),,因为它不在您的控制之下。所以你开火了,你从目标(nn_output
)击中了一些位置。您可以看到错过了哪种方式以及您错过了多少(error
)以了解如何更改下一次拍摄的方位角和角度(w
)。
实际上,更准确地说,在神经网络中,x
(“输入”)并不是真正的大炮,而是所有射击的情况:风速,加农炮位置,加农炮模型和特殊性。 .. w
(“重量”)实际上不仅仅是一个曲柄:我们根据所有x
参数设置曲柄的知识(“如果加农炮离目标很远,那就是角度更高的“,”如果风来自北方,就这样调整“......)。
learnrate
是你在调整中的两倍。较高的学习率意味着你可以更快地调整(当你偏离目标时很好),但是当你需要更好的控制时,你可能会在另一个方向上超调。
可能让您感到困惑的一件事是x
和y
不是坐标,因此在其应用中并不对称。当您在屏幕上绘制圆圈时,同样对待x
和y
是有意义的。但是,在此处,x
和y
的关键值不同:x
是实际输入(例如x[0]
风速,x[1]
风向,{{1}大炮年龄,x[2]
雷达上的光点方向,x[3]
与雷达上的光点距离......),x[4]
是应该的输出( y
目标的经度,目标的y[0]
纬度) - 并且将它们视为同样没有任何意义。