共计 6647 个字符,预计需要花费 17 分钟才能阅读完成。
在 NLP (Natural Language Processing, 自然语言解决) 畛域,ChatGPT 和其余的聊天机器人利用引起了极大的关注。每个社区为构建本人的利用,也都在继续地寻求弱小、牢靠的开源模型。自 Vaswani 等人于 2017 年首次提出 Attention Is All You Need 之后,基于 transformer 的弱小的模型始终在一直地涌现,它们在 NLP 相干工作上的体现远远超过基于 RNN (Recurrent Neural Networks, 递归神经网络) 的 SoTA 模型,甚至少数认为 RNN 已死。而本文将介绍一个集 RNN 和 transformer 两者的劣势于一身的全新网络架构 –RWKV!现已在 HuggingFace transformers 库中反对。
RWKV 我的项目概览
RWKV 我的项目曾经启动,由 Bo Peng 主导、奉献和保护。同时我的项目成员在官网 Discord 也开设了不同主题的探讨频道: 如性能 (RWKV.cpp、量化等),扩展性 (数据集收集和解决),相干钻研 (chat 微调、多模态微调等)。该我的项目中训练 RWKV 模型所需的 GPU 资源由 Stability AI 提供。
读者能够退出 官网 discord 频道 理解详情或者参加探讨。如想理解 RWKV 背地的思维,能够参考这两篇博文:
- https://johanwind.github.io/2023/03/23/rwkv_overview.html
- https://johanwind.github.io/2023/03/23/rwkv_details.html
Transformer 与 RNN 架构比照
RNN 架构是最早宽泛用于解决序列数据的神经网络架构之一。与接管固定输出尺寸的经典架构不同,RNN 接管以后时刻的“token”(即数据流中的以后数据点) 和先前时刻的“状态”作为输出,通过网络预测输入下一时刻的“token”和“状态”,同时输入的“状态”还能持续用到后续的预测中去,始终到序列开端。RNN 还能够用于不同的“模式”,实用于多种不同的场景。参考 Andrej Karpathy 的博客,RNN 能够用于: 一对一 (图像分类),一对多 (图像形容),多对一 (序列分类),多对多 (序列生成),等等。
因为 RNN 在计算每一时刻的预测值时应用的都是同一组网络权重,因而 RNN 很难解决长距离序列信息的记忆问题,这肯定水平上也是训练过程中梯度隐没导致的。为解决这个问题,相继有新的网络架构被提出,如 LSTM 或者 GRU,其中 transformer 是已被证实最无效的架构。
在 transformer 架构中,不同时刻的输出 token 能够在 self-attention 模块中并行处理。首先 token 通过 Q、K、V 权重矩阵做线性变换投影到不同的空间,失去的 Q、K 矩阵用于计算注意力分数 (通过 softmax,如下图所示),而后乘以 V 的隐状态失去最终的隐状态,这种架构设计能够无效缓解长距离序列问题,同时具备比 RNN 更快的训练和推理速度。
在训练过程中,Transformer 架构相比于传统的 RNN 和 CNN 有多个劣势,最突出的劣势是它可能学到上下文特色表白。不同于每次仅解决输出序列中一个 token 的 RNN 和 CNN,transformer 能够单次解决整个输出序列,这种个性也使得 transformer 能够很好地应答长距离序列 token 依赖问题,因而 transformer 在语言翻译和问答等多种工作中体现十分亮眼。
在推理过程中,RNN 架构在推理速度和内存效率方面会具备一些劣势。例如计算简略 (只需矩阵 – 向量运算)、内存敌对 (内存不会随着推理阶段的进行而减少),速度稳固 (与上下文窗口长度统一,因为 RNN 只关注以后时刻的 token 和状态)。
RWKV 架构
RWKV 的灵感来自于 Apple 公司的 Attention Free Transformer。RWKV 该架构通过精心简化和优化,能够转换为 RNN。除此此外,为使 RWKV 性能媲美 GPT,还额定应用了许多技巧,例如 TokenShift
和 SmallInitEmb
(应用的残缺技巧列表在 官网 GitHub 仓库的 README 中 阐明)。对于 RWKV 的训练,现有的我的项目仓库能够将参数量扩大到 14B,并且迭代修了 RWKV-4 的一些训练问题,例如数值不稳定性等。
RWKV 是 RNN 和 Transformer 的强强联合
如何把 transformer 和 RNN 劣势联合起来?基于 transformer 的模型的次要毛病是,在接管超出上下文长度预设值的输出时,推理后果可能会呈现潜在的危险,因为注意力分数是针对训练时的预设值来同时计算整个序列的。
RNN 自身反对十分长的上下文长度。即便在训练时接管的上下文长度无限,RNN 也能够通过精心的编码,来失去数百万长度的推理后果。目前,RWKV 模型应用上下文长度上为 8192 (ctx8192
) 和 ctx1024
时的训练速度和内存需要均雷同。
传统 RNN 模型的次要缺点,以及 RWKV 是如何防止的:
- 传统的 RNN 模型无奈利用很长距离的上下文信息 (LSTM 用作语言模型时也只能无效解决约 100 个 token),而 RWKV 能够解决数千个甚至更多的 token,如下图所示:
- 传统的 RNN 模型无奈并行训练,而 RWKV 更像一个“线性 GPT”,因而比 GPT 训练得更快。
通过将这两个劣势强强联合,心愿 RWKV 能够实现“1 + 1 > 2”的成果。
RWKV 注意力公式
RWKV 模型架构与经典的 transformer 模型架构十分类似 (例如也蕴含 embedding 层、Layer Normalization、用于预测下一 token 的因果语言模型头、以及多个完全相同的网络层等),惟一的区别在于注意力层,它与传统的 transformer 模型架构齐全不同,因而 RWKV 的注意力计算公式也不一样。
本文不会对注意力层过多的介绍,这里举荐一篇 Johan Sokrates Wind 的博文,外面有对注意力层的分数计算公式等更全面的解释。
现有检查点
纯语言模型: RWKV-4 模型
大多数采纳 RWKV 架构的语言模型参数量范畴从 170M 到 14B 不等。据 RWKV 概述博文 介绍,这些模型曾经在 Pile 数据集上实现训练,并进行了多项不同的基准测试,获得了与其余 SoTA 模型体现相当的性能后果。
指令微调 /Chat 版: RWKV-4 Raven
Bo 还训练了 RWKV 架构的“chat”版本: RWKV-4 Raven 模型。RWKV-4 Raven 是一个在 Pile 数据集上预训练的模型,并在 ALPACA、CodeAlpaca、Guanaco、GPT4All、ShareGPT 等上进行了微调。RWKV-4 Raven 模型有多个版本,如不同语言 (仅英文、英文 + 中文 + 日文、英文 + 日文等) 和不同大小 (1.5B 参数、7B 参数、14B 参数) 等。
所有 HF 版的模型都能够在 Hugging Face Hub 的 RWKV 社区主页 找到。
集成 🤗 Transformers 库
感激这个 Pull Request 的奉献,RWKV 架构现已集成到 🤗 transformers 库中。在作者撰写本文之时,您曾经能够通过从源代码装置 transformers
库,或者应用其 main
分支。RWKV 架构也会与 transformers 库一起更新,您能够像应用任何其余架构一样应用它。
上面让咱们来看一些应用示例。
文本生成示例
要在给定 prompt 的状况下生成文本,您能够应用 pipeline
:
from transformers import pipeline
model_id = "RWKV/rwkv-4-169m-pile"
prompt = "\nIn a shocking finding, scientist discovered a herd of dragons living in a remote, previously unexplored valley, in Tibet. Even more surprising to the researchers was the fact that the dragons spoke perfect Chinese."
pipe = pipeline("text-generation", model=model_id)
print(pipe(prompt, max_new_tokens=20))
>>> [{'generated_text': '\nIn a shocking finding, scientist discovered a herd of dragons living in a remote, previously unexplored valley, in Tibet. Even more surprising to the researchers was the fact that the dragons spoke perfect Chinese.\n\nThe researchers found that the dragons were able to communicate with each other, and that they were'}]
或者能够运行上面的代码片段:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("RWKV/rwkv-4-169m-pile")
tokenizer = AutoTokenizer.from_pretrained("RWKV/rwkv-4-169m-pile")
prompt = "\nIn a shocking finding, scientist discovered a herd of dragons living in a remote, previously unexplored valley, in Tibet. Even more surprising to the researchers was the fact that the dragons spoke perfect Chinese."
inputs = tokenizer(prompt, return_tensors="pt")
output = model.generate(inputs["input_ids"], max_new_tokens=20)
print(tokenizer.decode(output[0].tolist()))
>>> In a shocking finding, scientist discovered a herd of dragons living in a remote, previously unexplored valley, in Tibet. Even more surprising to the researchers was the fact that the dragons spoke perfect Chinese.\n\nThe researchers found that the dragons were able to communicate with each other, and that they were
应用 Raven 模型 (chat 模型) 示例
您能够以 alpaca 格调应用提醒 chat 版模型,示例如下:
from transformers import AutoTokenizer, AutoModelForCausalLM
model_id = "RWKV/rwkv-raven-1b5"
model = AutoModelForCausalLM.from_pretrained(model_id).to(0)
tokenizer = AutoTokenizer.from_pretrained(model_id)
question = "Tell me about ravens"
prompt = f"### Instruction: {question}\n### Response:"
inputs = tokenizer(prompt, return_tensors="pt").to(0)
output = model.generate(inputs["input_ids"], max_new_tokens=100)
print(tokenizer.decode(output[0].tolist(), skip_special_tokens=True))
>>> ### Instruction: Tell me about ravens
### Response: RAVENS are a type of bird that is native to the Middle East and North Africa. They are known for their intelligence, adaptability, and their ability to live in a variety of environments. RAVENS are known for their intelligence, adaptability, and their ability to live in a variety of environments. They are known for their intelligence, adaptability, and their ability to live in a variety of environments.
据 Bo 所述,这条 discord 音讯 (拜访超链接时请确保已退出 discord 频道) 中有更具体的书写指令技巧。
权重转换
任何用户都能够应用 transformers
库中提供的转换脚本轻松地将原始 RWKV 模型权重转换为 HF 格局。具体步骤为: 首先,将“原始”权重 push 到 Hugging Face Hub (假设指标仓库为 RAW_HUB_REPO
,指标权重文件为 RAW_FILE
),而后运行以下转换脚本:
python convert_rwkv_checkpoint_to_hf.py --repo_id RAW_HUB_REPO --checkpoint_file RAW_FILE --output_dir OUTPUT_DIR
如果您想将转换后的模型 push 到 Hub 上 (假设推送目录为 dummy_user/converted-rwkv
),首先请确保在 push 模型之前应用 huggingface-cli login
登录 HF 账号,而后运行:
python convert_rwkv_checkpoint_to_hf.py --repo_id RAW_HUB_REPO --checkpoint_file RAW_FILE --output_dir OUTPUT_DIR --push_to_hub --model_name dummy_user/converted-rwkv
将来工作
多语言 RWKV
Bo 目前正在钻研在多语言语料库上训练 RWKV 模型,最近公布了一个新的 多语言分词器。
社区后续钻研方向
RWKV 社区十分沉闷,致力于几个后续钻研方向。我的项目清单能够在 RWKV 的 discord 专用频道中找到 (拜访超链接时请确保已退出 discord 频道)。欢送退出这个 RWKV 钻研频道,以及对 RWKV 的踊跃奉献!
模型压缩与减速
因为只须要矩阵 – 向量运算,对于非标准化和实验性的计算硬件,RWKV 是一个十分现实的架构抉择,例如光子处理器 / 加速器。
因而天然地,RWKV 架构也能够应用经典的减速和压缩技术 (如 ONNX、4 位 /8 位量化等)。咱们心愿集成了 transformer 的 RWKV 架构可能使更多开发者和从业者受害。
在不久的未来,RWKV 还能够应用 optimum 库提出的减速技术。rwkv.cpp 或 rwkv-cpp-cuda 仓库波及的其中一些技术在库中已表明。
致谢
咱们 Hugging Face 团队非常感谢 Bo 和 RWKV 社区抽出宝贵时间来答复对于架构的问题,以及非常感谢他们的帮忙和反对。咱们很期待在 HF 生态中看到更多 RWKV 模型的利用。咱们还要感激 Johan Wind 公布的对于 RWKV 的博文,这对咱们了解架构自身和其后劲有很大帮忙。最初,咱们着重感激 ArEnSc 开启 RWKV 集成到 transformers
库的 PR 所做的工作,以及感激 Merve Noyan、Maria Khalusova 和 Pedro Cuenca 审阅和校对本篇文章!
援用
如果您心愿在工作中应用 RWKV,请应用此 cff 援用。
英文原文: https://hf.co/blog/rwkv
作者: BlinkDL, Harrison Vanderbyl, Sylvain Gugger, Younes Belkada
译者: SuSung-boy
审校 / 排版: zhongdongy (阿东)