最近一直在研究障碍物识别算法障碍物的类型和姿态又是开放性的无法提前定义因此这类肯定是无监督问题在读SimCLR之前有必要把自己的知识体系中的内容再总结下一、知识体系总结特征训练的过程例如损失函数反向传播以及训练数据和标签网络学习的是一个从原始像素空间到特征空间的映射使得原始图片中对当前任务有意义的信息在特征空间中具有更好的结构。例如在这个向量空间中你想要检测的目标你想分类的目标很容易被提出来所以设计的网络结构以及分类函数就是在重塑特征同样是一个512维的特征空间由于训练数据的不同损失函数的不同同样的图片在这个512维特征空间中的分布就不同首先这点必须明白并且理解。比如之前读的Deep SVDD论文中用到的encoder-decoder的网络结构通过decoder出来的图片要和原始图片一样的目标使得encoder尽可能的学习到较丰富的、与输入整体结构有关的表示。分类分类是在工程中经常被用到的首先必要从特征分布的角度来说下分类分类网络学习的是特征的边界就是只要把A类和B类分开就行不管A类和B类内部特征是怎么分布的有可能某个A类的样本和某个B类的样本最近一个在边界的一边一个在边界的另一边。Deep SVDD的目的是让正常类别的特征更聚合聚合在一个球体内部那么落到球体外部的特征就是异常图片这里有一个非常关键的问题Deep SVDD采用的encoder-decoder方式使得encoder学习的特征非常丰富若想要重现原图encoder提取出来的特征除了整体结构很多细节也要学习到那么异常图片经过 Encoder 后真的有可能落到球体外面这才是 Deep SVDD 最核心的问题要知道“特征丰富” ≠ “异常一定能够被检测出来”还有一点值得注意如果 AutoEncoder 真的学到了所有细节对我们来说不一定是好的因为 AutoEncoder 可能学到一些对异常检测没有意义的变化所以异常检测真正需要的不是尽可能丰富的特征而是保留能够区分正常/异常的变化同时忽略正常情况下本来就会产生的变化这两个目标是不一样的所以我觉得Deep SVDD中AutoEncoder学习的特征很危险很容易受到其他因素的影响。PatchCore中没有重新学习特征而是复用了ImageNet的特征这里有一个前提是工业场景工业场景的图片受光照影响小物体姿态等的影响且拍摄的图片和ImageNet的图片类型目标都在正中间所以ImageNet学习的特征非常适合工业图片那么在这个基础上进行patch等操作是可以看到效果的。所以你的任务的根本是怎么样学习到与任务非常适配的特征二、SimCLR关键4部分其实SimCLR在传递一种信息就是想学到好的特征不只是用对比损失这么简单而是数据增强、Projection Head、特征归一化、Temperature、Batch Size 、训练时间网络容量这些因素共同决定了最终特征空间的质量。Composition of multiple data augmentation operations is crucial in defining the contrastive prediction tasks that yield effective representations。多种数据增强方式组合起来用那么我们在干什么我们想要告诉模型不是长得差不多就认为是同一个人模型必须学习什么东西虽然变了但是本质没有变例如颜色、亮度、局部被裁剪、轻微模糊这些都不会改变目标类别但是如果目标本身的结构变了那么类别也跟着变所以多种数据增强其实在告诉模型你应该学习什么不变性。SimCLR强调”无监督需要比监督学习更强的数据增强“因为在监督学习中图片对应猫的标签模型只需要学习什么特征能够区分猫和狗就行但是在SimCLR中需要判断图片A和图片B是否属于同一个图片没有人为标签所以必须制造一个学习任务。Introducing a learnable nonlinear transformation between the representation and the contrastive loss substantially improves the quality of the learned representations.这点什么意思呢就是在常规的结构中输入图片Image 经过encoder之后得到特征表征h不要直接把提取的特征h直接输入到contrastive loss中最好是经过一个非线性的变换后得到z把z输入到contrastive loss中。因为SimCLR发现如果把h输入到 contrastive loss时encoder必须同时满足两个要求要求1h要有很好的语义特征要求2h还要适合做对比学习。这两个目标其实不完全一致所以增加一个project headencoder只负责学习好的表征project head 负责把这个表征转换成适合contrastive loss的空间就行。Representation learning with contrastive cross entropy loss benefits from normalized embeddings and an appropriately adjusted temperature parameter。这里提到了normalized embeddings我觉得这个是很好理解的如果要比较embedding A和B肯定要将A和B归一化之后才能进行相似性比较这个在使用yolov8的P5特征的时候已经得到了证实这里还提到了温度参数.假设两个 embeddingzi,zjz_i, z_jzi,zjSimCLR 使用 cosine similaritysim(zi,zj)ziTzj∣∣zi∣∣∣∣zj∣∣sim(z_i, z_j) \frac{z_i^Tz_j}{||z_i||||z_j||}sim(zi,zj)∣∣zi∣∣∣∣zj∣∣ziTzj然后有temperature:sim(zi,zj)r\frac{sim(z_i, z_j)}{r}rsim(zi,zj)这个temperature参数是用来放大或者缩小 cosine similarity值的例如 cosine similarity值为0.8, r 0.5 那么 0.8/0.5 1.6进入softmax后差异会被明显放大。Contrastive learning benefits from larger batch sizes and longer training compared to its supervised counterpart.SimCLR喜欢大的batch因为对比学习需要1个正样本大量负样本所以batch越大通常能够提供越多的负样本batch8时正样本1个负样本15个batch1024时正样本1个负样本2047个显然第二种情况下模型对特征空间的认识更充分所以SimCLR对batch size 比较敏感。SimCLR 的任务比普通监督学习更难所以需要更长的训练时间。三、 SimCLR数据加载对输入的batch中的图片每个图片做2个数据增强生成2个图片例如batchN增强后就是2N针对每个图片自己内部增强后的图片是正样本batch内的其他图片都是负样本所以正样本是2负样本是2*N-1四、SimCLR损失函数对于一个正样本对(i,j)li,j−log(exp(sim(zi,zj)/r)∑k12NIk不等于iexp(sim(zi,zj)/r))l_{i,j} -log(\frac{exp(sim(z_i,z_j)/r)}{\sum_{k1}^{2N}I_{k不等于i}exp(sim(z_i,z_j)/r)})li,j−log(∑k12NIk不等于iexp(sim(zi,zj)/r)exp(sim(zi,zj)/r))上面公式的理解分子是自己与正样本的距离分母是自己与除了自己以外其他所有样本的距离和Loss 只把 positive 的概率拿出来作为“正确答案”。接下来去理解为什么 温度参数会改变SimCLR的训练行为4.1 y exp(x / tau) 曲线的理解y exp(x在softmax的理解指数函数一直都被应用的softmax这里进一步去理解为什么。softmax的核心任务就是把模型认为谁更相似/重要这种分数转换成一个概率分布而指数函数比较适合这个任务。原始相似度s[0.8, 0.6, 0.2, -0.1] 是分数不是概率直接除以总和会导致负数的概率值指数函数可以把所有的值都变成正数指数函数还有一个非常重要的性质输入之间的差异会被指数函数进一步放大例如 x10.8, x20.6 原始差距 0.8-0.6 0.2, 经过 指数函数后 这个差距变成1.22y exp(x / tau) 曲线的理解我们把yex/r,r0.5,1.0,2.0y e^{x/r}, r 0.5, 1.0, 2.0yex/r,r0.5,1.0,2.0画出来了如下图所有的r 值都经过(0,1)这个点但是r越小后面的曲线就越陡使得x对应的y的增长快从而进一步拉大不同x对应的数值差距可以看到加入温度参数后是用来调节输入之间的差距。y exp(x / tau) 曲线的放大功能理解指数函数绝对不是等比例放大的是输入的分数或者相似度越大差距放大的越大比如下面的例子三个相似度[0.8, 0.6, 0.2], 指数后[e0.8,e0.6,e0.2][e^0.8, e^0.6, e^0.2][e0.8,e0.6,e0.2]约等于[2.23, 1.82, 1.22] 归一化后是[0.42, 0.35, 0.23] 。如果相似度变成[0.95, 0.6, 0.2] 指数后[e0.9,e0.6,e0.2][e^0.9, e^0.6, e^0.2][e0.9,e0.6,e0.2]指数后约等于[2.59, 1.82, 1.22] 归一化后是[0.46, 0.32, 0.21]如果增加一个r 0.5 的温度参数三个相似度[0.95, 0.6, 0.2] 指数后[e0.9/0.5,e0.6/0.5,e0.2/0.5][e^{0.9/0.5}, e^{0.6/0.5}, e^{0.2/0.5}][e0.9/0.5,e0.6/0.5,e0.2/0.5]指数后约等于[5.99, 3.35, 1.48] 归一化后是[0.55, 0.31, 0.14]当计算了三次后你会发现 归一化后的概率分布由指数后相似度之间的差距决定而不是相似度本身的大小比如 s [0.8, 0.6, 0.4]Piesie0.8e0.6e0.4 P_i \frac{e^{s_i}}{e^0.8 e^0.6 e^0.4}Pie0.8e0.6e0.4esi如果所有的相似度都增加10Piesi10e0.810e0.610e0.410 P_i \frac{e^{s_i10}}{e^{0.810} e^{0.610} e^{0.410}}Pie0.810e0.610e0.410esi10Piesi∗e10(e0.8e0.6e0.4)∗e10 P_i \frac{e^{s_i}*e^{10}}{(e^{0.8} e^{0.6} e^{0.4})*e^{10}}Pi(e0.8e0.6e0.4)∗e10esi∗e10总结softmax 天生具有去掉整体偏移保留绝对差异的特性这种特性是由于指数和相除两种操作共同决定的加上温度后这个关系更加明显softmax的价值是把特征空间中的关系转换成候选样本之间的竞争关系五、函数应用的延伸思考softmax 的函数的应用完美的解决了我们任务中的一些问题接着思考在实际应用中还可以使用哪些函数来解决任务问题### 5.1 sigmod 函数作为权重我之前使用sigmoid函数对网络输出的差值进行放大例如网络输出x1,x2我想拉大x1和x2之间的差值于是a x1-x2要想让a值对网络产生更新那么a需要产生比较大的损失这样直接想到的就是使用sigmoid作为权重进行放大有一个比较关键的点是a的值在[-0.2-0.2]之间范围比较小所以我把sigmoid在这个范围内的曲线画出来如下图现在分析sigmoid函数当r 50的 a -0.1的时候是非常满足我的需求的权重系数接近0了当 r50 a在[–0.1,0]之间的时候快速产生了一个[0-0.5]之间的权重这个不太适合我想要的另外在a 0 的部分[0, 0.1 ] 之间产生了一个快速的[0.5, 1]之间的权重。基于目标对sigmoid函数进行了分析发现sigmoid函数不能满足我的需求因为- sigmoid函数有一个非常明显的形式即sigmoid(0) 0.5 的斜对称函数你可以把[0,1]压缩在0的任意附近范围内但是我的目标是负数全部压到0附近然后从0开始随着正数增大逐渐增加。选用sigmoid函数是因为这个函数有将数值压缩到[01]而著名。### 5.2 ReLU 幂函数 函数作为权重w(a)(max(a,0)0.5)pw(a) (\frac{max(a,0)}{0.5})^pw(a)(0.5max(a,0))p函数曲线如下指数函数和幂函数都经常作为“非线性变换”使用而且非常常见的是与其他函数复合而不是单独拿来作为最终函数幂函数主要控制的是输入接近0时增长有多慢以后后期增长有多快yxp y x^pyxp曲线图如下会发现小值越被压低大值之间的差距越明显。指数函数更偏向于控制随着输入变化输出增长/衰减的速度