一、什么是回归
分类任务很好理解,比如去银行贷款,银行会根据贷款人的年龄、工资(特征)去决定贷款(标签1)和不贷款(标签0)。而回归任务,是预测允许贷款的额度(标签是一个一定范围的数值)。如下图所示:
每个特征对结果的影响程度不同,比如对于银行贷款问题,工资()肯定要比年龄()的影响大。因此给和分别分配一个权重和。现在就得到了一个模型。
现在我们需要做的事就是,什么样的和对于这个模型来说是最合适的。
二、什么是线性
上面这个图中,红色的点就是数据,绿色的面就是模型。通俗地讲,线性就是这个模型是一个平面,并不能做到与每一个点完全拟合(不是曲面)。因此,对于线性回归任务,就是要找到一个平面,这个平面能尽可能地拟合更多的数据。
三、数学表达
(1)拟合的平面
现在,我们得到了一个拟合的平面:。其中,是偏置系数,它的作用是对平面的位置进行微调,而不改变平面的倾斜度,已找到最合适的平面。为了方便计算机的计算,会先将数据转换成矩阵的形式,即把拟合平面转换成矩阵的叉乘。如下面的一个数据:
每一个样本就是矩阵的行,每一个特征就是矩阵的列。补充全为1,是为了给拟合平面中的配一个权重,方便转换成矩阵叉乘的形式,补充值为1就不会对平面有任何影响。最后得到拟合的平面:,其中大小为1x3,X大小为3xn,3是特征个数(包含),n是样本个数。
真实值与预测值之间存在差异,如图上粉色的点是预测值,同一个和对应的红色点就是真实数据,它们之间的差异被称为误差,记作。因此对于每一个样本的真实标签和模型预测的标签,都存在这样的关系:。
(2)误差的含义
先说明概念:误差是独立同分布的,并且服从均值为0、方差为的高斯分布。
为什么独立:样本之间是相互独立的,比如张三和李四一起到银行贷款,贷多少钱与别人没关系,不会因为张三叫银行给李四多贷点,银行就给多贷。因此,样本对应的误差,误差之间也是相互独立的。故在收集数据时,希望样本间是独立的,不希望他们之间有顺序或者有逻辑关系,在对样本进行学习前,通常会对它们进行shuffle(打乱)。
为什么同分布:比如张三去建行贷款,李四去农行贷款,这两个银行的贷款规则都不一样,用同一个模型去预测就不太准确了。因此尽可能要求误差同分布,类似于生物实验中的单一变量原则。
为什么是均值为0的高斯分布:均值为0的意思,打个比方,银行会少给有些人额度,也会多给有些人额度(多给少给的部分就相当于误差),但综合起来的平均值是趋向于0的。高斯分布又叫正态分布,它的形状是中间多,两边少,均值为0的正态分布是以为对称轴的,如上图所示。达到的效果就是,误差比较小的情况是比较正常的(银行多给或者少给几块钱),出现误差比较大的情况的概率要尽可能小(银行多给或者少给几万块钱)。所以,误差服从均值为0的高斯分布目的是让大多数误差接近于0。
那我们所求的模型的误差,要完全符合均值为0、方差为的高斯分布吗?其实,数学推导只是对理论的支撑,实际的情况并不能做到百分百准确,我们做的只是找到最优解,能解决实际的问题即可,而不是要求完全与数学得到的数值一模一样。
因为误差服从高斯分布,所以将均值0带入正态分布的概率密度函数得到(expA表示):
式(1)
这是一个关于误差的式子,但是我们并不需要求解,而是需要求解权重。因此,把改成,再代入式(1),得到:
式(2)
这样就转换成了关于的式子。接下来我们要求解的问题是,是什么值,能让误差最小,即预测值更接近真实值。
(3)最大似然估计
让真实值出现概率最大的参数,用在接下来的预测中,能让预测值更接近于真实值。比如,在学校中抽取100个人全是男生,那就说明在这个学校中,抽取的一个同学是男生的概率很大,那么再抽取一个人,更可能是男生。
最大似然估计的基本思想是:在已知数据样本的情况下(已知真实标签和对应的特征),寻找能够使得这些数据出现的概率最大的参数值(寻找让真实值出现概率最大的),这个概率就用似然函数表示。换句话说,通过最大化似然函数来估计参数值(求得)。
① 写出似然函数
似然函数,即样本出现的概率关于模型参数的函数。因为需要用很多个样本(抽取很多个都是男生,再抽一个是男生的概率才大),并且每个样本都是独立同分布的,所以是将式(2)进行累乘(独立的随机变量,它们的联合概率可以表示为各自边缘概率的乘积),得到似然函数:
式(3)
② 对似然函数取对数
为了方便后续求导,对似然函数取对数,改变的只是概率的最大值,而不会改变概率的最大值对应的参数值。因此,取对数对我们求没有影响。
式(4)
将式(4)化简为:
式(5)
对于来说,是一个常数;是一个恒正的值。因此,想求的最大值,就是求的最小值,然后把它常数项去掉,保留(后面求导正好可以抵消),得到目标函数(最小二乘法):
式(6)
要看成nx1的矩阵,包含n个特征。如下图:
把分开算转换成,直接算出一整个r向量:
因为是算的各项平方,不用考虑正负号,所以还是计算的结果都是一样的。因此,把这个中间结果去掉,就可以转化为:
式(7)
其中X大小为mxn,m是样本个数,n是特征个数。
③ 求偏导并令偏导为0
求偏导:
令偏导为0:
两边乘上得到:
③ 存在的问题
这样求解得到的,仅仅是通过一次计算得到,并没有体现出机器学习逐步的学习过程;并且对求逆不一定成功,因为不是所有的矩阵都有逆矩阵,这种方法在线性回归问题上能求得结果(特例),但在其它问题上并不适用。因此,最小二乘法并不通用,我们需要另寻方法。
四、梯度下降
交给机器一堆数据,再给一个学习的方向(目标函数达到最小值),然后机器朝着这个目标,一步步迭代优化完成,而不是直接一步求出结果,这体现了机器学习的过程(优化思想)。梯度下降就是优化算法之一。
(1)通俗地理解
如上图所示,想要快速地到达最小值处,就需要每次沿着当前所在位置的梯度方向的反方向走(梯度的方向是函数增长最快的方向),每走一步都需要更新梯度的方向。如果步长太大,可能会直接走到对面,反复在山谷之间胡乱震荡,而达到不了谷底(无法收敛或收敛效果不好);或者悬在空中。因此,步长应该小一点,稳步向下走,最终在谷底的很小的一个局部之间徘徊,就说明趋于了稳定,达到了最小值处。但是步长也不能过于小,因为会导致到达最小值处的速度非常慢。
梯度下降法需要分别计算不同参数的梯度,再将所有梯度对应的向量相加,就得到要走的方向和步长。如下图所示:
(2)参数的更新
① 目标函数
为什么要将所有样本的误差求和:算法在更新参数时要考虑所有样本的影响,而不是仅仅依赖于部分样本。
为什么是总误差的均值:均值可以减少异常值对总误差的影响,并且尤其在大规模数据集上,计算均值的梯度比计算总和的梯度更高效。
只是为了求目标函数最小点,为什么不把平方去掉,改为绝对值,让式子更简单呢:如果改为绝对值,x的绝对值会在x=0处不可导,同理也会让目标函数在某点处不可导,这样会多一些讨论情况,求最小点不方便。
为什么不把1/2去掉:后面求偏导,会刚好把1/2抵消掉。
目标函数:
将目标函数对求偏导(跟无关的项直接当成常数,求导消掉了):
② 按梯度下降的分类更新参数
是梯度方向,更新参数的方向是梯度反方向,所以更新当前的,加的是 -,正好把式子里的负号抵消掉了。以下的是更新后的参数;中的 i 和 j 表示第 i 个样本的第 j 个特征;是学习率,也就是步长。
批量梯度下降:。它的优点是每次迭代比较平稳地往好的方向走,就算有浮动也比较少和细微;缺点是会计算所有样本的误差和,效率比较慢。
随机梯度下降:每次迭代随机抽取一个样本做处理,效率大大提升,但是抽取的样本可能并不好。因此,每次参数的更新,可能是往目标函数减小的方向走,也可能是往目标函数增大的方向走,下降不平稳且精准度较低。。下图中通过损失曲线图,表现了两种梯度下降算法的区别,损失相当于误差:
小批量梯度下降:在实战中通常使用这个算法,它综合了批量梯度下降和随机梯度下降,每次迭代随机抽取batch个样本,既不会因为样本数量太少导致收敛过于混乱而精准度过低,也不会因为样本数量太大而计算效率过低。。
上面所说的batch,按照程序员的习惯,通常是取值、、,即64、128、256。在计算机性能允许的情况下,batch取较大值更好,很少低于64。
学习率(LR):即步长,通常取较小的值,如0.01、0.001。实战时先试一下0.01,如果效果不好,再试0.001,小到计算机性能和时间能容忍的程度(计算机性能差跑不起来、学习时间要好几年肯定不行了)。如下图是不同学习率的损失曲线图:
从上图可以看到,非常高的学习率会导致损失值无法收敛;高的学习率会导致损失值收敛效果不好;低的学习率导致损失值收敛速度缓慢;好的学习率让损失值既收敛效果较好,又收敛速度较快。通常以较高学习率开始训练,加速更新模型;然后根据学习进度逐渐降低学习率。