当前位置: 首页 > news >正文

10-机器学习与大模型开发数学教程-第1章 1-2 O(n) 表示法与时间复杂度

在机器学习和大模型开发中,很多时候我们会写出一个训练算法或者推理过程。代码能运行是第一步,但更重要的问题是:

  • 这个算法在小数据集上跑得很快,但在 百万级、甚至上亿数据 时还能行吗?
  • 一个 Transformer 模型在一块 GPU 上能训练,但换成 1000 块 GPU 时,能否高效并行?

这些问题的答案,往往隐藏在一个核心概念里——算法复杂度(Complexity)

复杂度不是用来吓唬人的公式,而是告诉我们:随着输入规模变大,程序的执行时间和资源消耗会怎么变化


O(n) 表示法的由来

我们常见的时间复杂度有:

  • O(1)O(1)O(1):常数时间,不随输入规模变化(比如直接读取数组某一项)。
  • O(n)O(n)O(n):线性时间,随输入规模成比例增长(比如遍历数组)。
  • O(n2)O(n^2)O(n2):平方时间,典型的双层循环(比如朴素矩阵乘法)。
  • O(log⁡n)O(\log n)O(logn):对数时间(比如二分查找)。
  • O(nlog⁡n)O(n \log n)O(nlogn):常见于排序算法。

数学上,**O 表示法(大 O 记号)**描述了函数在输入规模趋近无穷大时的增长趋势。
形式定义是:如果存在常数 C>0C > 0C>0,以及 n0>0n_0 > 0n0>0,当 n>n0n > n_0n>n0 时,有

f(n)≤C⋅g(n),f(n) \leq C \cdot g(n),f(n)Cg(n),

那么我们就记作:

f(n)=O(g(n)).f(n) = O(g(n)).f(n)=O(g(n)).

这里:

  • f(n)f(n)f(n) 是算法的实际运行时间;
  • g(n)g(n)g(n) 是一个更简单的“上界函数”;
  • O(g(n))O(g(n))O(g(n)) 表示“f 的增长速度不会超过 g 太多”。

一个生活类比:排队买奶茶

  • 如果店里有 1 个窗口,每来一个顾客就要单独服务,那时间复杂度就是 O(n)O(n)O(n)
  • 如果店里同时开了 n 个窗口(大家都能同时买),那时间复杂度接近 O(1)O(1)O(1)
  • 如果店员每服务一个顾客都要先“和上一个顾客做双重确认”,那复杂度可能变成 O(n2)O(n^2)O(n2)

复杂度的意义就是:当顾客越来越多(数据规模越来越大)时,等待时间会怎么增长


复杂度与函数增长的联系

在本章的主题“微分”里,函数的增长率是一个核心。复杂度分析其实就是在问:

  • 输入规模 nnn 增大时,算法运行时间 T(n)T(n)T(n) 的增长速度是多少?
  • 我们是否可以找到一个简单的函数 g(n)g(n)g(n) 来近似刻画 T(n)T(n)T(n) 的增长?
输入规模 n
函数 T(n): 算法运行时间
近似增长率 g(n)
大O表示法: O(g(n))

图示说明:输入规模 nnn 决定运行时间 T(n)T(n)T(n),而大 O 表示法就是用一个更简单的函数 g(n)g(n)g(n) 来描述它的“增长速度”。


