char-rnn

GitHub
12k 2.6k 困难 1 次阅读 今天语言模型
AI 解读 由 AI 自动生成,仅供参考

char-rnn 是一个基于 Torch 框架开发的开源项目,旨在构建多层循环神经网络(包括 LSTM、GRU 和传统 RNN),用于训练字符级的语言模型。它的核心功能是读取任意文本文件,学习预测序列中的下一个字符,从而生成在风格和结构上高度模仿原始训练数据的新文本。

这一工具主要解决了从零开始构建和训练递归神经网络的复杂性难题。它将复杂的深度学习概念封装为可执行的代码,让用户无需深入底层数学推导,即可通过简单的配置实现文本生成任务。无论是创作诗歌、编写代码还是模拟对话风格,char-rnn 都能提供强大的生成能力。

char-rnn 特别适合对深度学习感兴趣的开发者、研究人员以及希望探索 AI 生成内容可能性的技术爱好者使用。虽然普通用户也能尝试运行,但具备一定的命令行操作基础和机器学习常识会让体验更加顺畅。

其技术亮点在于支持多层网络架构以提升模型表达能力,并兼容 GPU 加速(CUDA 或 OpenCL),显著缩短训练时间。值得一提的是,该项目由知名学者 Andrej Karpathy 开发,代码清晰且配有详尽博客解读,是学习循环神经网络原理的经典入门案例。尽管后续有更优化的 torch-rnn 出现,char-rnn 凭借其教育价值和历史地位,依然是理解字符级建模的重要资源。

使用场景

某独立游戏开发者希望为奇幻 RPG 游戏中的古代遗迹石碑生成大量风格统一、看似有深意但实为虚构的铭文,以丰富世界观细节。

没有 char-rnn 时

  • 开发者需手动撰写数百条铭文,耗时数周且极易陷入创意枯竭,导致文本重复度高。
  • 若尝试用简单的随机字符串拼接,生成的内容毫无语言逻辑,玩家一眼就能看出是乱码,破坏沉浸感。
  • 聘请专业文案团队成本高昂,且难以保证所有铭文在生僻词汇和句式结构上保持高度一致的“古语”风格。
  • 每次需要新增内容时都必须重新投入人力,无法实现根据现有文本库进行自动化、批量的无限扩展。

使用 char-rnn 后

  • 只需将现有的几十页奇幻小说或自创的古语语料库作为输入,char-rnn 即可自动学习其字符级的语言规律。
  • 模型能逐字符生成全新的铭文,不仅拼写符合设定,连句法结构和语气都完美复刻了训练数据的“古奥”风格。
  • 利用 GPU 加速训练后,几分钟内即可产出成千上万条不重复的高质量文本,极大降低了内容制作的时间成本。
  • 通过调整采样温度参数,开发者可以灵活控制生成内容的创造性与保守度,轻松获得从“晦涩难懂”到“朗朗上口”的不同变体。

char-rnn 的核心价值在于它能以极低的成本,将少量风格化文本转化为无限的同类创意内容,彻底解决了垂直领域小样本文本生成的难题。

运行环境要求

操作系统
  • Linux
  • macOS
GPU
  • 可选
  • 若使用 NVIDIA GPU 需安装 CUDA Toolkit 及 cutorch/cunn 包(可提速约 15 倍)
  • 若使用 ATI/AMD GPU 需安装 OpenCL 及 cltorch/clnn 包
  • 具体显存大小取决于模型规模(例如 rnn_size=700, num_layers=3 需较大显存),未指定具体 CUDA 版本
内存

未说明(取决于数据集大小和模型规模,大数据集和大模型需要更多内存)

依赖
notes1. 该工具基于 Lua 语言和 Torch 框架,而非 Python。2. 推荐使用 Ubuntu 系统,通过官方脚本安装 Torch。3. 数据集建议至少 2MB 以上以获得良好效果,若数据量大可增大 rnn_size 参数。4. 若在 GPU 上训练并在 CPU 上采样,需使用 convert_gpu_cpu_checkpoint.lua 脚本转换模型检查点文件。5. 默认使用 GPU 0,若使用 CPU 需设置 -gpuid -1 参数。
python不适用 (该项目基于 Lua/Torch,非 Python)
Torch
LuaRocks
nngraph
optim
nn
cutorch (GPU 模式)
cunn (GPU 模式)
cltorch (OpenCL 模式)
clnn (OpenCL 模式)
char-rnn hero image

快速开始

char-rnn

这段代码实现了用于字符级语言模型训练和采样的多层循环神经网络(RNN、LSTM 和 GRU)。换句话说,该模型以一个文本文件作为输入,训练一个循环神经网络,使其学会预测序列中的下一个字符。随后,可以使用这个 RNN 逐字符生成与原始训练数据风格相似的文本。关于该代码库的背景和详细说明,请参阅我的博客文章

如果你是 Torch/Lua/神经网络的新手,可能需要了解的是,这段代码实际上只是我用 Python/numpy 编写的100 行 gist的一个稍微复杂一些的版本。本仓库中的代码还额外支持多层结构、使用 LSTM 而不是普通的 RNN、增加了模型检查点保存等辅助功能,并且由于采用了小批量训练和 GPU 加速,效率也更高。

