AlgoC++:课程总结

news2024/11/24 9:14:09

目录

  • 课程总结
    • 前言
    • 1. 未讲解内容
    • 2. 复习
      • 2.1 矩阵求导
      • 2.2 优化方法
      • 2.3 具体的算法
    • 3. 未来怎么学C++(必看!!!)

课程总结

前言

手写AI推出的全新面向AI算法的C++课程 Algo C++,链接。记录下个人学习笔记,仅供自己参考。

本次课程主要是课程总结,对之前学习的知识的一个复习

课程大纲可看下面的思维导图

如果有之前上过课的同学能否分享下剩余部分的示例代码呢?

什么时候杜老师能重启下这个课程就好了😂

在这里插入图片描述

1. 未讲解内容

我们先来看看没有讲解到的内容

1.基础篇

  • 多线程
    • thread、condition_variable、future、promise、mutex、shared_ptr、unique_ptr、线程进程

2.nn篇

  • CNN
  • LSTM
  • LM算法
  • Yolov5推理

3.3D渲染篇

  • 旋转相册
  • 模型加载

4.传统算法篇

  • 卷积
  • kdtree
  • 霍夫直线检测

5.调包篇

  • Eigen
  • OpenCV
  • Protobuf
  • TensorRT
  • Ceres
  • Sophus
  • ffmpeg
  • pybind11
  • json
  • zmq

6.性能优化篇

  • simd
    • sse
    • mmx
  • openmp
  • cuda
  • openblas

7.标定篇

  • 张正友标定法

8.SLAM篇

  • EPnP
  • Cartographer 参考

9.交付上线篇

  • release
  • inference-server

2. 复习

我们来对前面学习的知识做一个总结

2.1 矩阵求导

  • A ⋅ B = C A \cdot B = C AB=C G = ∂ A ∂ B G = \dfrac{\partial A}{\partial B} G=BA
  • ∂ L ∂ A = G ⋅ B T \dfrac{\partial L}{\partial A}=G\cdot B^T AL=GBT
  • ∂ L ∂ B = A T ⋅ G \dfrac{\partial L}{\partial B}=A^T \cdot G BL=ATG

2.2 优化方法

  • 梯度下降
    • θ = θ − l r ∗ d θ \theta = \theta - lr * d\theta θ=θlrdθ
    • 梯度方向是函数上升最快的方向
    • 负梯度方向是下降最快的方向
  • 最小二乘法
    • m i m i m i z e ( 1 2 ∣ ∣ X θ − Y ∣ ∣ 2 2 ) mimimize(\frac{1}{2} ||X\theta - Y||_2^2) mimimize(21∣∣Y22)
    • θ = ( X T X ) − 1 X T Y \theta = (X^TX)^{-1}X^TY θ=(XTX)1XTY
  • 岭回归(L2正则化的回归)
    • m i m i m i z e ( 1 2 ∣ ∣ X θ − Y ∣ ∣ 2 2 + λ ∣ ∣ θ ∣ ∣ 2 2 ) mimimize(\frac{1}{2} ||X\theta - Y||_2^2 + \lambda||\theta||_2^2) mimimize(21∣∣Y22+λ∣∣θ22)
      • λ \lambda λ 取很小的数
    • θ = ( X T X + λ I ) − 1 X T Y \theta = (X^TX + \lambda I)^{-1}X^TY θ=(XTX+λI)1XTY
      • 更好的解决奇异矩阵的问题,即 X T X X^TX XTX 不可导的问题
  • 牛顿法
    • θ = θ − H − 1 ∂ L ∂ θ \theta = \theta - H^{-1} \dfrac{\partial L}{\partial \theta} θ=θH1θL
      • 这里的 H H H 是海森矩阵,对应二阶导
  • 高斯牛顿法
    • m i m i m i z e ( 1 2 ∣ ∣ X θ − Y ∣ ∣ 2 2 ) mimimize(\frac{1}{2} ||X\theta - Y||_2^2) mimimize(21∣∣Y22)
    • 对于海森矩阵的求解问题,很多时候不好求解
    • 使用雅可比矩阵来近似它
    • θ = θ − ( J T J ) − 1 J T r \theta = \theta - (J^TJ)^{-1}J^Tr θ=θ(JTJ)1JTr
      • 这里近似的定义是
        • H ( L ( θ ) ) ≈ J ( r ( θ ) ) T J ( r ( θ ) ) H(L(\theta)) \approx J(r(\theta))^TJ(r(\theta)) H(L(θ))J(r(θ))TJ(r(θ))
        • H ( L ( θ ) ) H(L(\theta)) H(L(θ)) L L L 对参数的海森矩阵,对应二阶导
        • J ( r ( θ ) ) J(r(\theta)) J(r(θ)) 是残差 r r r 对参数的雅可比矩阵,对应一阶导
        • r = X θ − Y r=X\theta - Y r=Y 是残差
  • LM算法
    • θ = θ − ( J T J + μ I ) − 1 J T r \theta = \theta - (J^TJ+\mu I)^{-1}J^Tr θ=θ(JTJ+μI)1JTr
    • μ \mu μ 可以称之为阻尼系数,是一个可调整的参数

