Character level language model - Dinosaurus Island脉络总结

  • 1、打开数据集

    • 读取恐龙名字,并创建字符列表
    • 创建 char_to_ix 与 ix_to_char,作用:将softmax结果转换成字母
  • 2、初始化参数

    • 输入X-----------0向量
    • 隐藏层状态a------0向量
    • 循环:
      • 前向传播计算损失
      • 反向传播计算关于损失的梯度
      • 修剪梯度以免梯度爆炸
      • 用梯度下降更新规则更新参数。
      • 返回学习后了的参数
  • 3、两个模块

    • 梯度修剪模块------处理梯度爆炸

      • 方法:通过设定Maxvalue阈值,将梯度控制在阈值范围内
      • 核心函数:np.clip(gradient, -maxValue, maxValue, out=gradient)
    • 抽样模块---------按模型输出概率逐个抽取字符,生成恐龙名字

      • 核心函数:
              #设置随机数种子
              np.random.seed(0)
              #设置概率
              p = np.array([0.1, 0.0, 0.7, 0.2])
              #依据概率分布p,从列表中抽样
              index = np.random.choice([0, 1, 2, 3], p = p.ravel())
              #含义:
              #P(index=0)=0.1 , P(index=1)=0.0  ,  P(index=2)=0.7  ,  P(index=3)=0.2
  • 随机梯度下降(优化过程,并且加入了上面的梯度修剪功能):


def optimize(X, Y, a_prev, parameters, learning_rate ):

  #      X -- 整数列表,其中每个整数映射到词汇表中的字符。
  #      Y -- 整数列表,与X完全相同,但向左移动了一个索引。
  #      a_prev -- 上一个隐藏状态
  #      parameters -- 字典,包含了以下参数:
  #      Wax -- 权重矩阵乘以输入,维度为(n_a, n_x)
  #      Waa -- 权重矩阵乘以隐藏状态,维度为(n_a, n_a)
  #      Wya -- 隐藏状态与输出相关的权重矩阵,维度为(n_y, n_a)
  #      b -- 偏置,维度为(n_a, 1)
  #      by -- 隐藏状态与输出相关的权重偏置,维度为(n_y, 1)
  #      learning_rate -- 模型学习的速率      
           

return    loss, gradients, a[len(X)-1]     
  #       loss -- 损失函数的值(交叉熵损失)
  #       gradients -- 字典,包含了以下参数:
  #       dWax -- 输入到隐藏的权值的梯度,维度为(n_a, n_x)
  #       dWaa -- 隐藏到隐藏的权值的梯度,维度为(n_a, n_a)
  #       dWya -- 隐藏到输出的权值的梯度,维度为(n_y, n_a)
  #       db -- 偏置的梯度,维度为(n_a, 1)
  #       dby -- 输出偏置向量的梯度,维度为(n_y, 1)
  #       a[len(X)-1] -- 最后的隐藏状态,维度为(n_a, 1)
  • 模型结构

  • 小技巧

    • 1、将一个函数当作是参数传入另一个函数,传入的时候只需将函数名写入,可以在函数里定义变量,将变量传入参数函数里,将参数函数的结果作为变量并使用。
posted @ 2021-08-04 10:12  Simbanana  阅读(154)  评论(0)    收藏  举报