目录
- 课程总结
- 前言
- 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
- 编译时、运行时的区别
- 基础语法(类、多态、继承、重载)