【漫话机器学习系列】229.特征缩放对梯度下降的影响(The Effect Of Feature Scaling Gradient Descent)

特征缩放对梯度下降的影响:为什么特征标准化如此重要?

在机器学习和深度学习中,梯度下降是最常用的优化算法之一。然而,很多人在训练模型时会遇到收敛速度慢训练不稳定的问题,其中一个重要原因就是特征未进行适当的缩放

本文通过一张直观的图,详细讲解特征缩放对梯度下降路径的影响,并配合示例代码,帮助你彻底理解这个概念。


1. 什么是特征缩放?

特征缩放(Feature Scaling)是将数据的特征值统一到一定范围(如 [-1,1] 或 [0,1])的过程。
常见的方法有:

  • 归一化(Normalization):把数据缩放到固定范围(通常是[0,1])。

  • 标准化(Standardization):使特征数据的均值为0,标准差为1。

常见的公式:

归一化:

x' = \frac{x - \min(x)}{\max(x) - \min(x)}

标准化:

x' = \frac{x - \mu}{\sigma}

其中,μ 是均值,σ 是标准差。


2. 特征缩放对梯度下降的影响

看一下下面这张图(来源于 Chris Albon 的手绘):

图的左半部分展示了未进行特征缩放的情况;右半部分展示了进行了特征缩放的情况。

2.1 未进行特征缩放

  • 损失函数的等高线呈现出拉长的椭圆形(特征尺度不一致,X1、X2维度变化范围不同)。

  • 梯度下降沿着最陡方向前进,但由于方向不正确,导致路径“之”字形前进。

  • 整个收敛过程非常缓慢,且容易震荡

图中左边橙色箭头清晰显示了这种曲折前进的轨迹。

总结
特征缩放不一致 → 梯度下降“拐弯抹角” → 训练慢且不稳定。


2.2 进行了特征缩放

  • 等高线接近圆形,各特征对损失的贡献在同一量纲。

  • 梯度下降可以直接朝着最优解方向快速前进

  • 收敛速度大幅提升。

图中右边箭头直线指向中心,非常干脆利落。

总结
特征缩放一致 → 梯度下降快速直奔最优解 → 训练稳定且高效。


3. 为什么会这样?——从数学角度理解

梯度下降更新公式:

\theta = \theta - \eta \nabla J(\theta)

其中:

  • θ:模型参数

  • η:学习率

  • ∇J(θ):损失函数关于参数的梯度

如果各个特征的尺度差异很大,某些方向(例如 x_1​)的梯度变化非常快,而另一些方向(例如 x_2​)的变化非常慢,导致梯度下降需要在各个方向上不断地调整,非常低效。

当特征缩放后,各方向上的变化速度均衡,梯度下降可以更稳定地朝着全局最优点前进。


4. 示例代码:如何在 PyTorch 中应用特征缩放

下面用一个小示例说明如何在实际训练中进行特征标准化。

import torch
from sklearn.preprocessing import StandardScaler# 假设有一批特征数据
X = torch.tensor([[100.0, 1.0],[200.0, 2.0],[300.0, 3.0],[400.0, 4.0]
])# 使用sklearn进行标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X.numpy())print("原始数据:\n", X)
print("标准化后数据:\n", X_scaled)# 将标准化后的数据转回Tensor用于后续训练
X_scaled = torch.tensor(X_scaled, dtype=torch.float32)

输出:

原始数据:tensor([[100.,   1.],[200.,   2.],[300.,   3.],[400.,   4.]])
标准化后数据:[[-1.3416408 -1.3416408][ -0.4472136 -0.4472136][  0.4472136  0.4472136][  1.3416408  1.3416408]]

这样处理后的特征就不会因为数量级不同而影响梯度下降的速度和方向了!


5. 总结

  • 特征缩放是训练深度学习模型时非常重要的一步。

  • 特征未缩放时,梯度下降路径会变得弯曲,导致训练缓慢、不稳定。

  • 特征缩放后,可以显著加速收敛速度,提高训练稳定性。

  • 在实际建模中,始终推荐对输入特征进行标准化处理,尤其是在使用梯度下降优化器时。


建议:
今后在任何机器学习、深度学习项目中,在建模前加上特征缩放(尤其是标准化步骤)!这是最简单但效果最显著的性能提升方法之一!


如果你觉得这篇文章对你有帮助,别忘了点赞、收藏、关注哦!
未来我也会分享更多直观好懂的机器学习、深度学习知识!
如果你有其他想了解的内容,欢迎在评论区告诉我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【神经网络与深度学习】批标准化(Batch Normalization)和层标准化(Layer Normalization)

引言 在深度学习中,标准化技术(Normalization)是提高神经网络训练效率和性能的重要工具。其中,批标准化(Batch Normalization, BN)和层标准化(Layer Normalization, LN)是两种常用的…

OpenHarmony之电源管理子系统公共事件定义

OpenHarmony之电源管理子系统公共事件定义 电源管理子系统面向应用发布如下系统公共事件,应用如需订阅系统公共事件,请参考公共事件接口文档。 COMMON_EVENT_BATTERY_CHANGED 表示电池充电状态、电平和其他信息发生变化的公共事件的动作。 值&#x…

linux 环境下 c++ 程序打印 core dump 信息

linux 信号机制 软中断信号 Signal,简称信号,用来通知进程发生了异步事件,进程之间可以互相通过系统调用 kill 等函数来发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。 进程对信号的处理 进…

Qt开发环境的安装与问题的解决(2)

