尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

机器学习入门:从假设函数、代价函数到梯度下降的线性回归实践

机器学习入门:从假设函数、代价函数到梯度下降的线性回归实践 1. 从“模型描述”开始理解机器学习的核心语言如果你刚开始接触吴恩达老师的机器学习课程到了第四讲“模型描述”可能会觉得有点抽象。这很正常因为这是从“看热闹”到“入门道”的关键一步。模型描述说白了就是给计算机一个明确的“任务说明书”和“工作蓝图”。我们人类看到一个房价预测问题脑子里会想“哦房子越大价格越高大概是个线性关系”。但计算机不懂“大概”它需要我们用一种精确的、数学的语言告诉它我们猜测的规律是什么假设函数以及如何衡量这个猜测的好坏代价函数。这一讲就是教你如何构建这门与机器沟通的“核心语言”。很多人学到这里容易卡住觉得公式突然变多了。我的经验是别急着背公式先理解这两个核心概念到底在解决什么问题。假设函数是你的“预测模型”本身是你对世界规律的一个假设而代价函数是你的“质检员”它负责评估你这个假设模型在现有数据上表现得有多糟糕。整个监督学习的过程就是不断调整假设函数让代价函数的值降到最低的过程。理解了这一点再看那些符号和公式就会清晰很多。接下来我们就拆开揉碎了看看这门“语言”的语法和语义到底是什么。2. 模型描述的核心组件假设函数与代价函数2.1 假设函数为数据关系建立数学模型假设函数通常用 ( h_\theta(x) ) 表示是我们用来做出预测的模型。这里的 ( \theta ) 是模型的参数( x ) 是输入的特征。在单变量线性回归中它的形式非常简单[ h_\theta(x) \theta_0 \theta_1 x ]这其实就是我们初中就学过的直线方程 ( y kx b )。( \theta_0 ) 是截距( \theta_1 ) 是斜率。为什么叫“假设”因为在我们看到所有数据之前我们并不知道真正的、完美的关系是什么。我们只是根据经验或问题特性“假设”输入和输出之间存在这样一种线性关系。注意选择线性模型作为起点绝非偶然。其一它最简单是理解更复杂模型的基础其二很多真实世界的关系在局部范围内都可以用线性来近似其三从简单模型开始能让我们更专注于理解学习算法本身而不是被复杂的模型结构分散注意力。在实际操作中确定使用什么样的假设函数是建模的第一步也是最体现“领域知识”的一步。比如如果你知道房价和面积的关系可能不是简单的直线面积越大单价可能会逐渐降低或趋于平缓那你可能会考虑多项式回归即 ( h_\theta(x) \theta_0 \theta_1 x \theta_2 x^2 )。但在吴恩达课程的初期牢牢掌握线性假设是关键。2.2 代价函数量化模型预测的“错误”程度有了一个假设函数我们怎么知道它好不好呢这就需要代价函数 ( J(\theta_0, \theta_1) )。它的职责是给出一组具体的参数 ( \theta_0, \theta_1 ) 一个“评分”这个分数代表了模型在所有训练样本上预测的总误差。分数越高说明模型越差我们的目标就是找到让 ( J ) 最小的那组参数。最常用的代价函数是均方误差[ J(\theta_0, \theta_1) \frac{1}{2m} \sum_{i1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 ]我们来拆解一下这个公式( m )训练样本的总数。( h_\theta(x^{(i)}) )用当前参数的假设函数对第 ( i ) 个样本的预测值。( y^{(i)} )第 ( i ) 个样本的真实值。( (h_\theta(x^{(i)}) - y^{(i)})^2 )单个样本预测误差的平方。为什么用平方第一保证误差始终为正数不会因正负抵消而掩盖问题第二平方会放大较大误差的影响让模型对“离谱”的预测更加敏感惩罚更重。( \sum_{i1}^{m} )将所有样本的误差平方累加起来。( \frac{1}{2m} )求平均并乘以 ( \frac{1}{2} )。乘以 ( \frac{1}{2} ) 主要是为了后续求导时形式更简洁常数系数不影响最小值点的位置。实操心得第一次看到这个公式很多人会纠结于 ( \frac{1}{2m} ) 里的 ( 2 )。请务必理解这个 ( 2 ) 是为了数学推导的便利而引入的它在优化过程中会被消掉。你完全可以定义它为 ( \frac{1}{m} )最终的优化结果最优的 ( \theta ) 值是一样的只是梯度下降公式里会差一个常数因子。吴恩达课程采用这个形式是为了让后续的梯度下降公式更干净。所以代价函数 ( J ) 实际上是参数 ( \theta_0 ) 和 ( \theta_1 ) 的函数。对于不同的参数组合我们会得到一个不同的代价误差。我们的机器学习过程就转化为了一个纯粹的数学优化问题寻找使 ( J(\theta_0, \theta_1) ) 最小的 ( \theta_0, \theta_1 )。3. 代价函数的直观理解与可视化3.1 简化情况固定截距理解斜率的影响为了更直观地理解代价函数我们常常先看一个简化版。假设我们强制令截距 ( \theta_0 0 )那么假设函数简化为 ( h_\theta(x) \theta_1 x )代价函数也简化为 ( J(\theta_1) \frac{1}{2m} \sum (h_\theta(x^{(i)}) - y^{(i)})^2 )。现在( J ) 只是关于斜率 ( \theta_1 ) 的一元函数。想象我们有三组数据点 (1,1), (2,2), (3,3)。显然完美的拟合直线是 ( y x )即 ( \theta_1 1 )。如果我们选择 ( \theta_1 1 )那么对于每个点预测值等于真实值误差为0( J(1) 0 )。如果我们选择 ( \theta_1 0.5 )预测值分别是 0.5, 1, 1.5误差分别是 0.5, 1, 1.5平方后求和再平均会得到一个正数 ( J(0.5) 0 )。如果我们选择 ( \theta_1 2 )预测值分别是 2, 4, 6误差分别是 1, 2, 3平方和更大( J(2) ) 的值也更大。我们可以计算不同 ( \theta_1 ) 值对应的 ( J(\theta_1) )然后画在坐标系里。你会发现( J(\theta_1) ) 的图像是一个碗形的抛物线最低点就在 ( \theta_1 1 ) 处。这个“碗”的底部就是我们要找的最优点。3.2 一般情况两个参数下的“碗形”曲面当 ( \theta_0 ) 和 ( \theta_1 ) 都可以自由变化时( J(\theta_0, \theta_1) ) 就变成了一个二元函数其图像是一个三维空间中的曲面。对于线性回归和均方误差代价函数这个曲面总是一个凸函数形状像一个“碗”或者“汤盆”。这意味着它只有一个全局最低点没有局部最低点。这个性质对于优化至关重要因为它保证了只要我们持续朝着使代价降低的方向调整参数最终一定能到达那个唯一的最优点。我们可以用等高线图来可视化这个三维曲面。在等高线图上同一个椭圆环上的所有点具有相同的代价函数值 ( J )。椭圆的中心就是代价函数的最小值点对应着最优的参数组合 ( (\theta_0, \theta_1) )。可视化方式描述作用三维曲面图直接绘制 ( J ) 随 ( \theta_0, \theta_1 ) 变化的三维形状。最直观地展示“碗形”结构理解全局最小值的概念。等高线图将三维曲面投影到二维平面用闭合环线表示相同 ( J ) 值的点。便于观察优化算法的路径看参数如何一步步“滚”向中心。假设函数拟合图在数据散点图上动态绘制不同参数下的拟合直线。将抽象的代价与具体的拟合效果联系起来直观感受“代价高拟合差”。注意事项在手动或编程实现可视化时确保参数的取值范围设置合理。如果范围太大碗形曲面可能看起来像一块平坦的斜坡难以观察细节如果范围太小又可能看不到全局。一个实用的技巧是先根据数据范围和对问题的理解猜测一个大概的最优参数值然后围绕这个值设置一个合理的展示区间。理解代价函数的形状是理解后续梯度下降等优化算法的基础。你脑子里要始终有这样一个画面我们的目标是找到这个“碗”的底部而手里的工具梯度下降会告诉我们当前所在位置最陡的下山方向。4. 梯度下降自动寻找最优参数的引擎知道了目标最小化 ( J(\theta) )和目标的形状一个凸碗接下来就需要一个自动化的方法去寻找碗底。这就是梯度下降算法。它是机器学习中最重要、最基础的优化算法之一思想直观而强大。4.1 算法原理与核心公式梯度下降的核心思想可以类比为“盲人下山”。你站在山腰某个初始参数点想以最快速度走到山谷最低点代价最小点。你会环顾四周计算梯度找到当前最陡的下坡方向然后朝着那个方向迈出一步更新参数。重复这个过程直到你感觉走到平地了梯度接近零。用数学语言描述对于每一个参数 ( \theta_j )其更新公式为[ \theta_j : \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta_0, \theta_1) \quad (\text{for } j0,1) ]这个公式需要仔细理解:表示赋值即用计算出的新值覆盖旧值。( \alpha ) 是学习率它决定了我们“每一步”迈多大。这是算法中最重要的超参数之一。( \frac{\partial}{\partial \theta_j} J(\theta_0, \theta_1) ) 是代价函数 ( J ) 对参数 ( \theta_j ) 的偏导数也就是梯度在当前 ( \theta_j ) 方向上的分量。它指明了 ( J ) 在 ( \theta_j ) 这个维度上增长最快的方向。因为我们要求最小值所以要减去梯度即沿着反方向也就是下降最快的方向走。对于我们的线性回归模型和均方误差代价函数这两个偏导数有具体的解析解 [ \frac{\partial}{\partial \theta_0} J(\theta_0, \theta_1) \frac{1}{m} \sum_{i1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) ] [ \frac{\partial}{\partial \theta_1} J(\theta_0, \theta_1) \frac{1}{m} \sum_{i1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x^{(i)} ]可以看到梯度计算需要用到所有训练样本求和这也是为什么它被称为批量梯度下降。4.2 学习率的选择步长的艺术学习率 ( \alpha ) 的选择直接决定了梯度下降的成败和效率。如果 ( \alpha ) 太小每次更新参数只移动一点点算法需要很多步迭代才能收敛训练速度极慢。如果 ( \alpha ) 太大每一步迈得太大可能会直接“跨过”最低点导致代价函数值在最低点两侧来回震荡甚至发散到无穷大永远无法收敛。如何选择合适的学习率没有一个万能值。一个经典的调试方法是进行学习率扫描尝试一系列呈指数级变化的 ( \alpha ) 值如 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1...观察代价函数随迭代次数的变化曲线。理想曲线代价函数值随着迭代平稳、快速地下降最终趋于一个稳定的值。( \alpha ) 过小曲线下降非常缓慢可能需要成千上万次迭代才收敛。( \alpha ) 过大曲线代价函数值上下剧烈震荡甚至不断上升。实操心得在编写代码时一个非常好的实践是在每次梯度下降迭代中都绘制或打印出当前代价函数 ( J ) 的值。看着那个值随着迭代稳步下降是对调试过程最大的安慰和鼓励。如果发现代价不降反升你的第一反应就应该是学习率太大了赶紧调小。4.3 同步更新一个关键的实现细节梯度下降算法有一个必须遵守的规则所有参数必须同步更新。这意味着在计算完所有参数的梯度之后再统一用新值替换旧值。错误的做法不同步更新temp0 θ0 - α * 梯度0 θ0 temp0 # θ0 已经更新了 temp1 θ1 - α * 梯度1 # 这里计算梯度1时错误地使用了新的θ0 θ1 temp1正确的做法同步更新temp0 θ0 - α * 梯度0 temp1 θ1 - α * 梯度1 # 计算两个新值时使用的都是旧的(θ0, θ1) θ0 temp0 # 然后同时赋值 θ1 temp1虽然在线性回归中不同步更新可能也能工作但在更复杂的模型中这会导致错误的优化路径。养成同步更新的习惯是正确实现梯度下降的基本功。5. 线性回归的梯度下降从理论到实践当我们把梯度下降算法应用到线性回归这个具体问题上时就得到了一个完整、可实现的机器学习流程。将线性回归的代价函数和梯度公式代入梯度下降的更新规则我们得到重复直到收敛{ [ \theta_0 : \theta_0 - \alpha \frac{1}{m} \sum_{i1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) ] [ \theta_1 : \theta_1 - \alpha \frac{1}{m} \sum_{i1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x^{(i)} ] }这个算法被称为使用梯度下降的线性回归。由于线性回归的代价函数是凸函数梯度下降总能找到全局最优解假设学习率设置得当。5.1 算法实现步骤拆解让我们用伪代码和具体思考步骤来走一遍流程初始化参数通常将 ( \theta_0 ) 和 ( \theta_1 ) 初始化为0。当然也可以随机初始化但对于凸问题从0开始简单可靠。准备数据确保你的训练数据 ( X ) (特征) 和 ( y ) (标签) 已经准备好。有时需要对特征进行缩放归一化但单变量线性回归中如果特征尺度不大可以不做。设置超参数设定学习率 ( \alpha )例如0.01和迭代次数例如1000次。迭代次数也可以设置为直到代价函数变化小于某个阈值为止。梯度下降循环 a.计算当前预测值对于所有训练样本用当前的 ( \theta_0, \theta_1 ) 计算 ( h_\theta(x^{(i)}) \theta_0 \theta_1 x^{(i)} )。 b.计算误差对于每个样本计算预测值与真实值的差 ( error^{(i)} h_\theta(x^{(i)}) - y^{(i)} )。 c.计算梯度 - ( grad_0 (1/m) * sum(error^{(i)}) ) - ( grad_1 (1/m) * sum(error^{(i)} * x^{(i)}) ) d.同步更新参数 - ( \theta_0 \theta_0 - \alpha * grad_0 ) - ( \theta_1 \theta_1 - \alpha * grad_1 ) e.可选监控代价计算当前参数下的代价函数值 ( J )并记录或打印用于监控收敛过程。得到最终模型循环结束后得到的 ( \theta_0, \theta_1 ) 就是学习到的最优参数( h_\theta(x) \theta_0 \theta_1 x ) 就是你的线性回归模型。5.2 可视化收敛过程在调试和教学时将梯度下降的过程可视化极其有用。你可以在两张图上观察代价函数迭代曲线图横轴是迭代次数纵轴是代价 ( J )。你会看到一条随着迭代下降并逐渐平缓的曲线。这直观地告诉你算法是否在收敛以及收敛的速度。参数空间等高线图在 ( \theta_0, \theta_1 ) 的等高线图上绘制出每次迭代后参数点的位置。你会看到一个点从起始位置如(0,0)开始沿着最陡的方向曲折地走向等高线的中心最优点。这个轨迹就像一颗滚向碗底的弹珠。通过可视化你能真切地感受到学习率的影响。学习率合适时轨迹直接、高效地指向中心学习率太小时轨迹移动缓慢需要很多步学习率太大时轨迹可能在中心两侧来回“之字形”跳跃。6. 常见问题、调试技巧与心得实录学懂了原理真正动手实现时还是会遇到各种问题。下面是我在学习和教学中总结的一些典型问题和解决方法。6.1 代价函数不下降或发散这是最常见的问题根本原因几乎总是学习率过大。症状迭代时 ( J ) 的值上下震荡或持续快速增长。排查立即将学习率 ( \alpha ) 减小一个数量级例如从0.1降到0.01甚至0.001再试。根因步子太大直接越过了最低点跑到了代价函数更高的区域。由于梯度方向在对面下一步又会跳回来形成震荡。如果学习率极大可能直接跳到“碗沿”甚至外面导致代价激增。解决采用学习率扫描策略。从一个非常小的值如0.001开始尝试观察代价曲线。如果下降太慢再逐步增大乘以3倍如0.003, 0.01...直到找到一个下降既快又稳的值。6.2 算法收敛速度过慢症状代价函数 ( J ) 确实在下降但下降得非常缓慢需要数万次迭代才能达到一个可接受的值。可能原因1学习率太小。这是最直接的原因增大学习率即可。可能原因2特征尺度差异巨大。虽然单变量问题不常见但如果你手动添加了高阶项如 ( x^2 ) 或进行多变量回归时不同特征的取值范围如房子面积是10-200房间数是1-5会导致代价函数的“碗”变得非常扁长。梯度下降在这种地形上会沿着陡峭方向快速下降但沿着平坦方向进展极其缓慢像在狭窄的山谷中前进。解决进行特征缩放。最常用的方法是均值归一化( x \frac{x - \mu}{s} )其中 ( \mu ) 是均值( s ) 可以是取值范围最大值-最小值或标准差。缩放后所有特征大致在[-1, 1]的范围内代价函数的等高线会更接近圆形梯度下降能更高效地找到方向。6.3 如何判断收敛迭代多少次梯度下降是一个迭代算法我们需要一个停止条件。固定迭代次数最简单的方法设定一个足够大的数如1000, 5000。缺点是可能浪费计算早已收敛或迭代不足未完全收敛。根据代价变化判断在每次迭代中检查代价函数 ( J ) 的变化量 ( |J_{new} - J_{old}| )。如果这个变化量小于一个很小的阈值 ( \epsilon )例如 ( 10^{-6} ) 或 ( 10^{-9} )就可以认为已经收敛。这是更科学、更常用的方法。监控曲线绘制 ( J ) 随迭代次数的变化图。当曲线变得几乎水平时就说明收敛了。这对于手动调试和直观理解非常有帮助。个人经验在实际编程中我通常会结合两种方法。设置一个最大迭代次数如10000作为安全网防止死循环同时在循环内判断代价变化一旦小于阈值就提前跳出循环。这样既安全又高效。另外在迭代初期每100次或1000次迭代打印一次代价可以帮助你快速感知算法是否在正常工作。6.4 梯度下降与正规方程的比较学到梯度下降你可能会问有没有更直接的方法求最优参数对于线性回归答案是有的那就是正规方程。它是一种通过解析解一次性求出最优参数的方法 [ \theta (X^T X)^{-1} X^T y ] 其中 ( X ) 是包含所有特征并添加了一列1对应 ( \theta_0 ) 的矩阵( y ) 是标签向量。特性梯度下降正规方程需要选择学习率是需要调试。否一步计算。需要迭代是需要多次迭代。否直接得出结果。特征数量 n 很大时可以工作效率尚可。计算逆矩阵 ((X^T X)^{-1}) 的复杂度约为 (O(n^3))非常慢。适用模型范围广泛适用于各种模型线性、逻辑、神经网络等。仅适用于线性回归等有解析解的模型。处理特征冗余可以工作但可能变慢。如果特征冗余线性相关(X^T X)不可逆需要处理。如何选择当特征数量 ( n ) 不大比如小于10000时正规方程非常方便快捷。当 ( n ) 非常大比如上百万维特征在文本或图像处理中常见或者你的模型没有解析解时如逻辑回归、神经网络梯度下降及其变种是唯一的选择。理解梯度下降其意义远不止于解决线性回归。它是打开现代机器学习尤其是深度学习大门的钥匙。后续你会看到无论是训练一个复杂的神经网络还是调整推荐系统的参数其核心思想依然是梯度下降。在“模型描述”这一讲里打好这个基础未来学习更高级的优化算法如动量法、Adam时你会感到无比顺畅。
返回列表