学习笔记-250222

news2025/2/25 22:58:15

论文:

Learning Hierarchical Prompt with Structured Linguistic Knowledge for
Vision-Language Models
主要研究llm在图像分类中的能力,当提示输入目标类别时,llm能够生成相关的描述以及相应的结构化关系。

1.首先利用llm从普通的描述中获取结构化信息

利用llm来生成与类别相关的描述以及相应的结构化关系;

笑鼠,代码还没看,光看论文觉得太复杂了,引入Q矩阵(e2e和e2a)entity实体。attribute属性。

1.使用结构化知识指导学习得到的基于注意力的矩阵(attention-based matrices),并将这些矩阵集成到文本编码器的不同层中。

在实践中,通过同时计算一组查询(queries)上的注意力函数来实现这一点。这些查询被打包成一个矩阵Q。类似地,键(keys)和值(values)也被分别打包成矩阵K和V。

对于第l层,使用基于注意力的矩阵MlMl​,自注意力的输出通过以下公式计算:

这里,Ml​是为每一层特别设计的矩阵,用于显式表示该层内每个描述的丰富结构关系,从而增强与类别相关的关键信息。

2.层次化的知识建模方法,将来自多个层次的整体语义与结构化关系相结合,有助于发现大型语言模型(LLMs)未能识别的复杂关联。

  • 整合结构化知识:通过在自注意力机制中引入额外的矩阵Ml​,可以更好地捕捉输入数据中的结构化信息,这有助于提高模型对于特定任务的表现。

  • 跨层级自注意力:这种方法允许模型自动学习不同抽象层次之间的关系,无需人为定义这些关系。它通过结合高层次和全局级别的提示,能够捕捉长程依赖性和复杂的语义联系。

  • 增强表达能力:通过上述机制,模型不仅能够理解单个词或短语的意义,还能捕捉整个句子或段落内部以及跨句子、跨段落之间的复杂关系,从而提升对文本深层次含义的理解能力。

该技术通过在自注意力机制中融入结构化知识和跨层级提示,增强了模型理解和表达复杂文本关系的能力。

反正很复杂,看不懂......

250223

迁移:主要是学生不同

或者是知识点不同

如果二者都不一样,那没办法搞啊

阅读文章:

Prompt-to-prompt:让生成的图像保持一致 - 知乎

理了下PromptCD代码:

publisher-PromptCD/PromptCD: PromptCD:传输跨域认知诊断的提示

以irt模型为例:

1.初始化irt模型

初始化中

self.pp_dim = pp_dim                     # 提示向量维度
self.latent_dim = latent_dim             # 潜在特征维度
self.s_irt_net = Source_MIRTNet(         # 源域模型
    user_num, s_item_num, latent_dim, 
    pp_dim, s_ranges, a_range
)  
self.t_irt_net = Target_MIRTNet(         # 目标域模型(版本1)
    user_num, t_item_num, latent_dim, 
    pp_dim, s_ranges, a_range
)  
self.t_irt_net2 = Target_MIRTNet2(       # 目标域模型(初始化有优化)
    user_num, t_item_num, latent_dim, 
    pp_dim, s_ranges, a_range
)
class Source_MIRTNet(nn.Module):
    def __init__(self, user_num, item_num, latent_dim, pp_dim, s_ranges, a_range, irf_kwargs=None):
        super(Source_MIRTNet, self).__init__()
        self.user_num = user_num
        self.item_num = item_num
        self.pp_dim = pp_dim
        self.s_ranges = s_ranges
        self.latent_dim = latent_dim
        self.irf_kwargs = irf_kwargs if irf_kwargs is not None else {}

        self.b = nn.Parameter(torch.rand((self.item_num, self.latent_dim)))
        nn.init.xavier_uniform_(self.b)
        self.s_exer_vectors = nn.ParameterList([nn.Parameter(torch.rand(self.pp_dim)) for _ in range(len(s_ranges))])

        self.theta = nn.ParameterList([nn.Parameter(torch.randn(self.user_num, self.latent_dim))
                                       for _ in range(len(s_ranges))])
        for theta in self.theta:
            nn.init.xavier_uniform_(theta)

        self.prompt_theta = nn.Parameter(torch.randn(self.user_num, self.pp_dim))
        nn.init.xavier_uniform_(self.prompt_theta)

        self.a = nn.Embedding(self.item_num, 1)
        self.c = nn.Embedding(self.item_num, 1)

        self.a_range = 1
        self.value_range = 8

        self.fc1 = nn.Linear(self.pp_dim + self.latent_dim, self.latent_dim)
        self.fc2 = nn.Linear(self.pp_dim + self.latent_dim, self.latent_dim)

    def forward(self, user, item):
        prompt_theta_repeated = self.prompt_theta.repeat(len(self.s_ranges), 1)
        theta_concatenated = torch.cat([theta for theta in self.theta], dim=0)
        new_theta = torch.cat([prompt_theta_repeated, theta_concatenated], dim=1)
        new_theta = torch.index_select(new_theta, dim=0, index=user)
        new_theta = self.fc1(new_theta)
        new_theta = torch.squeeze(new_theta, dim=-1)

        temp_vectors = torch.cat(
            [vector.repeat(r[1] - r[0] + 1, 1) for vector, r in zip(self.s_exer_vectors, self.s_ranges)], dim=0)

        all_b = torch.cat([temp_vectors, self.b], dim=1)
        new_b = torch.index_select(all_b, dim=0, index=item)
        new_b = self.fc2(new_b)
        new_b = torch.squeeze(new_b, dim=-1)

        new_a = self.a(item)
        new_a = torch.squeeze(new_a, dim=-1)

        new_c = torch.squeeze(self.c(item), dim=-1)
        new_c = torch.sigmoid(new_c)

        if self.value_range is not None:
            new_theta = self.value_range * (torch.sigmoid(new_theta) - 0.5)
            new_b = self.value_range * (torch.sigmoid(new_b) - 0.5)
        if self.a_range is not None:
            new_a = self.a_range * torch.sigmoid(new_a)
        else:
            new_a = F.softplus(new_a)

