当前位置: 首页 > news >正文

【动手学深度学习】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函数, 也可以是深度学习框架中内置的优化函数。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

http://www.mrgr.cn/news/59122.html

相关文章:

  • 跟我学C++中级篇——volatile的探究
  • 大厂项目经理推荐的10款常用的项目管理软件值得你收藏
  • Java中TreeSet的使用
  • 代码随想录算法训练营第二十七天|Day27 贪心算法
  • 博图软件的使用(一)
  • 006:看图软件ACDSeePhotoStudio2019安装教程
  • Python中的Bloom Filter算法详解
  • C/C++(七)RAII思想与智能指针
  • Java-图书管理系统
  • 专题十六_栈_队列_优先级队列_算法专题详细总结
  • java核心技术点都有哪些
  • 【C++ 真题】B2099 矩阵交换行
  • 蓝桥杯第二十场小白入门赛
  • 走廊泼水节——求维持最小生成树的完全图的最小边权和
  • 010 操作符详解 上
  • MySQL数据库学习指南
  • RPA技术重塑企业自动化的未来
  • 数据结构之堆的实现以及性质和应用
  • 探寻闲鱼libsgmain加解密算法(3) ——libsgmainso-6.5.XX学习记录
  • 小白学视觉 | PE-YOLO:解决黑夜中的目标检测难点