文章目录 1. Qt开发环境安装的说明2. 通过安装包进行安装3. 通过在线下载程序 解决问题下载 https....网路错误问题解决开始安装--第一部分开始安装--第二部分 4. 建议配置环境变量(非必须)配置环境变量的意义 简介:这篇文章主要分享Qt开发环…

【每日EDA行业分析】2025年4月25日

深度总结:EDA 软件行业现状与发展趋势 一、引言 在半导体产业的复杂生态中,EDA 软件宛如一颗闪耀的明珠,它是集成电路设计的核心工具,贯穿芯片从设计构思到最终封装测试的全流程,其重要性不言而喻,被誉为…

flutter实践:比例对比线图实现

需求:flutter实现一个左右对比线图,带有动画效果 效果图: Widget _buildTop() {return Container(height: themeData.heightXl,padding: EdgeInsets.symmetric(horizontal: themeData.hSpacingMd),child: Row(mainAxisAlignment: MainAxisAlignment.spa…

测试基础笔记第十五天

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、集合1.集合的定义二、使用集合列表去重 导包二、函数1.函数介绍2.定义函数3.调用函数4.函数实现登录案例5.函数的返回值 三、模块和包1.模块的概念(Module)2.模…

Linux中的shell脚本练习

1.判断字符串是否为空 #!/usr/bin/bash while : #:默认值为真 do read -p "请输入你的密码: " a pass123456 if [ -z $a ];thenecho "您输入的密码不能为空"exit 1 elseif [ $a $pass ];thenecho "登录成功"breakelseecho "您的密码输入有…

使用命令关闭Redis服务端

使用命令关闭Redis服务端。 命令 redis-cli -a 111111 -p 6379 shutdown 有些人redis的端口不是6379,那就自己查一下 参数解释: -a:Redis密码 -p:Redis端口 shutdown:关闭命令

嵌入式RTOS实战:uC/OS-III最新版移植指南(附项目源码)

文章目录 前言一、uC/OS简介二、工程移植2.1 下载ucos源码2.2 创建空白工程2.3 拷贝ucosiii源码文件2.3.1 UC-CONFIG2.3.2 UC-CPU2.3.3 UC-LIB2.3.4 UC-OS3 2.3 添加工程文件分组及路径2.4 代码首次编译2.5 源码修改2.5.1 cpu_cfg.h2.5.2 os_cpu_c.c2.5.3 lib_cfg.h2.5.4 sys.h…

TypeScript中的函数类型定义与类型约束

函数类型定义与类型约束 一、核心概念:类型别名与函数类型 1. 类型别名(Type Alias) 定义 类型别名使用 type 关键字为现有类型创建一个新名称,可以用于: 基础类型(如 string、number)&…

相机DreamCamera2录像模式适配尺寸

在开发中遇到 一个问题,相机切换视频模式时,预览时,界面不能充满屏幕两侧有黑边,客户要求修改,在此记录 一问题现象: 系统相机在视频模式下预览时如下现象如图1,期望现象如图2: 图1 …

SpringCloud组件——Gateway

一.网关 1.问题提出 我们通过Eureka,Nacos解决了服务注册,服务发现的问题,使用SpringCloud LoadBalance解决了负载均衡的问题,使用OpenFeign解决了远程调用的问题。 但是当前所有微服务的接口都是直接对外暴露的,可…

C#中构造器及属性的加载顺序

一.基本原则: 先加载静态构造函数和静态字段,后加载普通构造函数和普通字段;先加载基类再加载子类; 二.具体的加载顺序: 父类静态字段--->父类静态构造函数--->子类静态字段--->子类静态构造函数--->父类实例字段---> 父类实例构造函数--->子类实例字段-…

Python面试问题

一、Python 基础 1. Python 的特点 动态类型:变量无需声明类型。解释型语言:逐行解释执行。支持多种编程范式(面向对象、函数式、过程式)。 2. 列表(List)与元组(Tuple)的区别 特…

计算机视觉进化论:YOLOv12、YOLOv11与Darknet系YOLOv7的微调实战对比

摘要 YOLO系列作为实时目标检测领域的重要里程碑,持续引领速度与精度的平衡发展。本文围绕YOLOv7(基于Darknet框架)、YOLOv11及YOLOv12,系统、深入地对比了三款模型的架构创新、微调策略、核心技术及应用场景。我们详细解析了三者…

SQL Server 存储过程开发规范

SQL Server 存储过程开发规范(高级版) 1. 总则 1.1 目标 本规范旨在: 提高存储过程的事务一致性、异常可追踪性、错误透明度。 统一日志记录、错误码管理、链路追踪(Trace ID)。 支持复杂事务场景(嵌套…

opendds的配置

配置的使用 文档中说明有4种使用配置的方式: 环境变量 命令行参数(将覆盖环境变量中的配置) 配置文件(不会覆盖环境变量或命令行参数中的配置) 用户调用的 API(将覆盖现有配置) 这里对开发…

(Go Gin)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收

1. 路由 gin 框架中采用的路优酷是基于httprouter做的 HttpRouter 是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。 主要特点 显式匹配:与其他路由…

Marin说PCB之----板材的替换注意事项

由于最近很多武林上的主流门派都需要采用将的本方案,小编所在的宗门古族也是不例外了,宗门大长老韩立现在想把之前一直在用的板材EM370Z替换成生益的Autolad3,让我去拿资料分析一下是否可以替换。下图所示是就是小编我做的一个表格关于两家板…