从卷积到大模型:现代机器学习结构速览¶
约 10485 个字 预计阅读时间 58 分钟
写在前面¶
粗略地过一遍ML基础,延伸到对CNN、RNN、transformer、GAN、扩散模型的学习,接着一窥迁移学习与强化学习的大门,最后止于大模型概述
学习路径¶
前瞻内容—基础概念复习¶
从感知机开始,带你机器学习基础概念一把梭
学习范式与网络结构互相独立,CNN可以在有监督/无监督/自监督/RL环境下发挥不同的作用
CNN基本概念与典型结构¶
参考文章:
背景与基本概念¶
-
多层感知机(MLP)的变种
-
局部感受野、权值共享、pooling池化:减少param数量,降低复杂度 → 便于优化,规避过拟合
-
对于输入层来说,宽度和高度指的是输入图像的宽度和高度,深度代表输入图像的通道数 对于中间层来说,宽度和高度指的是特征图的宽和高,通常由卷积运算和池化操作的相关参数(卷积核大小、步幅、填充方式、池化窗口大小)决定;深度指的是特征图的通道数,通常由卷积核的个数决定
-
注意多通道下卷积核数量的定义;原始输入有多少个通道,其对应的一个卷积核就必须要有多少个通道;用
k个卷积核对输入进行卷积处理,那么最后得到的特征图一定就会包含有k个通道
下面的图片代表着一个卷积核
-
在相邻空间位置上具有依赖关系的数据(宽平稳随机过程)均可以通过卷积操作来进行特征提取
-
感受野(Receptive Field)指的是卷积神经网络每一层输出的特征图上每个像素点映射回输入图像上的区域大小 故网络越深,神经元的感受野越大
-
下采样层有两个作用
-
减少计算量,防止过拟合
-
增大感受野,使得后面的卷积核能够学到更加全局的信息
-
-
下采样的设计有两种:
-
采用步长(stride)为2的
池化层,目前通常使用Max-pooling,因为它计算简单且最大响应能更好保留纹理特征 -
采用步长(stride)为2的
卷积层,下采样的过程是一个信息损失的过程,而池化层是不可学习的,用可学习卷积层来代替pooling可以得到更好的效果,当然同时也增加了一定的计算量
-
-
有时需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样,一般有三种实现方式:
-
双线性差值
-
零填充
-
Max Unpooling
-
-
参数量的大小是轻量化网络设计的一个重要评价指标
-
神经网络的前向推理过程基本上都是乘累加计算,所以它的计算量也是指的前向推理过程中乘加运算的次数,通常用
FLOPs(即“每秒浮点运算次数”)来表示
卷积网络范式¶
卷积结构类型¶
- 标准卷积
- 深度可分离卷积 \(Depthwise Separable Convolution\):区别于标准卷积,是沿着通道维度做卷积的一种特殊操作方式;每个通道单独卷积再融合,使得计算量和参数量大大减小
-
深层卷积(deep convolutional network):卷积之后再卷积
-
分组卷积(Group Convolution):最早在
AlexNet中出现,当时作者在训练模型时为了减少显存占用而将feature map分组然后给多个GPU进行处理,最后把多个输出进行融合 -
空洞卷积(Dilated Convolution):标准卷积的扩张率(dilation rate)为
1,通过下采样扩大感受野
- 转置卷积(Transposed Convolutions):和空洞卷积的思路正好相反,为上采样而生
-
可变形卷积(Deformable Convolution):类似于注意力机制,卷积核的采样点应该能根据输入特征自适应地偏移到更有信息的区域,从而拥有更精准的语义分割结果
- 偏移由额外的卷积层学习(通过梯度下降,使最终卷积输出对任务(分类、检测、分割)更有利)
- 点态卷积(Pointwise Convolution):大小
1*1的卷积核,通过全连接加宽加深网络层次,使其更加复杂(引入激活函数)
其他部分¶
-
现在看起来,未来的卷积网络结构中,可能会很少使用甚至不使用汇聚层
-
Channel shuffle用于保持分组卷积中的信息交互
-
leaky ReLU的负向部分的0.1权重,可用
13>>7去简化
-
sigmod在反向传播求导时容易出现梯度消失的问题
-
全局平均池化(GAP)再加全连接层可以达到与原有(拉平成C×H×W的向量)操作相似的效果,且计算量降低到了原来的1/HW
-
正则化(Regularization)分为岭回归(L2,均方,保留所有的特征,但削弱它们各自的影响力)和 Lasso回归(L1,绝对值的和,降维,产生 Sparse Model,自动帮你做特征选择)
经典CNN网络¶
LeNet-5¶
- 经典应用,由两个卷积层组成和三个全连接层组成,组合使用卷积层、非线性激活函数和汇聚层
AlexNet¶
是第一个在大规模视觉竞赛中击败传统计算机视觉模型的大型神经网络,它使得卷积神经网络在计算机视觉领域中备受欢迎。
-
更深
-
使用ReLU作为激活函数
-
全连接层
Dropout
VGG¶
使用可复用的卷积块构造网络,块的使用导致网络定义的非常简洁,从而使复杂网络的设计成为可能
不同的VGG模型可通过每个块中卷积层数量和输出通道数量的差异来定义
- 采用连续的几个
3x3的卷积核代替AlexNet中的较大卷积核。对于给定的感受野,采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)
NiN¶
- 首创了点态卷积和全局平均池化,去除了全连接层
GoogLeNet(2014)¶
-
提出观点:使用不同大小的卷积核组合是有利的
-
设计了一种称为 Inception 的基本卷积模块。Inception块由四条并行路径组成。前三条路径使用窗口大小为 1X1、3X3 和5X5 的卷积层,从不同空间大小中提取信息。中间的两条路径在输入上执行 1X1卷积,先减少通道数,从而降低模型的复杂性。然后使用3X3\(5×5\)卷积增加通道数。这四条路径都使用合适的填充来使输入与输出的高和宽一致,最后将每条线路的输出在通道维度上连结,并构成Inception块的输出。在Inception块中,通常调整的超参数是每层输出通道的数量。每条路径的通道数不尽相同
简要介绍:来自gemini的介绍
ResNet(2015)¶
-
解决梯度消失问题,使得更深的网络成为可能。因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小,导致着这些层的学习基本停滞;二是网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差
-
残差网络的核心思想是:每个附加层都应该更容易地包含原始函数作为其元素之一
-
ResNet 沿用了 VGG 完整的3×3卷积层设计。 残差块里首先有 2 个有相同输出通道数的3×3卷积层。 每个卷积层后接一个批量归一化层和 ReLU 激活函数。 然后我们通过跨层数据通路,跳过这 2 个卷积运算,将输入直接加在最后的 ReLU 激活函数前
-
为了满足直接相加而改变通道数的话,就需要引入一个额外的1×1卷积层来将输入变换成需要的形状后再做相加运算
DenseNet¶
-
稠密连接网络在某种程度上是
ResNet的逻辑扩展,但输出是连接(用图中的[,]表示)而不是如 ResNet 的简单相加 -
稠密网络主要由 2 部分构成:稠密块(dense block)和过渡层(transition layer)。 前者定义如何连接输入和输出,而后者则控制通道数量,使其不会太复杂
CNN结构总结¶
-
AlexNet:力大砖飞,它是第一个在大规模视觉竞赛中击败传统计算机视觉模型的大型神经网络
-
VGG:它利用许多重复的神经网络块和小卷积核的有效性
-
NiN:它重复使用由卷积层和1×1卷积层来构建深层网络;同时使用全局平均池化层替代全连接层
-
GoogLeNet:它使用并行连接的网络,通过不同窗口大小的卷积层和最大汇聚层来并行抽取信息
-
残差网络(ResNet):它通过残差块构建跨层的数据通道,是计算机视觉中最流行的体系结构
-
稠密连接网络(DenseNet):它的计算成本很高,但给我们带来了更好的效果
CNN网络设计思路¶
套用 + 微调
- 常见的结构
-
输入层 ,应该是2的倍数
-
几个小滤波器卷积层的组合比一个大滤波器卷积层好
-
可用大步长小卷积核代替pooling
-
使用零填充保护边缘信息
-
第一个卷积层可稍做内存上的妥协,采用7*7 stride = 2的卷积核
RNN & LSTM¶
参考文章:
RNN特点与诞生意义¶
循环神经网络(Rerrent Neural Network, RNN)对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,使深度学习模型在解决语音识别、语言模型、机器翻译以及时序分析等NLP(自然语言处理)领域的问题时有所突破
回忆一下信道传输,或者说几乎所有的通信传输接收,都是时序信号,前后具有一定的相关性
看见循环的概念,再联想到反馈,进一步到IIR滤波器的抽头概念,相比便不难理解这里的循环概念了
对于命名实体识别(苹果和苹果公司),单纯堆量是没有意义的
换言之,模型需要结合上下文去联想学习,而非独立去训练,于是RNN诞生了
RNN结构¶
摒弃W的部分,\(X\xrightarrow{U}S\xrightarrow{V}O\)就是经典的多层感知机(MLP),其中的U、V为权重矩阵
再加入反馈抽头W(权重保持一致)
用公式表示,有
从DSP里面随便截张图,懂了不
当然,输入也可能是多维的(从信息论的角度,即符号序列),比如
梯度消失、爆炸与解决方案¶
参考文章:
本质上是因为神经网络的更新方法,梯度消失是因为反向传播过程中对梯度的求解会产生sigmoid导数和参数的连乘,sigmoid导数的最大值为0.25,权重一般为[0,1]之间,则深层下多个小于1的值连乘,导致靠近输入层的梯度几乎为0,得不到更新。梯度爆炸是也是同样的原因,如果多个大于1的值连乘,将会很大或溢出,导致梯度更新过大,模型无法收敛
解决方案如下:
-
预训练 + 微调
-
Loss funtion 正则化
-
Leak ReLU解决求导问题
-
BN
-
残差结构
-
LSTM方案(见下一节)
LSTM结构¶
参考书籍: 李宏毅深度学习教程
长短期记忆网络(Long Short-Term Memory network,LSTM)可视为RNN plus版,通过Gate解决了其梯度爆炸的问题
DNN与RNN梯度问题差异¶
一言以蔽之: DNN 的梯度消失导致 深层不学习 ,而 RNN 的梯度消失导致 远处不记得
DNN 中权重梯度可表示为链式求导的连乘
就sigmod而言,导数最大为0.25,因此靠近输入层的梯度将直接衰减到 0,于是这些权重不再更新,模型无法学习早期层特征。DNN 的梯度消失意味着某些权重真正失去梯度,停止学习
对于 RNN,隐藏状态递推如下:
其中连乘部分为:
当时间 t 很大时,因此,远处时刻的梯度贡献趋近于 0,而最近时刻的梯度仍能保留(此时梯度仍存在)
此时表现为 RNN 存在上下文丢失的现象
门控装置¶
这是RNN的结构框图
改造一下
-
Input Gate:输入门,在每一时刻从输入层输入的信息会首先经过输入门,输入门的开关会决定这一时刻是否会有信息输入到
Memory Cell(记忆元) -
Output Gate:输出门,每一时刻是否有信息从
Memory Cell输出取决于这一道门 -
Forget Gate:遗忘门,每一时刻
Memory Cell里的值都会经历一个是否被遗忘的过程,就是由该门控制的,如果打卡,那么将会把Memory Cell里的值清除,也就是遗忘掉
让我们比较阅读一下
Memory Cell的迭代公式为
假设要被存到单元的输入叫做z,操控输入门的信号为zi,操控遗忘门的信号为zf ,操控输出门为zo,综合这些东西会得到一个输出记为a,且里面已经存了值c
激活函数通常会选择 sigmoid 函数,因为其值介在 0 到 1 之间,代表了这个门被打开的程度
输入输出遗忘门都是以
1代表允许通过/记住
三个门的启停也是通过网络训练涌现的,下面通过一个demo说明四个输入的由来
一个运算示例¶
让我们暂时人为规定一下输入的三维向量跟输出还有记忆元的关系
-
x2的值是1时,,x1的值就会被写到记忆元里 -
x2的值是-1时,就会重置这个记忆元 -
x3的值为1时输出
于是可得到图中的输出结果
可以把四个输入的诞生过程理解成卷积的过程——加权求和
所以为什么LSTM一定程度可以解决RNN的梯度消失问题呢?
再此回顾其传递公式,你会发现与RNN的连乘不同,加法使得梯度回传时类似于直通,即
如果遗忘门输出为1,则
从而使得梯度几乎无痛反向传递,于是拥有了更长的上下文记忆
自注意力机制¶
从RNN过来,我们知道输入还有可能是一坨向量,即向量序列,且序列长度并不确定(语句长度/语音时间)
让我们先看看常见NLP类信息的向量化方式与输出类型,再回过头看看自注意力模型(self-attention model)
输入信息处理¶
文字¶
语言通常可以通过独热码(one-hot encoding)和词嵌入\(word embedding\),但前者编码不包含任何语义信息
语音¶
声音通常设置25ms的窗口(一帧),而每次窗口挪动10ms(别问,先辈的智慧),即一秒存在100帧(帧间存在重合)
图¶
图(Graph)也可视为向量,每个人都看作一个类,根据其中的key-value就可搓出一个特征向量
输出类型¶
标签¶
用于对输入整体打上定性标签
比如情感分析、说话人识别、分子亲水性分析
维度与输入相同¶
需要对每个输入向量打标签,即序列标注
比如词性标注(Part-Of-Speech tagging,POS tagging)、音标识别、用户画像分析
也是序列¶
输出的序列不确定,比如翻译
自注意力运作原理¶
序列的每个符号(向量)间必然存在相关性信息,而单纯的全连接网络是无法做出区别的
以文本序列标注为例子,FC网络不可能区分I saw a saw的俩saw
像RNN家族一样添加记忆抽头循环是可行的,但其上下文记忆并不给力
此外,串行逻辑限制了其运算速度,可以理解为一个一个字蹦出来,即使是LSTM也不能逃脱
那对每一个FC,一次多输出几个,即包含上下文的序列输入的呢?
似乎有效,但窗口的大小是个问题,我们需要一个自适应大小的窗口🥲,而且参数量陡增并不优雅
还有没有法子呢?比如一目十行地理解?于是自注意力模块应运而生,天涯若比邻
实际上,有关自注意力最知名的相关的论文是 “Attention Is All You Need”。在这篇论文里面,谷歌提出了 Transformer 网络架构。其中最重要的模块就是自注意力,就像变形金刚的火种源
就核心点而言,自注意力机制着眼于利用 查询-键-值 (Query-Key-Value,QKV)模式找寻相关性,用空间(巨大的内存开销)和算力(平方级的计算量)去换取时间(并行的速度)和效果(强大的上下文理解力)
假设某一层的输入为a,输出为b,我们的核心就是知道b是咋来滴
- 首先需要计算注意力(即相关性矩阵)
最常见的方法便是,点积
其中,\(\bf q\)称为查询,而\(\bf k\)称为键
再做一个归一化(normalize),这里用softmax,即得到相关性
归一化相关性与值(Value)逐一点乘求和,便是这个input的输出结果
所以谁的注意力的分数最大,谁的Value就会主导(dominant) 抽出来的结果
事实上,所有的结果是并行同时计算的,所以运算速度快得一比,我们从矩阵的角度再考量会更加直观
一图以以蔽之
多头注意力¶
相关性可以从不同的角度去考量,所以需要多头自注意力(multi-head self-attention),它的数量也是一个超参
具体而言,就是分为多个\(\bf q\),几个头之间的运算是独立的
得到多头结果后拼接为新矩阵,变换后输出结果
位置编码¶
上述关于注意力矩阵的计算,并没有考虑位置这一重要维度,它往往包含着关键语义信息
解决方案就是加上一个\(\bf e\)
这相当于告诉自注意力位置信息,让它知道现在输入向量在i这个位置
就位置编码产生算法,目前没有最优的定论
截断自注意力¶
旨在缓解内存爆炸,截断自注意力(truncated self-attention)可以处理向量序列长度过大的问题
截断自注意力在做自注意力的时候不要看一整句话,就只看一个小的范围就好(这个范围是人设定的)
self-attention & CNN¶
On the Relationship between Self-attention and Convolutional Layers这篇论文用数学的方式严谨地告诉我们,卷积神经网络就是自注意力的特例
-
即使自注意力通常用于NLP领域,也可以将图片视为
Word -
CNN被认为是人为框定感受野的
self-attention -
self-attention是自学习感受野的CNN -
self-attention具有高弹性的特点,这也意味着需要更多的训练数据量
self-attention & RNN¶
相较于与CNN的包含关系,与RNN更像友商关系
循环神经网络跟自注意力一样,都是要处理输入是一个序列的状况
目前,循环神经网络的角色很大一部分都可以用自注意力来取代了
还是那俩痛点:上下文记忆与运行速度
Transformer¶
目标:序列到序列场景¶
-
语音识别、机器翻译和语音翻译
-
语音合成(Text-To-Speech,TTS)
-
聊天(问答)机器人,大语言模型
-
句法分析(syntactic parsing)
-
多标签分类问题(区别于多分类问题)
Transformer 结构¶
总体框图可如下图表示
其中,编码器负责输入理解,解码器负责输出生成
-
编码器凭借自注意力,彻底理解长句中复杂的上下文关系
-
解码器凭借交叉注意力(Cross-Attention)和掩码自注意力确保输出的每一步都精准依赖于输入的精髓
展开内部框图,有
题外话 | BN与LN
这里放弃了BN(批归一化),而创新性的使用LN(层归一化,会计算输入向量的平均值和标准差)
看着像六阶魔方
Batch Normalization 对一个 batch 中所有样本在各通道维度上分别计算均值和方差并进行标准化,其统计可靠性依赖于 batch 中样本数量。如果 batch 太小,则均值和方差估计会不稳定,从而影响归一化效果
与图像任务中常见的大批量训练不同,NLP 模型的输入序列通常较短且 batch size 较小,导致 BN 估计的批统计(均值、方差)不稳定,因此 BN 在 NLP 中往往表现不佳。为避免依赖 batch 的统计量,可以改为对单个样本内部的特征维度进行归一化,即采用 Layer Normalization
总结一下,批量归一化是对不同样本不同特征的同一个维度去计算均值跟标准差,但层归一化是对同一个特征、同一个样本里面不同的维度去计算均值跟标准差,接着做个归一化
编码器¶
Transformer 的编码器使用的是自注意力,输入一排向量,输出另外一个同样长度的向量
编码器由N个块(block)组成,最基础的,包含了上一节所说的多头注意力模块和全连接网络
Transformer在此基础上加入残差连接与LN
即注意力后加Res + LN,全连接后加Res + LN
事实上这并不是最优的架构,但transformer提出了突破性的架构
解码器¶
通常指的是自回归(autoregressive)的解码器
解码器可分为俩部分——交叉注意力(编码器-解码器注意力)下的输出和掩码注意力下的自我克制
-
要让解码器产生输出,首先要先给它一个代表开始的特殊符号
<BOS>,即 Begin Of Sequence,这是一个特殊的词元(token)。在词表(vocabulary)里面,在本来解码器可能产生的文字里面多加一个特殊的符号<BOS> -
当然,也会有
<EOS>,用于输出的终止 -
输出的结果会被解码器作为新的输入,如此反复
解码器内部结构
下图为交叉注意力(编码器-解码器注意力)的示意图,加权和\(\bf v\)经过Res + LN进入前馈网络(注意区分这里的v和注意力中的Value)
另外,掩码多头注意力的设置契合了我们人的输出逻辑——稳定系统,即不超前
解码器的输出是一个一个产生的,所以只能考虑其左边的东西, 没有办法考虑其右边的东西
最后,编码器和解码器都有很多层。原始论文中解码器是拿编码器最后一层的输出,但实际上并不一定
其他细节,见表
训练过程与常用技巧¶
训练过程¶
以语音识别机器学习为例,编码器输入带位置编码的语音帧向量,并经过多头自注意力和前馈全连接理解了这句的信息含义;解码器输入\<BOS>,初始化(位置编码)后经过掩码自注意模块(此时没东东),再和编码器的输出经过交叉自注意模块,再经过前馈全连接和softmax得到各个字词的概率。理想状态下,应该“机”的概率最大
训练时,我们会去计算标准答案和分布概率之间的交叉熵,并尽可能减小交叉熵
这种学习方式称为教师强制(teacher forcing)
为什么不叫
cramming
复制机制(Copy Mechanism)¶
在机器翻译或文本生成中,像人名、地名、专业术语这些很少见的词,模型往往在词表里找不到,或者训练数据中出现太少,导致它“编不出来”。复制机制就是给模型多一条路:当它不知道该生成什么词时,可以直接从输入句子里“抄”一个词出来。模型会有一个“开关”判断当前该正常生成词,还是直接复制输入中的词。借助这个机制,模型能更准确地处理罕见词和专有名词
引导注意力(Pointer Networks / Attention Guidance)¶
在一些任务中,比如摘要或代码生成,输出中的某些词其实本来就在输入中,这时候不是“想一个词”,而是“指向输入中的某个位置”。指针网络让注意力关注的不仅是输入内容,还关注输入中哪个位置更重要。这样模型的输出不是一个词,而是“选择输入中的某个词”。简单理解:普通注意力是“看内容”,而指针网络是“选位置”,强迫模型学会精准找输入中的关键元素
搜索策略(贪心搜索与束搜索)¶
在模型逐字生成句子时,每一步都要从很多可能的词里选下一个。贪心搜索的策略很简单:每一步都挑当前概率最高的词。但它只顾眼前,不考虑未来可能更好的句子结构,因此常常走向“歪路”。束搜索更聪明:每一步同时保留多个候选路径(通常 5–10 个),继续往下生成,最后从这些路径里选最好的。它就像一个有备选方案的人,不会被一时失误锁死。缺点是计算会变多
噪声加入(Adding Noise)¶
训练时,模型输入永远是正确答案,但测试时它依赖自己的预测,而这些预测未必正确。训练和测试环境不一致,会导致模型测试时容易“崩”。加入噪声就是让模型在训练阶段就提前适应“不完美的输入”,比如加入环境噪声、随机替换一些输入等。这样它在测试时遇到自己的错误预测,也能继续稳定输出,提高鲁棒性和泛化能力
使用强化学习训练(RL for Training)¶
传统训练优化的是每一个字对不对(交叉熵损失),但评价机器翻译时,我们更关心整句话质量(如 BLEU 分数)。这两者是脱节的。强化学习把整个句子作为一次动作,把 BLEU 分数作为奖励,让模型学会生成“整体更好”的句子,而不是只追求“每步都看起来正确”。就像学生做题,重点不是每个步骤都照答案写,而是期末考试能拿高分
计划采样(Scheduled Sampling)¶
暴露偏差问题在于:训练时模型总是依赖正确答案,但测试时却只能依赖自己的预测。一旦某一步出错,错误会不断传递。计划采样的做法是:训练时有时用正确输出做下一步输入,有时(按一定概率)用模型自己的输出,随着训练逐渐让“用自己预测结果”的比例升高。这样模型在训练阶段就学会处理自己犯的错,测试时更不容易“越走越偏”
生成模型¶
摘记 | 图像分布
关于图像的概率分布函数(右图),横坐标是所有可能的图像(由Pixel随机roll),纵坐标表示猫的概率
用平滑的曲线连接,即为实际的分布,可以理解成先验
- 生成器要干的就是不断学习,直到完美拟合出这条曲线

