目录
- 课程总结
 - 前言
 - 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 A⋅B=C G = ∂ A ∂ B G = \dfrac{\partial A}{\partial B} G=∂B∂A
 - ∂ L ∂ A = G ⋅ B T \dfrac{\partial L}{\partial A}=G\cdot B^T ∂A∂L=G⋅BT
 - ∂ L ∂ B = A T ⋅ G \dfrac{\partial L}{\partial B}=A^T \cdot G ∂B∂L=AT⋅G
 
2.2 优化方法
- 梯度下降 
  
- θ = θ − l r ∗ d θ \theta = \theta - lr * d\theta θ=θ−lr∗dθ
 - 梯度方向是函数上升最快的方向
 - 负梯度方向是下降最快的方向
 
 - 最小二乘法 
  
- 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∣∣Xθ−Y∣∣22)
 - θ = ( 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∣∣Xθ−Y∣∣22+λ∣∣θ∣∣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 不可导的问题
 
 
 -  
        
         
          
          
            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∣∣Xθ−Y∣∣22+λ∣∣θ∣∣22) 
    
 - 牛顿法 
  
-  
        
         
          
          
            θ 
           
          
            = 
           
          
            θ 
           
          
            − 
           
           
           
             H 
            
            
            
              − 
             
            
              1 
             
            
           
           
            
             
             
               ∂ 
              
             
               L 
              
             
             
             
               ∂ 
              
             
               θ 
              
             
            
           
          
         
           \theta = \theta - H^{-1} \dfrac{\partial L}{\partial \theta} 
          
         
       θ=θ−H−1∂θ∂L 
    
- 这里的 H H H 是海森矩阵,对应二阶导
 
 
 -  
        
         
          
          
            θ 
           
          
            = 
           
          
            θ 
           
          
            − 
           
           
           
             H 
            
            
            
              − 
             
            
              1 
             
            
           
           
            
             
             
               ∂ 
              
             
               L 
              
             
             
             
               ∂ 
              
             
               θ 
              
             
            
           
          
         
           \theta = \theta - H^{-1} \dfrac{\partial L}{\partial \theta} 
          
         
       θ=θ−H−1∂θ∂L 
    
 - 高斯牛顿法 
  
- 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∣∣Xθ−Y∣∣22)
 - 对于海森矩阵的求解问题,很多时候不好求解
 - 使用雅可比矩阵来近似它
 -  
        
         
          
          
            θ 
           
          
            = 
           
          
            θ 
           
          
            − 
           
          
            ( 
           
           
           
             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=Xθ−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=Xθ (x0=1)
 - 根据线性回归的正态分布假设推导,最后得 MSELoss
 - M S E = 1 2 ∑ ( X θ − Y ) 2 MSE = \frac{1}{2}\sum(X\theta-Y)^2 MSE=21∑(Xθ−Y)2
 - 也称之为 L2 loss
 - 正则化项,有 L1、L2 正则化
 - L1 正则化,对应的是 lasso 回归
 - L2 正则化,对应的是岭回归
 - 范数,P 范数的定义: ∣ ∣ X ∣ ∣ p = ∣ x i ∣ p p ||X||_p = \sqrt[p]{|x_i|^p} ∣∣X∣∣p=p∣xi∣p
 
2.逻辑回归
- y = k x + b y = kx+b y=kx+b 一元形式,用回归的思路去回归对数逻辑概率
 - Y = X θ ( x 0 = 1 ) Y = X\theta \ \ (x_0=1) Y=Xθ (x0=1)
 - 根据伯努利二项分布推导,得到交叉熵损失函数,CrossEntropyLoss
 - 最后把回归的预测值变为概率值的激活函数时 s i g m o i d = 1 1 + e − x sigmoid = \frac{1}{1+e^{-x}} sigmoid=1+e−x1
 - 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)+(1−Y)ln(1−P))
 
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(Xθ+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.描述计算图 
    
 - 实现途径: 
  
- 1。shared_ptr,引入它的目的是实现数据能够以引用的方式进行传递 
    
- 好处在于,内存更优化,避免拷贝的发生
 - 实现前后的真正关联(计算图前后关联的主要方式)
 
 - 2.定义外壳类(能够进行基本四则运算等操作的东西) 
    
- Expression
 - 这里的操作会被转发到实现类中
 
 - 3.定义具体实现类(具体执行forward/backward过程) 
    
- Container
 
 
 - 1。shared_ptr,引入它的目的是实现数据能够以引用的方式进行传递 
    
 
5.矩阵的封装
- 目前封装的是2d,只有行和列的情况,属于比较简单
 - 建议一定要自己实现 ndarray 的封装
 - GPU Tensor / CPU Tensor的实现和交互 
  
- Caffe
 - 比如 CPU 分配内存,使用 malloc / new
 - GPU 分配内存,使用 cudaMalloc
 
 - 高阶矩阵的维度变换、乘法、广播 
  
- permute
 - 矩阵乘法(批次)
 
 - 一些矩阵库的使用 
  
- Eigen 库很常用
 
 
3. 未来怎么学C++(必看!!!)
未来该怎么学习 C++ 呢,下面是杜老师给出的建议
- 一定要注意,你不是学软工,不是软件工程师 
  
- 因为绝大部分 C++ 教程都是按照软件工程师教的
 
 - 学习算法相关的 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
 - 编译时、运行时的区别
 
 
 
 - 基础语法(类、多态、继承、重载) 
    
 



















