循环神经网络——中篇【深度学习】【PyTorch】【d2l】

news2024/12/23 3:46:28

文章目录

  • 6、循环神经网络
    • 6.4、循环神经网络(`RNN`)
      • 6.4.1、理论部分
      • 6.4.2、代码实现
    • 6.5、长短期记忆网络(`LSTM`)
      • 6.5.1、理论部分
      • 6.5.2、代码实现
    • 6.6、门控循环单元(`GRU`)
      • 6.6.1、理论部分
      • 6.6.2、代码实现

6、循环神经网络

6.4、循环神经网络(RNN

6.4.1、理论部分

原理图

在这里插入图片描述

更新隐藏状态

H t = Φ ( W h h h t − 1 + W h x X t + b h ) H_t = Φ(W_{hh}h_{t-1}+W_{hx}X_t+b_h) Ht=Φ(Whhht1+WhxXt+bh)

H t : H_t: Ht:当前隐层, X t : X_t: Xt:输入

W h h : W_{hh}: Whh:上层隐层分配到的权重

W h x : W_{hx}: Whx:输入分配到的权重

b:偏移

循环指的是什么?

隐状态使用的定义与前一个时间步中使用的定义相同, 因此 上式计算是循环的(recurrent)。 于是基于循环计算的隐状态神经网络被命名为 循环神经网络(recurrent neural network)。 在循环神经网络中执行如上计算的层 称为循环层(recurrent layer)。

输出

O t = Φ ( W h o H t + b o ) Ot = Φ(W_{ho}H_t+b_o) Ot=Φ(WhoHt+bo)

文本预测展示

在这里插入图片描述

困惑度

用来衡量一个语言模型好坏的标准,可以用平均交叉熵,如下:

Π = 1 n ∑ t = 1 n − l o g   p ( x t ∣ x t − 1 , . . . x 1 ) Π = \frac{1}{n}\sum_{t=1}^n -log \ p(x_t|x_{t-1},...x_1) Π=n1t=1nlog p(xtxt1,...x1)

其中,p为预测概率, x t x_t xt为真实词。

历史原因,NLP使用困惑度 e x p ( Π ) exp(Π) exp(Π)来衡量,是平均每次可能选项,1为完美,最差为∞。

梯度裁剪

用于抑制RNN梯度爆炸,如果梯度长度超过 Θ Θ Θ,那么 g g g长度将拖回 Θ Θ Θ,反之任由 g g g变化。

g ← m i n ( 1 , Θ ∣ ∣ g ∣ ∣ ) g g ← min(1,\frac{Θ}{||g||})g gmin(1,∣∣g∣∣Θ)g

6.4.2、代码实现

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l

batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)

定义模型

num_hiddens = 256
rnn_layer = nn.RNN(len(vocab), num_hiddens)

隐状态:(隐藏层数,批量大小,隐藏单元数)

state = torch.zeros((1, batch_size, num_hiddens))
state.shape
torch.Size([1, 32, 256])
#@save
class RNNModel(nn.Module):
    """循环神经网络模型"""
    def __init__(self, rnn_layer, vocab_size, **kwargs):
        super(RNNModel, self).__init__(**kwargs)
        self.rnn = rnn_layer
        self.vocab_size = vocab_size
        self.num_hiddens = self.rnn.hidden_size
        # 如果RNN是双向的(之后将介绍),num_directions应该是2,否则应该是1
        if not self.rnn.bidirectional:
            self.num_directions = 1
            self.linear = nn.Linear(self.num_hiddens, self.vocab_size)
        else:
            self.num_directions = 2
            self.linear = nn.Linear(self.num_hiddens * 2, self.vocab_size)

    def forward(self, inputs, state):
        X = F.one_hot(inputs.T.long(), self.vocab_size)
        X = X.to(torch.float32)
        Y, state = self.rnn(X, state)
        # 全连接层首先将Y的形状改为(时间步数*批量大小,隐藏单元数)
        # 它的输出形状是(时间步数*批量大小,词表大小)。
        output = self.linear(Y.reshape((-1, Y.shape[-1])))
        return output, state

    def begin_state(self, device, batch_size=1):
        if not isinstance(self.rnn, nn.LSTM):
            # nn.GRU以张量作为隐状态
            return  torch.zeros((self.num_directions * self.rnn.num_layers,
                                 batch_size, self.num_hiddens),
                                device=device)
        else:
            # nn.LSTM以元组作为隐状态
            return (torch.zeros((
                self.num_directions * self.rnn.num_layers,
                batch_size, self.num_hiddens), device=device),
                    torch.zeros((
                        self.num_directions * self.rnn.num_layers,
                        batch_size, self.num_hiddens), device=device))

训练&预测

这里是,随即权重预测(效果不好)