2.3 具体的算法

  • 分类和回归的定义
    • 回归:连续值预测
    • 分类:离散值预测

1.线性回归

  • y = k x + b y = kx+b y=kx+b 一元形式
  • Y = X θ    ( x 0 = 1 ) Y = X\theta \ \ (x_0=1) Y=  (x0=1)
  • 根据线性回归的正态分布假设推导,最后得 MSELoss
  • M S E = 1 2 ∑ ( X θ − Y ) 2 MSE = \frac{1}{2}\sum(X\theta-Y)^2 MSE=21(Y)2
  • 也称之为 L2 loss
  • 正则化项,有 L1、L2 正则化
  • L1 正则化,对应的是 lasso 回归
  • L2 正则化,对应的是岭回归
  • 范数,P 范数的定义: ∣ ∣ X ∣ ∣ p = ∣ x i ∣ p p ||X||_p = \sqrt[p]{|x_i|^p} ∣∣Xp=pxip

2.逻辑回归

  • y = k x + b y = kx+b y=kx+b 一元形式,用回归的思路去回归对数逻辑概率
  • Y = X θ    ( x 0 = 1 ) Y = X\theta \ \ (x_0=1) Y=  (x0=1)
  • 根据伯努利二项分布推导,得到交叉熵损失函数,CrossEntropyLoss
  • 最后把回归的预测值变为概率值的激活函数时 s i g m o i d = 1 1 + e − x sigmoid = \frac{1}{1+e^{-x}} sigmoid=1+ex1
  • B C E = − 1 n ∑ ( Y ln ⁡ ( P ) + ( 1 − Y ) ln ⁡ ( 1 − P ) ) BCE = -\frac{1}{n}\sum(Y\ln(P) + (1-Y)\ln(1-P)) BCE=n1(Yln(P)+(1Y)ln(1P))

3.BP(误差反向传播)

  • 以矩阵形式理解权重和网络结构图
  • 本质上来讲,就是多个线性回归模型的叠加
  • h i d d e n = r e l u ( X θ + b i a s 1 ) hidden = relu(X\theta + bias_1) hidden=relu(+bias1)
  • o u t p u t = h i d d e n ⋅ θ + b i a s 2 output = hidden\cdot\theta + bias_2 output=hiddenθ+bias2
  • l o s s = B C E ( o u t p u t , Y ) loss = BCE(output,Y) loss=BCE(output,Y)
    • BCE 内部实现了 sigmoid 的激活
    • 参数初始化,采用 fan_in+fan_out,凯明初始化
    • 优化器,Momentum - SGD / Adam / AdamW

4.自动微分

  • 了解自动微分解决的问题
    • 自动求导的问题
  • 定义解决的思路
    • 1.描述计算图
      • 使得每一个求导过程都只关注到一个算子
      • 有微分类似的思想
    • 2.实现计算的 forward/backward
    • 3.实现基本的函数和四则运算的封装
      • 否则就不好用
  • 实现途径:
    • 1。shared_ptr,引入它的目的是实现数据能够以引用的方式进行传递
      • 好处在于,内存更优化,避免拷贝的发生
      • 实现前后的真正关联(计算图前后关联的主要方式)
    • 2.定义外壳类(能够进行基本四则运算等操作的东西)
      • Expression
      • 这里的操作会被转发到实现类中
    • 3.定义具体实现类(具体执行forward/backward过程)
      • Container

