【每日算法】理论:深度学习基础 刷题:力扣哈希表回顾

上期文章

【每日算法】理论:AIGC算法相关 刷题:力扣哈希表回顾


一、上期问题

  • Classifier-free Guidance和Classifier Guidance
  • VAE为什么会导致图像变模糊
  • SD,Dall-E2两者的异同
  • NMS非极大值抑制
  • CNN的特点以及优势
  • Stable Diffusion怎么实现文本和图像的条件控制的

二、本期理论问题

1、CNN 中的局部连接(Sparse Connectivity)和权值共享(Shared Weights)特点

CNN中非常有特点的地方就在于它的局部连接和权值共享:

  • 通过卷积操作实现局部连接,这个局部区域的大小就是滤波器,避免了全连接中参数过多造成无法计算的情况
  • 再通过参数共享来缩减实际参数的数量,减少了训练的空间、时间消耗,为实现多层网络提供了可能。

神经网络发展历程:DNN、CNN、RNN

2、GAN 与diffusion的对比

  • 目标和原理:
    • GAN是一种生成模型,由生成器和判别器组成。生成器试图生成逼真的样本,而判别器则试图区分生成的样本和真实样本。通过对抗训练的方式,生成器和判别器相互竞争,最终生成器可以生成更逼真的样本。
    • Diffusion是一种基于物理扩散过程的生成模型。它们模拟了一个从有序状态到无序状态的扩散过程,然后再逆转这个过程来生成数据。在训练过程中,模型学习如何从噪声数据逐步恢复到真实数据分布。Diffusion通常涉及一个预定义的扩散过程,该过程在固定的时间步长内逐步添加噪声,然后模型学习如何逆转这个过程。
  • 生成速度上:GAN 生成速度更快,diffusion model 需要多次迭代去噪声
  • 训练难度上:diffusion model 有严格的数学推理,优化目标简单(每一步拟合一个高斯分布),整体只需要训练一个生成器,而 GAN 需要稳定训练的平衡(生成和判别),防止模式崩溃,梯度消失等问题。
  • 图片质量上:GAN模型与diffusion模型的图片质量都很高,但是diffusion模型生成的图片多样性更高(基于 classifier-free guidance),GAN 的目的是使得生成的图像和真实图像更接近,CLIP 为代表的大规模预训练模型,使得 GAN 也能够基于文本生成图片。
  • 适配难度上:很多 diffusion model 生成的图片可以直接用于下游任务,而 GAN 基本都要对应的训练、微调。

3、Stable Diffusion是怎么训练的?

  • 从训练集中选取一张加噪过的图片和噪声强度
  • 输入unet,让unet预测噪声图
  • 计算和真正的噪声图之间的误差
  • 通过反向传播更新unet的参数

4、L1和L2正则化的区别

  • L1正则化和 L2 正则化是机器学习中常用的正则化方法,它们都可以用于线性模型和神经网络等模型的正则化。
  • L1正则化是指在损失函数中加入模型权重的L1范数,形式化表达式为: λ ∑ i = 1 n ∣ w i ∣ \lambda\sum_{i=1}^{n} |w_i| λi=1nwi。L2正则化是指在损失函数中加入模型权重的L2范数,形式化表达式为: λ ∑ i = 1 n w i 2 \lambda\sum_{i=1}^{n} w_i^2 λi=1nwi2
  • 它们的主要区别在于其对于模型的影响不同。L1正则化可以使得模型的部分权重变为0,实现特征选择的效果,减少模型复杂度。而L2正则化可以通过限制权重的大小来防止过拟合,并提高模型的泛化能力。同时,L2正则化还可以使得模型更加平滑。在实际使用中,需要根据具体的问题和数据选择合适的正则化方法。

5、JS散度

JS散度度量了两个概率分布的相似度,基于KL散度的变体,解决了KL散度非对称的问题。JS散度的取值范围为[0,1],更利于衡量和判断。JS散度计算公式:
J S ( p ∣ ∣ q ) = 1 2 K L ( p ∣ ∣ p + q 2 ) + 1 2 K L ( q ∣ ∣ p + q 2 ) JS(p||q)=\frac{1}{2}KL(p||\frac{p+q}{2})+\frac{1}{2}KL(q||\frac{p+q}{2}) JS(p∣∣q)=21KL(p∣∣2p+q)+21KL(q∣∣2p+q)
KL散度和JS散度在度量的时候有一个问题:如果p、q离得很远,完全没有重叠的时候,那么KL散度值是没有意义的,而JS散度值是一个常数。这在学习算法中是比较致命的,这就意味这这一点的梯度为0。梯度消失了。