device = d2l.try_gpu()
net = RNNModel(rnn_layer, vocab_size=len(vocab))
net = net.to(device)
d2l.predict_ch8('time traveller', 10, net, vocab, device)
'time travellermkkkkkkkkk'

高级API训练预测

num_epochs, lr = 500, 1
d2l.train_ch8(net, train_iter, vocab, lr, num_epochs, device)

调试报错,未解决

6.5、长短期记忆网络(LSTM

6.5.1、理论部分

原理图

在这里插入图片描述

遗忘门

将值朝0减少。

F t = σ ( X t W x f + H t − 1 W h f + b f ) F_t = σ(X_tW_{xf} + H_{t-1}W_{hf}+b_f) Ft=σ(XtWxf+Ht1Whf+bf)

输入门

决定是否忽略输入数据。

I t = σ ( X t W x i + H t − 1 W h i + b i ) I_t = σ(X_tW_{xi} + H_{t-1}W_{hi}+b_i) It=σ(XtWxi+Ht1Whi+bi)

输出门

决定是否使用隐状态。

O t = σ ( X t W x o + H t − 1 W h o + b o ) O_t = σ(X_tW_{xo} + H_{t-1}W_{ho}+b_o) Ot=σ(XtWxo+Ht1Who+bo)

候选记忆单元

C ~ = t a n h ( X t W x c + H t − 1 W h c + b c ) \tilde{C} = tanh(X_tW_{xc}+H_{t-1}W_{hc}+b_c) C~=tanh(XtWxc+Ht1Whc+bc)

记忆单元

C t = F t ⊚ C t − 1 + I t ⊚ C ~ t C_t = F_t ⊚ C_{t-1}+I_t ⊚ \tilde{C}_t Ct=FtCt1+ItC~t

隐状态

H t = O t ⊚ t a n h ( C ~ ) H_t = O_t ⊚ tanh(\tilde{C}) Ht=Ottanh(C~)

6.5.2、代码实现

1)手写实现

import torch
from torch import nn
from d2l import torch as d2l

batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)

初始化模型参数

def get_lstm_params(vocab_size, num_hiddens, device):
    num_inputs = num_outputs = vocab_size

    def normal(shape):
        return torch.randn(size=shape, device=device)*0.01

    def three():
        return (normal((num_inputs, num_hiddens)),
                normal((num_hiddens, num_hiddens)),
                torch.zeros(num_hiddens, device=device))

    W_xi, W_hi, b_i = three()  # 输入门参数
    W_xf, W_hf, b_f = three()  # 遗忘门参数
    W_xo, W_ho, b_o = three()  # 输出门参数
    W_xc, W_hc, b_c = three()  # 候选记忆元参数
    # 输出层参数
    W_hq = normal((num_hiddens, num_outputs))
    b_q = torch.zeros(num_outputs, device=device)
    # 附加梯度
    params = [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc,
              b_c, W_hq, b_q]
    for param in params:
        param.requires_grad_(True)
    return params

定义模型

def init_lstm_state(batch_size, num_hiddens, device):
    return (torch.zeros((batch_size, num_hiddens), device=device),
            torch.zeros((batch_size, num_hiddens), device=device))
def lstm(inputs, state, params):
    [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c,
     W_hq, b_q] = params
    (H, C) = state
    outputs = []
    for X in inputs:
        I = torch.sigmoid((X @ W_xi) + (H @ W_hi) + b_i)
        F = torch.sigmoid((X @ W_xf) + (H @ W_hf) + b_f)
        O = torch.sigmoid((X @ W_xo) + (H @ W_ho) + b_o)
        C_tilda = torch.tanh((X @ W_xc) + (H @ W_hc) + b_c)
        C = F * C + I * C_tilda
        H = O * torch.tanh(C)
        Y = (H @ W_hq) + b_q
        outputs.append(Y)
    return torch.cat(outputs, dim=0), (H, C)

训练&预测

vocab_size, num_hiddens, device = len(vocab), 256, d2l.try_gpu()
num_epochs, lr = 500, 1
model = d2l.RNNModelScratch(len(vocab), num_hiddens, device, get_lstm_params,
                            init_lstm_state, lstm)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

在这里插入图片描述

2)简洁实现

num_inputs = vocab_size
lstm_layer = nn.LSTM(num_inputs, num_hiddens)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

在这里插入图片描述

测试中,比手写实现快,甚至更准的原因?

深度学习框架的高级API对代码进行了更多的优化, 该模型在较短的时间内达到了较低的困惑度。

