numpy笔记:广播应用:实现一个对比学习的loss function

news2024/11/25 7:04:55

论文笔记:SUPERVISED CONTRASTIVE REGRESSION_UQI-LIUWJ的博客-CSDN博客的loss function

出于简单考虑,我们令v=y,同时sim就是两个向量的内积,d是两个向量逐元素差的绝对值之和 

L=-\frac{1}{2N}\sum_{i=1}^{2N}\frac{1}{2N-1}\sum_{j=1,j \ne i}^{2N} \log \frac{exp(sim(v_i,v_j)/\tau)}{\sum_{k=1}^{2N} 1_{[k \ne i, d(v_i,v_k) \le d(v_i,v_j)]} \exp(sim(v_i,v_k)/\tau)}

1 数据

import numpy as np

a=np.array([[1,3,4],
           [2,3,7],
           [4,0,-4],
           [5,0,1]])

tau=0.5

2 相似度矩阵

similarity=np.dot(a,a.T)/tau
similarity
#第i,j个元素表示 第i行数据和第j行数据的相似度
'''
array([[ 52.,  78., -24.,  18.],
       [ 78., 124., -40.,  34.],
       [-24., -40.,  64.,  32.],
       [ 18.,  34.,  32.,  52.]])
'''

exp_sim = np.exp(similarity)
exp_sim
'''
array([[3.83100800e+22, 7.49841700e+33, 3.77513454e-11, 6.56599691e+07],
       [7.49841700e+33, 7.12058633e+53, 4.24835426e-18, 5.83461743e+14],
       [3.77513454e-11, 4.24835426e-18, 6.23514908e+27, 7.89629602e+13],
       [6.56599691e+07, 5.83461743e+14, 7.89629602e+13, 3.83100800e+22]])
'''
#exp_sim也即分子

numerator = exp_sim
numerator

3 距离矩阵

n,m=a.shape
n,m
#(4, 3)

distance=np.abs(a.reshape(n,1,m)-a)
distance
#第i,j,k个元素的意义是:第i行和第j行第k个元素的距离
'''
array([[[ 0,  0,  0],
        [ 1,  0,  3],
        [ 3,  3,  8],
        [ 4,  3,  3]],

       [[ 1,  0,  3],
        [ 0,  0,  0],
        [ 2,  3, 11],
        [ 3,  3,  6]],

       [[ 3,  3,  8],
        [ 2,  3, 11],
        [ 0,  0,  0],
        [ 1,  0,  5]],

       [[ 4,  3,  3],
        [ 3,  3,  6],
        [ 1,  0,  5],
        [ 0,  0,  0]]])
'''
  • 这里说一下思考过程,我们希望distance矩阵的第i,j,k个元素的意义是:第i行和第j行第k个元素的距离(我们统一用i表示三维矩阵第一个维度的下标,j表示第二个维度的下标,k表示第三个维度的下标)
  • a.reshape(n,1,m)之后,第i,1,k个元素表示第i行数据的第k个值
  • a是一个2维矩阵,和a.reshape(n,1,m)相加,根据广播机制,最前面要补一个维度
    • 也就是自动被reshape成(1,n,m)维度,第1,j,k个元素表示第j行数据的第k个值
    • 我们后面直接用a.reshape(1,n,m)表示a
  • a.reshape(n,1,m)和a.reshape(1,n,m)还是不能直接相加,第一个张量的第二个维度需要复制n-1次,变成(n,n,m)维度;第二个张量的第一个维度需要复制n-1次,变成(n,n,m)维度
  • 这两个复制后的矩阵相加,再加上abs(取绝对值操作),就得到了distance矩阵
    • distance矩阵的第(i,j,k)个元素,是a.reshape(n,1,m)扩展到(n,n,m)的第(i,j,k)个元素,加上a.reshape(1,n,m)扩展到(n,n,m)的第(i,j,k)个元素
      • a.reshape(n,1,m)扩展到(n,n,m)的第(i,j,k)个元素就是a.reshape(n,1,m)的第(i,1,k)个元素
      • a.reshape(1,n,m)扩展到(n,n,m)的第(i,j,k)个元素就是a.reshape(1,n,m)的第1,j,k个元素
      • ——>第i行数据的第k个值,减去第j行数据的第k个值
