机器学习算法原理实现——神经网络反向传播,链式求导核心

记得先看之前的梯度下降文章!

 

 

 链式求导的核心来了,就高中数学知识:

 

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import numpy as np
import matplotlib.pyplot as plt
 
# Sigmoid 激活函数及其导数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))
 
def sigmoid_derivative(z):
    return sigmoid(z) * (1 - sigmoid(z))
 
# 前向传播
def forward(x, w, b):
    z = w * x + b
    return sigmoid(z), z
 
# 反向传播
def backward(y_pred, y_true, z, x):
    dz = (y_pred - y_true) * sigmoid_derivative(z)
    dw = dz * x
    db = dz
    return dw, db
 
# 初始化参数
w = 2
b = 1
# 生成数据:在真实函数上加入噪声
np.random.seed(42)
x = np.linspace(0, 5, 100)
y_true = 1 / (1 + np.exp(-(2 * x + 1))) # 这是我们的真实函数
y_true = y_true + np.random.normal(0, 0.02, len(x)) # 加入噪声
 
alpha = 0.1
epochs = 1000
 
losses = []
 
# 训练过程
for epoch in range(epochs):
    total_loss = 0
    for i in range(len(x)):
        y_pred, z = forward(x[i], w, b)
        error = y_true[i] - y_pred
        total_loss += error ** 2
        dw, db = backward(y_pred, y_true[i], z, x[i])
         
        # 更新参数
        w = w - alpha * dw
        b = b - alpha * db
     
    # 保存每个 epoch 的损失值
    losses.append(total_loss / len(x))
    if epoch % 100 == 0:
        print(f"Epoch {epoch}/{epochs} - Loss: {total_loss / len(x)}")
 
 
# 绘制预测值与实际值对比
y_preds = [forward(i, w, b)[0] for i in x]
plt.plot(x, y_true, 'ro', label="True values")
plt.plot(x, y_preds, 'bo', label="Predicted values")
plt.title("Predicted vs True values")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
 
plt.tight_layout()
plt.show()

  

看看输出:

 

 

 

 

 

 

 

 

posted @   bonelee  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2022-09-10 metersploit msf 常用命令
2022-09-10 windows 7 iso下载地址
2020-09-10 小样本学习文献
2019-09-10 联邦学习
2019-09-10 数据库索引数据结构总结——ART树就是前缀树
点击右上角即可分享
微信分享提示