当前位置:首页 > 数码 > 代码的完整教程-从头开始-编写-LoRA (代码教学入门)

代码的完整教程-从头开始-编写-LoRA (代码教学入门)

admin7个月前 (04-15)数码27

作者:Sebastian Raschka

简介

LoRA(低秩自适应)是一种用于微调大语言模型 (LLM) 的流行技术。与其他技术不同,LoRA 专注于更新一组小秩矩阵,而不是调整神经网络的所有参数。这大大减少了训练模型所需的计算量。由于 LoRA 的微调质量与全模型微调相当,这种方法被誉为微调神器。

从头编写 LoRA

要从头编写 LoRA,首先需要创建一个 LoRA 层。用代码表示是这样的: ```python class LoRALayer(nn.Module): def __init__(self, in_dim, out_dim): super(LoRALayer, self).__init__() self.in_dim = in_dim self.out_dim = out_dim self.alpha = nn.Parameter(torch.zeros(1)) self.A = nn.Parameter(torch.randn(in_dim, in_dim) 0.01) self.B = nn.Parameter(torch.zeros(in_dim, out_dim)) ``` 其中,`in_dim` 是要使用 LoRA 修改的层的输入维度,`out_dim` 是层的输出维度。我们还添加了一个超参数缩放因子 `alpha`,`alpha` 值越高,对模型行为的调整就越大,反之亦然。我们使用随机分布中的较小值来初始化矩阵 `A`,并用零初始化矩阵 `B`。 LoRA 通常在神经网络的线性(前馈)层中发挥作用。例如,对于一个简单的 PyTorch 模型或具有两个线性层的模块(例如,这可能是 Transformer 块的前馈模块),其前馈(forward)方法可以表示为: ```python def forward(self, x): x = self.linear1(x) x = self.linear2(x) return x ``` 在使用 LoRA 时,我们通常会将 LoRA 更新添加到这些线性层的输出中,得到代码: ```python def forward(self, x): x = self.linear1(x) x = self.linear2(x) + torch.einsum('bi,ij,bj->bj', x, self.A, self.B) self.alpha return x ``` 如果要通过修改现有 PyTorch 模型来实现 LoRA,一种简单的方法是将每个线性层替换为 `LinearWithLoRA` 层: ```python class LinearWithLoRA(nn.Linear): def __init__(self, in_dim, out_dim, bias=True): super(LinearWithLoRA, self).__init__(in_dim, out_dim, bias=bias) self.lora_layer = LoRALayer(in_dim, out_dim) def forward(self, x): return self.lora_layer(x) + F.linear(x, self.weight, self.bias) ``` 这些概念总结如下图所示: [图片:说明 LoRA 如何修改线性层的示意图] 编写

使用 LoRA 进行微调

为了应用 LoRA,我们首先将神经网络中现有的线性层替换为结合了原始线性层和 `LoRALayer` 的 `LinearWithLoRA` 层。 接下来,我们可以通过将所有可训练参数的 `requires_grad` 设置为 `False` 来冻结所有模型参数,因为我们只训练新的 LoRA 权重: ```python for param in model.parameters(): param.requires_grad = False ``` 现在我们可以使用 LoRA 微调模型了。

与传统微调方法的比较

LoRA 在默认设置下达到了 89.44% 的测试准确率。这与传统的微调方法相比如何? 为了进行比较,我们进行了另一项实验,其中我们训练了一个 DistilBERT 模型,但只在训练期间更新了最后两层。这给了我们 86.22% 的测试准确率。 如我们所见,使用 LoRA 进行微调(89.44%)优于仅微调模型最后几层(86.22%)。

结论

LoRA 是一种用于微调 LLM 的强大技术。它通过只更新一组小秩矩阵来减少计算量,同时保持与全模型微调相当的微调质量。我们已经展示了如何从头编写 LoRA,并将其用于文本分类任务。我们还将其与传统的微调方法进行了比较,发现 LoRA 在测试准确率方面具有优势。

GitHub 开发者自制火星车,教程全面开源,网友:这太酷了

未来,人类有可能在火星生活吗? 不管你信不信,反正大家已经开始期待了。 随着一系列火星升空,网友们也大开脑洞,提出了一系列问题:将来我们能不能在火星上建旅馆?火星上能不能采矿?在火星上可以开展哪些科学实验?等我们移民到火星,该种什么菜吃? 而这一切答案都要依赖我们不断的对火星 探索 ,这其中一个很重要的 探索 工具就是火星车。 此前,我们看到报道最多的是 NASA 发射的火星车,看起来离我们遥不可及,相信很多人也想过拥有一辆自己的火星车,现在,机会来了。 近日,雷锋网编辑在网上冲浪的时候,发现了一份关于火星漫游车的全面开源教程。 据 GitHub 介绍,这款 3D 打印的移动机器人在设计上参考了美国宇航局的“好奇号” 火星车,它不仅可以在坑坑洼洼的沙地上顺畅行驶。 同时,摇臂转向架高度模拟了“好奇号”,环绕摄像头可以进行第一视角拍摄。 此外,随着扩充配件,它还能够伸出机械臂抓取物体,开发者可以通过智能手机应用程序集成自定义控件和数据进行各种操控。 科普下好奇号: 网友也感叹,这简直太酷了! 所以,要制作这样一辆火星车需要几步呢? 玩过组装车的童鞋一定知道,组装一辆 汽车 必不可少的硬件就是车轮、车身和各种关键零部件。 我们先来看下硬件部分。 根据 GitHub 提供的资料,需要的硬件材料如下: 车轮方面,作者表示有两种选择,一种是原装好奇号风格的一体式车轮。 一种是火星 2020 风格的轮子,分两部分印刷,外部部分可以用柔性塑料印刷,如 TPU。 运程信息处理方式上,目前有三种通信方式,分别是长距离广域网(LoRa)、WebSocket 协议以及通用 RC 发射器,通过车上的一个三向开关可以选择启动模式:WiFi 站 + LoRa、仅 LoRa 或 WiFi AP,有人连接到 WebSocket 服务器或通过 LoRa 连接火星车,就能接收到火星车自动发送的远程通信数据。 全部组装完成的火星车长这样,虽然功能有限,但也非常令人期待了。 那么,问题来了,我们可不可以拥有它呢? 作者表示,项目仍需要进行大量调整才能使开放源代码版本更加完善,基于目前的基础平台,任何有经验的技术人员都可以进一步参与构建它,至于什么时候能拥有,或许需要一年,或者更长时间。 如果有条件,也可以自己试着组装一下。 雷锋网雷锋网雷锋网 参考资料: 【1】【2】【3】【4】【5】

基于LoRa和WiFi通信技术的智能感应主要内容是什么?

基于LoRa和WiFi通信技术的智能感应主要内容是实现智能设备与云端之间的信息交互。LoRa是一种低功耗、远距离的无线通信技术,适用于物联网应用。而WiFi是一种常见的无线通信技术,通常用于连接智能设备到互联网。

在这个领域,智能感应的实现主要涉及以下几个关键方面:

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: LoRA