评价此页

热身:numpy#

创建日期:2020 年 12 月 03 日 | 最后更新:2025 年 09 月 29 日 | 最后验证:2024 年 11 月 05 日

一个三阶多项式,通过最小化欧几里得距离平方,从 \(-\pi\)\(\pi\) 训练以预测 \(y=\sin(x)\)

此实现使用 numpy 手动计算前向传播、损失和后向传播。

numpy 数组是一个通用的 n 维数组;它对深度学习、梯度或计算图一无所知,仅仅是一种执行通用数值计算的方式。

99 388.2964989863209
199 263.5660647475677
299 179.9730610087652
399 123.9069187280723
499 86.27394654264089
599 60.99339907554943
699 43.9965872505971
799 32.55926734037074
899 24.856098205214266
999 19.663135374221856
1099 16.159059600215066
1199 13.792291629971178
1299 12.192097440995827
1399 11.109081657079427
1499 10.375325826526202
1599 9.87766683807366
1699 9.539770381012872
1799 9.310095230101755
1899 9.153805984344647
1999 9.047334329770528
Result: y = 0.011369133497771914 + 0.8463253638436126 x + -0.0019613647115636528 x^2 + -0.09184887781889801 x^3

import numpy as np
import math

# Create random input and output data
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)

# Randomly initialize weights
a = np.random.randn()
b = np.random.randn()
c = np.random.randn()
d = np.random.randn()

learning_rate = 1e-6
for t in range(2000):
    # Forward pass: compute predicted y
    # y = a + b x + c x^2 + d x^3
    y_pred = a + b * x + c * x ** 2 + d * x ** 3

    # Compute and print loss
    loss = np.square(y_pred - y).sum()
    if t % 100 == 99:
        print(t, loss)

    # Backprop to compute gradients of a, b, c, d with respect to loss
    grad_y_pred = 2.0 * (y_pred - y)
    grad_a = grad_y_pred.sum()
    grad_b = (grad_y_pred * x).sum()
    grad_c = (grad_y_pred * x ** 2).sum()
    grad_d = (grad_y_pred * x ** 3).sum()

    # Update weights
    a -= learning_rate * grad_a
    b -= learning_rate * grad_b
    c -= learning_rate * grad_c
    d -= learning_rate * grad_d

print(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')

脚本总运行时间: (0 分 0.232 秒)