生成对抗网络是啥¶
生成对抗网络(Generative Adversarial Network,GAN),是一种区别于先前网络的架构,以难以训练而著名🤪
- 网络由生成器(G)和辨别器(D)构成
生成器与辨别器¶
从上面的摘记中可以知道,当存在输入x时,会从学习到的分布中采样一个z,从而决定输出的y是啥
如果跳过采样而直接输出呢?网络在训练时存在既要又要的特性(比如训练数据中既有向左转,也有向右转,输出就是一坨残影)
此时我们就需要生成一个图像分布,即把所有的可能输出来,再去采样其中的一个点
对于需要x输入(这里可以用RNN或者transformer把文字转向量)的网络称为条件型生成(conditional generation);若仅需要z的,称为无条件生成(unconditional generation)
当然,这里生成器已经训练好了,最开始的输出只是随机的像素点;而训练的过程离不开辨别器的监督
辨别器可以用任何常见的模型构成,对于图像来说主要是CNN;其功能就是尽可能分辨出fake image
而从宏观上,可以把GAN的生成过程定义为辨别器—生成器—辨别器的交替训练过程
-
固定G,训练D,使得生成图片得分尽可能低(慧眼识猪)
-
固定D,训练G,使得生成图片得分尽可能高(瞒天过海)
-
反反复复无穷匮也,直到再高明的辨别器也无法区分生成图片和真实图片(这就是巴巴博弈)
GAN 理论介绍¶
可归纳为MinMax操作
- 生成器的训练目的是是希望生成图像分布和原始数据分布尽可能的相似
其中满足下面式子的生成器称为最优生成器
事实上,生成器的损失函数
\(p(z\mid\boldsymbol{x})=\frac{p(z,\boldsymbol{x})}{p(\boldsymbol{x})}=\frac{p(\boldsymbol{x}\mid z)p(z)}{\int p(\boldsymbol{x}\mid z)p(z)dz}\)
中的积分项很难办,辨别器目标函数的KL散度也很难办
具体过程看PDF或者VAE视频,我现在不想动脑子了🤪
总的来说,这是一种MinMax操作
WGAN 算法¶
在理论上,当采样数据和真数据在高维空间中没有交集时(这在深度学习初期几乎是常态),JS散度会直接给出一个恒定的值,导致GAN的训练变得十分困难(总不能用人眼吧)
办法总比困难多,与VAE的ELBO类似,先辈巧妙地的用一种新的距离来衡量两个分布的相似程度,
即Wasserstein 距离(推土机距离,Earth Mover’s Distance,EMD)
可以理解成搬山法的最优解——最小代价路径
辨别器 D 需要做到让上式的第一项尽可能大,后者尽可能小
此外,为了让 D 能够正确地近似这个 Wasserstein 距离,这个函数必须是一个1-Lipschitz函数(斜率有限制)以规避梯度爆炸
轨到轨限制、梯度惩罚、谱归一化,等等方法可以通过引入新的超参让搬山的过程变得平滑(控制梯度在1附近)
挠头的评价体系¶
判断图片质量时有两个老大难
-
模式崩塌:当生成器用并不完美的一张照片踩中了辨别器的盲点,就不再更新了
-
模式丢失:缺乏想象力(多样性),需要的是无中生有,而非直接从数据库CV
流行的,可以使用FID去评价
扩散模型¶
塑像就在石头里,我只是把不需要的部分去掉
加噪并找到一个去噪模型,使得从杂乱无章的照片中提取出想要的照片,即预测噪声
加噪过程可表述为
这是一个递归式,最后证明:可从初始状态一步跃到T步
这里的上划线表示连乘,即\(\sqrt{\alpha_t\alpha_{t-1}\cdots\alpha_1}\boldsymbol{x}_0+\sqrt{1-\alpha_t\alpha_{t-1}\cdots\alpha_1}\boldsymbol{\varepsilon}\)
像极了马尔科夫过程:可由初始状态和一步状态转移矩阵唯一确定
但是逆向(reverse process)一定不是close-form的,所以需要借助神经网络
具体过程见PDF,这里直接给结论,就不班门弄斧了
我们希望回退,知道上一步加噪过程的噪声分布到底怎样,如此就能逆向的去噪
假设都用标准高斯分布,则有
结论是,impossible
于是借助最大似然估计和KL散度,我们得到了下面的表达式
局势逆转了,因为看见了\(q(x_{t-1}|x_{t},x_{0})\);现在条件变成——知晓结果的情况下,对图像执行一步去噪
利用条件分布等概率论工具展开表达并代入,得到
方差是一个常数,初始状态又可以由下式表示
故说到底扩散模型就是在训练噪声
进一步,可以得到训练和采样表达式
这里不管系数就是L2损失函数。事实上paper中就是忽略了系数
训练过程¶
看图看图,一图胜千言
迁移学习¶
实际应用中很多任务的数据的标注成本很高,无法获得充足的训练数据,这种情况可以使用迁移学习(transfer learning),比如领域自适应(domain adaptation)和领域泛化(domain generalization)
领域自适应¶
自适应的核心目标是通过算法调整,将已学到的知识从源领域有效迁移至目标领域
训练数据和测试数据分别属于不同领域(如不同环境或数据集),但它们的特征维度(如数据属性结构)和类别标签(如分类体系)保持一致,仅特征的数据分布(如数值规律或统计特性)存在差异
就比如黑白的数字和彩色的数字
直觉下的,考虑训练一个特征提取器(向量生成器),使得源领域/目标领域提取出的特征一致,则再把这个特征给分类器,就能正确分类
相当于多一个抽象层
至于训练方法,几乎与GAN同一时期的领域对抗训练应运而生,我想应该能大致理解其原理了
对于分类问题,因为边界是确定的,我们自然希望输出的特征尽可能远离边界,即降低其熵
领域泛化¶
跨特征的学习,需要基于架构的学习
-
若训练数据丰富多样,则问题不大
-
反之,需要通过数据增强的方式去产生多个领域的数据
强化学习¶
视频:
我把强化学习(Reinforcement Learning,RL)视为不断迭代策略的启发式算法,或者说启发式闭包 🤪
-
很大一部分的任务可以归结为马尔科夫过程,只与过于的有限步有关 监督学习下必须需要数据标注,但现实是骨感的,无穷匮的数据对应着极大的人工成本(无监督也仍然逃不开标签的范畴)
-
启发式算法(Heuristic Algorithm)基于直观或经验构造的算法,旨在通过较少的计算量在可接受的时间内寻找问题的近似最优解 就像有限状态机,设定规则和初始状态后,系统不断执行当下条件的动作,并进入新的状态。如果说这个规则足够
marvellous,那也没ML啥事情了
为了不断迭代出更好的策略,强化学习应运而生
RL规定以下概念:状态(state)、动作(action)、奖励(reward)、智能体(agent)、环境(environment)、策略(policy)
just like playing a game
把奖励累加(级数是部分和),加上折扣因子,得到了(折扣回报)Return(不难观察这也是一个递归式)
我们应如何衡量每一步的价值呢?答案是:求期望
不难观察,上图中出现
其中,
-
\(U_t\)是随机变量 ,可理解为一个实际的随机变量轨迹
-
\(Q_\pi(s,a)\)是固定动作a后,对所有U的求期望结果(在状态 s 强制执行动作 a,然后之后都按策略 π,未来累计回报的期望)
- \(V_{\pi}(s)\)是按策略对所有动作的求期望结果
约定策略概率分布为\(\pi(a|s)\),状态转移为\(p(s^{\prime}|s,a)\),经过一顿小鸡炖蘑菇(Bellman等式),可得到
即当前状态价值\(V_{\pi}(s)\)等于对每一个 action 价值\(Q_\pi(s,a)\)求期望
所以RL的实现思路有两条:选择动作价值最大(value-based),或者策略概率分布最大(policy-based)
这里的agent策略网络可以是最简单的查找表look-up table,也可以是CNN或者transformer
具体的算法模型与数理推导,才疏学浅,暂时搁置,top-down framwork(很cool的名字)如下
Actor-Critic 框架一定程度上综合了
Policy-based和Value-based
再插一个:梯度上升与策略梯度
题外话 | 关于Agent
大语言模型(LLM)智能体的定义:它会不断调用一组工具,循环执行,以实现特定目标(Tools in a loop to achieve a goal)
大模型发展总结图¶
可以说,是预制菜+微调(迁移学习)让LLM的发展就此起飞
我们正在经历这样一个的时代——少数人负责“造神”(预训练大模型),而多数人学习如何与神对话






























































































