学习深度学习过程中的一些基础知识
DL | 修仙.炼丹 | example |
---|---|---|
框架 | 丹炉 | PyTorch |
网络 | 丹方.灵阵 | CNN |
数据集 | 灵材 | MNIST |
GPU | 真火 | NVIDIA |
模型 | 成丹 | .ckpt |
技巧
归一化
输入数据的归一化:
当输入的数据为多个变量时,如果某个变量的变化远大于其他变量的变化,则会出现大数吃小数问题,网络会按着变化大的变量(对其最为敏感)来预测。
Model
CNN
1 | 卷积神将网络的计算公式为: |
UCNN
单向卷积
BCNN
kumar-shridhar/PyTorch-BayesianCNN: Bayesian Convolutional Neural Network with Variational Inference based on Bayes by Backprop in PyTorch.
Bayesian neural network introduction - 知乎
重参数 (Reparameterization)-CSDN博客 漫谈重参数:从正态分布到Gumbel Softmax - 科学空间|Scientific Spaces
初始化的权重参数用高斯先验分布表示:$p(w^{(i)})=\prod_i\mathcal{N}(w_i|0,\sigma_p^2)$,训练的过程就是根据权重先验和数据集来获得权重参数的后验分布:$p(w|\mathcal{D})=\frac{p(\mathcal{D}|w)p(w)}{p(\mathcal{D})}$
具体流程:对数据使用两个卷积核进行操作,得到两个输出的feature map,分别作为真实输出的均值和标准差。随后使用高斯分布从两个feature map中采样,得到该层feature map的激活值,作为下一层的输入。
激活值$\begin{aligned}b_j=A_i\mu_i+\epsilon_j\odot\sqrt{A_i^2(\alpha_i\odot\mu_i^2)}\end{aligned}$ (Reparameterization)
- 为了解决从分布中采样不可微的问题,使用基于重参数化(Reparameterization)的反向传播方法来估计梯度
VGG16
VGG16学习笔记 | 韩鼎の个人网站 (deanhan.com)
ResNet
ResNet中的BasicBlock与bottleneck-CSDN博客
RNN
相比一般的神经网络来说,他能够处理序列变化的数据
LSTM
人人都能看懂的LSTM - 知乎 (zhihu.com)
讲的很好:三分钟吃透RNN和LSTM神经网络
U-Net
U-Net (labml.ai)
anxingle/UNet-pytorch: medical image semantic segmentation
图像分割
VAE
【生成式AI】Diffusion Model 原理剖析 (2/4) (optional) - YouTube
生成模型共同目标:
如何优化:
Maximum Likelihood == Minimize KL Divergence
最大化 $P_{\theta}(x)$ 分布中从 $P_{data}(x)$ 采样出来的 $x_{i},…, x_{m}$ 的概率,相当于最小化 $P_{\theta}(x)$ 与 $P_{data}(x)$ 之间的差异
$P_\theta(x)=\int\limits_zP(z)P_\theta(x|z)dz$
$\begin{aligned}&P_\theta(x|\mathrm{z})\propto\exp(-|G(\mathrm{z})-x|_2)\end{aligned}$
Maximize : Lower bound of $logP(x)$
Diffusion Model
DDPM(Denoising Diffusion Probabilistic Models)
$\text{Maximize E}_{q(x_1:x_T|x_0)}[log\left(\frac{P(x_0;x_T)}{q(x_1:x_T|x_0)}\right)]$
$q(x_t|x_0)$ 可以只做一次 sample(给定一系列 $\beta$)
DDPM 的 Lower bound of $logP(x)$
复杂公式推导得到:
$logP(x) \geq \operatorname{E}_{q(x_1|x_0)}[logP(x_0|x_1)]-KL\big(q(x_T|x_0)||P(x_T)\big)-\sum_{t=2}^{T}\mathrm{E}_{q(x_{t}|x_{0})}\bigl[KL\bigl(q(x_{t-1}|x_{t},x_{0})||P(x_{t-1}|x_{t})\bigr)\bigr]$
- $q(x_{t-1}|x_{t},x_{0}) =\frac{q(x_{t}|x_{t-1})q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})}$ 为一个 Gaussian distribution
- $mean = \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_{t}x_{0}+\sqrt{\alpha_{t}}(1-\bar{\alpha}_{t-1})x_{t}}{1-\bar{\alpha}_{t}}$ ,$variance = \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_{t}}\beta$
DDPM Code
Schedule
betas
: $\beta_t$ ,betas=torch.linspace(1e-4,2e-2,num_timesteps)
alphas
: $\alpha_t=1-\beta_t$alphas_sqrt
: $\sqrt{\alpha_t}$alphas_prod
: $\bar{\alpha}_t=\prod_{i=0}^{t}\alpha_i$alphas_prod_sqrt
: $\sqrt{\bar{\alpha}_t}$
Forward Process
Forward step:
Forward jump:
1 | def forward_step(t, condition_img, return_noise=False): |
Reverse Process
至少三种逆向过程的求法,从 $x_{t}$ 到 $x_{0}$
There are at least 3 ways of parameterizing the mean of the reverse step distribution $p_\theta(x_{t-1}|x_t)$:
- Directly (a neural network will estimate $\mu_\theta$)直接用网络预测 $\mu_\theta$
- Via $x_0$ (a neural network will estimate $x_0$)用网络预测 $x_0$
- Via noise $\epsilon$ subtraction from $x_0$ (a neural network will estimate $\epsilon$)用网络预测噪声 $\epsilon$
Why Does Diffusion Work Better than Auto-Regression?
Why Does Diffusion Work Better than Auto-Regression? - YouTube
- 分类任务:图片—>类别
如何生成图片(Thinking):
- 从任意数据中预测整张图片(真实图片做标签),这样训练集标签图片的mean value会变blurring(blurry mess)。(分类任务中训练集标签01的meaning value不会收到很大影响)
- Auto-Regressor: 正向过程是不断擦除图像,网络被训练为undo这个过程,即不断预测图片的下一个像素是什么颜色(like ChatGPT)
- 考虑来预测图片中的单个像素,这样训练集标签的mean value是另一个颜色值(网络根据输入的图片来预测单个颜色值)。每个像素的颜色训练一个网络来进行预测,通过多个网络,依次预测每个像素值,最终得到整张图片。这样就能生成plausible(似乎是真的) image,out of nothing(凭空)。然而每次生成的图片是相同的
- 考虑添加随机,之前predicted pixel是概率分布中概率最大的那个颜色值,不去这样选择而是随机选择某个概率的颜色作为本次的预测
- 缺点是随着像素量的增大,计算量非常大,要生成一张大像素图像是非常耗时的。当然可以造数据集时一次remove多个像素,在训练中一次预测多个像素。但是不能过多,这样依然会造成blurry mess Trade-off:更快但是blurry mess,更慢但是更准确
Blurry mess:
Why predicting one pixel is work:
该问题只会出现在预测的值是互相关的情况(在图像中相近的像素通常是强相关的,这在按顺序remove时出现),假设预测的值相互独立的情况(随机remove像素)。remove像素可以从另一种角度进行实现,即给每个像素添加噪声
Stable Diffusion
目前常见的 UI 有 WebUI 和 ComfyUI
模型
模型格式:
- 主模型 checkpoints:ckpt, safetensors
- 微调模型
- LoRA 和 LyCORIS 控制画风和角色:safetensors
- 文本编码器模型:pt,safetensors
- Embedding 输入文本 prompt 进行编码 pt
- Hypernetworks 低配版的 lora pt
- ControlNet
- VAE 图片与潜在空间 pt
采样器
Stable diffusion采样器全解析,30种采样算法教程
DPM++2M Karras,收敛+速度快+质量 OK
MLP
前向传播
根据每层的输入、权重weight和偏置bias,求出该层的输出,然后经过激活函数。按此一层一层传递,最终获得输出层的输出。
反向传播
神经网络之反向传播算法(BP)公式推导(超详细) - jsfantasy - 博客园 (cnblogs.com)
ML Lecture 7: Backpropagation - YouTube
假如激活函数为sigmoid函数:$\sigma(x) = \frac{1}{1+e^{-x}}$
sigmoid的导数为:$\frac{d}{dx}\sigma(x) = \frac{d}{dx} \left(\frac{1}{1+e^{-x}} \right)= \sigma(1-\sigma)$
因此当损失函数对权重求导,其结果与sigmoid的输出相关
- o代表输出,上标表示当前的层数,下标表示当前层数的第几号输出
- z代表求和结果,即sigmoid的输入
- 权重$w^{J}_{ij}$的上标表示权值所属的层数,下标表示从I层的第i号节点到J层的第j号节点
输出对J层的权重$w_{ij}$求导:
$\frac{\partial z_k}{\partial w_{ij}} = \frac{\partial z_k}{o_j}\cdot \frac{\partial o_j}{\partial w_{ij}} = w_{jk} \cdot \frac{\partial o_j}{\partial w_{ij}}$, because $z_k = o_j \cdot w_{jk} + b_k$
and $\frac{\partial z_j}{\partial w_{ij}} = o_i \left(z_j = o_i\cdot w_{ij} + b_j\right)$
其中 $\delta_j^J = o_j(1-o_j) \cdot \sum_k \delta _k^K\cdot w_{jk}$
推广:
- 输出层:$\frac{\partial L}{\partial w_{jk}} = \delta _k^K\cdot o_j$ ,其中$\delta _k^K = (o_k-t_k)o_k(1-o_k)$
- 倒二层:$\frac{\partial L}{\partial w_{ij}} = \delta _j^J\cdot o_i$ ,其中$\delta_j^J = o_j(1-o_j) \cdot \sum_k \delta _k^K\cdot w_{jk}$
- 倒三层:$\frac{\partial L}{\partial w_{ni}} = \delta _i^I\cdot o_n$ ,其中$\delta_i^I = o_i(1-o_i)\cdot \sum_j\delta_j^J\cdot w_{ij}$
- $o_n$ 为倒三层输入,即倒四层的输出
根据每一层的输入或输出,以及真实值,即可计算loss对每个权重参数的导数
优化算法
不同的算法有不同的参数更新方式
优化的目标
训练数据集的最低经验风险可能与最低风险(泛化误差)不同
- 经验风险是训练数据集的平均损失
- 风险则是整个数据群的预期损失
优化的挑战
局部最优 |
鞍点 |
梯度消失 |
(鞍点 in 3D)saddle point be like:
Transformer
INN
Interval Neural Networks 2020 通过物理参数和measured response来辨识 集中负载
$y_{k}^{I}=f(x_{1},x_{2},\cdots,x_{l})=[\underline{y}_{k},\overline{y}_{k}]=f\left(\sum_{j=1}^{m}\left[\underline{v}_{jk},\overline{v}_{jk}\right]u_{j}-[\underline{\lambda}_{k},\overline{\lambda}_{k}]\right)$
INN 与 MLP 两者预测区间参数的区别
INN offers greater fitting flexibility due to the interval of weight and bias
KAN
KindXiaoming/pykan: Kolmogorov Arnold Networks
SNNs
第三代神经网络初探:脉冲神经网络(Spiking Neural Networks) - 知乎
其他概念
KL 散度
KL 散度(Kullback–Leibler divergence,缩写 KLD)是一种统计学度量,表示的是一个概率分布相对于另一个概率分布的差异程度,在信息论中又称为相对熵(Relative entropy)。
对于连续型随机变量,设概率空间 X 上有两个概率分布 P 和 Q,其概率密度分别为 p 和 q,那么,P 相对于 Q 的 KL 散度定义如下:
显然,当 P=Q 时,$D_{KL}=0$
两个一维高斯分布的 KL 散度公式:
KL散度(Kullback-Leibler Divergence)介绍及详细公式推导 | HsinJhao’s Blogs
参数重整化
DDPMb站视频公式推导
从高斯分布中直接采样一个值出来是不可导的,无法进行梯度传递,需要进行参数重整化:
从 $\mathcal{N}(0,1)$ 中随机采样出来 z,然后对 z 做 $\mu + z * \sigma$ 相当于从高斯分布 $\mathcal{N}(\mu,\sigma)$ 中采样
位置编码
Position Embedding 与 Position encoding的区别
position embedding:随网络一起训练出来的位置向量,与前面说的一致,可以理解成动态的,即每次训练结果可能不一样。
position encoding:根据一定的编码规则计算出来位置表示,比如
迁移学习
迁移学习通常会关注有一个源域 $D_{s}$ 和一个目标域$D_{t}$ 的情况,将源域中网络学习到的知识迁移到目标域的学习中
Transfer learning 【迁移学习综述_汇总】 - 知乎 (zhihu.com)
集成学习
集成学习(Ensemble Learning) - 知乎 (zhihu.com)