6.6、门控循环单元(GRU

6.6.1、理论部分

直白理解:不是每个观察都重要,更新门实现关注机制,重置门实现遗忘机制。

原理图

在这里插入图片描述

重置门

R t = σ ( X t W x r + H t − 1 W h r + b r ) R_t =σ(X_{tW}x_r+H_{t-1}W_{hr}+b_r) Rt=σ(XtWxr+Ht1Whr+br)

更新门

Z t = σ ( X t W x z + H t − 1 W h z + b z ) Z_t =σ(X_tW_{xz}+H_{t-1}W_{hz}+b_z) Zt=σ(XtWxz+Ht1Whz+bz)

候选隐状态

H ~ t = t a n h ( X t W x h + ( R t ⊚ H t − 1 ) W h h + b h ) \tilde{H}_t = tanh(X_tW_{xh}+(R_t ⊚ H_{t-1})W_{hh}+b_h) H~t=tanh(XtWxh+(RtHt1)Whh+bh)

隐状态

H t = Z t ⊚ H t − 1 + ( 1 − Z t ) ⊚ H ~ t H_t = Z_t ⊚ H_{t-1}+(1-Z_t)⊚\tilde{H}_t Ht=ZtHt1+(1Zt)H~t

6.6.2、代码实现

1)手写实现

import torch
from torch import nn
from d2l import torch as d2l

batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)

初始化模型参数

def get_params(vocab_size, num_hiddens, device):
    num_inputs = num_outputs = vocab_size

    def normal(shape):
        return torch.randn(size=shape, device=device)*0.01

    def three():
        return (normal((num_inputs, num_hiddens)),
                normal((num_hiddens, num_hiddens)),
                torch.zeros(num_hiddens, device=device))

    W_xz, W_hz, b_z = three()  # 更新门参数
    W_xr, W_hr, b_r = three()  # 重置门参数
    W_xh, W_hh, b_h = three()  # 候选隐状态参数
    # 输出层参数
    W_hq = normal((num_hiddens, num_outputs))
    b_q = torch.zeros(num_outputs, device=device)
    # 附加梯度
    params = [W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q]
    for param in params:
        param.requires_grad_(True)
    return params

定义模型

def init_gru_state(batch_size, num_hiddens, device):
    return (torch.zeros((batch_size, num_hiddens), device=device), )
def gru(inputs, state, params):
    W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q = params
    H, = state
    outputs = []
    for X in inputs:
        Z = torch.sigmoid((X @ W_xz) + (H @ W_hz) + b_z)
        R = torch.sigmoid((X @ W_xr) + (H @ W_hr) + b_r)
        H_tilda = torch.tanh((X @ W_xh) + ((R * H) @ W_hh) + b_h)
        H = Z * H + (1 - Z) * H_tilda
        Y = H @ W_hq + b_q
        outputs.append(Y)
    return torch.cat(outputs, dim=0), (H,)

训练&预测

vocab_size, num_hiddens, device = len(vocab), 256, d2l.try_gpu()
num_epochs, lr = 500, 1
model = d2l.RNNModelScratch(len(vocab), num_hiddens, device, get_params,
                            init_gru_state, gru)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

在这里插入图片描述

2)简洁实现

num_inputs = vocab_size
gru_layer = nn.GRU(num_inputs, num_hiddens)
model = d2l.RNNModel(gru_layer, len(vocab))
model = model.to(device)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1039308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现电商跨平台订单每日自动对账

场景描述: 多数商家都存在多电商平台同时经营的情况,而进行订单对账则是相关业务或财务人员的每日必修课。比如商家在天猫,苏宁,1号店,京东等均有运营店铺,每天需要通过各电商后台系统抓单打单&#xff0c…

Android 小组件 AppWidgetProvider

一、相关文档 二、小组件是什么? 三、AppWidget 核心类 AppWidgetProvider 源码解读和原理分析 1、先看 AppWidgetProvider 源码 2、AppWidgetProvider 回调方法分析 onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appW…

索引与切片

索引 生成一个CNN的输入格式张量 a torch.rand(4, 3, 28, 28) (batch, channel,high, width)单个索引的方式与python一样 a[0] # 去索引为0的图片即第一张图片 a[0].shape多个索引与python稍微不一样,但很相似 python:a[0][0…

PMP证书在国内已经泛滥了,还有含金量吗?

没有泛滥吧?这个证书现在就是趋向于项目管理人士要去考的呀,也不是考了没用,提升自身个人的能力、找工作方面和晋升加薪方面确实有用呀,不然报名费那么贵,为什么越来越多人考呢? 1、提升自身个人的能力 首…

云原生技术盛会KubeCon即将召开!亚马逊云科技作为钻石赞助商参会

KubeCon2023将于9月26-28日在上海跨国采购会展中心隆重召开。作为云原生领域最负盛名的技术大会之一,KubeConCloudNativeCon是连接全球开发者与云原生社区的最佳平台,此次还新增Open Source Summit环节,吸引了全球顶尖的云原生专家们汇聚其中…

利用C++开发一个迷你的英文单词录入和测试小程序-增强功能

