【Pytorch神经网络理论篇】 19 循环神经网络训练语言模型:语言模型概述+NLP多项式概述

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: torch.nn.LSTM类与torch..nn.GRU类并不属于单层的网络结构,它本质上是对RNNCell的二次封装,将基本的RNN Cell按照指定的参数连接起来,形成一个完整的RNN。

同学你好!本文章于2021年末编写,获得广泛的好评!


故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现,


Pytorch深度学习·理论篇(2023版)目录地址为:


CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录


本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!

https://v9999.blog.csdn.net/article/details/127587345

欢迎大家订阅(2023版)理论篇

以下为2021版原文~~~~


be8893cca26342839e077e30f3785272.png


1 语言模型


循环神经网络模型可以对序列片段进行学习,找到样本间的顺序特征。这个特性非常适合运用在语言处理方向。


20180517162001401.png


1.1 语言模型简介


语言模型包括文法语言模型和统计语言模型,一般指统计语言模型。


1.1.1 统计语言模型


统计语言模型是指:把语言(词的序列)看成一个随机事件,并赋予相应的概率来描述其属于某种语言集合的可能性,衡量一个句子的合理性,概率越高,说明这个句子越像是自然句子。


统计语言模型的作用是,为一个长度为m的字符串确定一个概率分布P(w1,w2,...,wm),表示其存在的可能性。其中,”w1~wm”依次表示这段文本中的各个词,用这种模型通过这些方法可以保留一定的词序信息,获得一个词的上下文信息。


2 词表与词向量


2.1 词表与词向量


   词表是指给每个单词(或字)编码,即用数字来表示单词(或字),这样才能将句子输入到神经网络中进行处理。


   比较简单的词表是为每个单词(或字)按顺序进行编号,或将这种编号用one_hot编码来表示。但是,这种简单的编号方式只能描述不同的单词(或字),无法将单词(或字)的内部含义表达出来。


于是人们开始用向量来映射单词(或字),可以表达更多信息,这种用来表示每个词的向量就称为词向量(也称词嵌入)。词向量可以理解为one-hot编码的升级版,它使用多维向量更好地描述词与词之间的关系。


2.2 词向量的原理与实现


词向量的最大优势在于可以更好地表示上下文语义。


2.2.1 词向量的含义


词向量表示词与词之间的远近关系映射为向量间的距离,从而最大限度地保留了单词(或字)原有的特征,建立在分布假说(distributional hypothesis)基础上的,即假设词的语义由其上下文决定,上下文相似的词,其语义也相似。


2.2.2 词向量的组成


(1)选择一种方式描述上下文;


(2)选择一种模型刻画某个目标词与其上下文之间的关系。


2.3 词向量的原理与实现


 one_hot编码的映射方法本质上也属于词向量,即把每个字表示为一个很长的向量,这个向量的维度是词表大小,并且只有一个维度的值为1,其余的维度都为0。这个为1的度就代表了当前的字。


   one_hot编码与词向量的唯一区别就是仅仅将字符号化,不考虑任何语义信息。如one_hot编码每一个元素由整型改为浮点型,同时再将原来稀疏的巨大维度压缩嵌入到人更小维度的空间,那么它就等同于词向量。


21393564f27c4804845526e53f22c639.png


2.4 词向量的实现


在神经网络的实现中,词向量更多地被称为词嵌入(word embedding),具体做法是将二维的张量映射到多维空间,即embedding中的元素将不再是、个字,而变成了字所转化的多维向量,所有向量之间是有距离远近关系的。


3 NLP中多项式的分布


在自然语言中,一句话中的某个词并不是唯一的。例如,“代码医生工作室真棒”这句话中的最后一个字“棒”,也可以换成“好”,不会影响整句话的语义。


3.1 RNN模型中存在的问题


在RNN模型中,将一个使用语言样本训练好的模型用于生成文本时,会发现模型总会将在下一时刻出现概率最大的那个词取出,即仅仅实现一种语言的设计,这种生成文本的方式失去了语言本身的多样性。


3.2 解决方案


为了解决这个问题,将RNN模型的最终结果当成一个多项式分布(multinomialdistribution),以分布取样的方式预测出下一序列的词向量。用这种方法所生成的句子更符合语言的特性。


3.2.1 多项式分布


多项式分布多项式分布是二项式分布的拓展。


二项式分布的典型例子是“扔硬币”:硬币正面朝上的概率为P,重复扔n次硬币,所得到k次正面朝上的概率即为一个二项式分布概率。把二项式分布公式拓展至多种状态,就得到了多项式分布。


3.2.2 多项式分布在RNN模型中的应用


多项式分布在RNN模型中的应用在RNN模型中,预测的结果不再是下一个序列中出现的具体某一个词,而是这个词的分布情况,这便是在RNN模型中使用多项式分布的核心思想。在获得该词的多项式分布之后,便可以在该分布中进行采样操作,获得具体的词,这种方式更符合NLP任务中语言本身的多样性,即一个句子中的某个词并不是唯一的。


3.2.3 RNN模型中的实现步骤


   (1)将RNN模型预测的结果通过全连接或卷积,变成与字典维度相同的数组。

   (2)用该数组代表模型所预测结果的多项式分布。

   (3)用torch.multinomial()函数从预测结果中采样,得到真正的预测结果。


3.3 torch.multinomial()