机器学习中的复杂度案例

  1. 线性回归
    • 训练时需要计算矩阵乘法(维度 n×dn \times dn×d,其中 nnn 是样本数,ddd 是特征数)。
    • 矩阵乘法的复杂度约为 O(nd2)O(nd^2)O(nd2)O(d3)O(d^3)O(d3)(取决于实现)。
    • 当数据量非常大时,优化矩阵运算库(BLAS、CUDA)就变得至关重要。
  2. 神经网络前向传播
    • 单层神经网络计算:输入向量长 ddd,权重矩阵大小 d×hd \times hd×h,输出维度 hhh
    • 时间复杂度约为 O(dh)O(dh)O(dh)
    • 如果层数是 LLL,那么总复杂度是 O(Ldh)O(Ldh)O(Ldh)
  3. Transformer 注意力机制
    • 经典自注意力(Self-Attention)要计算所有序列位置的两两相似度。
    • 序列长度为 nnn 时,复杂度为 O(n2)O(n^2)O(n2)
    • 这也是为什么 长文本处理 成为大模型的重要挑战。很多论文都在研究如何把 O(n2)O(n^2)O(n2) 降到 O(nlog⁡n)O(n \log n)O(nlogn) 或更低。

技术延伸:为什么微积分和 O(n) 有关系?

  • 微积分研究的是函数的变化趋势
  • O(n) 表示法研究的是函数的增长趋势

在算法复杂度里,我们常常会用到极限的思想:

lim⁡n→∞f(n)g(n)\lim_{n \to \infty} \frac{f(n)}{g(n)}limng(n)f(n)

如果这个极限是有限值,那么我们说 f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))
所以,复杂度分析其实就是在用极限比较函数的增长率

这也说明:即使 O(n) 表示法看似是“算法”的概念,但它的数学根基依然来自微积分


本节小结

  • 大 O 表示法 用来描述算法在输入规模很大时的增长趋势。
  • 它和微积分的联系在于:都关注“函数在无穷大时的增长速度”。
  • 在机器学习和大模型中:
    • 线性回归矩阵运算 → O(nd2)O(nd^2)O(nd2)
    • 神经网络前向传播 → O(Ldh)O(Ldh)O(Ldh)
    • Transformer 自注意力 → O(n2)O(n^2)O(n2)
  • 理解复杂度,能帮助我们从“代码能跑”提升到“代码能高效跑”。
http://www.dtcms.com/a/486008.html

相关文章:

  • toLua[六] Examples 05_LuaCoroutine分析
  • keil5使用STlink下载程序到stm32后不自动运行的解决办法
  • stm32大项目阶段20251015
  • 机器学习四范式(有监督、无监督、强化学习、半监督学习)
  • 源码分析 golang bigcache 高性能无 GC 开销的缓存设计实现
  • 网站开发的工资开发者应用
  • 东莞网站建设优化企业太平洋保险网站
  • transformer-注意力评分函数
  • 破解 Shuffle 阻塞:Spark RDD 宽窄依赖在实时特征工程中的实战与未来
  • TypeScript入门学习
  • 西固网站建设平台12306网站花多少钱做的
  • Linux运维实战:云原生设计与实施DockerK8S(视频教程)
  • Chroma 开源的 AI 应用搜索与检索数据库(即向量数据库)
  • 楼宇自控 DDC 系统 + IBMS 智能化集成系统:构建建筑智慧运营双核心
  • 《深度学习框架核心之争:PyTorch动态图与早期TensorFlow静态图的底层逻辑与实战对比》
  • 固件下printf函数分析
  • 做外贸都得有网站吗秦皇岛网站排名公司
  • AI-Native 能力反思(三):Prompt Engineering 自我提升神器
  • 基于Django+Vue2+MySQL前后端分离的红色故事分享平台
  • LangGraph 工作流全解析:从 Prompt 到智能体编排的革命
  • JAVA算法练习题day42
  • 天津市建设工程备案网站什么是网站的层次
  • 【基础算法】BFS
  • 国家工信部网站备案查询系统公司网址怎么做出来的
  • 做网站都用到哪些软件asp源码打开网站
  • React组件生命周期节点触发时机(组件加载Mount、组件更新Update、组件卸载Unmount)组件挂载
  • 月球矩阵日志:Swift 6.2 主线程隔离抉择(上)
  • 无需 iCloud 在 iPhone 之间传输文本消息
  • Flink受管状态自定义序列化原理深度解析与实践指南
  • Unity Visual Graph粒子系统 Plexus 效果