线性模型 Linear-Model 数学原理分析以及源码实现 深度学习 Pytorch笔记 B站刘二大人(1/10)
数学原理分析
线性模型是我们在初级数学问题中所遇到的最普遍也是最多的一类问题
在线性模型中自变量和因变量呈线性关系,问题往往会给与单个或者多个自变量,给出部分因变量要求推导得到模型的数学表达式,或者根据已知自变量预测因变量,而后者也成为线性回归,linear regression,在后期也会着重讲到。可以从刘二老师的ppt中进行更为图像化的理解
我们也都知道,线性模型的普遍表达式为
在深度学习中,将w称之为权重,b称之为偏移,在此构建模型 y_ = x×w,需要重点提醒的是,在这里要把x和w都视为矩阵,将该公式每次运行都视为一次矩阵运算,同时正如在第0篇中写的,我们将整体模型视为一个黑盒,通过数据对其进行训练
由于不涉及对模型本身的更改,就需要使用一种方法使得模型能够在每次的训练中不断的自我优化逼近理想中的正确模型。这个过程称之为优化,而为了定义好与不好,我们需要指定一个标准,即损失loss,以定义预测正确的偏差。
在这里定义损失loss
进一步优化损失函数,将损失函数定义为MSE均方根误差
在一维的数据中,进行计算可以得到关于w的损失图
源码详解与实现
在源码中需要注意的是,在第一章线性模型的代码中,并没有进行训练,仅仅是将损失函数loss与权重w之间的关系图进行了绘制,并未进行优化
import numpy as np
import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0] # 定义原始数据集
y_data = [2.0, 4.0, 6.0]
def forward(x): # 定义前向函数
return w * x
def loss(x, y): # 定义损失函数
y_pred = forward(x) # 预测值
return (y - y_pred) * (y - y_pred)
w_list = [] # 定义参数w的初始列表为空 再for循环中进行填充
mse_list = [] # 定义w对应的预测误差mse的初始列表
for w in np.arange(0.0, 4.1, 0.1): # for循环使w初值为0循环+0.1直到大于4.1时跳出循环
print(f"w = {w}") # 打印每次训练w的值
l_sum = 0 # 误差参数为0
for x_val, y_val in zip(x_data, y_data): # 将x,y数据进行压缩,从中依次取值进行测试
y_pred_val = forward(x_val) # 进行前向预测
loss_val = loss(x_val, y_val) # 计算单个误差
l_sum += loss_val # 数据累计误差
print("/t", x_val, y_val, y_pred_val, l_sum) # 打印
print(f"MSE = {l_sum/3}") # 输出累计误差值
w_list.append(w) # 将每次训练的w值放入w列表
mse_list.append(l_sum/3) # 将每次的累计误差值放入mse列表 与w一一对应
plt.plot(w_list, mse_list) # 画出误差随w参数的变化图
plt.xlabel('Loss') #label
plt.ylabel('W')
plt.show()
运行结果
w = 4.0
1.0 2.0 4.0 4.0
2.0 4.0 8.0 20.0
3.0 6.0 12.0 56.0
MSE = 18.666666666666668
作业
通过matplotlib库,绘制在三维空间下的损失分布图:
源码与详解
# homework
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0] # 定义原始数据集
y_data = [2.0, 4.0, 6.0]
def forward(x): # 定义前向函数
return w * x + b
def loss(x, y): # 定义损失函数
y_pred = forward(x) # 预测值
return (y - y_pred) * (y - y_pred)
w_list = np.arange(0.0, 4.1, 0.1)
b_list = np.arange(0.0, 4.1, 0.1)
[w, b] = np.meshgrid(w_list, b_list) #生成网格将两条直线变成二维平面
mse_list = [] # 定义w对应的预测误差mse的初始列表
l_sum = 0 # 误差参数为0
for x_val, y_val in zip(x_data, y_data): # 将x,y数据进行压缩,从中依次取值进行测试
y_pred_val = forward(x_val) # 进行前向预测
loss_val = loss(x_val, y_val) # 计算单个误差
l_sum += loss_val # 数据累计误差
print('\t', x_val, y_val, y_pred_val, l_sum) # 打印
# print("MSE = {l_sum/3}") # 输出累计误差值
# mse_list.append(l_sum/3) # 将每次的累计误差值放入mse列表 与w一一对应
"""
解释这个for循环能正常进行且正确的原因,由于每次提取的单个x数据输入为1*1向量,w和b的大小为都为[40,40]
因此相当于 常数x*矩阵w+矩阵b 与y相加减
"""
fig = plt.figure() # 定义一个绘图窗口
ax = Axes3D(fig) # 3D设置
ax.plot_surface(w, b, l_sum/3) # surface函数画出三维图像
plt.show()
运行结果