长期源
technical essay
2015年5月21日发布于作者个人博客
循环神经网络不可思议的有效性
原题:The Unreasonable Effectiveness of Recurrent Neural Networks
出自:Andrej Karpathy · Andrej Karpathy Blog
Andrej Karpathy 在 2015 年的这篇博客里,用近乎惊叹的语气分享了循环神经网络(RNN)带给他的冲击。他回忆自己第一次训练图像描述模型时,只用了短短几十分钟,一个参数随意设置的“婴儿模型”就开始输出几乎合理的图片描述。这种简单模型与高质量结果之间的巨大反差,彻底颠覆了当时“RNN 很难训练”的普遍看法。一年后,Karpathy 已经频繁使用 RNN,却依然会被它们魔术般的输出逗乐。
这篇文章的核心,就是带读者体验这种魔力。Karpathy 选择了一个直观的任务:训练字符级语言模型,让网络逐字符生成文本。他同时发布了基于多层 LSTM 的代码,任何人都可以喂给模型一大段文本,看它如何一个字符一个字符地模仿出类似风格的内容。
要理解 RNN 为什么特别,得先看清传统神经网络的局限。普通网络(包括卷积网络)的 API 太死板:输入和输出都必须是固定大小的向量,计算步骤也是固定的。而 RNN 能处理向量序列——输入可以是序列,输出可以是序列,或者两者都是。比如图像描述是固定图像到序列输出,情感分析是序列输入到固定输出,机器翻译是序列到序列,视频分类则是同步的序列输入输出。这种灵活性让 RNN 不再受限于预设的长度,因为核心的循环变换可以重复应用任意多次。
从计算角度看,RNN 每一步都用固定的(但可学习的)函数把输入向量和当前状态向量结合起来,产生新状态。这就像运行一个带有内部变量的固定程序。理论上,RNN 是图灵完备的,能模拟任意程序,但 Karpathy 提醒我们别过度解读这一点。更实际的类比是:训练普通网络是优化函数,训练 RNN 则是优化程序。
即使数据本身不是序列,RNN 也能派上用场。DeepMind 的两项研究展示了这一点:一个网络学会了从左到右读取门牌号,另一个学会了在画布上逐步添加颜色来生成数字图像。这意味着,你可以把固定大小的数据当作序列来处理,让模型学会有状态地逐步加工信息。
RNN 的核心 API 简单得惊人:一个 step 函数,接收输入向量 x,返回输出向量 y。但 y 不仅取决于当前输入,还受整个输入历史的影响。最简单的 RNN 内部维护一个隐藏状态 h,每次更新时,把前一时刻的 h 和当前 x 分别乘以权重矩阵,相加后通过 tanh 非线性函数,得到新状态,再用它计算输出。训练的目标就是找到合适的权重矩阵,让输出序列符合期望。
堆叠多层 RNN 能进一步提升效果,就像叠煎饼一样。实践中更常用的是 LSTM,它改进了状态更新公式,训练更稳定。Karpathy 在文中将 RNN 和 LSTM 混用,所有实验都基于 LSTM。
回到字符语言模型:假设词汇表只有“helo”四个字母,训练序列是“hello”。模型要学习在给定前文字符序列的条件下,预测下一个字符的概率分布。每个字符用独热编码表示,逐个送入 RNN,每一步输出一个四维向量,代表对四个字母的置信度。训练时,我们通过反向传播调整权重,让正确下一个字符的置信度尽可能高,其他字符的置信度尽可能低。
为什么选它Andrej Karpathy 是 AI 领域的知名研究者和教育者,曾任特斯拉 AI 总监、OpenAI 创始成员。这篇 2015 年的经典博客以生动的语言和直观的示例,揭示了 RNN 的核心思想与惊人潜力,是理解序列模型和语言生成任务的绝佳入门材料。
#ai #neural-networks #technical-intuition #rnn