六、前向传播与损失函数

前向传播与损失函数

(一)原理

1. 定义

前向传播是指在一个神经网络(或机器学习模型)中,从输入到输出的信息传递过程,具体来说,就是数据从输入层开始,经过隐藏层的一系列运算,最终传递到输出层得到预测结果的过程

2. 斜截式

通过斜截式公式计算预测值,配合参数优化,实现对多个散点的线性拟合

\[y=wx+b \]

x输入/特征;y输出/标签;w权重,决定直线的斜率;b偏置,决定直线的截距

令 b=0 ,直线过原点,此时模型退化为“正比例函数”

3. 单点误差

单点误差(Single-point Error) 指的是:模型针对某“一个”具体的样本数据,计算出的预测值与真实值之间的差距

计算公式通常为:e = 预测值 - 真实值

4. 理想状态

找到一组最优的参数(w 和 b),使得所有样本点的预测值与真实值之间的误差(通常是误差的平方和)达到最小。

在几何意义上,就是寻找一条直线,使它尽可能地穿过所有散点的“正中间”,此时得到的直线即为最终的最佳拟合直线。

5. 均方误差公式

\[MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \]

n 为样本总数; yᵢ 为真实值; ŷᵢ 为预测值

6. 总结

所有的神经网络(无论多复杂)都必定包含前向传播过程,它是模型进行预测的基础

7. 损失函数

  • 作用:损失函数用来衡量模型预测值 ŷ 与真实值 y 之间的不一致程度。损失函数的值越小,说明模型拟合得越好。
  • 关系:损失函数是一个统称(比如还有交叉熵损失等),均方误差(MSE)就是最常用的一种用于回归任务的损失函数。
  • 流程:前向传播计算损失 ==> 反向传播(Backpropagation)根据损失函数计算梯度 -> 更新参数(w,b),从而不断降低损失。

8. 补充

通过 MSE 找最优直线的过程,在机器学习中叫做“最小二乘法(Ordinary Least Squares, OLS)”,或者叫“线性回归”

前向传播得出误差后,需要依靠反向传播来更新权重 w 和偏置 b,两者配合才能完成模型的训练

(二)代码

# 导入库
import numpy as np
import matplotlib.pyplot as plt

# 1. 数据集的输入

# 定义输入的数据
data = [[0.8, 1.0], [1.7, 0.9], [2.7, 2.4], [3.2, 2.9], [3.7, 2.8], [4.2, 3.8],[4.2,2.7]]

# 转换成数组
data = np.array(data)

# 将标签(需要拟合的目标)和特征分离
x_data = data[:,0]
y_data = data[:,1]


# 2. 前向计算

# 公式:y = w * x + b
w = 0.8
b = 0
y_hat = w * x_data + b


# 3. 单点误差

# 误差
e = y_data - y_hat
print("单点误差 e:",e)


# 4. 均方误差(损失函数),图像的绘制

# 计算均方误差
e_bar = np.mean((y_data - y_hat) ** 2)  # 求数组的平均值
print("均方误差 e_bar:",e_bar)

# 绘制图像
fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)

# 装饰坐标轴
ax1.set_xlim(0,5)
ax1.set_ylim(0,6)
ax1.set_xlabel("x axis label")
ax1.set_ylabel("y axis label")

# 绘制数据集散点
ax1.scatter(x_data,y_data,color="b")

# 计算并绘制拟合线
y_lower = w * 0 + b
y_upper = w * 5 + b
ax1.plot([0,5],[y_lower, y_upper],color="r", linewidth=3)

# 绘制左侧图,散点到线的竖直线(距离)
for x,y_true,y_pre in zip(x_data,y_data,y_hat):
    ax1.plot([x,x],[y_true,y_pre],color="g",linewidth=2,linestyle="--")

# 绘制右侧 w 和 e 的曲线,先获取点,再绘制图
w_values = np.linspace(0,3,1000)    # 取大量的点组成数组
e_values = [np.mean(y_data - (w_value * x_data + b)) ** 2 for w_value in w_values]
ax2.plot(w_values,e_values,color="g",linewidth=3)

# 在曲线上绘制 w 的点
ax2.plot(w, e_bar, marker="o", color="r")
ax2.set_xlabel("w axis label")
ax2.set_ylabel("e axis label")

# 展示图像
plt.show()
posted @ 2026-11-04 15:44  桑年  阅读(2)  评论(0)    收藏  举报