从零开始自己搭建RNN【Pytorch文档】1
先贴官方教程:https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html
参考Blog:https://blog.youkuaiyun.com/iteapoy/article/details/106478462
字母级RNN的分类任务

这次我们只用到 /name 这个文件夹下的18个文件,每个文件以语言命名,格式为 [Language].txt 打开后,里面是该语言中常用的姓/名。
任务说明
输入一个姓名,根据它的拼写,用循环神经网络对它分类,判断它属于哪个语言里的姓名
理论基础
RNN
循环神经网络(Recurrent Neural Network)里面引入了循环体结构

x t x_t xt是第 t 步循环时的输入, h t h_t ht是第 t 步循环时的输出,他们都是向量,把它按时序展平变成一般的神经网络那样的单向传播结构。展开后就是一个链状结构:

每一个A块里的结构都是一样的,现在的问题是:变量到底应该怎么更新?输入的 x t x_t xt应该如何处理,才能输出 h t h_t ht,图里的 A 内部具体的更新结构如下:

流程为:
- 把上一步输出的 h t − 1 h_{t-1} ht−1乘上权重矩阵 W h W_h Wh,变成 W h h t − 1 W_hh_{t-1} Whht−1,h是hidden layer
- 把这一步输入的 x t x_t xt也乘上权重矩阵 W i W_i Wi,变成 W i i t W_ii_{t} Wiit,i是input
- 把两者相加,得到 W h h t − 1 + W i i t W_hh_{t-1}+W_ii_{t} Whht−1+Wiit
- 经过一个 t a n h tanh tanh函数,就得到这一步的输出: h t = t a n h ( W h h t − 1 + W i i t ) h_t=tanh(W_hh_{t-1}+W_ii_t) ht=tanh(Whht−1+Wiit)
反复循环流程1-4,就是一个最简单的RNN
在这个简单RNN中, W h , W i W_h,W_i Wh,Wi并没有与时间步相关的下标,在训练过程中,这两个矩阵中的数字会发生变化,因为它们是模型要学习的“参数”始终只有这两个矩阵。
另外,你可能会看到一种带有偏置向量 b 的更新方式:
h t = t a n h ( ( W h h t − 1 + b h ) + ( W i i t + b i ) ) h_t=tanh((W_hh_{t-1}+b_h)+(W_ii_t+b_i)) ht=tanh((Whht−1+bh)+(Wiit+bi))
这里进行了简化,即令所有的向量 b 都为0。另外,我们在初始化向量 h 0 h_0 h0 的时候,也会把它初始化成全为0的向量
RNN这样一个结构用来处理有前后关联的序列非常有效,因此在自然语言处理里也取得了不错的成绩。因为一句话可以看成是许多词组成的序列,这些词之前有前后文/上下文关系
LSTM
LSTM是长短期记忆网络(LSTM,Long Short-Term Memory),通过三个门(遗忘门、输入门、输出门)的控制,存储短期记忆或长期记忆。它的整体流程是这样:

LSTM里的一个A内部的结构变成了这样子:

李宏毅老师的简化版容易入门:

对同一个输入 x t x_t xt,乘上不同的权重 W f , W i , W , W o W_f,W_i,W,W_o Wf,Wi,W,Wo,得到四个不同的值:
- z f = W f x t z_f=W_fx_t zf=Wfxt,遗忘门(Forget Gate)的输入
- z i = W i x t z_i=W_ix_t zi=

本文介绍了如何从零开始使用PyTorch构建一个RNN模型,用于根据姓名的拼写进行语言分类。首先,对数据进行预处理,包括读取文件、one-hot编码和字母标准化。接着,详细解释了RNN、LSTM和GRU的工作原理。然后,展示了如何将字母编码为张量,并构建了一个简单的RNN模型。在训练阶段,定义了损失函数和学习率,通过随机采样进行训练,并记录损失。最后,通过混淆矩阵评估模型性能,并给出了预测示例。
最低0.47元/天 解锁文章
886

被折叠的 条评论
为什么被折叠?



