上期文章
【每日算法】理论: DALLE 系列 刷题:力扣链表回顾
文章目录
- 上期文章
- 一、上期问题
- 二、本期问题
- 1、交叉熵损失函数
- 2、SAM模型的mask encoder(掩码解码器)
- 3、VQVAE的优化问题
- 4、controlnet模型中的zero convolution模块
- 5、DDIM模型
- 6、BN、LN、IN、GN、SN的对比
- 三、力扣刷题回顾-哈希表
- 242.有效的字母异位词
- 349. 两个数组的交集
- 第202题. 快乐数
一、上期问题
- SDXL对于Stable Diffusion在网络架构上的具体改进
- Transformer为什么可以并行
- 卷积神经网络中的归纳偏置
- DALLE2
- DALLE3
- SAM模型的数据集构建过程
二、本期问题
1、交叉熵损失函数
交叉熵损失函数用于分类问题,它将预测值与真实值之间的差异对数化,然后取平均值。交叉熵能够衡量同一个随机变量中两个不同概率分布的差异程度,在机器学习中表示真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。交叉熵在分类问题中常常与softmax是标配,softmax将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。
2、SAM模型的mask encoder(掩码解码器)
SAM模型中的mask解码器主要用于将图像嵌入、提示嵌入和输出标记映射到掩码。它采用了改进的Transformer解码器,接一个动态掩码预测头。修改后的解码器块在两个方向(提示到图像和反方向)使用提示自注意力和交叉注意力来更新所有Embedding。两个方向的交叉注意力层之间有一个前馈mlp网络,cross attention的结果通过残差方式相加并norm。在运行两个块后,将transform返回的mask token与上采样后的图像embedding点积得到最终的分割结果,iou token经过mlp后得到分割结果的得分。
SAM:segment anything model——一个通用的图像分割基础模型
前序问题:SAM模型
3、VQVAE的优化问题
VQ-VAE的优化目标由两部分组成:重建误差和嵌入空间误差:
- 重建误差为输入图片和重建图片的均方误差。为了让梯度从解码器传到编码器,作者使用了一种巧妙的停止梯度算子,让正向传播和反向传播按照不同的方式计算。具体来说,前向传播时,sg里的值不变;反向传播时,sg按值为0求导,即此次计算无梯度。因此就可以实现前向传播时用解码器输入 z q ( x ) z_q(x) zq(x)计算梯度,反向传播时将解码器的梯度全部传给 z e ( x ) z_e(x) ze(x)。
- 嵌入空间的向量应该和其对应编码器输出尽可能接近,因此嵌入空间误差为嵌入和其对应的编码器输出的均方误差。为了让嵌入和编码器以不同的速度优化,作者再次使用了停止梯度算子,把嵌入的更新和编码器的更新分开计算。
AutoEncoder自动编码器、VAE变分自编码器、VQVAE量子化(离散化)的自编码器
前序问题:
- VAE模型
- VQVAE相对于VAE的改进
4、controlnet模型中的zero convolution模块
ControlNet的基本结构由一个对应的原先网络的神经网络模块和两个”零卷积“层组成。在训练过程中,会”锁死“原先网络的权重,只更新ControlNet基本结构中的网络”副本“和零卷积层的权重。这些可训练的网络”副本“将学会如何让模型按照新的控制条件来生成结果,而被”锁死“的网络会保留原先网络已经学会的所有知识。零卷积层是一些权重和偏置被初始化为0的1X1卷积层。在训练ControlNet之前,所有zero convolution模块的输出都为零,使得ControlNet完完全全就在原有Stable Diffusion底模型的能力上进行微调训练,不会产生大的能力偏差;只有在加入自己的数据训练之后,trainable copy以及zero convolution中的可学习参数值才会发生变化,使整个网络学习到用户指定的任务。
ControlNet核心基础知识
前序问题:
- controlnet模型的创新点
5、DDIM模型
去噪扩散隐式模型(DDIM)是一类更有效的迭代隐式概率模型,具有与DDPM相同的训练程序,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程(中间没有加入随机噪音)。
前序问题:
- ddpm
- 为什么DDPM加噪声的幅度是不一致的?
6、BN、LN、IN、GN、SN的对比
在机器学习领域中,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。数据归一化一般有[0,1]归一化和正态分布归一化两种方法,在深度学习中大多用到正态分布归一化,但是由于归一化所作用在不同的集合上又大体包括BN、LN、IN、GN、SN等。不同的归一化方式的区别仅在于共享归一化参数的维度不同,具体来说:BN(批归一化)是逐通道进行的,batchsize较大时候效果才会比较理想;LN(层归一化)是逐样本进行的,即对每一个样本中多个通道进行归一化操作,是针对自然语言处理领域提出的,例如像RNN循环神经网络;IN (实例归一化)是逐通道,逐样本进行的,可以看作是将BN公式单独应用到每个输入特性(又称实例),常用于图像的风格化迁移;GN(组归一化)将channel方向分group,然后每个group内做归一化,这样与batchsize无关,不受其约束。可以说LN和IN就是GN的特列,比如G的大小为1就成了LN或者为G的大小为C就成了IN。GN适用于占用显存比较大的任务,例如图像分割。SN(自适配归一化)是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
归一化总结:BN、LN、IN、GN、SN
三、力扣刷题回顾-哈希表
上期涉及题目:
- 面试题 02.07. 链表相交
- 142.环形链表II
本期题目:
- 242.有效的字母异位词
- 349. 两个数组的交集
- 第202题. 快乐数
242.有效的字母异位词:
- 给定输入:两个字符串s和t
- 要求输出:判断t是否为s的字母异位词
- 补充条件:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
349. 两个数组的交集:
- 给定输入:两个数组nums1和nums2
- 要求输出:返回两个数组的交集
- 注意事项:输出结果中的每个元素一定是唯一的,并且可以不考虑输出结果的顺序
第202题. 快乐数:
- 给定输入:一个数n
- 要求输出:返回该数是不是快乐数,如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
- 补充条件:快乐数的定义:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,那么这个数就是快乐数。
对比分析:
当遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。242.有效的字母异位词 是判断两个字符串中的元素出现次数,349. 两个数组的交集是判断两个数组中的元素出现次数,第202题. 快乐数是判断下一个数组在之前的计算过程中是否有过出现。三道题都需要对元素是否出现过进行判断,因此都可以采用哈希法进行求解。
242.有效的字母异位词
核心思路:定义一个数组叫做record用于遍历增加记录字符串s里字符出现的次数,然后遍历减少记录字符串t里字符出现的次数,最后判断record中的记录是否为0。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
result=[0]*26
for i in s:
result[ord(i)-ord('a')]+=1
for j in t:
result[ord(j)-ord('a')]-=1
for m in result:
if m != 0:
return False
return True
349. 两个数组的交集
核心思路:定义一个数组用于遍历增加记录数组nums1里元素出现的次数,然后遍历数组nums2t里的元素是否在nums1里出现过,如果出现过则加入result数组返回。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
hashtable=[0]*1000
result=[]
for i in nums1:
hashtable[i]+=1
for j in nums2:
if hashtable[j] != 0 and j not in result:
result.append(j)
return result
核心思路:定义两个数组分别遍历记录数组nums1和数组nums2里元素出现的次数,然后判断同一元素是否在两个数组中均出现过。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
record1=[0]*1000
record2=[0]*1000
result=[]
for i in nums1:
record1[i]+=1
for j in nums2:
record2[j]+=1
for m in range(1000):
if record1[m]*record2[m]:
result.append(m)
return result
第202题. 快乐数
核心思想:使用哈希法判断某一次求和的结果是否重复出现,如果重复了就是return false, 否则一直找到和为1为止。由于这道题是判断当前计算结果是否在之前出现过,所以定义的哈希表是用于记录之前的元素。
class Solution:
def isHappy(self, n: int) -> bool:
record=[]
while n not in record:
record.append(n)
new_num=0
n_str=str(n)
for i in n_str:
new_num+=int(i)**2
if new_num==1:
return True
else:
n=new_num
return False
参考:
代码随想录算法训练营第五天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和