欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 【动手学深度学习】8.5 循环神经网络从零开始实现

【动手学深度学习】8.5 循环神经网络从零开始实现

2025/5/3 3:49:44 来源:https://blog.csdn.net/hxdxiaoming/article/details/143248402  浏览:    关键词:【动手学深度学习】8.5 循环神经网络从零开始实现
  • 先读取数据集
    在这里插入图片描述

1. 独热编码

  • train_ier中,每个词元都表示为一个数字索引,将这些索引直接输入神经网络可能会使学习变得困难,故我们需要将每个词元表示为更具有表现力的特征向量。而独热编码是最简单的
  • 词元数量为 N,那么每个向量的长度则为 N,其中根据索引的位置填 1。
    在这里插入图片描述

2. 初始化模型参数

  • num_hidden是一个可调参数
  • 输入和输出具有相同的维度
    在这里插入图片描述

3. 循环神经网络模型

  • 首先在初始化返回的隐状态,形状为(批量大小,隐藏单元数)
    在这里插入图片描述
  • 下面定义了RNN如何在一个时间步内计算隐状态和输出,循环神经网络通过 inputs 最外层的维度实现循环,以逐步更新小批量数据的隐状态 H。此外这里使用 tanh 函数作为激活函数:当元素在实数上满足均匀分布时,tanh函数的平均值为0。
    在这里插入图片描述
  • 创建一个类来包装这些函数
    在这里插入图片描述
  • 检查输出是否有正确形状
    在这里插入图片描述

4. 预测

  • 定义预测函数生成prefix之后的新字符,其中prefix是一个用户提供的多字符字符串。在循环遍历prefix中的字符时,我们不断地将隐状态传递到第一个时间步,但是不生成任何输出,这个被称为预热,在此期间模型会自我更新(例如:更新隐状态),但不会预测。预测结束后,隐状态的值比刚开始的初始值更适合预测,从而预测字符并输出它们
    在这里插入图片描述
  • 现在我们可以测试predict_ch8函数。 我们将前缀指定为time traveller, 并基于这个前缀生成10个后续字符。 鉴于我们还没有训练网络,它会生成荒谬的预测结果。
    在这里插入图片描述

5. 梯度裁剪

  • 对于长度为 T 的序列,我们在迭代中计算 T 个时间步上的梯度,会在反向传播中产生长度为 O(T) 的矩阵乘法链。所以当 T 较大时会导致数值不稳定,例如梯度爆炸或者消失
    在这里插入图片描述

在这里插入图片描述


6. 训练

  • 不同采样方法(随机采样和顺序分区)将导致隐状态初始化的差异
  • 更新参数之前先进行梯度裁剪,这样可以保证梯度即使爆炸也不会发散
  • 用困惑度来评估模型,以保证不同长度的序列有可比性
  • 当使用随机抽样时,因为每个样本都是在一个随机位置抽样的, 因此需要为每个迭代周期重新初始化隐状态。
  • updater是更新模型参数的常用函数。 它既可以是从头开始实现的d2l.sgd函数, 也可以是深度学习框架中内置的优化函数。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词