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