#------------------------------
        if torch.max(new_theta != new_theta) or torch.max(new_a != new_a) or torch.max(new_b != new_b):  # pragma: no cover
            raise ValueError('ValueError:theta,a,b may contains nan!  The a_range is too large.')
        return self.irf(new_theta, new_a, new_b, new_c, **self.irf_kwargs)
class Source_MIRTNet(nn.Module):
    def __init__(self, user_num, item_num, latent_dim, pp_dim, s_ranges, a_range, irf_kwargs=None):
        super(Source_MIRTNet, self).__init__()
        # 基础参数
        self.user_num = user_num          # 用户总数
        self.item_num = item_num          # 题目总数(源域)
        self.pp_dim = pp_dim              # 提示向量维度(用于迁移学习)
        self.s_ranges = s_ranges          # 源域题目范围划分(如知识点分类)
        self.latent_dim = latent_dim      # 潜在特征维度(用户能力θ和题目难度b的维度)
        self.irf_kwargs = irf_kwargs      # IRT模型参数(如三参数模型配置)
        self.a_range = a_range           # 区分度a的范围约束(如[0,1])
        self.value_range = 8             # θ和b的范围约束(如[-4,4])

题目参数:(主要看题目范围参数,每个范围一个pp_dim维向量)

# 题目难度参数(b):每个题目对应一个latent_dim维向量
self.b = nn.Parameter(torch.rand((self.item_num, self.latent_dim)))
nn.init.xavier_uniform_(self.b)  # Xavier初始化

# 题目范围嵌入向量(s_exer_vectors):每个范围一个pp_dim维向量
self.s_exer_vectors = nn.ParameterList([
    nn.Parameter(torch.rand(self.pp_dim)) 
    for _ in range(len(s_ranges))  # 根据s_ranges长度创建(如代数、几何各一个)
])

用户参数:

# 用户能力参数(theta):每个范围独立的能力矩阵(如代数能力、几何能力)
self.theta = nn.ParameterList([
    nn.Parameter(torch.randn(self.user_num, self.latent_dim))
    for _ in range(len(s_ranges))
])
for theta in self.theta:  # Xavier初始化每个能力矩阵
    nn.init.xavier_uniform_(theta)

# 用户提示向量(prompt_theta):跨范围共享的迁移适配参数
self.prompt_theta = nn.Parameter(torch.randn(self.user_num, self.pp_dim))
nn.init.xavier_uniform_(self.prompt_theta)

其中:torch.randn 函数用于生成一个形状为 (self.user_num, self.pp_dim) 的张量,其中的元素是从标准正态分布(均值为0,标准差为1)中随机抽取的。
self.user_num 表示用户的数量,而 self.pp_dim 则代表预处理维度或先验/后验维度的大小。这个二维张量可以看作是每个用户对应的一个向量集合,每个向量的长度为 pp_dim。

self.prompt_theta: 此变量被设计用来存储与每个用户相关的“提示”向量。这里的“提示”可能是指某种形式的上下文信息或额外特征,旨在增强模型对不同用户行为的理解能力。这些向量初始时是随机的,但随着模型的训练,它们将根据任务需求进行调整,以更好地捕捉每个用户的独特偏好或特性。
初始化:使用标准正态分布来初始化这些参数是一种常见的做法,因为它有助于打破对称性,使得神经网络中的各个神经元能够学习不同的特征,从而加速训练过程。

题目区分度与猜测函数:

