目录
- 摘要
- Abstract
- 1.线性回归
- 1.1.一元线性回归
- 1.1.1.函数凹凸性判断
- 1.2.多元线性回归
- 1.3.进一步理解梯度下降法
- 2.逻辑回归
- 2.1.信息论角度推导交叉熵损失函数
- 2.2.概率论角度推导交叉熵损失函数
- 3.额外阅读:Label Smoothing
- 3.1.One-hot 和 Label Smoothing 的优缺点对比
- 总结
摘要
本周学校的机器学习课程正好讲完了逻辑回归内容,正好趁着这个时间来回顾以下之前所学的知识,手动推导了一下线性回顾与逻辑回归的全过程,顺便进行了一些额外的阅读学习。
Abstract
This week, the machine learning course at school has just finished covering the content on logistic regression. Taking advantage of this time, I reviewed the knowledge I had learned before, manually derived the entire process of linear regression and logistic regression, and took the opportunity to do some additional reading and learning.
1.线性回归
1.1.一元线性回归
线性回归的本质是寻找到一条直线去最大程度地拟合已有的数据,而对于多维线性回归,就是找到一条直线去拟合高维度下多个自变量和应变量的关系。
假设目前我们已经找到了一条直线 y = w x + b y=wx+b y=wx+b,那么我们如何去评价这条直线对现有数据拟合程度的好坏呢?
很容易想到的一个角度:我们可以拿真实值和预测值做对比,预测值越接近真实值说明拟合程度越高,换句话也就是说真实值和预测值的差距越小说明拟合程度越高。
衡量差距的有以下三种方法:
对于第一种方法来说,当计算多个样本点时可能会发生正负抵消的情况,导致总体的差距被相互中和。比如a点真实值与预测值的差距是10,b点真实值与预测值的差距是-10,而a点和b点的总体差距却是 10 − 10 = 0 10-10=0 10−10=0 了,这显然不能正确地表示真实值和预测值的总体差距大小。
对于第二种方法来说,由于后面我们使差距最小时需要对这个差距进行求导,而绝对值内并不是处处可导的,所以我们也不选择第二个方法。
因此,第三个方法就非常符合我们目前的要求了。
1.1.1.函数凹凸性判断
参考来源:二元函数凹凸性的判别法、二元函数判断凹凸性-CSDN
设 f ( x , y ) f(x,y) f(x,y) 在区域 D D D内具有二阶连续偏导数,记 A = f x x ′ ′ ( x , y ) A=f''_{xx}(x,y) A=fxx′′(x,y), B = f x y ′ ′ ( x , y ) B=f''_{xy}(x,y) B=fxy′′(x,y), C = f y y ′ ′ ( x , y ) C=f''_{yy}(x,y) C=fyy′′(x,y),则
(1)在 D D D上恒有 A < 0 A<0 A<0,且 A C − B 2 ≥ 0 AC-B^2≥0 AC−B2≥0时, f ( x , y ) f(x,y) f(x,y)在区域 D D D上时凹函数;
(2)在 D D D上恒有 A > 0 A>0 A>0,且 A C − B 2 ≥ 0 AC-B^2≥0 AC−B2≥0时, f ( x , y ) f(x,y) f(x,y)在区域 D D D上时凸函数。
注:这里的凸函数是指下凸,也就是我们常见的“凹函数”。中国大陆数学界某些机构关于函数凹凸性定义和国外的定义是相反的,但在中国大陆涉及经济学的很多书中,凹凸性的提法和其他国家的提法是一致的,也就是和数学教材是反的。
参考链接:凸函数定义
到这里就证明了 L ( w , b ) L(w,b) L(w,b)为凸函数,所有就可以进行凸优化操作了。
最优化损失函数 L ( w , b ) L(w,b) L(w,b)
因为 L ( w , b ) L(w,b) L(w,b)为凸函数,所以存在最小值点,且这个最小值点就是 L ( w , b ) L(w,b) L(w,b)的驻点。
正如上述推导过程,我们求出参数 w w w和 b b b的解析式,通过解析式我们可以很轻松地对一元线性回归问题进行求解:只需要把给定的数据进行相应的处理再代入解析式求解即可。
1.2.多元线性回归
类比一元线性回归,多元线性回归的本质就是找到一条高维直线最大程度地去拟合高维度下 y y y 与 x ( x 1 , x 2 , . . . , x n ) x(x_1,x_2,...,x_n) x(x1,x2,...,xn) 的关系。
上述推导过程得到了参数 θ ( θ 1 , θ 2 , . . . , θ n ) θ(θ_1,θ_2,...,θ_n) θ(θ1,θ2,...,θn)的解析表达式,我们只需把所给数据代入上式即可。
这种直接求得解析解的方法称为正规方程法。
正规方程法(Normal Equation Method)是一种用于求解线性回归问题的解析方法,它通过直接求解最小化损失函数的解析解来找到最优参数。与梯度下降法不同,正规方程法不需要迭代,而是通过矩阵运算一次性求解最优参数。
正规方程法虽然可以直接给出最优解,但是当特征数量很大时整个算法的计算复杂度非常高,达到了 O ( n 3 ) O(n^3) O(n3) ,这在高维数据集上显然是不可行的。并且正规方程法需要存储整个矩阵 X X X 和目标向量 y y y ,还需要计算和存储 X T X X^TX XTX 和 ( X T X ) − 1 (X^TX)^{-1} (XTX)−1。当数据集很大的时候,这些矩阵的存储和计算可能会超出内存限制。正规方程法只适用于线性回归模型,而对于其他类型的模型(如逻辑回归、神经网络等)不适用。
和正规方程法相比,梯度下降法的计算复杂度较低,特别是对于大规模数据集。除此之外,梯度下降法只需要存储当前的参数向量和梯度,以及每次迭代的中间结果。对于大规模数据集,可以使用小批量梯度下降(Mini-batch Gradient Descent)或随机梯度下降(Stochastic Gradient Descent)来减少内存需求。梯度下降法还具有很高的灵活性,可以应用于各种类型的模型和损失函数。通过调整损失函数和梯度计算,可以轻松扩展到带正则化的模型和其他非线性模型。此外,梯度下降法可以很容易地并行化,提高计算效率。
1.3.进一步理解梯度下降法
总结一下就是,对于xOy平面上的一个点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 在所有xOy平面上的任一方向都有方向导数,每个不同方向的方向导数揭示了函数 f ( x , y ) f(x,y) f(x,y) 在整个方向上的变化率。而当我们找到一个方向和点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的梯度同向时,此时就是 f ( x , y ) f(x,y) f(x,y) 的函数值增加最快的方向。而当我们找到一个方向和点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的梯度反向时,此时就是 f ( x , y ) f(x,y) f(x,y) 的函数值减少最快的方向。
更新参数
找到方向之后下一步就是更新参数了。那么如何控制参数向损失函数下降最快的方向变化呢?答案就是在梯度的负方向上进行逐步增量,用公式表示就是:
θ n e w = θ o l d − η ▽ L ( θ o l d ) θ_{new} = θ_{old} -η▽L(θ_{old}) θnew=θold−η▽L(θold)
其中:
(1)负号表示“负方向”;
(2) η η η 为学习率,是控制 θ θ θ 向着 L ( θ ) L(θ) L(θ) 的局部最小值进行变化的步长,学习率 η η η 不宜过大(太大容易跑过局部最小值),也不宜太小(太小前进的速度太缓慢);
(3) ▽ L ( θ ) ▽L(θ) ▽L(θ) 为梯度向量,梯度向量控制变化方向。
遗留的问题
对于上面这个公式,一直有个现在看起来比较 弱智 的问题萦绕着我,那就是为什么一个参数向量可以直接加或者减另一个向量就可以更新参数?
其实答案早就在初中数学告诉我 们 了,向量除了表示方向之外,还蕴含了关于位移的信息。比如向量 ( 2 , 3 ) (2,3) (2,3) 也可以看作一个点从原点 ( 0 , 0 ) (0,0) (0,0) 移动到点 ( 2 , 3 ) (2,3) (2,3) 。
对于参数更新的例子,我们不妨假设向函数值增大最快的方向更新,并且去掉学习率来简化公式,例如:
( x 1 , y 1 ) = ( x 0 , y 0 ) + ▽ f ( x 0 , y 0 ) (x_1,y_1) = (x_0,y_0) +▽f(x_0,y_0) (x1,y1)=(x0,y0)+▽f(x0,y0)
假设 ( x 0 , y 0 ) = ( 1 , 1 ) (x_0,y_0)=(1,1) (x0,y0)=(1,1),而 ▽ f ( x 0 , y 0 ) = ( 2 , 3 ) ▽f(x_0,y_0)=(2,3) ▽f(x0,y0)=(2,3),此时 ( 1 , 1 ) + ( 2 , 3 ) (1,1)+(2,3) (1,1)+(2,3)就相当于点 ( 1 , 1 ) (1,1) (1,1) 先向 x 轴移动两个单位,再向 y y y 轴移动三个单位,最后到达点 ( 3 , 4 ) (3,4) (3,4),这可不就是向 ( 2 , 3 ) (2,3) (2,3) 这个向量的方向移动嘛!
因此再回看这个公式:
θ n e w = θ o l d − η ▽ L ( θ o l d ) θ_{new} = θ_{old} -η▽L(θ_{old}) θnew=θold−η▽L(θold)
η η η 决定了我们移动步伐的大小,只需要一直循环这个过程就可以一步一步地更新到最小值。
关于梯度下降法就不再赘述,更详细的也可以参考这个链接:梯度下降法
2.逻辑回归
逻辑回归的本质就是将线性回归模型的 y y y 值映射成 0~1 的概率值 p p p ,然后根据这个概率值进行分类。
逻辑回归的损失函数用的是交叉熵损失函数,第一次学习逻辑回归时,对交叉熵损失函数的推导时通过极大似然估计的方式推导的。但是最近在学习信息论的时候对交叉熵损失函数有了新的理解,故从信息论的观点去推导一下交叉熵损失函数。
2.1.信息论角度推导交叉熵损失函数
现在新的问题又出现了,明明交叉熵公式中的 y i y_i yi 是一个概率值,为什么交叉熵损失函数中 y i y_i yi 却是个标签呢?
其实可以这样子理解:
对于分类任务来说,我们取得一个数据实际上也只能把它分到在唯一的一个类别中。例如在手写数字识别中(数字为0~9),若样本是数字5,则对应的真实分布应为 [ 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 ] [0,0,0,0,0,1,0,0,0,0] [0,0,0,0,0,1,0,0,0,0],所以在真实分布中的概率应为 P ( 5 ) = 1 P(5)=1 P(5)=1,而其他数字的概率均为0。也就是说, y i y_i yi 其实也可以看作是一个概率,只不过 y i y_i yi 的概率除了1就是0。假设网络输出分布为 [ 0.2 , 0.3 , 0.1 , 0 , 0 , 0.3 , 0.1 , 0 , 0 , 0 ] [0.2,0.3,0.1,0,0,0.3,0.1,0,0,0] [0.2,0.3,0.1,0,0,0.3,0.1,0,0,0],也就是说我们想要网络输出概率 P ( 5 ) P(5) P(5) 越接近1越好,而其他位置的概率越接近0就越好。
我们可以计算一下网络输出分布的loss,发现 L o s s ≈ 1.2040 Loss≈1.2040 Loss≈1.2040。
再考虑第二个输出分布 [ 0.1 , 0.1 , 0 , 0 , 0 , 0.7 , 0 , 0.1 , 0 , 0 ] [0.1,0.1,0,0,0,0.7,0,0.1,0,0] [0.1,0.1,0,0,0,0.7,0,0.1,0,0],求解一下loss得 L o s s ≈ 0.3567 Loss≈0.3567 Loss≈0.3567。显然第二个输出分布的loss明显低于第一个分布,从概率分布上也可以轻易看出第二个输出分布更符合真实分布。
而在二分类问题中,不仅需要考虑模型对正类的预测能力,还需要考虑其对负类的预测能力。如果只用 − y l o g ( y ^ ) −ylog(\hat y) −ylog(y^),那么损失函数将仅关注正类的预测,而忽略了负类。通过加入 − ( 1 − y ) l o g ( 1 − y ^ ) -(1−y)log(1−\hat y) −(1−y)log(1−y^),我们可以同时评估模型对正类和负类的预测效果。通过同时考虑正类和负类的预测,模型可以更均衡地学习数据中的特征,避免过度关注某一类而忽略另一类,从而提高整体的泛化能力。
从图像中也可以看出,当y=1时,如果预测类别越接近1损失函数的值就越小,越接近0损失函数的值就越大;当y=0时,如果预测类别越接近0损失函数的值就越小,越接近1损失函数的值就越大。这样我们就定义了一个预测越离谱,损失就越大;预测越靠谱,损失就越小的损失函数。
也正是因为如此,交叉熵损失函数可以用来实现分类任务。
2.2.概率论角度推导交叉熵损失函数
这个部分的推导内容已经在【第二周】李宏毅机器学习笔记02里做过详细的推导,下面就用简单的公式快速复习一遍推导流程。
3.额外阅读:Label Smoothing
Label Smoothing 是机器学习领域的一种正则化方法,通常用于分类问题,目的是防止模型在训练时过于自信地预测标签,改善泛化能力差的问题。在交叉熵损失CrossEntropy_Loss中,非标签对应位置的预测信息是没有被使用的,也就是上文曾提到由于标签值为0从而交叉熵并未考虑负类的影响。而Label Smoothing使用了这种信息,宏观上讲,也是略微改变了标签的分布,使得标签不在是非0即1了,故而称为标签平滑。
Label Smoothing 使得 one-hot 编码的 hard label 转变为了 soft label,使网络优化更加平滑。
3.1.One-hot 和 Label Smoothing 的优缺点对比
One-Hot
优点
- 明确的类别区分:每个类别都有唯一的向量表示,模型可以清楚地知道每个样本属于哪个类别。
- 易于实现:实现简单,适用于大多数分类任务。
- 计算效率高:在计算损失函数时,可以直接使用交叉熵损失(Cross-Entropy Loss),计算效率较高。
缺点
- 过拟合风险:在小数据集上,模型可能会过度拟合训练数据,因为 one-hot 编码没有提供任何关于类别的额外信息。
- 不考虑类别间的相似性:one-hot 编码将所有类别视为完全独立,忽略了类别之间的潜在相似性或关系。
Label Smoothing
优点
- 减少过拟合:通过引入标签噪声,模型不容易过拟合训练数据,从而提高泛化能力。
- 考虑类别间的相似性:Label Smoothing 隐式地考虑了类别之间的相似性,因为每个类别的标签不再是完全独立的。
- 提升模型鲁棒性:模型对输入数据的变化更加鲁棒,能够在面对噪声或异常值时表现更好。
缺点
- 增加复杂性:实现 Label Smoothing 相对复杂,需要调整超参数(如平滑因子)。
- 可能降低性能:在某些情况下,Label Smoothing 可能会导致模型性能下降,尤其是在类别之间确实没有相似性的情况下。
- 解释性差:相比于 one-hot 编码,Label Smoothing 的标签表示更难解释,因为每个类别的标签不再是简单的 0 或 1。
对于为什么标签平滑可以产生作用可以参考这篇论文:When Does Label Smoothing Help?
损失函数
总结
本周对线性回归和逻辑回归的重新推导加深了我对这些基础知识的印象,特别是对梯度和方向导数的理解中又更深入了一步,解决了很多之前并为注意到的遗留问题。希望往后也能这样继续充满学习热情来解决问题。下周见。