KL散度计算公式:
D K L ( p ∣ ∣ q ) = − ∑ x p ( x ) l o g q ( x ) p ( x ) D_{KL}(p||q)=-\sum_{x}p(x)log\frac{q(x)}{p(x)} DKL(p∣∣q)=xp(x)logp(x)q(x)

6、Dropout的作用和原理,在训练和测试时是如何运行?

  • Dropout叫做随机失活,就是在模型训练阶段的前向传播过程中,对于每个神经元,都有一定的概率被舍弃,也就是让其输出置零,进而不更新权重,这样可以使模型的泛化性更强。最早dropout是在全连接层使用的,后来在卷积层中也增加了dropout功能。
  • Dropout是作为缓解卷积神经网络CNN过拟合而被提出的一种正则化方法,它确实能够有效缓解过拟合现象的发生,但是Dropout带来的缺点就是可能会减缓模型收敛的速度,因为每次迭代只有一部分参数更新,可能导致梯度下降变慢。
  • 训练时前向传播只使用没有失活的那部分神经元,而测试时使用的是全部的神经元,那么训练和测试阶段就会出现数据尺度不同的问题。所以测试时,所有权重参数W都要乘以1-p,以保证训练和测试时尺度变化一致。

三、力扣刷题回顾-哈希表

上期涉及题目:

本期题目:


第15题. 三数之和:

  • 给定输入:一个整数数组 nums
  • 要求输出:判断是否存在索引不同的三元组 [nums[i], nums[j], nums[k]] 满足他们的和为0,如果存在就返回所有和为0且不重复的三元组,不存在就返回空集。
  • 注意事项:答案中不可以包含重复的三元组。

第454题.四数相加II:

  • 给定输入:一个由 n 个整数组成的数组 nums 和一个目标值 target
  • 要求输出:返回满足nums[a] + nums[b] + nums[c] + nums[d] == target的所有四元组
  • 注意事项:
    • 可以按任意顺序返回答案,但是不能存在重复的四元组;
    • 0 <= a, b, c, d < n;
    • a、b、c 和 d 互不相同

对比分析:
一般来说哈希表都是用来快速判断一个元素是否出现集合里;第15题. 三数之和 问题可以先用两层for循环确定 a 和b 的数值,然后利用哈希法来确定 0-(a+b) 是否在 数组里出现过,而第454题.四数相加II问题类似,只不过需要多加一层循环。这两道题的关键难点在于不可以包含重复,因此在使用哈希法处理的时候有很多细节需要注意。这两道题实际上更适合使用双指针的方法来解决。


第15题. 三数之和

哈希法:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        result=[]
        nums.sort()
        for i in range (len(nums)):
            # 排序之后如果第一个元素已经大于0,就不可能凑成三元组
            if nums[i]>0:
                break
            if i > 0 and nums[i] == nums[i-1]: #三元组元素a去重
                continue
            d={}
            for j in range(i+1,len(nums)):
                if j>i+2 and nums[j]==nums[j-1]==nums[j-2]: #三元组元素b去重
                    continue 
                c=0-(nums[i]+nums[j])
                if c in d:
                    result.append([nums[i],nums[j],c])
                    d.pop(c) #三元组元素c去重
                else:
                    d[nums[j]] = j
        return result

双指针法:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        result=[]
        nums.sort()
        for i in range(len(nums)):
            if nums[i]>0:
                break
            if i>0 and nums[i]==nums[i-1]:
                continue
            left,right=i+1,len(nums)-1
            while left<right:
                s=nums[i]+nums[left]+nums[right]
                if s == 0:
                    result.append([nums[i],nums[left],nums[right]])
                    while left<right and nums[left]==nums[left+1]:
                        left+=1
                    while left<right and nums[right]==nums[right-1]:
                        right-=1
                    left+=1
                    right-=1
                elif s<0:
                    left+=1
                else:
                    right-=1
        return result

第454题.四数相加II

双指针法:

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        result=[]
        nums.sort()
        for i in range(len(nums)):
            if nums[i]>target and nums[i]>0 and target>0:
                break
            if i > 0 and nums[i] == nums[i-1]: 
                continue
            for j in range(i+1,len(nums)):
                if nums[i]+nums[j]>target and target>0:
                    break
                if j>i+1 and nums[j]==nums[j-1]:
                    continue
                left,right=j+1,len(nums)-1
                while left < right:
                    s=nums[i]+nums[j]+nums[left]+nums[right]
                    if s==target:
                        result.append([nums[i],nums[j],nums[left],nums[right]])
                        while left < right and nums[left] == nums[left+1]:
                            left+=1
                        while left < right and nums[right] == nums[right-1]:
                            right-=1
                        left+=1
                        right-=1
                    elif s<target:
                        left+=1
                    else:
                        right-=1
        return result

参考:
代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和,总结

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值