5.矩阵的封装

  • 目前封装的是2d,只有行和列的情况,属于比较简单
  • 建议一定要自己实现 ndarray 的封装
  • GPU Tensor / CPU Tensor的实现和交互
    • Caffe
    • 比如 CPU 分配内存,使用 malloc / new
    • GPU 分配内存,使用 cudaMalloc
  • 高阶矩阵的维度变换、乘法、广播
    • permute
    • 矩阵乘法(批次)
  • 一些矩阵库的使用
    • Eigen 库很常用

3. 未来怎么学C++(必看!!!)

未来该怎么学习 C++ 呢,下面是杜老师给出的建议

  1. 一定要注意,你不是学软工,不是软件工程师
    • 因为绝大部分 C++ 教程都是按照软件工程师教的
  2. 学习算法相关的 C++ 即可
    • 基础语法(类、多态、继承、重载)
      • C++新特性,新标准,C++11/14/17
      • lambda、构造析构、深浅拷贝、作用域、命名空间、模板
    • STL库
      • 基本容器(vector、list、queue、map、set)
      • 线程相关(thread、mutex、condition_variabe、promise、future、unique_lock)
    • 基本语法,加线程相关,加优化相关,加编译相关
    • CMake,这个不重要
      • 重点也不是学makefile
      • 重点是理清楚 -l -L -I -o -c -E -S 这些东西在干嘛
        • LD_LIBRARY_PATH、PATH、rpath
        • 编译时、运行时的区别
          on_variabe、promise、future、unique_lock)
    • 基本语法,加线程相关,加优化相关,加编译相关
    • CMake,这个不重要
      • 重点也不是学makefile
      • 重点是理清楚 -l -L -I -o -c -E -S 这些东西在干嘛
        • LD_LIBRARY_PATH、PATH、rpath
        • 编译时、运行时的区别

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

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

相关文章

【嵌入式环境下linux内核及驱动学习笔记-(8-内核 I/O)-信号驱动】

目录 3 信号驱动的异步通知3.1 linux异步通知编程3.1.1 什么是信号3.1.2 信号的工作流程: 3.2. 应用层3.2.1 信号接收 signal函数3.2.2 应用层 fcntl 函数3.2.3 应用层信号驱动机制步骤 3.3 驱动层3.3.1 驱动层模板3.3.2 驱动层 实现fasync函数3.3.3 fasync_helper3.3.4 struct…

Golang-常见数据结构Slice

Slice slice 翻译成中文就是切片,它和数组(array)很类似,可以用下标的方式进行访问,如果越界,就会产生 panic。但是它比数组更灵活,可以自动地进行扩容。 了解 slice 的本质, 最简单的方法就是…

MySQL 一条SQL语句是如何执行的?

总览 ​ 所以今天我们把MySQL拆解一下,看看里边有哪些零件。下边是MySQL的基本架构示意图。 大体来说,MySQL分为Server层和存储引擎两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能&am…

小白也能懂的可转债配债价格计算

可转债配债如何计算 先给理论公式: 配债10张/1手所需的钱数 配债所需股数 * 当前的股价 这个公式应该很好理解,不需要做过多的解释。 那, 为什么如此简单的公式,还是很多人不会算,是因为: 配债所需的股数跟…

类与对象之构造函数

文章目录 导读类的6个默认构造函数构造函数概念特性 析构函数概念特性 拷贝构造函数概念特性 赋值运算符重载运算符重载赋值运算符重载前置和后置重载 导读 本文是md导入的可能格式有点乱,希望各位理解一下 类的6个默认构造函数 默认成员函数:用户没有…

五一堵车 | AI“高速”车辆检测轻而易举监测大家安全

点击蓝字关注我们 关注并星标 从此不迷路 计算机视觉研究院 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 五一节不管是离开小城镇还是进入大城市,每个高速路口都是堵车,现在人工智能愈来愈发达&#xff0c…

git fetch时,FETCH_HEAD和.git\refs\remotes\origin会有哪些变化

