clip模型思考

y=wx+b

模型的权重w是从均值为0,标准差为1的正态分布里面随机抽取。

模型的偏置b=0

网络里面有归一化层

网络里面的激活函数是QuickGELU激活函数

QuickGELU激活函数:y=

在这个网络里面,输入经过一个线性层(线性函数y=wx+b)后来到神经网络的节点上面,接着是节点上面的激活函数对y进行处理,经过处理后的y继续经过一个线性层(线性函数y=wx+b)来到输出层。

里面的维度变化:输入层到隐藏层输入维度m变成输入的四倍维度m*4,隐藏层到输出层m*4变成m。

残差注意力模块

一个多头注意力组件:给它输入数据特征维度m,还有他的头数量n,并行处理n个注意力。

传入了一个掩码矩阵,注意力计算中需要用到,掩盖某些特定位置

如果掩码矩阵的数据类型是torch.float32,输入的数据类型(张量)是torch.float16,需要统一为torch.float16

前向传播中多头注意力部分可以接收比实例化 Init更多参数:

    Init就两个参数:m,n,初始化对象状态

     前向传播中接收参数:q(查询),k(键),v(值),need_weights=False 表示在返回结果时不需要注意力权重矩阵,注意力掩码矩阵。

[0] 表示只返回注意力输出,不返回注意力权重。

原因:调用 MultiheadAttention 类的 forward 方法,这是 PyTorch nn.Module 类的一个特性。 forward 方法的定义接受更多参数并提供默认值,所以即使在实例化时只传入 d_modeln_head 这两个参数,也可以在调用 forward 时传递额外的参数。

self.ln_1 = LayerNorm(d_model)解释:

定义了一个名为ln_1的层归一化层,并且指定了输入特征的维度d_model。这只是定义了该层,并没有实际进行归一化操作。

使用的时候传入的是你希望进行归一化的输入数据。

举个例子,如果d_model=3,

那么层归一化后的结果:

层归一化的作用是对每一个输入样本的特征进行归一化,使其具有零均值和单位方差 。这里每一行的元素均值为0,标准差为1,从而实现了归一化的效果。

残差注意力模块的执行部分1:残差连接

x = x + self.attention(self.ln_1(x))
x = x + self.mlp(self.ln_2(x))

1:模型的输入+attention(层归一化处理后的数据)

举个例子:

 假设注意力掩码矩阵:

 Dk=4/2=2,计算注意力得分矩阵:

 残差注意力的执行模块2:残差连接

1里面的输出y+一个经过多层感知机处理的y(隐藏层就一层)

懂了吗,这里就是一个x经过多注意力模型处理和x残差相加得到y,y经过多层感知机处理和y进行残差连接得到最终结果。这个总体称之为残差注意力机制。定义的时候接收三个参数:数据的维度,多头注意力的头数,掩码矩阵。

Transformer模型就是堆叠残差注意力层,堆叠多少数量就是layers.

请看接下来的VisionTransformer:好菜

图像处理:将一个RGB图像分割成图像块,每个图像块大小是patch_size*patch_size,卷积核的大小等于图像块的大小,步长stide当然就是patch_size.

1.卷积运算:图像变成特征图

  • 卷积运算nn.Conv2d 会对输入数据进行卷积运算,使用指定大小的卷积核(由 kernel_sizestride 决定)在输入图像上滑动,提取局部特征。
  • 输出特征图out_channels 决定卷积层输出特征图的深度,每个输出通道对应一个卷积核提取的特征。

输入图像的形状为 [batch_size, in_channels, height, width]。

输出 shape = [batch_size, width, grid, grid]     

grid 是特征图的宽度和高度,grid 的值取决于输入图像的大小和卷积层的参数(如卷积核大小、步幅等)。

2.展平特征图并且进行转置(方便连接后续层):

形状:  [batch_size, width, grid, grid] ->[batch_size, width, grid**2]->[batch_size, grid**2, width]

3.分类标记添加(为每个样本/图像添加分类标记):

[batch_size, grid**2, width]->[batch_size,grid**2+1,width]

4.位置嵌入:引入序列的顺序信息,shape不变。

5.对width维度的特征数据进行层归一化后,使用transformer模型处理数据。

6.对原来的形状是[batch_size,grid**2+1,width] 的数据进行切片操作,将之前添加的标记提取出来。

形状:[batch_size,grid**2+1,width]->[batch_size,width].

7.应用投影矩阵进行维度转换,匹配后续层的输入要求:

形状:[batch_size,width]->[batch_size,output_dim].

文本处理(与图片处理类似):

1.词向量化;将输入的词汇映射到高维度的特征向量:

 2.位置编码

3.使用transformer模型进行处理

4.对每个维度的特征数据进行归一化

5.选择最重要的特征进行降维,适应后续的处理。

形状变化:[batch_size, n_ctx, transformer_width]->[batch_size, projection_dim].

对图像和文本进行处理之后;

对得到的图像和文本特征进行归一化处理,

计算图像和文本特征之间的相似性得分:

  • 相似性度量

    • 通过计算图像和文本特征的内积,我们得到了一个相似性度量,表示每对图像和文本之间的相似程度。
  • 可训练的缩放因子

    • logit_scale 是一个可训练的参数,可以根据训练数据进行调整,以优化相似性得分的范围,使模型在训练过程中更容易收敛。
  • 双向相似性矩阵

    • 通过计算 logits_per_imagelogits_per_text,我们得到了图像-文本和文本-图像两种方向的相似性得分矩阵,便于在训练过程中进行双向匹配和对比学习。

从state_dict里面获取权重等数据。

参数:

context_length:77

input_resolution:224

vocab_size:49408

visual.conv1.weight 的形状是:(64, 3, 7, 7)

vision_width=out_channels:64

in_channels:3

kernel_size=7

stride=7

vision_layers=12

vision_patch_size=7

grid_size=14

image_resolution:98

embed_dim:512

transformer_width:512

 transformer_heads :8

transformer_layers:12

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值