上期文章
文章目录
一、上期问题
- LAMA Inpaint
- IP Adaper模型
- Anydoor模型
- vit(Vision Transformer)架构
- MAE模型
- CLIP模型
二、本期问题
1、SDXL对于Stable Diffusion在网络架构上的具体改进
Stable Diffusion XL是一个二阶段的级联扩散模型,除了一个和Stable Diffusion基本一致的base模型之外,SDXL还增加一个单独的基于Latent的Refiner模型,来提升图像的精细化程度。在base模型中,SDXL对Stable Diffusion原先的U-Net,VAE,CLIP Text Encoder三大件也都做了相应的改进:
- 对于VAE ,SDXL增加条件变分自编码器来提升潜在空间的表达能力,基于SD同样的架构采用了更大的batch size(256 vs 9)重新训练encoder,同时对模型的参数采用了EMA(指数移动平均),从而改善生成图片的局部和高频细节;
- 对于U-Net,SDXL的U-Net结构发生了改变,从之前的4stage变成了3stage,参数量上SDXL的U-Net模型参数量相比SD模型增加了3倍左右,这主要是因为增加了Transformer Blocks (自注意力 + 交叉注意力) 来增强特征提取和融合能力;
- 对于CLIP Text Encoder,SDXL增加了两个大小不同的编码器来提升文本理解和匹配能力。
Stable Diffusion XL(SDXL)核心基础知识
前序问题:SDXL模型
2、Transformer为什么可以并行
Transformer模型之所以能够高效地进行并行计算,主要得益于其自注意力机制和层与层之间的独立性。在自注意力层中,每个输入元素都会计算与其他所有元素的关联度,这个过程可以独立地对每个元素进行,不需要考虑序列中元素的顺序。因此自注意力层的计算可以并行化,因为每个元素的计算不依赖于其他元素的计算结果。另外,Transformer是由多个编码器和解码器层堆叠而成,每一层的输出仅依赖于前一层的输出。这种层与层之间的独立性使得模型的每一层都可以独立地进行计算,从而实现层级的并行处理。
前序问题:Transformer模型
3、卷积神经网络中的归纳偏置
深度学习中的归纳偏置指的是模型的先验知识,或者关于目标函数的必要假设。卷积神经网络中的Inductive Bias 包括局部性 (Locality) 和 空间不变性 (Spatial Invariance) / 平移等效性 (Translation Equivariance)。局部性假设图片上相邻的区域会有相邻的特征,靠得越近的东西相关性能也就越强,局部性可以控制模型的复杂度。而平移等变性满足 f ( g ( x ) ) = g ( f ( x ) ) f (g(x)) = g( f(x) ) f(g(x))=g(f(x)), f f f为卷积, g g g为平移, f f f函数和 g g g函数的顺序不影响结果。由于卷积核是一样的,无论先做卷积还是平移,卷积核相当于模板,不论图片中同样的物体移到哪里,只要是同样的输入进来,遇到同样的卷积核,其输出永远是一样的。利用平移等变形可以很好的提高模型的泛化能力。
4、DALLE2
DALLE2是一种层级式的基于CLIP特征的文生图模型。层级式的意思是说在图像生成时,先生成64*64再生成256*256,最终生成1024*1024的高清大图。DALLE2提出了一个两阶段模型。第一阶段是prior先验模型,根据给定的文本描述生成类似于CLIP的图像特征(图像嵌入)。第二阶段是decoder解码器,根据上述图像特征(以图像嵌入为条件)生成一个图像。训练过程中,prior先验模型生成的图像特征会参照CLIP生成的对应文本的图像特征。
【论文精读】DALLE2: Hierarchical Text-Conditional Image Generation with CLIP Latents
前序问题:DALLE模型
5、DALLE3
DALLE3的核心思想是通过更好的文本标注让图像生成质量提升。首先训练一个图片标注器用于生成标注,然后使用它来重新捕获训练数据集。在实际应用上,DALLE 3 可以借助大语言模型比如ChatGPT,用 ChatGPT 来创建、拓展和优化 prompt。这样一来,用户无需在 prompt 上花费太多时间。
【论文精读】DALLE3:Improving Image Generation with Better Captions 通过更好的文本标注改进图像生成
6、SAM模型的数据集构建过程
SAM的训练数据通过辅助人工标注、人工半监督标注和全自动标注三个阶段产生。
- 辅助人工标注阶段采用公开的分割数据进行训练,由标注人员手动单击前景或背景来矫正mask,标注矫正后,使用新标注的mask对SAM重新训练;
- 人工半监督标注阶段利用第一阶段的数据训练一个目标检测模型,用检测框作为SAM的prompt输入,输出的分割结果中,人工只需要关注置信度得分低的分割图进行修正,并补充SAM遗漏的结果;
- 全自动标注阶段用前边数据训练好的SAM在海量数据上产生分割的结果,然后再通过规则过滤掉部分可能错误的结果。
SAM:segment anything model——一个通用的图像分割基础模型
三、力扣刷题回顾-链表
上期涉及题目:
本期题目:
面试题 02.07. 链表相交:
- 给定输入:两个单链表的头节点headA、headB
- 要求输出:返回两个单链表相交的起始节点,没有交点返回null
142.环形链表II
- 给定输入:一个链表的头节点 head
- 要求输出:返回链表入环的第一个节点,链表无环返回null
对比分析:
面试题 02.07. 链表相交和142.环形链表II都是链表题目中涉及到复杂结构的题目。需要运用到两个节点指正,结合背后的数学原理,通过两个节点指针的关系求解。
面试题 02.07. 链表相交
求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,之后两个指针一起移动,如果节点相同则说明链表相交。注意是节点相同,不是节点的值相同。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
curA,curB=headA,headB
lenA,lenB=0,0
while curA:
lenA+=1
curA=curA.next
while curB:
lenB+=1
curB=curB.next
curA,curB=headA,headB
if lenA>lenB:
curA,curB=curB,curA
lenA,lenB=lenB,lenA
for i in range(lenB-lenA):
curB=curB.next
while curA:
if curA==curB:
return curA
else:
curA=curA.next
curB=curB.next
return None
142.环形链表II
使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
slow,fast=head,head
while fast is not None and fast.next is not None:
slow=slow.next
fast=fast.next.next
if slow==fast:
slow=head
while slow!=fast:
slow=slow.next
fast=fast.next
return slow
return None
参考:
代码随想录算法训练营第四天|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,总结