深度学习的课程笔记,参考李宏毅机器学习课程
一、定义
回归是通过输入特征向量来找到函数并输出数值标量。
例如,深度学习应用于自动驾驶领域。我们在无人车上输入每个传感器的数据,例如路况、测量的车辆距离等,并结合回归模型输出方向盘角度。
二、回归模型建立步骤
step1:模型假设,选择模型框架
step2:模型评估,判断众多模型的好坏
step3:模型优化,筛选最优的模型
三、模型假设-线性模型
1、一元线性模型(单个特征)
以一个特征值x为例,线性模型假设 y=a+b⋅x ,一元线性函数形式,对于不同的a,b值可以得到很多不同的模型
2、多元线性模型(多个特征)
多个特征值xi,y=b+∑wi·xi,多元线性函数形式,不同的特征值xi对应不同的权重wi
- xi:就是各种特征(fetrure) xcp,xhp,xw,xh,⋅⋅⋅
- wi:各个特征的权重 wcp,whp,ww,wh,⋅⋅
- b:偏移量
四、模型评估-损失函数
以单个特征值线性模型为例
收集和查看训练数据
真实数据可视化后结果
判断模型优劣性质
传统及经济学回归中,通常通过拟合优度检验,R^2等检验方法对回归的优劣性进行评价判断,在机器学习中,通常通过定义损失函数进行模型的好坏判断,如统计10组原始数据 (y^n−f(xcp^n))^2 的和,其和越小回归模型预测效果越好。
数学公式推导:
L(f)=∑(y^n−f(xcp^n))^2,将【f(x)=y】,【y=b+w⋅xcp】代入有
L(f)=∑(y^n−(b+w⋅xcp^n))^2
最终定义 损失函数 Loss function:L(w,b)=∑(y^n−(b+w⋅xcp^n))^2
五、最优模型选择-梯度下降
以单个特征值一元线性回归模型为例
已知损失函数是 L(w,b)=∑(y^n−(b+w⋅xcp))^2 ,需要找到一个令结果最小的 f∗,实际应用中参数会更多更为复杂。
仅考虑单个参数的情况:
引入学习率概念:移动的步长,如上图中 η
- 步骤1:随机选取一个 w0
- 步骤2:计算微分,也就是当前的斜率,根据斜率来判定移动的方向
- 大于0向右移动(增加w)
- 小于0向左移动(减少w)
- 步骤3:根据学习率移动
- 重复步骤2和步骤3,直到找到最低点
本质上是一种通过迭代的思想进行最小值的求解方法。但通过这种算法,可能会找到当前最小值,但并未全局最小值。
从多参数角度:即数学推导中的偏微分求解过程:
梯度下降算法面临的挑战:
- 问题1:当前最优(Stuck at local minima)
- 问题2:等于0(Stuck at saddle point)
- 问题3:趋近于0(Very slow at the plateau)
六、模型的验证
对于简单一元回归模型,求解模型的平均误差值作为模型评价体系的衡量指标
过拟合问题:
每一个模型结果都是一个集合,5次模型包⊇4次模型⊇3次模型,所以在4次模型里面找到的最佳模型,肯定不会比5次模型里面找到更差,高次模型的解释力强于低次模型,包含低次模型,即高次模型为最高次幂系数取零的低次项系数。
将错误率结果图形化展示,发现3次方以上的模型,已经出现了过拟合的现象:
七、步骤优化
step1 优化:将2个input的四个线性模型合并到一个线性模型中
Step2优化:如果希望模型更强大表现更好(要求更多参数以及更多input)
更多特征,更多input,数据量没有明显增加,仍旧存在过拟合现象发生
Step3 优化:加入正则化
引入更多特征后,权重 w可能会使某些特征权值过高,仍旧导致过拟合,因此加入正则化
- w 越小,表示 function 较平滑的,function输出值与输入值相差不大
- 在很多应用场景中,并不是 w越小模型越平滑越好,但是经验值表示 w 越小大部分情况下都是好的。
- b 的值接近于0 ,对曲线平滑是没有影响
八、线性回归的代码实现
# linear regression
#b = -120
#w = -4
b=-2
w=0.01
lr = 0.000005
iteration = 1400000
b_history = [b]
w_history = [w]
loss_history = []
import time
start = time.time()
for i in range(iteration):
m = float(len(x_d))
y_hat = w * x_d +b
loss = np.dot(y_d - y_hat, y_d - y_hat) / m
grad_b = -2.0 * np.sum(y_d - y_hat) / m
grad_w = -2.0 * np.dot(y_d - y_hat, x_d) / m
# update param
b -= lr * grad_b
w -= lr * grad_w
b_history.append(b)
w_history.append(w)
loss_history.append(loss)
if i % 10000 == 0:
print("Step %i, w: %0.4f, b: %.4f, Loss: %.4f" % (i, w, b, loss))
九、总结
回归分析是指一种预测性的建模技术,主要是研究自变量和因变量的关系。通常使用线/曲线来拟合数据点,然后研究如何使曲线到数据点的距离差异最小。
令损失函数最小来确定参数是模型建立过程中最关键的一步,可以通过多种方式进行损失函数的最小化求解。
本文中涉及到的梯度下降法是常用且通用的,包括更为复杂的逻辑回归算法中也可以使用,但是对于较小的数据量来说它的速度并没有优势。
正规方程的速度往往更快,但是当数量级达到一定的时候,还是梯度下降法更快,因为正规方程中需要对矩阵求逆,而求逆的时间复杂的是n的3次方。
最小二乘法一般比较少用,虽然它的思想比较简单,在计算过程中需要对损失函数求导并令其为0,从而解出系数。但是对于计算机来说很难实现,所以一般不使用最小二乘法。
在本章节中提到的多种方式仅涉及理想化的线性回归模型,对于更为常见的非线性及多元模型需要更加深入的理论研究与讨论。