Python NumPy-是否有可能提高相互递归数组计算的性能
考虑以下模块-Python NumPy-是否有可能提高相互递归数组计算的性能,python,numpy,Python,Numpy,考虑以下模块- """ simple nn """ import numpy as np TRAINING_SET = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]]) OUTPUT = np.array([[0, 0, 1, 1]]).T def train(epochs=100000): """ train a single layer neural network """ rng = np.random.def
""" simple nn """
import numpy as np
TRAINING_SET = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
OUTPUT = np.array([[0, 0, 1, 1]]).T
def train(epochs=100000):
""" train a single layer neural network """
rng = np.random.default_rng()
weights = 2 * rng.random((3, 1)) - 1
for _ in range(epochs):
layer = 1 /(1 + np.exp(-np.dot(TRAINING_SET, weights)))
weights += np.dot(TRAINING_SET.T, (OUTPUT - layer) * layer * (1 - layer))
print("Number of epochs:", epochs)
print("layer\n", layer)
print("weights\n", weights)
由于
层
和权重
是相互递归的,因此我不得不使用for
循环来计算它们。有没有更有效的方法?这里有一种方法可以完全摆脱for
循环。请注意,此问题不需要唯一定义最佳权重
,但可以恢复层
的最佳值
我假设当时代
趋于无穷大时,权重
和层
收敛到一些极限值(就像这个特定示例的情况一样)。如果是这样,我们期望权重的增量为零。我们有以下方程组:
0 == np.dot(TRAINING_SET.T, (OUTPUT - layer) * layer * (1 - layer))
layer == 1 /(1 + np.exp(-np.dot(TRAINING_SET, weights)))
使用一点代数,我们得到
OUTPUT == 1/(1 + np.exp(-TRAINING_SET @ weights))
请注意,由于OUTPUT
中有一些零元素,因此该等式不能精确成立。我们可以得到如下的数值近似值:
err = 1e-8
w = np.linalg.pinv(TRAINING_SET) @ -np.log(err + 1/(err + OUTPUT)-1)
比较层的结果
:
ws, lr = train(100000)
err = 1e-8
ws2 = np.linalg.pinv(TRAINING_SET) @ -np.log(err + 1/(err + OUTPUT)-1)
lr2 = 1 /(1 + np.exp(-np.dot(TRAINING_SET, ws2)))
print(lr - lr2)
# [[ 0.00301781]
# [ 0.00246096]
# [-0.00200824]
# [-0.0024629 ]]
此技术能否计算正确的权重
?大约“[[12.00865995][0.20449309][5.80021327]]`