torch.multinomial(input, num_samples,replacement=False, out=None) → LongTensor


  • 函数作用:对input的每一行做n_samples次取值,输出的张量是每一次取值时input张量对应行的下标。输入是一个input张量,一个取样数量,和一个布尔值replacement。


  • input:张量可以看成一个权重张量,每一个元素代表其在该行中的权重。如果有元素为0,那么在其他不为0的元素,被取干净之前,这个元素是不会被取到的。


  • n_samples:是每一行的取值次数,该值不能大于每一样的元素数,否则会报错。


  • replacement:指的是取样时是否是有放回的取样,True是有放回,False无放回。


3.3.1 代码实现(每次多想次分布采样的结果均不同)


import torch
# 生成一串0-1的随机数
data = torch.rand(2,4)
print("生成的数据列表",data)
#生成的数据列表 tensor([[0.8998, 0.6512, 0.9156, 0.8575],[0.8455, 0.4838, 0.6859, 0.2629]])
a = torch.multinomial(data,1)
print("第一次采样结果:",a)
# 第一次采样结果: tensor([[0],[0]])
b = torch.multinomial(data,1)
print("第二次采样结果:",b)
# 第二次采样结果: tensor([[0],[1]])


4 循环神经网络的实现


47f0c166b6d1489bb2ac76b55c7bd248.png

71ea0698a0b340c0b7da9f16bf5263a0.png


a619482d82c448b7a9ac75604f9e48c7.png


4.1 RNN的底层类


torch.nn.LSTM类与torch..nn.GRU类并不属于单层的网络结构,它本质上是对RNNCell的二次封装,将基本的RNN Cell按照指定的参数连接起来,形成一个完整的RNN。


在torch.nn.LSTM类与torch.nn.GRU类的内部还会分别调用torch.nn.LSTMCel类与torch.nn.GRUCell类进行具体实现。

目录
相关文章
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch 中的动态计算图:实现灵活的神经网络架构
【8月更文第27天】PyTorch 是一款流行的深度学习框架,它以其灵活性和易用性而闻名。与 TensorFlow 等其他框架相比,PyTorch 最大的特点之一是支持动态计算图。这意味着开发者可以在运行时定义网络结构,这为构建复杂的模型提供了极大的便利。本文将深入探讨 PyTorch 中动态计算图的工作原理,并通过一些示例代码展示如何利用这一特性来构建灵活的神经网络架构。
298 1
|
3月前
|
并行计算 PyTorch 算法框架/工具
基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练
文章介绍了如何在CUDA 12.1、CUDNN 8.9和PyTorch 2.3.1环境下实现自定义数据集的训练,包括环境配置、预览结果和核心步骤,以及遇到问题的解决方法和参考链接。
145 4
基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练
|
4月前
|
机器学习/深度学习 人工智能 PyTorch
【深度学习】使用PyTorch构建神经网络:深度学习实战指南
PyTorch是一个开源的Python机器学习库,特别专注于深度学习领域。它由Facebook的AI研究团队开发并维护,因其灵活的架构、动态计算图以及在科研和工业界的广泛支持而受到青睐。PyTorch提供了强大的GPU加速能力,使得在处理大规模数据集和复杂模型时效率极高。
194 59
|
3月前
|
机器学习/深度学习
小土堆-pytorch-神经网络-损失函数与反向传播_笔记
在使用损失函数时,关键在于匹配输入和输出形状。例如,在L1Loss中,输入形状中的N代表批量大小。以下是具体示例:对于相同形状的输入和目标张量,L1Loss默认计算差值并求平均;此外,均方误差(MSE)也是常用损失函数。实战中,损失函数用于计算模型输出与真实标签间的差距,并通过反向传播更新模型参数。
|
2月前
|
机器学习/深度学习 数据采集 自然语言处理
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
|
2月前
|
机器学习/深度学习 存储 自然语言处理
深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)
深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)
|
2月前
|
机器学习/深度学习 PyTorch API
深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)
深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)
|
4月前
|
机器学习/深度学习 并行计算 PyTorch
GPU 加速与 PyTorch:最大化硬件性能提升训练速度
【8月更文第29天】GPU(图形处理单元)因其并行计算能力而成为深度学习领域的重要组成部分。本文将介绍如何利用PyTorch来高效地利用GPU进行深度学习模型的训练,从而最大化训练速度。我们将讨论如何配置环境、选择合适的硬件、编写高效的代码以及利用高级特性来提高性能。
739 1
|
4月前
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch与Hugging Face Transformers:快速构建先进的NLP模型
【8月更文第27天】随着自然语言处理(NLP)技术的快速发展,深度学习模型已经成为了构建高质量NLP应用程序的关键。PyTorch 作为一种强大的深度学习框架,提供了灵活的 API 和高效的性能,非常适合于构建复杂的 NLP 模型。Hugging Face Transformers 库则是目前最流行的预训练模型库之一,它为 PyTorch 提供了大量的预训练模型和工具,极大地简化了模型训练和部署的过程。
203 2
|
4月前
|
机器学习/深度学习 并行计算 PyTorch
PyTorch与DistributedDataParallel:分布式训练入门指南
【8月更文第27天】随着深度学习模型变得越来越复杂,单一GPU已经无法满足训练大规模模型的需求。分布式训练成为了加速模型训练的关键技术之一。PyTorch 提供了多种工具来支持分布式训练,其中 DistributedDataParallel (DDP) 是一个非常受欢迎且易用的选择。本文将详细介绍如何使用 PyTorch 的 DDP 模块来进行分布式训练,并通过一个简单的示例来演示其使用方法。
397 2

相关产品

  • 自然语言处理