自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(10)
  • 收藏
  • 关注

原创 LoRA(一)

LoRA的低秩适配器通过将前馈层的权重矩阵分解为两个低秩矩阵 A 和 B,然后进行乘积 A⋅B 来调节前馈层的表现。具体来说,LoRA将权重矩阵 W 替换为 W+A⋅B,其中 A 和 B 是低秩矩阵,这样就不需要直接修改整个模型的权重,只增加了少量参数以便进行微调。一般来说,秩越大,低秩矩阵对权重的调整能力越强,但需要的参数也越多,计算开销也增大。具体而言,LoRA对预训练模型中的权重矩阵进行分解,替换成两个低秩矩阵的乘积,从而减少了更新参数的规模。低秩矩阵 A和 B 的选择是LoRA的关键。

2024-12-29 21:18:26 533

原创 C++学习(四)静态函数与成员

可以通过静态成员变量来实现单例模式,其中静态成员变量用来存储类的唯一实例,并通过静态成员函数来访问。静态成员变量可以被继承,但是它们不属于具体的对象实例,而是属于类本身,因此派生类可以直接访问基类的静态成员变量。它们是属于类本身的,而非某个特定的实例,因此静态函数可以访问同一类中的其他静态成员。静态成员函数只能访问静态成员变量和静态成员函数,不能访问普通成员变量和普通成员函数。是属于对象实例的,可以访问类的所有成员,包括静态和非静态成员。是属于类的每个实例的,每个对象有自己独立的成员变量。

2024-12-27 09:10:23 432

原创 transformer详解(一)输入嵌入

位置编码就是为了这个目的而设计的,它为每个词添加一个对应的“位置”信息,使得模型能够感知词在句子中的顺序。由于位置编码是通过固定的函数(如正弦和余弦)生成的,因此它能够提供有规律的位置信息,而不是通过学习得到的位置向量。的目标是表示词与词之间的相对距离,这种方法避免了标准位置编码的限制,能够更加灵活地捕捉词语之间的关系,尤其是在长序列或变长输入时,它能够更好地建模序列中的局部依赖关系。可学习的位置编码通过将每个位置的嵌入初始化为一个可训练的参数,允许模型在训练过程中对位置编码进行优化。

2024-12-26 21:23:16 1102

原创 C++学习(四)指针

是一个已存在变量的别名,引用必须在声明时初始化,并且一旦绑定到某个变量,就不能改变其指向。避免使用指针指向局部变量的地址,因为局部变量在函数结束时会被销毁,这会导致指针悬空。是C++11引入的新关键字,表示指向无效内存的位置,它有更明确的类型,通常用于指针初始化或检查。在使用裸指针时,应当确保正确地管理内存,避免忘记释放内存,导致内存泄漏。应该始终在解引用之前检查指针是否为。: 指针所指向的内容是常量,不能通过指针修改内容,但指针本身可以改变指向。: 指针本身是常量,不能改变指向,但可以通过指针修改内容。

2024-12-26 21:02:03 451

原创 C++学习(三)多态

虚函数表是在对象构造过程中初始化的:当基类的构造函数运行时,虚函数表指针指向基类的虚函数表。多态需要通过基类指针或引用调用虚函数,因为对象本身的类型在编译时是静态确定的,而指针或引用可以在运行时动态绑定到派生类。核心在于虚函数表(vtable)机制,通过查找虚函数表,在运行时调用具体的派生类实现。如果基类析构函数不是虚函数,通过基类指针销毁派生类对象时,只会调用基类的析构函数,导致派生类资源未正确释放,可能造成内存泄漏。时,虚函数表指针(vptr)仍然指向基类的虚函数表,因此调用的是基类的。

2024-12-22 11:14:05 1604

原创 cuda学习(三)矩阵乘法

共享内存是每个线程块(block)内部的高速内存,线程块内的所有线程都能访问共享内存。因此,直接将整个矩阵加载到共享内存并不是一个可行的选择,除非矩阵的尺寸非常小,或者使用多个线程块来分担内存工作。根据矩阵的大小和线程块的大小计算出所需的线程块数量,保证每个矩阵元素都有一个线程负责计算。会使得线程块在加载数据时,线程按行访问,这可以减少不必要的内存访问延迟。是线程块的大小,这里设置为 16,表示每个线程块是 16x16 的线程矩阵。的大小或者通过更精细的内存布局,确保不同线程访问不同的银行。

2024-12-21 20:56:36 1641

原创 CUDA学习(二)矩阵加法

每个块处理 16x16 的矩阵元素,即每个线程块最多处理 256 个元素(16 行 16 列)。为了确保即使矩阵的大小不是 16 的整数倍,也能确保最后一部分矩阵有足够的块进行处理,所以加上了 15。在这个示例中,矩阵 A 的元素全为 1,矩阵 B 的元素全为 2。如果矩阵的维度不完全是线程块大小的倍数,可以通过适当的调整确保矩阵的所有元素都能得到处理。的尺寸,确保所有的矩阵元素都有线程处理,尽管矩阵维度不一定是 16 的倍数。是传递给内核的参数,分别表示矩阵 A、B、C 和矩阵的维度。

2024-12-21 19:59:20 670

原创 C++学习(二)构造与析构

可以注意到,这个代码中并没有析构函数,如果类中没有动态分配资源(如new分配的内存),编译器生成的默认析构函数能够满足要求。那么这里还有一个疑问,析构函数需要delete释放new分配的资源,当构造函数被重载也就是有多个用new分配的内存,那么就需要在析构函数中将这些动态分配的内存全部收回。如果一个类没有显式定义析构函数,会生成一个默认的析构函数,但它只会释放对象本身占用的资源,不会释放动态分配的资源。析构函数是一个特殊的成员函数,用于在对象销毁时释放资源(如动态分配的内存、打开的文件)。

2024-12-21 10:53:41 790

原创 CUDA学习(一)CUDA基础知识

CUDA 中,GPU 的内存结构被设计为层次化(1)全局内存:所有线程可访问,容量大但延迟高。(2)共享内存:每个线程块内的线程共享,速度快,但容量有限。每个线程的全局索引(Idx)由以下公式计算:idx = threadIdx.x + blockIdx.x * blockDim.x这将确保网格中每个线程都有唯一的索引,从而可以分配不同的任务。CUDA的最小计算单元是线程,现成的集合组成线程块,线程块的集合组成网格。每个 SM 同时执行多个线程块(Block),每个线程块包含多个线程(Thread)。

2024-12-20 22:01:21 1590

原创 C++学习笔记(一)类的继承

同时,在对象的内存布局中,编译器会添加一个额外的指针,称为虚函数指针(Virtual Table Pointer,简称VTable指针),它指向该对象对应的虚函数表。继承允许子类继承父类的属性和方法,而多态则允许不同的对象通过相同的接口表现出不同的行为。当使用基类指针或引用调用虚函数时,编译器会使用虚表指针来查找该对象对应的虚函数表,并根据函数在虚函数表中的位置来调用正确的虚函数。虚函数是实现运行时多态的关键,因为它允许程序在运行时根据对象的实际类型调用对应的函数,而不是在编译时决定。

2024-12-20 11:52:16 519 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除