(刚开始学习这方面,若有错误的地方 欢迎大家指正!)
目录
一、机器学习基础
1.1简介本质
机器学习和深度学习的本质是让机器具备找到合适函数的能力,这个函数的输入可以是向量、矩阵等,输出则根据任务不同呈现多样形式:①回归任务输出标量,e.g.预测未来某一时间的PM2.5数值;②分类任务让机器从预设选项中选择输出,e.g.邮箱的垃圾邮件检测、AlphaGo下围棋时从19×19个位置中选择落子点;③结构化学习要求机器产生有结构的输出,e.g.生成一张图或一篇文章。
1.2确立函数步骤
机器学习找函数的过程分为三个明确步骤。
①第一步:定义一个带有未知的参数(parameter)的函数,也称为模型(model)。以视频点击次数预测为例,假设函数为y = b + wx1,其中y是要预测的当天观看次数,x1是前一天的观看次数,b偏置(bias)和w权重(weight)是需要通过数据确定的未知参数,这一步的猜测往往依赖于领域知识(domain knowledge),
②第二步:定义损失函数,它是衡量参数好坏的标准,输入是模型参数,输出是损失值。损失可以通过计算预测值与真实值的差距得到,常见的有平均绝对误差(MAE)e = |yˆ − y|和均方误差(MSE)e = (yˆ - y)2,当输出为概率分布时则常用交叉熵。我们会计算所有训练数据的误差平均值作为最终损失L,L越小说明参数越好。
③第三步:解决最优化问题,找到使损失最小的参数,常用的方法是梯度下降(gradient descent)。梯度下降的过程是:先随机选取初始参数,计算损失关于参数的偏导数(梯度),根据梯度方向和学习率(learning rate)更新参数,反复迭代,直到损失不再明显下降。学习率是超参数(hyperparameter),影响参数更新的步伐大小,而当参数数量较多时,我们会将数据分成批量(batch)进行训练,遍历所有批量称为一个回合(epoch),批量大小也是超参数。
1.3激活函数
线性模型虽然简单,但存在局限性,它无法拟合复杂的非线性关系。在某些情况下,前一天观看次数与当天观看次数的关系可能不是简单的线性,而是呈现分段变化的趋势。这时候可以通过组合多个激活函数来增强模型的灵活性,分段线性曲线可以看作是一个常数加上一群Hard Sigmoid函数,而Sigmoid函数
可以逼近Hard Sigmoid函数。通过调整Sigmoid函数的参数,如斜率、偏移和高度,能组合出各种复杂的曲线,进而逼近任意连续曲线。引入多特征后,模型可以扩展为更复杂的形式,比如考虑前7天的观看次数,甚至更多天的数据。当模型中包含多个Sigmoid或ReLU等激活函数(activation function),且这些函数层层叠加时,就形成了深度学习模型,网络的深度增加能提升模型的表达能力,但也可能带来过拟合问题,需要合理设计。
(在定义一个函数时,当样本复杂一般的线性函数y=wx+b不能很好的描述,所以用到非线性函数,也就是激活函数f(x)=g(wx+b)来辅助,常见的激活函数:sigmoid、ReLU,当有多个输入f(x)=g(w1x1+w2x2+b),可以在此基础上无限套娃叠加,包含在输入与输出中的激活函数就变成了隐藏层(hidden layer),称为神经元(neuron),很多的神经元称为神经网络(neural network))
补充:
链式法则:复合函数的导数将是构成复合这有限个函数在相应点的导数的乘积,就像锁链一样一环套一环。
接着从右向左依次求导,逐步更新每一层的参数,直到把所有神经网络的参数都更新一遍,在计算前一层时,用到的一些偏导数的值后面也会遇到,所以不用计算那么多而是让这些值从右往左,一点点传播过来。该过程为:反向传播(Backpropagation):通过链式法则(Chain Rule)有效计算梯度的方法。反向传播是梯度计算的方法,梯度下降法是参数优化的方法,二者结合使用完成神经网络的训练。
通过前向传播,输入x计算输出y,再根据反向传播计算出损失函数关于每个参数的梯度,然后每个参数都向着梯度计算的反方向变化。构成神经网络的一次训练。
二、神经网络训练不起来怎么办
2.1模型偏差和优化问题
模型在测试集上表现不佳,首先检查训练数据的损失:若训练损失很大,说明模型在训练集上都没有学好。原因:①模型偏差,即模型过于简单,函数集合太小,无法包含能使损失降低的函数。e.g.仅考虑前一天数据的线性模型预测观看次数,可能因模型灵活性不足而表现差。可以通过增加输入特征、使用深度学习增加模型复杂度等方式解决。②优化问题,即模型本身足够灵活,包含了损失低的函数,却因梯度下降等优化算法的局限无法找到。梯度停止有局部最小值,局部最大值,马鞍点三种情况,通过泰勒级数近似,结合其中的海森矩阵判断该点类型,以及更新参数。判断是模型偏差还是优化问题,可以比较不同模型:若深模型灵活性比浅模型大,但训练损失却未更低,说明是优化问题。
2.2过拟合和mismatch
若训练损失小但测试损失大,原因:①过拟合,即模型过于灵活,过度拟合了训练数据中的噪声,而对未见过的数据泛化能力差。解决过拟合的有效方法:包括增加训练数据、进行数据增强(如图像翻转),或是限制模型灵活性(如减少参数、使用共享参数、使用正则化、早停、dropout等)。不过,限制模型灵活性要适度,否则可能导致模型偏差。②mismatch,即模型参数或数据分布与实际环境不匹配,测试资料出现问题,导致结果误差无法避免。
补充:正则化(Regularization):使获得更平滑的模型,提高测试数据的预测。
参数接近0的模型会更平滑,对输入变化的敏感度降低。
2.3交叉验证
为了合理选择模型,交叉验证是常用方法。将训练数据分为训练集和验证集,用训练集训练模型,用验证集衡量性能并挑选模型。k折交叉验证则将训练集分成k等份,多次交替使用不同部分作为验证集,取平均性能作为模型评价,能减少数据划分带来的随机性影响。
三、深度学习基础-优化神经网络
3.1梯度停止
深度学习的优化过程中,遇到损失不再下降的情况,可能是因为参数收敛到了临界点,即梯度为零的点,包括局部极小值(local minima)、局部极大值(local maxima)和鞍点(saddle point)。判断临界点的类型需要借助海森矩阵(Hessian matrix),通过其特征值来确定:特征值全为正则是局部极小值,全为负则是局部极大值,有正有负则是鞍点。在高维空间中,鞍点比局部极小值更常见,且可以通过负特征值对应的特征向量方向逃离鞍点,找到损失更低的参数。
3.2批量
批量大小对梯度下降的效果影响显著。全批量梯度下降,即批量梯度下降法(Batch Gradient Descent,BGD)使用所有数据计算梯度,更新稳定但计算量大;随机梯度下降(Stochastic Gradient Descent,SGD)每次用一笔数据计算梯度,更新有噪声但能更快迭代,且在非凸优化中更容易逃离局部最小值;小批量梯度下降(mini-batch gradient descent)则平衡了两者的优缺点。在有并行计算的情况下,较大批量能提高计算效率,但过大的批量可能导致模型泛化性能下降,因为大批量容易收敛到“峡谷”中的局部最小值,而小批量更可能收敛到“平原”上的更优解。
3.3动量
动量法(momentum method)是改进梯度下降的重要方法,它模拟物理中的惯性,将前一步的更新方向与当前梯度结合,帮助参数跨越鞍点或局部最小值。参数更新公式为
,
,其中mt是动量,λ是动量因子,η是学习率,gt-1是前一步的梯度。动量与梯度下降反向做矢量相加,在梯度停止时,告诉我们是否还继续训练,以及更新方向。
3.4自适应学习率
当学习速率太大导致无法到达最低点,梯度在两侧来回震荡时,自适应学习率方法能为不同参数定制学习率,解决梯度下降中学习率难以统一设置的问题。①AdaGrad根据梯度平方的积累调整学习率,对稀疏数据友好,但可能导致学习率逐渐减小至零;②RMSProp通过指数移动平均调整梯度累积,解决了AdaGrad学习率递减过快的问题;③Adam结合了动量法和RMSProp的优点,是目前常用的优化器。学习率调度则通过调整学习率随时间的变化(如衰减、预热),进一步提高优化稳定性。
3.5分类
分类(Classificaion)任务中,通常用独热向量表示类别,模型输出通过softmax函数归一化得到概率分布,softmax函数能让输出在0到1之间且和为1。损失函数常用交叉熵而非均方误差,因为交叉熵在分类任务中梯度更大,能加速参数更新,避免均方误差在损失大时梯度小导致的优化困难。
3.6批量归一化
当输入的不同维度的特征数值相差很大时,由于共用同一个模型,导致随着参数改变,loss的差距也会变动很大,误差曲面很曲折,所以模型在训练模型中的梯度下降优化会变得很困难。批量归一化(Batch Normalization,BN)是加速深度学习训练的重要技术,它对每批数据的特征进行归一化(减均值、除标准差),并引入可学习参数和调整分布。训练时用当前批量的统计量,测试时用训练过程中累积的移动平均统计量。批量归一化能改变误差表面,为了让模型的收敛速度更快,对于使用梯度下降优化的模型,每次迭代会找到梯度最大的方向迭代更新模型参数,寻求最优解的特征空间,提高训练稳定性。