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_model
和 n_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_size
和stride
决定)在输入图像上滑动,提取局部特征。 - 输出特征图:
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_image
和logits_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