更新:torch-rnn

Justin Johnson (@jcjohnson) 最近从头重新实现了一个更简洁、更高效、更易用的 Torch 版本的 char-rnn,项目名为 torch-rnn。它使用 Adam 优化器,并为提高空间和时间效率而硬编码了 RNN/LSTM 的前向和反向传播过程。这同时也避免了本仓库中克隆模型时可能出现的问题。因此,现在默认应该使用 torch-rnn 而不是本代码库中的实现。

环境要求

此代码使用 Lua 编写,需要依赖 Torch 框架。如果你使用 Ubuntu 系统,在家目录下安装 Torch 的步骤大致如下:

$ curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
$ git clone https://github.com/torch/distro.git ~/torch --recursive
$ cd ~/torch; 
$ ./install.sh      # 最后回答“yes”以修改你的 .bashrc 文件
$ source ~/.bashrc

更多细节请参考 Torch 的官方安装文档。安装完 Torch 后,还需要通过 LuaRocks 安装几个额外的包(这些工具在 Torch 安装时已一并提供):

$ luarocks install nngraph 
$ luarocks install optim
$ luarocks install nn

如果你想使用 NVIDIA GPU 并借助 CUDA 进行加速(通常可提升约 15 倍的速度),则需要配备相应的 GPU,并安装 CUDA 工具包。接着再安装 cutorchcunn 包:

$ luarocks install cutorch
$ luarocks install cunn

如果你希望使用 OpenCL GPU(例如 ATI 显卡),则需要安装 cltorchclnn 包,并在训练时添加 -opencl 1 参数(相关问题请参见 cltorch 的 GitHub 问题页面):

$ luarocks install cltorch
$ luarocks install clnn

使用方法

数据

所有输入数据都存储在 data/ 目录下。你会注意到仓库中包含了一个示例数据集(位于 data/tinyshakespeare 文件夹),它是莎士比亚作品的一部分。此外,我还提供了更多数据集,详情请访问此页面

自定义数据:如果想使用自己的数据,只需创建一个名为 input.txt 的单个文件,并将其放入 data/ 目录下的某个文件夹中,例如 data/some_folder/input.txt。首次运行训练脚本时,程序会进行预处理,并在 data/some_folder 中生成两个方便使用的缓存文件。

数据规模:需要注意的是,如果数据量过小(1MB 已经算非常小了),RNN 很难有效学习,因为它必须完全从零开始学习所有内容。相反,如果数据量较大(超过约 2MB),则可以放心地增加 rnn_size 参数,训练一个更大的模型(具体参数设置见下文的训练部分),这样效果会显著更好。例如,当数据量达到 6MB 时,可以将 rnn_size 提高到 300 甚至更高。我在自己的 GPU 上尝试过的最大配置是 rnn_size 700、num_layers 3(默认值为 2)。

训练

使用 train.lua 开始训练模型。作为 sanity check,要运行附带的示例数据集,只需尝试:

$ th train.lua -gpuid -1

请注意,这里我们将标志 gpuid 设置为 -1,这会指示代码使用 CPU 进行训练;否则默认使用 GPU 0。还有许多其他标志用于各种选项。请参阅 $ th train.lua -help 获取全面的设置说明。以下是另一个示例,它训练一个更大的网络,并展示了如何在您自己的自定义数据集上运行(此操作已假定 data/some_folder/input.txt 存在):

$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5

检查点。 在模型训练期间,它会定期将检查点文件写入 cv 文件夹。这些检查点的写入频率由迭代次数控制,具体由 eval_val_every 选项指定(例如,如果该值为 1,则每迭代都会写入一个检查点)。这些检查点的文件名包含一个非常重要的数字:损失值。例如,文件名为 lm_lstm_epoch0.95_2.0681.t7 的检查点表示此时模型处于第 0.95 个 epoch(即几乎完成了一轮完整的训练数据遍历),且验证集上的损失值为 2.0681。这个数值非常重要,因为其越低,检查点的效果越好。一旦开始生成数据(如下所述),您将希望使用报告最低验证损失的模型检查点。请注意,这并不一定是训练结束时的最后一个检查点(由于可能过拟合)。

另外需要关注的重要参数包括 batch_size(记作 B)、seq_length(记作 S),以及 train_fracval_frac 设置。批大小指一次并行处理的数据流数量。序列长度则指每个数据流的长度,同时也是梯度可以反向传播的时间上限。例如,若 seq_length 为 20,则梯度信号永远不会回传超过 20 个时间步,模型也可能无法“发现”超过该字符数的长期依赖关系。因此,如果您有一个非常困难的数据集,其中存在大量长期依赖关系,那么您应该提高此设置。现在,如果您的输入文本文件有 N 个字符,它们首先会被分割成大小为 BxS 的块。这些块随后会根据 frac 设置被分配到训练/验证/测试三个部分中。默认情况下,train_frac 为 0.95,val_frac 为 0.05,这意味着我们 95% 的数据块将用于训练,而 5% 的块则用于估计验证损失(从而评估泛化能力)。如果您的数据量较小,按照默认设置,您可能总共只有很少的块(例如 100 块)。这是不好的:在这种情况下,您可能需要减小批大小或序列长度。

