AlgoC++:课程总结

课程总结

前言

手写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篇

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
        • 编译时、运行时的区别

个人总结

本次课程从求解 2 \sqrt2 2 出发引出了梯度下降法和牛顿法,同时后续还介绍了其它的优化方法,如最小二乘法、岭回归、高斯牛顿法、LM算法。并介绍了线性回归和逻辑回归两个具体的算法,一个损失函数使用的是 MSE Loss,一个损失函数使用的是 Cross Entropy Loss;并着重讲解了 BP 反向传播算法,其本质是多个线性回归模型的叠加,并带着我们实现了矩阵 Matrix 的封装、BP算法的实现以及自动微分的实现。杜老师的代码非常具有借鉴意义,不过也没来得及仔细看,学习 C++ 还是得多看多写多想吧。

从去年准备开始学的还是拖到了今年😂,这次跟随杜老师学习算法的 C++,也算整体过了一遍吧,感觉掌握到得东西不是很多,还是写少了🤣,后续再去多看看老师的代码,多去想想吧。需要注意的是后续学习 C++ 是要与软工 C++ 教程进行区分,我们毕竟并不是软件工程师,很多东西也没有太大的必要去学习,用老师的一句话来总结 C++ 的学习,即基本语法+线程相关+优化相关+编译相关

总的来说,本次课程的学习收获还是比较大的,对 C++ 的学习起码有了一个大概的方向,后续学习的内容老师也给出来了,接着去学吧。感谢杜老师!!!🤞

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱听歌的周童鞋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值