LLaMA中ROPE位置编码实现源码解析
1、Attention中q,经下式,生成新的q。m为句长length,d为embedding_dim/head
θ i = 1 1000 0 2 i d \theta_i=\frac{1}{10000^\frac{2i}{d}} θi=10000d2i1
2、LLaMA中RoPE源码
import torchdef precompute_freqs_cis(dim: int, end: int, constant: float = 10000.0):'''计算cos和sin的值,cos值在实部,sin值在虚部,类似于 cosx+j*sinx:param dim: q,k,v的最后一维,一般为emb_dim/head_num:param end: 句长length:param constant: 这里指10000:return:复数计算 torch.polar(a, t)输出, a*(cos(t)+j*sin(t))'''# freqs: 计算 1/(10000^(2i/d) ),将结果作为参数theta# 形式化为 [theta_0, theta_1, ..., theta_(d/2-1)]freqs = 1.0 / (constant ** (torch.arange(0, dim, 2)[: (dim // 2)].float() / dim)) # [d/2]# 计算mt = torch.arange(end, device=freqs.device) # [length]# 计算m*thetafreqs = torch.outer(t, freqs).float() # [length, d]# freqs形式化为 [m*theta_0, m*theta_1, ..., m*theta_(d/2-1)],其中 m=0,1,...,length-1# 计算cos(m*theta)+j*sin(m*theta)freqs_cis = torch.polar(torch.ones_like(freqs), freqs) # complex64# freqs_cis: [cos(m*theta_0)+j*sin(m*theta_0), cos(m*theta_1)+j*sin(m*theta_1),), ..., cos(m*theta_(d/2-1))+j*sin(m*theta_(d/2-1))]# 其中j为虚数单位, m=0,1,...,length-1return freqs_cis # [length, d]def reshape_for_broadcast(freqs_cis: torch.Tensor, x: torch.Tensor):ndim = x.ndimassert 0 <= 1 < ndimassert freqs_cis.shape == (x.shape[1], x.shape[-1])shape = [d if i == 1 or i == ndim - 1 else 1 for i, d in enumerate(x.shape)] # (1, length, 1, d/2)return freqs_cis.view(*shape) # [1, length, 1, d/2]def apply_rotary_emb(xq: torch.Tensor, xk: torch.Tensor, freqs_cis: torch.Tensor,):# 先将xq维度变为[bs, length, head, d/2, 2], 利用torch.view_as_complex转变为复数# xq:[q0, q1, .., q(d-1)] 转变为 xq_: [q0+j*q1, q2+j*q3, ..., q(d-2)+j*q(d-1)]xq_ = torch.view_as_complex(xq.float().reshape(*xq.shape[:-1], -1, 2)) # [bs, length, head, d/2]# 同样的,xk_:[k0+j*k1, k2+j*k3, ..., k(d-2)+j*k(d-1)]xk_ = torch.view_as_complex(xk.float().reshape(*xk.shape[:-1], -1, 2))freqs_cis = reshape_for_broadcast(freqs_cis, xq_) # [1, length, 1, d/2]# 下式xq_ * freqs_cis形式化输出,以第一个为例, 如下# (q0+j*q1)(cos(m*theta_0)+j*sin(m*theta_0)) = q0*cos(m*theta_0)-q1*sin(m*theta_0) + j*(q1*cos(m*theta_0)+q0*sin(m*theta_0))# 上式的实部为q0*cos(m*theta_0)-q1*sin(m*theta_0),虚部为q1*cos(m*theta_0)+q0*sin(m*theta_0)# 然后通过torch.view_as_real函数,取出实部和虚部,维度由[bs, length, head, d/2]变为[bs, length, head, d/2, 2],最后一维放实部与虚部# 最后经flatten函数将维度拉平,即[bs, length, head, d]# 此时xq_out形式化为 [实部0,虚部0,实部1,虚部1,..., 实部(d/2-1), 虚部(d/2-1)]xq_out = torch.view_as_real(xq_ * freqs_cis).flatten(3) # [bs, length, head, d]# 即为新生成的qxk_out = torch.view_as_real(xk_ * freqs_cis).flatten(3)return xq_out.type_as(xq), xk_out.type_as(xk)if __name__=='__main__':# (bs, length, head, d)q = torch.randn((2, 10, 12, 32)) # q=[q0, q1, .., qd-1]k = torch.randn((2, 10, 12, 32))v = torch.randn((2, 10, 12, 32))freqs_cis= precompute_freqs_cis(dim=32, end=10, constant= 10000.0)# print(freqs_cis.detach().numpy())q_new, k_new = apply_rotary_emb(xq=q, xk=k, freqs_cis=freqs_cis)print()
3、表示
看1中的公式表示,q0和q1相互作用,得到新的q0和q1,也即
q 0 n e w = q 0 ∗ c o s ( m θ 0 ) − q 1 ∗ s i n ( m θ 0 ) q^{new}_0=q_0*cos(m\theta_0)-q_1*sin(m\theta_0) q0new=q0∗cos(mθ0)−q1∗sin(mθ0)
q 1 n e w = q 1 ∗ c o s ( m θ 0 ) + q 0 ∗ s i n ( m θ 0 ) q^{new}_1=q_1*cos(m\theta_0)+q_0*sin(m\theta_0) q1new=q1∗cos(mθ0)+q0∗sin(mθ0)
这里将 ( q 0 , q 1 ) (q_0,q_1) (q0,q1)、 ( q 0 n e w , q 1 n e w ) (q^{new}_0,q^{new}_1) (q0new,q1new)看做向量,很明显上式是向量旋转,旋转角度为逆时针 m θ 0 m\theta_0 mθ0
可与PalM中ROPE实现方式做对比
PaLM中ROPE位置编码实现源码解析
相关文章:
![](https://img-blog.csdnimg.cn/c063925744f84a2796daae77723e6b44.png)
LLaMA中ROPE位置编码实现源码解析
1、Attention中q,经下式,生成新的q。m为句长length,d为embedding_dim/head θ i 1 1000 0 2 i d \theta_i\frac{1}{10000^\frac{2i}{d}} θi10000d2i1 2、LLaMA中RoPE源码 import torchdef precompute_freqs_cis(dim: int, end: i…...
![](https://www.ngui.cc/images/no-images.jpg)
在c++ 20下使用微软的proxy库替代传统的virtual动态多态
传统的virtual动态多态,经常会有下面这样的使用需求: #include <iostream> #include <vector>// 声明一个包含virtual虚函数的基类 struct shape {virtual ~shape() {}virtual void draw() 0; };// 派生,实现virtual虚函数 str…...
![](https://img-blog.csdnimg.cn/b4d7c6b51cfb448887e234763868f0db.png)
Spring MVC:@RequestMapping
Spring MVC RequestMapping属性 RequestMapping RequestMapping, 是 Spring Web 应用程序中最常用的注解之一,主要用于映射 HTTP 请求 URL 与处理请求的处理器 Controller 方法上。使用 RequestMapping 注解可以方便地定义处理器 Controller 的方法来处…...
![](https://img-blog.csdnimg.cn/808943f411e54664a2010879820361db.png)
【vue3+ts项目】配置eslint校验代码工具,eslint+prettier+stylelint
1、运行好后自动打开浏览器 package.json中 vite后面加上 --open 2、安装eslint npm i eslint -D3、运行 eslint --init 之后,回答一些问题, 自动创建 .eslintrc 配置文件。 npx eslint --init回答问题如下: 使用eslint仅检查语法&…...
![](https://www.ngui.cc/images/no-images.jpg)
PHP之ZipArchive打包压缩文件
1、Linux 安装 nginx 安装zlib库 2、使用,目前我这边的需求是。 1、材料图片、单据图片,分别压缩打包到“材料.zip”和“单据.zip”。 2、“材料.zip”和“单据.zip”在压缩打包到“订单.zip” 3、支持批量导出多个订单的图片信息所有订单的压缩文件&…...
![](https://www.ngui.cc/images/no-images.jpg)
面试之快速学习C++14
文章参考:https://zhuanlan.zhihu.com/p/588826142?utm_id0 最近学了一会感慨到找工作好难,上周面试了一家医疗公司,准备攒攒经验但是不去,结果三天了没消息,感觉一面都没过… 本来自傲看不上,结果人家也…...
![](https://img-blog.csdnimg.cn/a35e311cae274164a9ec4d512753df1e.png)
【算法专题突破】双指针 - 快乐数(3)
目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:202. 快乐数 - 力扣(Leetcode) 这道题的题目也很容易理解, 看一下题目给的示例就能很容易明白, 但是要注意一个点&#…...
![](https://img-blog.csdnimg.cn/b3aee9f4d73b4da1826a7e87afff7ba0.png)
【javaweb】学习日记Day4 - Maven 依赖管理 Web入门
目录 一、Maven入门 - 管理和构建java项目的工具 1、IDEA如何构建Maven项目 2、Maven 坐标 (1)定义 (2)主要组成 3、IDEA如何导入和删除项目 二、Maven - 依赖管理 1、依赖配置 2、依赖传递 (1)查…...
![](https://img-blog.csdnimg.cn/4f1b9070472b4a35a32b1a7e4ac1b517.png)
C++信息学奥赛1144:单词翻转
#include <iostream> #include <string> using namespace std; int main() {string str;// 输入一行字符串getline(cin, str);string arr;for (int i 0; i < str.length(); i){if (str[i] ! ){arr str[i]; // 将非空格字符添加到临时存储的字符串中}else{for…...
![](https://www.ngui.cc/images/no-images.jpg)
qt检查文件夹是否有写权限
Qt 使用如下函数能够判断路径或者文件是否可写: bool QFileInfo::isWritable() const 对于win10系统实测,结果不准确。继续排查,官方文档描述:a)如果未启用 NTFS 权限检查,Windows 上的结果将仅反映文件是…...
![](https://img-blog.csdnimg.cn/img_convert/01be4a81a893e3a9a594b0f6416f2228.jpeg)
LSF 安装目录,快速参考 LSF 命令、守护程序、配置文件、日志文件和重要集群配置参数
样本 UNIX 和 Linux 安装目录 守护程序错误日志文件 守护程序错误日志文件存储在 LSF_LOGDIR 在 lsf.conf 文件中定义的目录中。 LSF 基本系统守护程序日志文件LSF 批处理系统守护程序日志文件pim.log.host_namembatchd.log.host_namembatchd.log.host_namesbatchd.log.host_…...
![](https://www.ngui.cc/images/no-images.jpg)
在Mybatis中写动态sql这些标签:if、where、set、trim、foreach、choose的作用是什么,怎么用?
在 MyBatis 中,您可以使用动态 SQL 标签来构建灵活的 SQL 查询,以根据不同的条件生成不同的查询语句。以下是这些标签的作用和用法: 1. **<if> 标签:** 用于根据某个条件动态地包含或排除 SQL 片段,test:可以写…...
![](https://www.ngui.cc/images/no-images.jpg)
7 Python的模块和包
概述 在上一节,我们介绍了Python的异常处理,包括:异常、异常处理、抛出异常、用户自定义异常等内容。在这一节中,我们将介绍Python的模块和包。Python的模块(Module)和包(Package)是…...
![](https://www.ngui.cc/images/no-images.jpg)
【JavaWeb 篇】使用Servlet、JdbcTemplate和Durid连接池实现用户登录功能与测试
在现代Web应用程序开发中,用户登录功能是基础中的基础。它为用户提供了安全访问系统的途径。本篇博客将引导您通过使用Servlet、Spring框架的JdbcTemplate以及Durid连接池,来构建一个完整的用户登录功能。我们将详细展示每个部分的代码,并解释…...
![](https://img-blog.csdnimg.cn/430fd5b6362d48c281827ddc6a56789d.gif)
【Unity3D赛车游戏】【六】如何在Unity中为汽车添加发动机和手动挡变速?
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
![](https://img-blog.csdnimg.cn/018351f0fbbc449682b7a646226f988b.png)
【Go 基础篇】切片:Go语言中的灵活数据结构
在Go语言中,切片(Slice)是一种强大且灵活的数据结构,用于管理和操作一系列元素。与数组相比,切片的大小可以动态调整,这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入,介…...
![](https://img-blog.csdnimg.cn/b94bc8ab962541bfb10c4f6b8e01d84d.png)
龙芯2K1000LA移植交叉编译环境以及QT
嵌入式大赛结束了,根据这次比赛中记的凌乱的笔记,整理了一份龙芯2K1000LA的环境搭建过程,可能笔记缺少了一部分步骤或者错误,但是大致步骤可以当作参考。 一、交叉编译工具链 下载连接:龙芯 GNU 编译工具链 | 龙芯开…...
![](https://www.ngui.cc/images/no-images.jpg)
javaee spring依赖注入之spel方式
spring依赖注入之spel方式 <dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.18.RELEASE</version></dependency>package com.test.pojo;import java.util.List; …...
![](https://img-blog.csdnimg.cn/f98b35ab934e43f29ac32a1790a447f8.png)
【Java集合学习1】ArrayList集合学习及集合概述分析
JavaArrayList集合学习及集合学习概述 一、Java集合概述 Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Col…...
![](https://img-blog.csdnimg.cn/58e8c575b4794f4d9fbe6bf2a585a4fa.png)
TouchGFX之调试
DebugPrinter类是一种在显示屏上打印调试消息的简单方法,无需向屏幕添加控件。 在使用DebugPrinter之前,需要分配一个实例并将其传递给Application类,且DebugPrinter实例必须兼容所使用的LCD类。 该表列出了DebugPrinter类名称: …...
![](https://img-blog.csdnimg.cn/5e52d73c0171416388af6fcd28b4461d.png)
C# winform加载yolov8模型测试(附例程)
第一步:在NuGet中下载Yolov8.Net 第二步:引用 using Yolov8Net; 第三步:加载模型 private IPredictor yolov8 YoloV8Predictor.Create("D:\\0MyWork\\Learn\\vs2022\\yolov_onnx\\best.onnx", mylabel); 第四步:图…...
![](https://img-blog.csdnimg.cn/b5e77fc325ae4c49aadafbbadc86e53c.png)
浙大陈越何钦铭数据结构07-图6 旅游规划
题目: 有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。 输入…...
![](https://www.ngui.cc/images/no-images.jpg)
VUE笔记(七)项目登录
1、安装elementui 在终端执行 vue add element 注册组件 如果要使用哪个组件,大家需要在plugins/element.js中注册该组件 import Vue from vue import { Button } from element-ui Vue.use(Button) 在页面组件中使用 <el-button type"primary"&…...
![](https://img-blog.csdnimg.cn/0dfba4eb3327470b9af7ec37d8983b30.png)
大语言模型之六- LLM之企业私有化部署
数据安全是每个公司不得不慎重对待的,为了提高生产力,降本增效又不得不接受新技术带来的工具,私有化部署对于公司还是非常有吸引力的。大语言模型这一工具结合公司的数据可以大大提高公司生产率。 私有化LLM需要处理的问题 企业内私有化LLM…...
![](https://img-blog.csdnimg.cn/img_convert/e3f4155e2501295245d953a9dd6ad8c3.png)
Python3 列表
Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。 Python 有 6 个序列的内置类型,但最常见的是列表和元组。 列表都可以进…...
![](https://img-blog.csdnimg.cn/f736d1d84b714bf7896416644131b925.gif)
OpenCV基础知识(8)— 图形检测
前言:Hello大家好,我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状,然后对这些形状进行描绘,例如搜索并绘制图像的边缘,定位图像的位置,判断图像中有没有直线、…...
![](https://img-blog.csdnimg.cn/20200224221417657.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTYzNjMw,size_16,color_FFFFFF,t_70)
Java虚拟机
文章目录 JVM运行时数据区域HotSpot虚拟机对象探秘实战:OutOfMemoryError异常 JVM 运行时数据区域 HotSpot虚拟机对象探秘 实战:OutOfMemoryError异常...
![](https://www.ngui.cc/images/no-images.jpg)
c++学习 之 函数重载注意事项
文章目录 引用作为函数重载的条件函数重载遇到默认参数 引用作为函数重载的条件 #include <iostream> using namespace std; void fun(int &a) {cout << "void fun(int & a)" << endl; }void fun(const int &a) {cout << "…...
![](https://img-blog.csdnimg.cn/a48c273754c24bd391a567ed65bf7792.png)
2023-08-27 LeetCode每日一题(合并区间)
2023-08-27每日一题 一、题目编号 56. 合并区间二、题目链接 点击跳转到题目位置 三、题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组&#…...
![](https://img-blog.csdnimg.cn/2bd17df56e814066bcc6a68b76a6afbd.png)
C#,数值计算——调适数值积分法(adaptive quadrature)的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 调适数值积分法 /// adaptive quadrature /// </summary> public class Adapt { private double x1 { get; } 0.942882415695480; private …...
![](/images/no-images.jpg)
可以自己做直播网站吗/百度平台订单查询
具名插槽 //子组件 <slot name"footer"></slot> //父组件 <child1><span slot"footer"><p>我是页尾的具体内容</p></span></child1>匿名插槽 子组件 <slot></slot> 父组件 <child>多…...
![](https://img-blog.csdnimg.cn/20210811154606925.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQ0OTU0MA==,size_16,color_FFFFFF,t_70)
临西企业做网站/排名优化服务
有没有需求,都可以试试EasyDL。 近日,全球权威咨询机构IDC发布调研报告显示,百度EasyDL再次取得亮眼成绩,继连续两年位列中国机器学习平台市场份额第一之后, 今年上半年继续保持第一。 说起EasyDL,可能公…...
![](/images/no-images.jpg)
短网址生成系统源码/搜索引擎优化培训中心
WebSocket 以前没用过,之前写过一篇博客是基于原生socket的(查看)比较复杂,慎入。今天另外一个APP需要接websocket了,然后便找到了facebook的 SocketRocket 框架,然后用了一天时间接上了,完成了…...
![](/images/no-images.jpg)
如何开始做网站/百度趋势搜索
文件类文件 getParentFile()软件包java.io.File.getParentFile()中提供了此方法。此方法用于返回给定文件对象的父文件。此方法的返回类型为File(即,它返回给定文件对象的父文件,而父文件为File形式。语法:File getParentFile(){}参数&#x…...
![](/images/no-images.jpg)
大气精美网站设计工作室织梦模板(附赠精美织梦后台模板)/南宁seo收费
存储数据 cc.sys.localStorage.setItem(key, value) 上面的方法需要两个参数,用来索引的字符串键值 key,和要保存的字符串数据 value。 假如我们要保存玩家最高分,假设键值为 score:cc.sys.localStorage.setItem(score, 0); 复杂的对象数据&a…...
![](https://img-blog.csdnimg.cn/img_convert/fe1018dd36dc6d1473a19782cc09b364.png)
百度抓取网站图片/seo快速提升排名
一年前,在公司大佬的指点之下,我开始写系统级重构工具 Coca (https://github.com/phodal/coca) 。哦,不,不对,是刚开始学习 Golang,因为我的第一次提交是从一个 Go 的 hello, world 写起的。commit a685d69…...