目录 github远程仓库状态clone 到本地对新clone的仓库直接 fetchgit fetchgit fetch origingit fetch origin test1git fetch origin test2:test22 结论 github远程仓库状态 clone 到本地 git fetchgit fetch origingit fetch origin test3git fetch origin test2:test22 git f…

Photon AI Translator 和做产品的一些思考

近 4 个月内我一直在做 Apple 平台的产品,虽然从使用量来说「简体中文」用户是占多数,但我一直有做多语言的支持:英语、简体中文和繁体中文。习惯上 Google 翻译的我,基本上在使用 Xcode 过程中也会一直在浏览器开着 Google Trans…

复古决战快速施法穿墙秒怪分析流程及安全防护

《决战》是一款非常古老的RPG游戏,作为热血传奇同期的热门游戏也深受7080后的喜爱。 在十几年前玩这个游戏时,我也使用过瞬移穿墙,快速施法秒怪等功能的辅助。 下面我们就用一个自己架设的单机版来回顾一下当年辅助开发的流程,并…

【三十天精通Vue 3】 第二十二天 Vue 3的UI框架详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、常用的Vue 3 UI框架概览1. 常用的Vue 3 UI框架有哪些&…

不同主题增删改查系统【控制台+MySQL】(Java课设)

有很多顾客都是只要实现各种各样的增删改查系统即可,只是主题和数据库表不一样,功能都是增删改查这四个功能,做出来的效果和下面的截图是一样的,后续这样的增删改查系统的运行效果请参考下面的截图,我就不一一演示了&a…

OSPF-MGRE综合实验

拓扑结构: 要求: 1、R6为ISP只能配置IP地址,R1~R5的环回为私有网段 2、R1/4/5为全连的MGRE结构,R1/2/3为星型的拓扑结构,R1为中心站点 3、所有私有网段可以互相通讯,私有网段使用OSPF协议完成 使用的设备…

【Java笔试强训 13】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥参数解析…

忆暖行动|“ 还可以留一点做成柿饼,做法也很简单,就是挑硬柿子把皮削掉,用开水烫个几秒”

追忆过往 感恩现在 我们知道,现在的生活与之前相比发生了翻天覆地的变化,您觉得有什么变化呢? 现在的生活好啊,家家房子都盖起来了,你瞅我这房子,是我子女们大前年给我盖的,我原来都是住的土房…

【Unity-UGUI控件全面解析】| Image 图片组件详解

🎬【Unity-UGUI控件全面解析】| Image 图片组件详解一、组件介绍二、组件属性面板2.1 Image Type三、代码操作组件四、组件常用方法示例4.1 简易血条制作4.2 简易技能冷却条制作五、组件相关扩展使用5.1 Mask 遮罩💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本…

Java每日一练(20230430)

目录 1. 文本左右对齐 🌟🌟🌟 2. 求素数和 🌟 3. 整数转换英文表示 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专…

mycat的基本介绍及安装

海量数据存储解决方案之分库分表原理解析及mycat安装及使用_已经存在大量数据 可以使用mycat分表吗_踩踩踩从踩的博客-CSDN博客 Mycat核心概念工作原理及高级特性分析_mycat-mini-monitor_踩踩踩从踩的博客-CSDN博客 前言 在之前的文章中,介绍了一部分的mycat&am…

Web App Manager - 将任何网站转换为应用程序

Web App Manager - 将任何网站转换为应用程序 WebApp Manager 是一款实用程序,由 Linux Mint 和 Peppermint 基于 Peppermint 的 ICE 合作创建——用户可以使用该应用程序将他们喜欢的应用程序转换为独立的 Web 应用程序,它最早于 2010 年首次发布&…

CKA/CKS/CKAD认证考试攻略

什么是CKA考试? CKA认证考试是由Linux基金会和云原生计算基金会(CNCF)创建的,以促进Kubernetes生态系统的持续发展。该考试是一种远程在线、有监考、基于实操的认证考试,需要在运行Kubernetes的命令行中解决多个任务。CKA认证考试是专为Kube…

vue---组件基本知识

目录 一、组件基础 二、Props组件交互 三、自定义组件交互 一、组件基础 对于组件,我个人的理解是每个网页其实都是由一个个组件组成的,它可以理解成网页元素的组成单位,下面我们来看下如何将组件加载到页面中。 (1&#xff09…