ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MLAlgorithms RNN与LSTM深度解析:二进制加法与文本生成两大经典实现

MLAlgorithms RNN与LSTM深度解析:二进制加法与文本生成两大经典实现 MLAlgorithms RNN与LSTM深度解析二进制加法与文本生成两大经典实现【免费下载链接】MLAlgorithmsMinimal and clean examples of machine learning algorithms implementations项目地址: https://gitcode.com/gh_mirrors/ml/MLAlgorithmsMLAlgorithms 是一个用极简、干净的 Python 代码从零实现机器学习算法的开源项目其中 mla/neuralnet/layers/recurrent/ 下的 RNN 与 LSTM 层配合 examples/nnet_rnn_binary_add.py 的二进制加法和 examples/nnet_rnn_text_generation.py 的文本生成两个示例是理解循环神经网络内部机制的绝佳起点。本文带你读懂这两个经典实现的核心思想与代码结构。为什么选择这个项目学习 RNN大多数深度学习框架如 Keras、PyTorch封装得很好用但黑盒感也强。如果你想知道隐藏状态h到底是怎么一步步更新的梯度是怎么沿时间反向传播BPTT的LSTM 的门控公式在代码里长什么样MLAlgorithms 的答案就是不依赖任何框架只用 numpy autograd 手写全部核心逻辑代码量小到可以逐行读懂。RNN 相关代码集中在以下位置文件作用mla/neuralnet/layers/recurrent/rnn.py原生 RNN 层前向 BPTT 反向传播mla/neuralnet/layers/recurrent/lstm.pyLSTM 层四个门控的完整实现mla/neuralnet/nnet.py通用神经网络容器串联各层完成训练RNN 核心原理一个状态矩阵记住过去原生 RNN 的精髓可以用一句话概括每个时间步的输出都依赖上一个时间步的隐藏状态。在 rnn.py 的forward_passL55-L74中核心循环极其精炼for i in range(n_timesteps): states[:, i, :] np.tanh( np.dot(X[:, i, :], p[W]) # 当前输入的影响 np.dot(states[:, i - 1, :], p[U]) # 上一步隐藏状态的影响 p[b] )其中W是输入→隐藏权重U是隐藏→隐藏权重tanh把状态压缩到 (-1, 1)。整段序列的隐藏状态被存进一个(样本数, 时间步数, 隐藏维度)的张量states。反向传播在backward_passL76-L104中完成沿时间轴倒序遍历每个时间步把当前步的误差delta和来自未来的误差dh_next合并后回传这就是经典的 BPTT。初学者可以对照这两个函数亲手推一遍每个矩阵的维度变化——这是理解 RNN 最快的方式。⚠️ 原生 RNN 的已知短板梯度沿时间反向传播时容易消失或爆炸难以学习长距离依赖。这正是 LSTM 登场的理由。LSTM 核心原理用门精细控制记忆流动LSTM 引入了**细胞状态cell**这条记忆高速公路并用四个门来控制信息的写入、遗忘与读出。lstm.py 在setupL47-L85中清晰地定义了参数命名约定iinput gate输入门fforget gate遗忘门ooutput gate输出门ccell细胞状态每个门各有一套W输入权重、U隐藏权重和b偏置共 12 个参数矩阵。前向过程L87-L131的每一步只做了三件关键的事算门三个门过sigmoid输出 0~1 的开关程度细胞候选值过tanh更新记忆新状态 旧状态 × 遗忘门 输入门 × 细胞候选值L117-L120——这就是有选择地记住或遗忘输出输出 输出门 × tanh(新状态)。正因为存在这条可以长期保持数值的细胞状态LSTM 能学到 RNN 学不到的长距离依赖。反向传播L133-L189则分别对四个门求导结构上比 RNN 多了一层门控导数但思路完全一致倒序遍历时间步累积各权重矩阵的梯度。实战一二进制加法——让网络学会算术这是循环网络最迷人的演示之一不教网络任何数学知识只给它成对的二进位数它就能自己悟出进位规则。示例代码在 nnet_rnn_binary_add.py数据生成L20-L53随机取两个 8 位以内的数转成二进制串并低位在前排好加法从最低位开始天然适合逐位顺序处理形状为(样本数, 8, 2)模型结构L56-L72只有三层——LSTM(16)→TimeDistributedDense(1)→sigmoid损失函数用均方误差mse优化器用 Adam评估技巧L69-L72预测值四舍五入后用np.packbits把 0/1 位串打包回整数再比对直接算出加法准确率。值得注意的一个细节注释掉的 RNN 版本L76特意给权重加了SmallNorm约束见 mla/neuralnet/constraints.py来抑制梯度爆炸而 LSTM 版本直接用LSTM(16)就能稳定训练——这本身就是两个模型能力差异的直观证明。实战二文本生成——模仿尼采的写作风格第二个示例 nnet_rnn_text_generation.py 让网络学习尼采著作的语料然后自动续写出风格相近的文字思路与 Keras 官方lstm_text_generation示例一致。1️⃣ 语料准备mla/datasets/base.py 的load_nietzscheL58-L78读取 nietzsche.txt把文本切成大量40 个字符的句子 第 41 个字符作为标签的滑动窗口对并把字符 one-hot 编码成(句数, 40, 字符表大小)的矩阵。语料文件就在 mla/datasets/data/nietzsche.txt。2️⃣ 模型与训练结构为LSTM(128, return_sequencesFalse)→Dense(字符数)→softmax损失用categorical_crossentropy优化器 RMSpropL44-L58。外层用 for 循环反复训练 25 轮每轮都从原文随机抽一句当种子现场生成可以直观感受模型随训练逐步像人话的过程。3️⃣ 温度采样sample函数L22-L29是文本生成的灵魂把预测概率取对数、除以温度temperature再 softmax最后按概率抽样。示例中temperature0.5让分布更尖生成的文字更确定调大到 1.0 以上则更随机、更有创造力。快速上手三步跑通两个示例git clone https://gitcode.com/gh_mirrors/ml/MLAlgorithms cd MLAlgorithms pip install scipy numpy pip install -e .然后任选其一运行无需安装也可直接以模块方式运行python -m examples.nnet_rnn_binary_add python -m examples.nnet_rnn_text_generation不想本地配置项目还附带 Dockerfile一行docker build -t mlalgorithms .即可在容器里跑全部示例。两个示例对比与学习建议维度二进制加法文本生成任务类型逐位回归0/1字符级分类输出层TimeDistributedDense sigmoidDense softmax损失函数msecategorical_crossentropy关键技巧低位在先的位序设计温度采样控制随机性建议的学习路径先读 rnn.py只约 110 行逐行推一遍前向/反向的张量形状再读 lstm.py对照四个门的命名注释理解参数结构跑通两个示例把LSTM换成RNN、把temperature调来调去观察训练曲线和生成质量的变化——亲手实验比看十篇博客都有效。当你真正读懂了这两份代码再回头看框架里黑盒的RNN、LSTM模块时你会发现它们不过就是这几行循环的封装罢了。【免费下载链接】MLAlgorithmsMinimal and clean examples of machine learning algorithms implementations项目地址: https://gitcode.com/gh_mirrors/ml/MLAlgorithms创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表