小玩具基本完成之后,在日常工作中,记录一些单词,然后定时再复习下,还真的有那么一点点用(毕竟自己做的小玩具)。 在使用过程中,遇到不认识的单词,总去翻译软件翻译,然后…

结合Mockjs与Bus事件总线搭建首页导航和左侧菜单

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…

可在电脑桌面显示每日工作计划表的工具用哪个?

当你坐在电脑前,繁忙的工作日开始了。屏幕前的任务排成一列,待处理的事情如潮水般涌来。这时,你需要一款强大的工具来帮助你合理安排时间,确保没有一个任务被忘记。 在这个数字时代,有一款工具可以在你的电脑桌面上显…

关于建筑八大员(住建厅七大员)考试难不难?合格技巧

关于建筑八大员(住建厅七大员)考试难不难?合格技巧 建筑八大员分为施工员、质量员、资料员、材料员、机械员、劳务员、标准员等7种大类。电脑考核,系统好几万题目,随机抽取一套匹配给你,每个人考试题目都不…

数组01-二分查找算法

目录 数组如何实现随机访问 两个关键词 数组的特点 根据下标随机访问数组元素 为什么数组要从0开始编号,而不是从1开始 LeetCode之路——704. 二分查找 Code 二分查找算法 数组如何实现随机访问 数组(Array)是一种线性表数据结构。它…

【从0学习Solidity】51. ERC4626 代币化金库标准

【从0学习Solidity】51. ERC4626 代币化金库标准 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#…

https跳过SSL认证时是不是就是不加密的,相当于http?

https跳过SSL认证时是不是就是不加密的,相当于http?,其实不是,HTTPS跳过SSL认证并不相当于HTTP,也不意味着没有加密。请注意以下几点: HTTPS(Hypertext Transfer Protocol Secure)本质上是在HTTP的基础上…

在docker中删除none镜像

在构建过Docker镜像的电脑上查看本地镜像列表,有可能看到下图红框中的镜像,在列表中展示为:: 这种镜像在Docker官方文档中被称作dangling images,指的是没有标签并且没有被容器使用的镜像。 官方解释 来自官方的解释如下图红框所…

【多线程初阶】多线程案例之阻塞式队列

文章目录 前言1. 什么是阻塞队列2. 生产者消费者模型2.1 生产者消费者模型的优势2.1.1 解耦合2.1.2 削峰填谷 3. Java 标准库中的阻塞队列3.1 生产者消费者模型 4. 自己实现一个阻塞队列总结 前言 本文主要给大家讲解多线程的一个重要案例 — 阻塞式队列. 关注收藏, 开始学习…

如何在Windows11上使用macOS Sonoma全新的慢镜屏幕保护程序

前言 macOS Sonoma是Apple macOS一个大版本的描述,以任何方式使用macOS Sonoma都应确保符合Apple的规定 本文假定你在搭载Intel处理器的Apple产品上通过bootcamp安装了Windows11,且想要让Windows11产生类似于macOS Sonoma全新的慢镜屏幕保护程序的相关…

java面试题-jvm基础知识

1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 难易程度:☆☆☆ 出现频率:☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写&a…

【记录文】Android自定义Dialog实现圆角对话框

圆角的dialog还是蛮常用的,demo中正好用上了 自定义Dialog,代码中可以设置指定大小与位置 /*** author : jiangxue* date : 2023/9/25 13:21* description :圆角的矩形*/internal class RoundCornerView(context: Context,view: Int, StyleRes theme…

智能网联驾驶测试与评价工业和信息化部重点实验室“车载智能计算基础平台参考架构2.0专家研讨会”圆满结束

近日,智能网联驾驶测试与评价工业和信息化部重点实验室在北京市召开“车载智能计算基础平台参考架构2.0专家研讨会”,本次会议由智能网联驾驶测试与评价工业和信息化部重点实验室、中国软件评测中心(工业和信息化部软件与集成电路促进中心&am…

美颜SDK哪家好?2023美颜SDK有哪些新玩法?

在当今的数字世界中,美颜SDK正成为一种强大的工具,可以帮助我们在视频直播和短视频中展现出最美的自己。美摄科技作为一家专注于美颜SDK技术的公司,提供了多种领先的美颜SDK相关产品,以满足不同用户的需求。 美摄科技的美颜SDK是一…

第一章 计算机网络与协议

文章目录 一、计算机网络的基础概念二、计算机网络分类2.1 通信子网/资源子网/网络协议2.2 网络拓补图分类2.3 按照覆盖范围分类2.4 按照交换技术分类2.5 其他分类 三、OSI参考模型3.1 应用层3.2 表示层3.3 会话层3.4 传输层3.5 网络层3.6 数据链路层3.7 物理层3.8 借助OSI模型…