【每日算法】理论:多模态系列 刷题:栈的应用

上期文章

【每日算法】理论:深度学习基础 刷题:栈与队列的转换


一、上期问题

  • RAW图像和RGB图像的区别?
  • LSTM模型
  • 卷积层和池化层有什么区别
  • tokenizer 的分词方法有那些?
  • 10亿个参数的模型,部署后占用多大显存?
  • Textual Inversion模型

二、本期理论问题

1、GPT

GPT模型主要由Transformer Decoder的block堆叠而成,去除了原本的cross-attention。其核心技术是把Transformer的解码器拿出来,在没有标号的大量的文本数据集上训练一个语言模型来获得一个预训练模型,然后在子任务上进行微调得到每一个任务所需要的分类器。GPT可以用于完成多种任务,如分类任务,句子关系任务,文本相似性任务,多项选择任务。现在一般多用于生成任务或者包装成生成任务的以上任务。

【论文精读】 GPT,GPT-2,GPT-3:大力出奇迹

2、BLIP

BLIP模型是多模态领域的经典模型,它的核心思想是通过多路损失函数,以及图像分块理解策略等算法,构建高质量的图像理解模型,实现了视觉语言理解和生成任务的统一。BLIP模型的图像方面是一个完整的ViT模型,文本方面有三个模型分别用于计算三个目标函数。第一个文本模型用于根据输入文本做文本理解的分类任务,当得到文本特征之后,与视觉特征做ITC Loss;第二个文本模型是一个多模态编码器,借助了图像的信息,然后去完成多模态的任务,对应ITM Loss;第三个文本模型是解码器结构,主要用于完成生成任务。另外,BLIP模型还采用标题和过滤策略(Captioning and Filtering, CapFilt)提高了训练文本语料库的质量。

3、Pix2Pix

Pix2Pix是将GAN应用于有监督的图像到图像翻译的经典模型。普通GAN的生成器G输入的是随机向量(噪声),输出是图像; 判别器D接收的输入是图像(生成的或是真实的),输出是对或者错 。这样G和D联手就能输出真实的图像。Pix2pixGAN本质上是一个cGAN,图片x作为此cGAN的条件, 输入到生成器G中。G的输出是生成的图片G(x)。判别器D判别的时候图片也是和给定的条件一起判别。Pix2Pix模型的生成器G采用了Encoder-Decoder模型,参考U-Net的结构,判别器D实现为Patch-D,所谓Patch,是指无论生成的图像有多大,将其切分为多个固定大小的Patch输入进D去判断。这样设计的好处是:D的输入变小,计算量小,训练速度快。pix2pix的目标函数采用将L1 loss与GAN loss相结合的方式,其中L1损失用于捕捉低频信息,判别器损失则用于捕捉高频损失。

4、常见的激活函数及其优缺点

激活函数在神经网络的每一层中引入非线性,使得神经网络能够拟合复杂的非线性模式。常见的激活函数有:

  • Sigmoid: 它可以将一个实数映射到(0,1)的区间,但不以0为中心,收敛慢且易梯度消失。
  • Tanh:缩至-1 到 1 的区间内,其收敛速度要比sigmoid快,但也会梯度消失
  • Relu:当x<0时,ReLU硬饱和,能够在x>0时保持梯度不衰减,从而缓解梯度消失问题,但也有缺点<0时,以及不以0为对称中心。

5、残差模块如何缓解梯度消失

残差网络的精妙之处在于它把对于完整的输出的学习问题归结于对于残差的学习问题。因为“短路”机制的存在,反向回传时,高层的梯度可以直接传递到低层,防止梯度消失,同时也提高了计算效率。

6、ViLT

ViLT提出了一个极其简单的做多模态学习的框架结构,它把模态的特征抽取做到了极小化,把主要的计算量都放到了后面的模态融合上,大大地提高了模型的推理速度,而且让整个方法的建模变得很简单。ViLT模型整体由两个linear embedding,加一个transformer组成。视觉和文本输入通过linear embedding层被转化为了相同的token特征之后通过一个Transformer的结构就可以进行建模,它使用了一个预训练的ViT来初始化这个Transformer。ViLT主要的贡献是把目标检测也就是区域性检测从多模态学习的框架中移除掉了。VILT在预训练阶段主要使用ITM和MLM这两种较典型的优化目标,并在训练时采用了Whole Word Masking和图像数据增强等技巧增加模型的性能。

三、力扣刷题回顾-栈与队列

上期涉及题目:

本期题目:

20. 有效的括号:

  • 给定输入:一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s
  • 要求输出:判断字符串是否有效:左括号必须用相同类型的右括号闭合、左括号必须以正确的顺序闭合、每个右括号都有一个对应的相同类型的左括号

1047. 删除字符串中的所有相邻重复项:

  • 给定输入:由小写字母组成的字符串 S
  • 要求输出:反复删除字符串中两个相邻且相同的字母,直到无法继续删除

150. 逆波兰表达式求值:

  • 给定输入:一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式
  • 要求输出:返回该表达式计算得到的值
  • 补充:逆波兰表达式是一种后缀表达式,所谓后缀就是指运算符写在后面。

对比分析:
20. 有效的括号1047. 删除字符串中的所有相邻重复项以及150. 逆波兰表达式求值都是运用栈的题目。其中20. 有效的括号和1047. 删除字符串中的所有相邻重复项都是匹配类型的题,栈的作用就是存放需要匹配的内容。150. 逆波兰表达式求值和1047. 删除字符串中的所有相邻重复项是差不多的,只不过本题不要相邻元素做消除了,而是做运算。


20. 有效的括号

核心思想:遇到左括号就把对应的右括号放进栈里,遇到右括号就去栈里进行匹配,这样不仅可以保证左右括号的匹配,而且能保证顺序不出现问题。False的三种情况:左括号多了;左右括号类型不匹配;右括号多了。

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for i in s:
            if i == '(':
                stack.append(')')
            elif i == '[':
                stack.append(']')
            elif i == '{':
                stack.append('}')
            elif not stack or stack[-1] != i:
                return False
            else:
                stack.pop()
        return True if not stack else False

1047. 删除字符串中的所有相邻重复项

核心思想:与上题类似,栈的目的就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下是不是遍历过相同数值的相邻元素,然后再去做对应的消除操作。

class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack = []
        for i in s:
            if not stack or stack[-1] != i:
                stack.append(i)
            else:
                stack.pop()
        return "".join(stack)

150. 逆波兰表达式求值

核心思想:用栈操作运算,遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for i in tokens:
            if i in ['+','-','*','/']:
                num1 = stack.pop()
                num2 = stack.pop()
                if i == '+':
                    stack.append(int(num2+num1))
                elif i == '-':
                    stack.append(int(num2-num1))
                elif i == '*':
                    stack.append(int(num2*num1))
                else:
                    stack.append(int(num2/num1))
            else:
                stack.append(int(i))
        return stack.pop()

参考:
代码随想录算法训练营第十天|20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值