total_dis=np.sum(distance,axis=2)
total_dis
#第ij个元素就是第i行和第j行的距离,是一个对称矩阵
#每一对(i,j)的所有k加和
'''
array([[ 0,  4, 14, 10],
       [ 4,  0, 16, 12],
       [14, 16,  0,  6],
       [10, 12,  6,  0]])
'''

 4 约束条件限制

1_{[k \ne i, d(v_i,v_k) \le d(v_i,v_j)]}

4.1 k ≠ i

mask_i = np.eye(4) == 0
mask_i

'''
array([[False,  True,  True,  True],
       [ True, False,  True,  True],
       [ True,  True, False,  True],
       [ True,  True,  True, False]])
'''

mask_i=mask_i.reshape(n,1,n)
#第(i,1,k)个元素

4.2  d(yi,yk)≤d(yi,yj)

dist_cond = total_dis.reshape(n,1, n) <= total_dis.reshape(n, n, 1)
dist_cond
'''
array([[[ True,  True,  True,  True],
        [False,  True,  True,  True],
        [False, False,  True, False],
        [False, False,  True,  True]],

       [[ True, False,  True,  True],
        [ True,  True,  True,  True],
        [False, False,  True, False],
        [False, False,  True,  True]],

       [[ True,  True, False, False],
        [False,  True, False, False],
        [ True,  True,  True,  True],
        [ True,  True, False,  True]],

       [[ True,  True, False, False],
        [False,  True, False, False],
        [ True,  True,  True, False],
        [ True,  True,  True,  True]]])
'''

和前面广播类似的思考方法

 

dist_cond的第i,j,k个元素表示d(yi,yk)≤d(yi,yj)是否满足

 

 total_dis.reshape(n, 1, n)的第i,1,k个元素表示d(yi,yk)

total_dis.reshape(n, n, 1)的第i,j,1个元素表示d(yi,yj)

 

total_dis.reshape(n, 1, n)≤total_dis.reshape(n, n, 1)就是d(yi,yk)≤d(yi,yj)

4.3 两个判断条件合并

indicator = np.logical_and(mask_i[:, np.newaxis, :], dist_cond)
indicator
'''
array([[[False,  True,  True,  True],
        [False,  True,  True,  True],
        [False, False,  True, False],
        [False, False,  True,  True]],

       [[ True, False,  True,  True],
        [ True, False,  True,  True],
        [False, False,  True, False],
        [False, False,  True,  True]],

       [[ True,  True, False, False],
        [False,  True, False, False],
        [ True,  True, False,  True],
        [ True,  True, False,  True]],

       [[ True,  True, False, False],
        [False,  True, False, False],
        [ True,  True,  True, False],
        [ True,  True,  True, False]]])
'''

5 计算分母

\sum_{k=1}^{2N} 1_{[k \ne i, d(v_i,v_k) \le d(v_i,v_j)]} \exp(sim(v_i,v_k)/\tau)