self.a = nn.Embedding(self.item_num, 1)  # 区分度参数a
self.c = nn.Embedding(self.item_num, 1)  # 猜测概率参数c
特征融合层
self.fc1 = nn.Linear(pp_dim + latent_dim, latent_dim)  # 用户特征融合
self.fc2 = nn.Linear(pp_dim + latent_dim, latent_dim)  # 题目特征融合

2. 前向传播逻辑解析

(1) 用户能力生成
def forward(self, user, item):
    # 步骤1:扩展提示向量以匹配范围数量
    prompt_theta_repeated = self.prompt_theta.repeat(len(self.s_ranges), 1)
    # 示例:若s_ranges有2个范围,则每个用户的提示向量复制2次

    # 步骤2:拼接所有范围的用户能力(theta_concatenated)
    theta_concatenated = torch.cat([theta for theta in self.theta], dim=0)
    # 结果形状:(num_ranges * user_num, latent_dim)

    # 步骤3:将提示向量与用户能力拼接
    new_theta = torch.cat([prompt_theta_repeated, theta_concatenated], dim=1)
    # 形状:(num_ranges * user_num, pp_dim + latent_dim)

    # 步骤4:根据输入的user索引选择对应的融合特征
    new_theta = torch.index_select(new_theta, dim=0, index=user)
    # 假设user是批量用户的索引,形状:(batch_size,)

    # 步骤5:通过全连接层生成最终用户能力
    new_theta = self.fc1(new_theta)  # 输出形状:(batch_size, latent_dim)
    new_theta = torch.squeeze(new_theta, dim=-1)

设计意图

  • 分范围能力建模:每个范围(如知识点)的用户能力独立存储,增强模型对领域内细粒度差异的捕捉。

  • 提示向量融合:通过 prompt_theta 引入迁移学习能力,为后续目标域适配提供接口。

# 步骤1:生成题目范围特征(temp_vectors)
temp_vectors = torch.cat([
    vector.repeat(r[1] - r[0] + 1, 1) 
    for vector, r in zip(self.s_exer_vectors, self.s_ranges)
], dim=0)
# 示例:若s_ranges为[(0,99), (100,199)],则每个范围向量重复100次

# 步骤2:拼接范围特征与题目基础难度b
all_b = torch.cat([temp_vectors, self.b], dim=1)  # 形状:(item_num, pp_dim + latent_dim)

# 步骤3:根据输入的item索引选择题目特征
new_b = torch.index_select(all_b, dim=0, index=item)  # 形状:(batch_size, pp_dim + latent_dim)

# 步骤4:通过全连接层生成最终题目难度
new_b = self.fc2(new_b)  # 形状:(batch_size, latent_dim)
new_b = torch.squeeze(new_b, dim=-1)
(3) 题目参数提取与约束
# 区分度参数a
new_a = self.a(item)                    # 形状:(batch_size, 1)
new_a = torch.squeeze(new_a, dim=-1)    # 形状:(batch_size,)

# 猜测概率参数c(通过sigmoid约束到[0,1])
new_c = torch.squeeze(self.c(item), dim=-1)
new_c = torch.sigmoid(new_c)            # 形状:(batch_size,)

# 参数范围约束
if self.value_range is not None:
    new_theta = self.value_range * (torch.sigmoid(new_theta) - 0.5)  # [-value_range/2, value_range/2]
    new_b = self.value_range * (torch.sigmoid(new_b) - 0.5)          # 同上
if self.a_range is not None:
    new_a = self.a_range * torch.sigmoid(new_a)                      # [0, a_range]
else:
    new_a = F.softplus(new_a)  # 确保非负

前向传播流程图——

用户输入 → [分范围theta] → 拼接 → 融合提示向量 → fc1 → 标准化 → IRF
            ↗ (prompt_theta)
题目输入 → [范围嵌入 + 基础b] → fc2 → 标准化 → IRF
           ↘ [a, c] → 标准化 → IRF

就是在target训练的时候,只改变prompt向量部分,达到利用源目标数据的作用。

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

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

相关文章

Unity游戏制作中的C#基础(1)界面操作基础

1.脚本有关注意事项 (1).进入项目之后,一般创建一个文件夹Scripts用来存放c#脚本; (2).在Scripts中创建脚本,双击脚本,进入VS编辑器,有如下结构: start&#…

为什么要将PDF转换为CSV?CSV是Excel吗?

在企业和数据管理的日常工作中,PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档,而CSV因其简洁、易操作的特性,广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据,转换为CSV格式可能是一个高效…

Android KMP初探

Android KMP初探 前言: 最近线上听了Kotlin官网举行的KMP会议,感觉听神奇的,于是就把官方demo下载下来尝试了一下,下载插件和所需要的依赖都用了很久,但是发现里面的代码很少,于是尝试自己手写了一下&…

网络安全之Web后端PHP