请注意,您还可以使用 init_from 从先前保存的检查点初始化参数。

采样

给定一个检查点文件(例如写入 cv 文件夹中的那些),我们可以生成新文本。例如:

$ th sample.lua cv/some_checkpoint.t7 -gpuid -1

请确保如果您的检查点是用 GPU 训练的,那么采样时也应使用 GPU,反之亦然。否则代码(目前)会报错。与训练脚本类似,可参阅 $ th sample.lua -help 查看完整选项。其中一个重要选项是 -length 10000,它将生成 10,000 个字符(默认为 2000)。

温度。 您可能想要尝试的一个重要参数是 -temperature,它取范围为 (0, 1] 的数值(不包括 0),默认值为 1。温度会在 Softmax 之前对预测的对数概率进行归一化,因此较低的温度会使模型做出更可能但同时也更单调和保守的预测。较高的温度则会让模型承担更多风险,增加结果的多样性,但代价是可能出现更多错误。

预热。 您还可以使用 -primetext 参数用一些起始文本对模型进行预热。这会用一些硬编码的字符初始化 RNN,以便在开始生成文本之前为其提供上下文。例如,一个有趣的预热文本可能是 -primetext "生命的意义是 "

用 GPU 训练但在 CPU 上采样。 目前的解决方法是使用 convert_gpu_cpu_checkpoint.lua 脚本将 GPU 检查点转换为 CPU 检查点。在不久的将来,您将无需再手动执行此操作。例如:

$ th convert_gpu_cpu_checkpoint.lua cv/lm_lstm_epoch30.00_1.3950.t7

将会创建一个新的文件 cv/lm_lstm_epoch30.00_1.3950.t7_cpu.t7,您可以将其与采样脚本一起使用,并通过 -gpuid -1 以 CPU 模式运行。

祝您采样愉快!

小贴士与技巧

监控验证损失与训练损失

如果您对机器学习或神经网络不太熟悉,获得良好的模型可能需要一定的经验积累。最重要的是要跟踪您的训练损失(在训练过程中打印)与验证损失(当 RNN 在验证数据上运行时偶尔打印, 默认每 1000 次迭代打印一次)之间的差异。具体来说:

  • 如果您的训练损失远低于验证损失,则表明网络可能存在 过拟合 问题。解决办法是减小网络规模或增加 dropout。例如,您可以尝试将 dropout 设置为 0.5 等。
  • 如果您的训练损失和验证损失大致相等,则说明您的模型正在 欠拟合。此时应增大模型规模(无论是层数还是每层的神经元数量)。

参数数量的近似估算

控制模型的两个最重要的参数是 rnn_sizenum_layers。我建议您始终将 num_layers 设置为 2 或 3。rnn_size 可根据您拥有的数据量进行调整。在此过程中,有两个重要指标需要关注:

  • 您的模型中的参数数量。这会在您开始训练时打印出来。
  • 您的数据集大小。1MB 的文件大约包含 100 万个字符。

这两者应在数量级上大致相当。判断起来可能有些棘手。以下是一些例子:

  • 我有一个 100MB 的数据集,使用的是默认参数设置(当前打印出约 15 万个参数)。我的数据量明显更大(1000 万 >> 15 万),因此预计会严重欠拟合。我认为我可以放心地增大 rnn_size
  • 我有一个 10MB 的数据集,却运行着一个拥有 1000 万个参数的模型。我有些紧张,正在仔细监控验证损失。如果验证损失高于训练损失,或许可以尝试稍微增加 dropout,看看是否有助于降低验证损失。

最佳模型策略

要想获得非常好的模型(如果你有足够的计算时间),最佳策略就是尽可能地把网络做得更大(大到你能接受的等待时间为止),然后尝试不同的 Dropout 值(在 0 到 1 之间)。最终选择验证性能最好的模型,即检查点文件名中记录的损失值最低的那个。

在深度学习中,通常会运行许多不同超参数设置的模型,并最终选择验证性能最好的那个检查点。

顺便提一下,训练集和验证集的划分比例也是超参数之一。请确保验证集中有足够的数据,否则验证性能会非常不稳定,难以提供有价值的参考。

补充说明与致谢

这段代码最初基于牛津大学机器学习课程的实践作业第 6 题 practical 6,而该实践作业又源自 Wojciech Zaremba 的 learning to execute 项目。此外,代码的部分内容也与我的实验室伙伴 Justin Johnson 合作开发而成,他的个人主页是 http://cs.stanford.edu/people/jcjohns/

若想深入了解 RNN 语言模型,我推荐以下资源:

许可证

MIT

常见问题

相似工具推荐

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

145.9k|★★☆☆☆|今天
开发框架Agent语言模型

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|2天前
语言模型图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|3天前
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85.1k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|4天前
Agent图像开发框架

PaddleOCR

PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。

75.1k|★★★☆☆|今天
语言模型图像开发框架