【深度学习】rnn是什么?循环神经网络是什么?RNN前向传播。

news2024/11/24 3:15:28

文章目录

  • 循环神经网络
    • 1.循环神经网络原理
    • 2.使用Numpy实现RNN层的前向传播
    • 3.RNN存在的问题
    • 4.小结

循环神经网络

  通常卷积神经网络 适合处理图像问题,然而通常适合处理自然语言的网络是循环神经网络。rnn是所有基本网络,就像cnn 是很多复杂网络的基本原型。包括目前火热的自然语言处理的模型MLL,GPT等。rnn适合处理序列类数据,在语言模型与文本生成,以及机器翻译和语音识别等场景广泛使用。

1.循环神经网络原理

  循环神经网络能够对前面的信息进行“记忆”并且应用于当前输出的计算中,即隐藏层之间不再无连接。 某一个具体的隐藏层中的神经网络的神经元的输入不仅仅包含上一层的输出,还包括当前层上一个神经元的输出。
  假设给定一个长度为T的输入序列 { x 0 , x 1 , . . . , x t , . . . , x T } \{x_0,x_1,...,x_t,...,x_T\} {x0,x1,...,xt,...,xT},其中 x t x_t xt表示在t时刻的输入特征向量,这里的t时刻,并不一定真的指的是时间,只是用来表明这是一个序列输入。现在要得到每个时刻的隐含特征 { h 0 , h 1 , . . . , h t , . . . , h T } \{h_0,h_1,...,h_t,...,h_T\} {h0,h1,...,ht,...,hT},这些隐含层特征那个与后面层的层的特征输入。如何采用传统的神经网络只需要进行一下计算。 h t = f ( U x t + b ) h_t=f(Ux_t+b) ht=f(Uxt+b)其中f为非线性激活函数。但是,这样明显忽略了这是一个序列输入问题,即当丢失了序列中各个元素的依赖关系。对于循环神经网络,其在计算t时刻的特征时,不但考虑当前时刻的输入特征 x t x_t xt,而且引入了前一个隐含特征 h t − 1 h_{t-1} ht1,计算如下。 h t = f ( U x t + W h t − 1 + b ) h_t=f(Ux_t+Wh_{t-1}+b) ht=f(Uxt+Wht1+b).
  显然,这样可以捕捉序列中的依赖关系,可以认为 h t − 1 h_{t-1} ht1是一个记忆特征,其提取了前面t-1个时刻输入的旧特征。可以称 h t − 1 h_{t-1} ht1为旧状态,称 h t h_{t} ht为新状态。因此,循环神经网络特别适合解决序列问题。从结构上来看,循环神经网络可以看作是有环的神经网络(见图1)。
在这里插入图片描述

图1 循环神经网络结构(左)及其展开形式(右)

  不过,我们可以将其展开成普通的神经网络,准确地说,就是展开成t个普通地神经网络。但是这t个神经网络不是割裂的,他们使用的参数是相同的也是共享的,既权重共享。这样,在每一个时刻,循环神经网络执行的是相同的计算过程。

2.使用Numpy实现RNN层的前向传播

  为了实现RNN的层,通过Numpy包进行模拟一些平台的的构建层。RNN的输入是一个张量序列,我们输入一个形状为(sequence_length,input_feature)的二维张量。它对序列中每一个元素进行遍历,同时它会把前元素和上一个状态放在一起进行计算。对于第一个元素,由于没有上一个状态,所以需要初始化一个全零向量,然后将其作为初始状态。
  此时输入的矩阵为一个20个单词的矩阵,每一个单词的维度为5。状态权重w大小为1010,链接权重为510.输出为10的一个向量大小,表示最后一个隐藏层词语。前向传播输入结果为每一个隐含层的大小维度为20,10.

import numpy as np


