六、前向传播与损失函数
前向传播与损失函数
(一)原理
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()
本文来自博客园,作者:桑年,转载请注明原文链接:https://www.cnblogs.com/clover-1105/p/23548559

浙公网安备 33010602011771号