评价此页

热身:numpy#

创建于:2020 年 12 月 3 日 | 最后更新:2020 年 12 月 3 日 | 最后验证:2024 年 11 月 5 日

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

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

numpy 数组是一个通用的 N 维数组;它不了解深度学习、梯度或计算图,只是一种执行通用数值计算的方式。

99 3977.1822667730075
199 2632.9665842995732
299 1744.0846284304607
399 1156.2971417835356
499 767.6125744884587
599 510.58777809337755
699 340.62509859074476
799 228.23372187140396
899 153.912412770934
999 104.76567294065885
1099 72.26613763768472
1199 50.774934080497985
1299 36.56324970119874
1399 27.165330950060202
1499 20.95064443773275
1599 16.840961913821346
1699 14.123278066001996
1799 12.326099136386503
1899 11.1376364540267
1999 10.3517102732154
Result: y = -0.001502297203477509 + 0.8186860605374503 x + 0.00025917126593323424 x^2 + -0.0879174276087672 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.237 秒)