class RNNlayer(object):
    def __init__(self,sequence_length:int,input_feature:int,output_feature:int):
        """

        :param sequence_length: 输入序列长度
        :param input_feature: 输入序列中每一个元素维度
        :param output_feature: 输出序列每一个元素维度
        """
        self.sequence_length = sequence_length
        self.input_feature = input_feature
        self.output_feature = output_feature
        #初始化0向量,
        self.state_t=np.zeros((output_feature,))
        #网络权重初始化
        self.W=np.random.uniform(size=(output_feature,input_feature))
        self.U=np.random.uniform(size=(output_feature,output_feature))
        self.b=np.random.uniform(size=(output_feature,))
    def _sigmoid(self,inputs:np.ndarray)->np.ndarray:
        """
        因为sigmoid激活函数是内部方法,所以函数名使用_
        :param inputs:输入特征
        :return: sigmoid的函数运算结果
        """
        sigm=1./(1.+np.exp(-inputs))
        return sigm
    def forward_propagation(self,inputs:np.ndarray)->np.ndarray:
        """
        前向传播
        :param inputs: 输入特征
        :return: 在该层中进行前向传播后的结果
        """
        output=[]
        #遍历输入特征,逐个计算对应的输出
        for input_t in inputs:
            # 有输入特征和前一个状态(前一个输出)计算当前的输出
            print(self.U,self.W,self.state_t)
            output_t=np.dot(self.W,input_t)+np.dot(self.U,self.state_t)+self.b
            #使用激活函数
            output_t=self._sigmoid(output_t)
            #将输出的保存到输入列表中
            output.append(output_t)
            # 将这次状态保存一边用于下次计算
            self.state_t=output_t
        return np.stack(output,axis=0)


if __name__ == '__main__':
    #初始化一个层
    rnn=RNNlayer(20,5,10)
    #随机初始化输入特征
    input_sequence=np.random.random((20,5))
    print(input_sequence)
    #进行前向传播
    output_sequence= rnn.forward_propagation(input_sequence)
    print(output_sequence)


3.RNN存在的问题

  虽然rnn处理时间序列效果非常好,但是其存在一定的问题。其中比较严重的问题是:处理长序列时,其容易出现梯度消失或者梯度爆炸。
(1)梯度爆炸:在训练过程梯度变大,大幅度更新网络参数 使得训练不稳定,可以通过截断或者压缩梯度解决。
(2)梯度消失:梯度变得非常小,导致更新网络过程时候变得非常缓慢,甚至停止更新参数。造成无法优化的局面。对于这个问题。通常使用变种网络,长短时间记忆网络lstm。它的出现解决了梯度消失问题。

4.小结

  本文介绍了rnn数据的输入结构以及rnn 用于时间序列的基本单元,并且通过一个numpy的前向传播算法实现了网络的计算。对于rnn如何进行参数更新,后续继续有相关博客进行讲解。

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

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

相关文章

项目管理知识点学习

项目管理,验收需要做的事情,验收汇报ppt 验收汇报PPT包含内容: 项目背景(金额,招投标时间)项目功能完成情况验收内容专家评审 竣工验收材料:详细设计和测试报告 项目风险管理,外来…

Betaflight BN880 GPS 简单测试

Betaflight BN880 GPS 简单测试1. 源由2. 窗台对比测试3. 开阔区域测试3.1 GPS安装位置3.1.1 BN880 GPS 机尾打印支架 安装位置3.1.2 BN880 GPS 机头固定 安装位置3.1.3 M8N GPS 机尾打印支架 安装位置3.2 M8N模块历史记录3.3 BN880模块第一次(机尾安装)…

Golang 哈希表详解

哈希表介绍 ​ 一个映射,也成为关联数组,其实是一个由唯一键组成的集合,而每个键必然关联一个特定的值。这种键到值的关联关系称为映射,若在键到值的关联使用hash计算,就是哈希表,映射至少支持三个操作&am…

每日做题总结——day01

目录 选择题 for循环 指针数组 位段 getchar 大小端存储 进制与格式控制符 位运算 数组指针 二维数组的存储 计算二进制中1的个数 斐波那契数列求递归次数 编程题 删除公共字符 排序子序列 倒置字符串 选择题 for循环 解析:该题主要看for…

react face to face