denominator = np.sum(indicator * exp_sim.reshape(n,1,n), axis=-1)
'''
array([[7.49841700e+33, 7.49841700e+33, 3.77513454e-11, 6.56599691e+07],
       [7.49841700e+33, 7.49841700e+33, 4.24835426e-18, 5.83461743e+14],
       [3.77513497e-11, 4.24835426e-18, 7.89629602e+13, 7.89629602e+13],
       [5.83461808e+14, 5.83461743e+14, 6.62424768e+14, 6.62424768e+14]])
'''
  • exp_sim.reshape(n,1,n) 表示\exp(sim(v_i,v_k)/\tau
  • 呈上indicator就是前面的那个条件不等式
  • sum就是对k求和

6 计算最后的loss function

result_matrix = np.log(numerator / denominator)
result_matrix
'''
array([[-2.60000000e+01,  0.00000000e+00,  0.00000000e+00,
         0.00000000e+00],
       [ 0.00000000e+00,  4.60000000e+01,  0.00000000e+00,
         0.00000000e+00],
       [-1.12535168e-07,  0.00000000e+00,  3.20000000e+01,
         0.00000000e+00],
       [-1.60000001e+01,  0.00000000e+00, -2.12692811e+00,
         1.78730719e+01]])
'''

 

loss=np.sum(result_matrix)
loss
#51.74614355460242
#对x轴和y轴求和

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

点评项目核心内容

目录 拦截器设置 集群的session共享问题 基于redis实现共享session登录 创建bean对象技巧 什么是缓存 使用缓存来处理对象 使用String类型缓存来处理集合 缓存更新策略 主动更新策略 缓存穿透 空串""和null的区别 缓存null值解决穿透问题 缓存雪崩 缓存击穿…

二刷力扣--字符串

字符串 摘自Python文档-标准库&#xff1a; 在Python中&#xff0c; 字符串是由 Unicode 码位构成的不可变序列。 由于不存在单独的“字符”类型&#xff0c;对字符串做索引操作将产生一个长度为 1 的字符串。 也就是说&#xff0c;对于一个非空字符串 s, s[0] s[0:1]。 不存…

震惊!idea里斗地主还不算我还要玩大富翁!vscode也安排一个

1. 介绍 本来呢前段时间大约是三四月份吧&#xff0c;摸鱼的时候找到了这个插件 xechat-idea, 可以在idea里边摸鱼&#xff0c;斗地主&#xff0c;聊天等,项目地址为 https://github.com/anlingyi/xechat-idea , QQ群号754126966 然后我尝试着开发了两个游戏 一个是大富翁 一个…

Kubernetes(K8S)集群部署

目录 一、创建3台虚拟机 二、为每台虚拟机安装Docker 三、安装kubelet 3.1 安装要求 3.2 为每台服务器完成前置设置 3.3 为每台服务器安装kubelet、kubeadm、kubectl 四、使用kubeadm引导集群 4.1 master服务器 4.2 node1、node2服务器 4.3 初始化主节点 4.4 work节…

使用内网端口映射方案,轻松实现U8用友ERP的本地部署异地远程访问——“cpolar内网穿透”

文章目录 前言1. 服务器本机安装U8并调试设置2. 用友U8借助cpolar实现企业远程办公2.1 在被控端电脑上&#xff0c;点击开始菜单栏&#xff0c;打开设置——系统2.2 找到远程桌面2.3 启用远程桌面 3. 安装cpolar内网穿透3.1 注册cpolar账号3.2 下载cpolar客户端 4. 获取远程桌面…

元宇宙发展下的虚拟时尚

过去两年元宇宙概念大热&#xff0c;在元宇宙的发展过程中&#xff0c;时尚已逐渐成为其最受欢迎的应用领域之一。元宇宙中的时尚应用经历长期的发展&#xff0c;现已成为其最流行的用途之一。自2006年首届虚拟时装秀在Second Life举办以来&#xff0c;该行业的发展呈指数级增长…

【实训项目】滴滴电竞APP

1.设计摘要 2013年国家体育总局决定成立一支由17人组成的电子竞技国家队&#xff0c;第四届亚室会中国电竞代表队 出战第四届亚洲室内和武道运动会。 2014年1月13日CCTV5《体育人间》播放英雄联盟皇族战队的纪录片。 在2015到2019年间&#xff0c;我国电竞战队取得的无数值得…

气膜建筑凭借自身优势,提供多功能室内体育馆

气膜安装简单快捷&#xff0c;可作为临时性或季节性建筑&#xff0c;并且可以和其他常规结构建筑相连接。连接处均可进行气密性设计。功能分区明显&#xff0c;避免其他活动对运动的影响。方便运动与观光的有机结合。气膜建筑基础处理简单&#xff0c;迁移的损耗非常小&#xf…

在外远程访问禅道,点亮软件测试新技能「内网穿透」

文章目录 1.前言2.BUG管理软件设置2.1.禅道Bug管理软件下载安装2.2.cpolar下载安装 3.本地内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 作为一个软件技术人员&#xff0c;每天都无法避免的事&#xff0c;就是与各种Bug斗智斗勇。反观整个计算机…

机场、公交枢纽定位解决方案

系统简介 高精度综合定位系统围绕车辆、人员和资产三类定位目标&#xff0c;以及停机坪、行李分拣中心、GTC和新建航站楼等多个定位场景&#xff0c;建设一体化综合定位系统。系统通过卫星差分、蓝牙等多类技术的集成和融合&#xff0c;实现多场景、多目标的综合精准定位&#…

汉诺塔问题(包含了三台柱和四台柱)——C语言版本

目录 1. 什么是汉诺塔 2. 三座台柱的汉诺塔 2.1 思路 2.2 三座台柱的汉诺塔代码 3. 四座台柱的汉诺塔 3.1 思路 3.2 四座台柱的汉诺塔代码 1. 什么是汉诺塔 汉诺塔代码的功能&#xff1a;计算盘子的移动次数&#xff0c;由数学公式知&#xff0c;汉诺塔的盘子移动次数与…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.1 整体效果演示、技术点

事件&#xff0c;在 Qt 中是很重要的一块内容&#xff0c;在实际工作中用到的也很多。 这里用一章的篇幅来讲解它。 本节先看下本章的一个总览&#xff0c;演示下所有效果&#xff0c;以及涉及到的一些技术点。 1.1 常用的事件讲解 整体效果如下&#xff1a; 详细讲解以下…

【学习笔记】C#基础 - 由C/C++衍生出来的面向对象的编程语言

一、程序结构 1、基本语法 using System; // C#程序第一条语句都是 using System; // using 关键字&#xff08;可多个&#xff09;&#xff1a;在程序中包含命名空间namespace RectangleApplication // namespace 声明&#xff08;可多个&#xff09;&#xff1a;包含一系列…

被删除并且被回收站清空的文件如何找回

文件的意外删除和回收站清空是许多用户面临的普遍问题。这种情况下&#xff0c;很多人会感到无助和焦虑&#xff0c;担心自己的重要文件永远丢失。然而&#xff0c;幸运的是&#xff0c;依然存在一些有效的方法能够帮助我们找回被删除并且被回收站清空的文件。 ▌被删除文件在…

【deepspeed】【训练】【交互】【wandb】训练过程中的wandb交互如何去除

问题&#xff1a;gpt模型训练时&#xff0c;中间有询问输入账户&#xff0c;交互式的询问影响自动执行脚本&#xff0c;询问是这样的&#xff1a; 解决办法&#xff1a; 在脚本中设置环境变量&#xff0c;关闭wandb&#xff0c;如下图&#xff1a; 其他&#xff1a; log中没有…

低代码框架开发平台厂家:做好产品,实现流程化办公!

在新的发展时代&#xff0c;低代码技术平台拥有诸多优势特点&#xff0c;成为广大企业实现降本、增效办公效率的得力助手。什么样的低代码框架开发平台厂家值得信任与青睐&#xff1f;都有哪些主要产品&#xff1f;为了帮助大家了解这一讯息&#xff0c;一起来了解流辰信息低代…

学习网络编程No.6【将服务器日志和守护进程化】

引言&#xff1a; 北京时间&#xff1a;2023/9/1/21:15&#xff0c;下午刚更新完博客&#xff0c;同理再接再厉&#xff0c;这样整天不需要干什么&#xff0c;除了玩手机的日子不多了&#xff0c;马上就要开学&#xff0c;每天需要签到签退的日子就要来临&#xff0c;烦躁&…

原生小程序Donut多端开发

原生小程序Donut多端开发 原生小程序 Donut 多端&#xff1a;跨平台开发的新选择 随着移动应用开发的不断发展&#xff0c;跨平台开发成为了一个备受关注的话题。开发人员希望能够使用一套代码库&#xff0c;同时支持多个平台&#xff0c;从而提高开发效率并覆盖更广泛的用户群…

移除数组中指定元素的所有数

给你一个数组 nums 和一个值 val&#xff0c;你需要 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 思路1&#xff1a;暴力查找——覆盖法&#xff0c;遇到一次val就挪动后面的数据删除 代码 int removeElement(int* nums, int numsSize, int val) {int…

英国入境前需要准备什么?

英国&#xff0c;这个位于欧洲北部的岛国&#xff0c;以其悠久的历史、文化和美丽的风景而闻名于世。无论是旅游观光、留学深造&#xff0c;还是商务差旅&#xff0c;前往英国都需要进行一些入境前的准备工作&#xff0c;以确保您的旅行顺利进行。下面&#xff0c;知识人网小编…