目录 一、PHP基础语法 1.PHP基础 (1)php的优点 (2)PhpStorm的优点 2.PHP基本语法 3.PHP变量 4.PHP运算符 二、PHP流控与数组 1.php流程控制语句以及循环 (1)if 语句 (2)if…

Redis——用户签到BitMap,UV统计

目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器(Bloom Filter) BitMap介绍 Redis中的使用 Redis功能示例 添加: 获取: 批量获取: java中实现 统计本月连续签到次数 UV统计 UV 统计…

pycharm技巧--鼠标滚轮放大或缩小 Pycharm 字体大小

1、鼠标滚轮调整字体 设置 Ctrl 鼠标滚轮调整字体大小 备注: 第一个是活动窗口,即缩放当前窗口 第二个是所有编辑器窗口,即缩放所有窗口的字体 2、插件 汉化包: Chinese Simplified 包

数字信任的底层逻辑:密码学核心技术与现实应用

安全和密码学 --The Missing Semester of Your CS Education 目录 熵与密码强度密码散列函数密钥体系 3.1 对称加密 3.2 非对称加密信任模型对比典型应用案例安全实践建议扩展练习杂项 密码学是构建数字信任的基石。 本文浅析密码学在现实工具中的应用,涵盖 1&…

全面理解-深拷贝与浅拷贝

在 C 中,深拷贝(Deep Copy) 和 浅拷贝(Shallow Copy) 是两种完全不同的对象拷贝策略,主要区别在于对指针和动态分配资源的处理方式。正确理解二者的区别是避免内存泄漏、悬空指针和程序崩溃的关键。 一、核…

Redis分布式锁故障处理:当Redis不可用时的应对策略

Redis分布式锁故障处理:当Redis不可用时的应对策略 在分布式系统中,Redis因其高性能和丰富的特性常被用于实现分布式锁。但当加锁过程中Redis服务不可用时,系统将面临严重挑战。本文将深入探讨这一问题,并提供多维度解决方案。 目…

WordPress平台如何接入Deepseek,有效提升网站流量

深夜改代码到崩溃?《2024全球CMS生态报告》揭露:78%的WordPress站长因API对接复杂,错失AI内容红利。本文实测「零代码接入Deepseek」的保姆级方案,配合147SEO的智能发布系统,让你用3个步骤实现日均50篇EEAT合规内容自动…

ROS ur10机械臂添加140夹爪全流程记录

ROS ur10机械臂添加140夹爪 系统版本:Ubuntu20.04 Ros版本:noetic Moveit版本:moveit-noetic 参考博客: ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境_有末端力传感器的仿真环境-CSDN博客 UR5机械臂仿真实例&#xf…

FFMPEG编码容错处理解决办法之途径----升级库文件

在qt开发环境下接收网络数据,调用ffmpeg解码播放视频,出现闪屏现象,具体现象可以使用操作系统自带的ffplay播放器播放原始视频流可复现;而使用操作系统自带的mpv播放器播放视频则不会出现闪屏;闪屏时会报Could not fin…

uniapp h5端和app端 使用 turn.js

前提:添加页后,添加页与当前页会重叠在一起,不知道为什么,没有找到解决办法 1.h5端 <template><view class"container"><view id"flipbook"><view class"page page1">Page 1</view><view class"page pag…

【入门音视频】音视频基础知识

&#x1f308;前言&#x1f308; 这个系列在我学习过程中&#xff0c;对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少&#xff0c;所以我希望通过这个音视频系列&#xff0c;跟大家一起学习音视频&#xff0c;希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…

数据结构☞泛型

一.基础定义与应用方向 1.定义&#xff1a; 一般的类和方法&#xff0c;只能使用具体的类型 : 要么是基本类型&#xff0c;要么是自定义的类。如果要编写可以 应用于多种类型 的代码&#xff0c;这种刻板的限制对代码的束缚就会很大。----- 来源《 Java 编程思想》对泛型的介…

hot100-二叉树

二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…

嵌入式项目:STM32刷卡指纹智能门禁系统

本文详细介绍基于STM32的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助&#xff0c;请点链接&#xff1a; https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端&#xff08;下位机&#xff09;…

短剧小程序系统源码

短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具&#xff0c;它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃&#xff01; 为什么说这款源码很厉害&#xff1f; 首先&#xff0c;在当今竞争激烈的市场环境…

C#中级教程(2)——走进 C# 面向对象编程:从基础到进阶的深度探索

一、为什么选择面向对象编程 在软件开发的演进过程中&#xff0c;随着程序规模和复杂度的不断增加&#xff0c;传统的编程方式逐渐暴露出局限性。面向对象编程应运而生&#xff0c;它就像是一位智慧的组织者&#xff0c;将程序中的功能进行模块化划分。每个模块各司其职&#x…

基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“流浪动物救助系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…