React面试题 创建一个react项目 1.全局安装create-react-app npm install -g create-react-app 2.创建项目 create-react-app myapp 3.局部安装,可以直接用npx npx create-react-app myapp 4.进入文件夹 cd myapp 5.启用项目 npm start(开发模式下运行&…

浅谈DNS-rebinding

为啥突然要总结一下这个很老的知识点,我也不知道,可能太菜了,闲下来总得学点什么~ DNS Rebinding 0x01 攻击简介 DNS Rebinding也叫做DNS重绑定攻击或者DNS重定向攻击。在这种攻击中,恶意网页会导致访问者运行客户端脚本&#xff…

springboot-参数校验

SpringBoot 中使用 Valid 注解 Exception 全局处理器优雅处理参数验证 注解Valid的主要作用是用于数据效验,可以在定义的实体中的属性上,添加不同的注解来完成不同的校验规则。Controller类中在参数中添加Valid注解来开启效验功能Valid配合 Spring 会抛…

2023年4月10日下午总结和近日感悟

技术和钱 人生,活到现阶段,已于一月前,深感技术就是这么回事,不再像以前那样为学习某样东西而不问来由,闷头去学(也许是因为即将步入下一个人生阶段)。虽然,乐于也想去接受新技术&a…

centos7下基于nginx+uwsgi部署Django项目

文章目录一:基础环境介绍:二:部署环境安装配置:1.基础依赖环境安装2.安装wegt,vim,unzip等必须命令3.安装python与pip(或者python多版本管理工具pyenv等)4.安装nginx5.安装uwsgi三&a…

json和CMake简单入门

Json 介绍 Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成&#xff…

Binder基本知识

1:IPC 原理 从进程角度来看 IPC 机制 每个 Android 的进程,只能运行在自己进程所拥有的虚拟地址空间。对应一个4GB 的虚拟地址空间,其中 3GB 是用户空间,1GB 是内核空间,当然内核空间的大小是可以通过参数配置调整的…

网络安全之密码学

目录 密码学 定义 密码的分类 对称加密 非对称加密 对称算法与非对称算法的优缺点 最佳解决办法 --- 用非对称加密算法加密对称加密算法的密钥 非对称加密如何解决对称加密的困境 密钥传输风险 密码管理难 常见算法 对称算法 非对称算法 完整性与身份认证最佳解决…

优维低代码:定制构件的打包及部署

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 连载…

用Python写一个BMI计算代码

有粉丝问我怎么写一个BMI算法,安排 height float(input("请输入身高(米): ")) weight float(input("请输入体重(千克): ")) 计算BMI bmi weight / (height ** 2) 显示结果 print("您的…

MySQL8.0.32安装以及环境配置

文章目录一、安装MySQL二、错误集1. 如果操作失误,可以重新安装一、安装MySQL 下载MySQL的社区版的压缩包:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.32-winx64.zip 将压缩包解压到你要安装的目录中 将对应的安装路径添加到环境变量中…

Java面试核心知识点梳理(二)——Java集合

文章目录前言1. List1.1 ArrayList(数组)1.2 Vector(数组、线程安全)1.3 LinkedList(链表)2. Set2.1 HashSet(Hash表)2.2 TreeSet(二叉树)2.3 LinkHashSet&am…

3分钟通过日志定位bug,这个技能测试人必须会

♥ 前 言 软件开发中通过日志记录程序的运行情况是一个开发的好习惯,对于错误排查和系统运维都有很大帮助。 Python 标准库自带了强大的 logging 日志模块,在各种 python 模块中得到广泛应用。 一、简单使用 1. 入门小案例 import logging logging.ba…

国内Google翻译失效的解决方法(MAC/WIN)

Google宣布停止在中国大陆的翻译服务,原因是:使用率低??,这导致Chrome浏览器网页翻译失效。对于一些使用Chrome,经常鼠标下一秒就在大洋彼岸扒拉资料,且英语不太好的同学来说变得非常难受。为此…

【软考中级·网络工程师】校验码差错控制

差错控制🍉 无论通信系统如何可靠,都不能做到完美无缺。因此,必须考虑怎样发现和纠正信号传输重的差错。通信过程中出现的差错大致可以分为两类: 一类是由热噪声引起的随机错误;热噪声:一种由电子的热运动…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 ​ 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号…