LLM之循环神经网络(RNN)

news2025/2/22 18:55:10

在人工智能的领域中,神经网络是推动技术发展的核心力量。今天,让我们深入探讨循环神经网络(RNN)

在这里插入图片描述

一、神经网络基础

(1)什么是神经网络

神经网络,又称人工神经网络,其设计灵感源于人类大脑的运作模式。它由众多被称为“节点”的处理单元构成,这些节点之间相互传递数据,恰似大脑中的神经元传递电脉冲。

在机器学习领域,神经网络扮演着关键角色。尤其是在深度学习中,它能够从无标签数据中提取有价值的信息,实现诸如识别照片中未知物品等复杂任务。

(2)神经网络的学习过程

神经网络的学习过程是一个迭代的过程,主要包括前向传播、损失函数计算和反向传播三个关键步骤。
在这里插入图片描述
在前向传播阶段,数据从输入层开始,依次经过隐藏层的处理,最终到达输出层。在这个过程中,每个神经元都会根据输入数据和自身的权重、偏差进行计算。权重决定了输入数据的相对重要性,而偏差则影响着神经元的激活程度。最初,我们会为权重和偏差赋予非零的随机值,这就是网络的参数初始化过程。
在这里插入图片描述
计算完成后,输出层的结果即为前向传播的最终输出,我们将其与真实值(ground-truth value)进行对比,通过损失函数(loss function)来衡量模型的性能。损失函数计算预测值与真实值之间的误差,常见的损失函数包括均方误差(Mean Squared Error,MSE)、平均绝对误差(Mean Absolute Error,MAE)、二元交叉熵(Binary Cross-entropy)、多类交叉熵(Multi-class Cross-entropy)等,它们分别适用于不同类型的任务,如回归问题或分类问题。

在这里插入图片描述
如果前向传播得到的预测值与真实值相差较大,说明我们需要调整网络的参数以降低损失函数的值。这就引出了反向传播过程,在这个阶段,我们会计算损失函数关于模型参数的梯度,并利用优化算法(如梯度下降 等)来更新参数。

在这里插入图片描述

二、循环神经网络

(1)RNN的定义与应用场景

循环神经网络(RNN)是一种专门设计用于处理顺序数据的神经网络架构。与传统的前馈神经网络不同。
RNN 能够通过内部状态来记忆之前输入的信息,从而更好地处理序列数据。在处理时间序列数据、语言建模或视频序列等任务时,RNN 表现出了独特的优势,因为这些任务中输入数据的顺序至关重要。
在这里插入图片描述

(2)顺序数据的概念

顺序数据是指具有特定顺序且顺序会影响数据含义的信息。

“The quick brown fox jumps over the lazy dog.”

每个单词都是数据的一部分,单词的顺序决定了句子的语义。如果将单词顺序打乱,句子就会变得毫无意义。
其他常见的顺序数据还包括时间序列数据(如股票价格、温度读数、网站流量等)和语音信号等。

(3)RNN与前馈神经网络的对比

  • 前馈神经网络:数据在网络中仅沿一个方向流动,从输入层到输出层,不存在反馈回路。这种架构适用于模式识别等任务,但在处理顺序数据时存在局限性,因为它无法利用之前的输入信息。
  • 循环神经网络:通过网络中的反馈回路,信号可以在前后时间步之间传递,使得网络能够记住之前的输入,从而更好地处理顺序数据。

在这里插入图片描述

(4)为什么使用RNN

传统的人工神经网络(ANN)在处理顺序数据(如文本)时面临挑战,因为它们要求输入数据具有固定的大小。在 ANN 中,每个输入被独立处理,无法捕捉元素之间的顺序和关系。

三、RNN的架构

在这里插入图片描述

3.1 RNN的时间展开

RNN的关键在于其内部状态或记忆,它能够跟踪已处理的数据,可以将 RNN 视为多个前馈神经网络在时间上的链式执行,每个时间步都有一个相同的网络结构在处理输入数据。
在这里插入图片描述

  • 输入层:在每个时间步,输入层接收一个输入数据,并将其传递给隐藏层。与前馈网络不同,RNN 的输入是逐个时间步进行处理的,这使得网络能够适应动态变化的数据序列
  • 隐藏状态:隐藏层在 RNN 中起着核心作用,它不仅处理当前输入,还会保留之前输入的信息。隐藏状态 h t h_t ht 在时间步 t t t是根据当前输入 X t X_t Xt和前一个隐藏状态 h t − 1 h_{t - 1} ht1 计算得出的,计算公式如下:

h t = t a n h ( W ∗ [ h t − 1 , X t ] + b h ) h_t = tanh(W*[h_{t-1},X_t] + b_h) ht=tanh(W[ht1,Xt]+bh)

  • t a n h tanh tanh: 是非线性激活函数
  • W W W:隐藏层的权重矩阵
  • b h b_h bh: 隐藏层的偏差向量
  • 输出序列
    RNN 的输出方式非常灵活,可以在每个时间步都产生输出(多对多),也可以在序列结束时产生一个单一输出(多对一),甚至可以从单个输入生成一个序列输出(一对多)。例如,对于多对多的 RNN,时间步 t t t的输出 O t O_t Ot 可以通过以下公式计算:

O t = V ∗ h t + b o O_t = V*h_t+b_o Ot=Vht+bo

  • V V V: 输出层的权重矩阵
  • b o b_o bo:输出层的偏差向

3.2 RNN的关键操作

3.2.1 前向传播

在 RNN 的前向传播过程中,对于每个时间步 t t t,网络会结合当前输入 X t X_t Xt 和前一个隐藏状态 h t − 1 h_{t - 1} ht1 来计算新的隐藏状态 h t h_t ht和输出 O t O_t Ot。这个过程中会使用一些非线性激活函数(如 s i g m o i d sigmoid sigmoid t a n h tanh tanh)来引入非线性变换.

在这里插入图片描述

def forward(self, inputs):
    h = np.zeros((1, self.hidden_size))
    self.last_inputs = inputs
    self.last_hs = {0: h}
    for i, x in enumerate(inputs):
        x = x.reshape(1, -1)
        h = np.tanh(np.dot(x, self.weights_ih) + np.dot(h, self.weights_hh) + self.bias_h)
        self.last_hs[i + 1] = h
    y = np.dot(h, self.weights_ho) + self.bias_o
    self.last_outputs = y
    return y

3.2.2 反向传播时间(BPTT)

与传统的反向传播不同,BPTT 会在时间上展开整个数据序列,并在每个时间步计算梯度,然后利用这些梯度来调整权重,以降低总体损失。

在这里插入图片描述
假设我们有一个长度为 T T T 的时间序列数据,在每个时间步 t t t 都有一个简单的损失函数 L t L_t Lt(如回归任务中的均方误差),那么总损失 L t o t a l L_{total} Ltotal 是每个时间步损失的总和:

L t o t a l = Σ t = 1 T L t L_{total}=\Sigma_{t=1}^{T}L_t Ltotal=Σt=1TLt

为了更新权重,我们需要计算 L t o t a l L_{total} Ltotal 关于权重的梯度。对于权重矩阵 U U U(输入到隐藏层)、 W W W(隐藏层到隐藏层)和 V V V(隐藏层到输出层),梯度的计算公式如下:
在这里插入图片描述

def backprop(self, d_y, learning_rate, clip_value=1):
    n = len(self.last_inputs)
    d_y_pred = (self.last_outputs - d_y) / d_y.size
    d_Whh = np.zeros_like(self.weights_hh)
    d_Wxh = np.zeros_like(self.weights_ih)
    d_Why = np.zeros_like(self.weights_ho)
    d_bh = np.zeros_like(self.bias_h)
    d_by = np.zeros_like(self.bias_o)
    d_h = np.dot(d_y_pred, self.weights_ho.T)
    for t in reversed(range(1, n + 1)):
        d_h_raw = (1 - self.last_hs[t] ** 2) * d_h
        d_bh += d_h_raw
        d_Whh += np.dot(self.last_hs[t - 1].T, d_h_raw)
        d_Wxh += np.dot(self.last_inputs[t - 1].reshape(1, -1).T, d_h_raw)
        d_h = np.dot(d_h_raw, self.weights_hh.T)
    for d in [d_Wxh, d_Whh, d_Why, d_bh, d_by]:
        np.clip(d, -clip_value, clip_value, out=d)
    self.weights_ih -= learning_rate * d_Wxh
    self.weights_hh -= learning_rate * d_Whh
    self.weights_ho -= learning_rate * d_Why
    self.bias_h -= learning_rate * d_bh
    self.bias_o -= learning_rate * d_by

3.2.3 权重更新

在计算出梯度后,我们使用优化算法(如随机梯度下降)来更新权重。权重更新的公式如下:

在这里插入图片描述

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

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

相关文章

Java:204 基于springboot零食销售商城的设计与实现

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统主要分为管理员和用户、商家。 用户可以使用网站首页的登录注册界面进行在线登录注册,并且注册登录后方可使用系统的各种功能以及购物…

harmonyOS的文件的增、删、读、写相关操作(fs/content)

注意: 操作harmonyOS的文件只能对app沙箱内的文件进行操作 牵扯到两个支持点: fs和content这两个API; 具体的操作方法看下图: 创建文件 //js 引入 import fs from "ohos.files.fs" import featureAbility from "ohos.ability.featureAbility"; // 上下…

【golang】量化开发学习(一)

均值回归策略简介 均值回归(Mean Reversion)假设价格会围绕均值波动,当价格偏离均值一定程度后,会回归到均值。 基本逻辑: 计算一段时间内的移动均值(如 20 天均线)。当当前价格高于均值一定比…

4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

引言: 最近,DeepSeek-R1在完全开源的背景下,与OpenAI的O1推理模型展开了激烈竞争,引发了广泛关注。为了让更多本地用户能够运行DeepSeek,我们成功将R1 671B参数模型从720GB压缩至131GB,减少了80%&#xff…

MySQL数据库(八)☞ 我是不是锁神

目录 1 全局锁的应用 2 索引对行锁的影响 3 表锁(显式)--表级锁 4 元数据锁 MDL(隐式)--表级锁 5 意向锁(Intention)--IS锁 IX锁--表级锁(隐式) 6 记录锁-(Record)-S锁 X锁 -- 行级锁 7 如何理解select ... lock in share …

AI法理学与责任归属:技术演进下的法律重构与伦理挑战

文章目录 引言:智能时代的新型法律困境一、AI技术特性对传统法理的冲击1.1 算法黑箱与可解释性悖论1.2 动态学习系统的责任漂移1.3 多智能体协作的责任稀释二、AI法理学的核心争议点2.1 法律主体资格认定2.2 因果关系的技术解构2.3 过错标准的重新定义三、责任归属的实践案例分…

【NLP】循环神经网络RNN

目录 一、认识RNN 二、RNN模型分类 三、传统RNN模型 3.1 结构分析 3.2 Pytorch构建RNN模型 3.3 优缺点 一、认识RNN RNN(Recurrent Neural Network),中文称作循环神经网络,一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之…

pnpm, eslint, vue-router4, element-plus, pinia

利用 pnpm 创建 vue3 项目 pnpm 包管理器 - 创建项目 Eslint 配置代码风格(Eslint用于规范纠错,prettier用于美观) 在 设置 中配置保存时自动修复 提交前做代码检查 husky是一个 git hooks工具(git的钩子工具,可以在特定实际执行特…

Vue的简单入门 一

声明:本版块根据B站学习,创建的是vue3项目,用的是vue2语法风格,仅供初学者学习。 目录 一、Vue项目的创建 1.已安装15.0或更高版本的Node.js 2.创建项目 二、 简单认识目录结构 三、模块语法中的指令 1.v-html 1.文本插值…

VMware Workstate 的 Ubuntu18 安装 vmware tools(不安装没法共享)

在共享主机路径后,可以在: /mnt/hgfs/下方找到共享的文件。但没有安装vmware tool时是没法共享的。 如何安装vmware tool,网上版本很多。这里记录一下: VMware Workstation 17 Pro,版本:17.6.0 虚拟机系统…

GC 基础入门

什么是GC(Garbage Collection)? 内存管理方式通常分为两种: 手动内存管理(Manual Memory Management)自动内存管理(Garbage Collection, GC) 手动内存管理 手动内存管理是指开发…

UE求职Demo开发日志#32 优化#1 交互逻辑实现接口、提取Bag和Warehouse的父类

1 定义并实现交互接口 接口定义: // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "UObject/Interface.h" #include "MyInterActInterface.generated.h…

如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题

在安装Qt时,遇到了一些问题,尤其是在Mac上安装Qt后,发现Qt Creator没有出现在应用程序中。通过一些搜索和操作,最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后,启动应用程…

多线程基础面试题剖析

一、线程的创建方式有几种 创建线程的方式有两种,一种是继承Thread,一种是实现Runable 在这里推荐使用实现Runable接口,因为java是单继承的,一个类继承了Thread将无法继承其他的类,而java可以实现多个接口&#xff0…

Android设备 网络安全检测

八、网络与安全机制 6.1 网络框架对比 volley: 功能 基于HttpUrlConnection;封装了UIL图片加载框架,支持图片加载;网络请求的排序、优先级处理缓存;多级别取消请求;Activity和生命周期的联动(Activity结束生命周期同时取消所有网络请求 …

神经网络的学习 求梯度

import sys, ossys.path.append(os.pardir) import numpy as npfrom common.functions import softmax, cross_entropy_error from common.gradient import numerical_gradient# simpleNet类 class simpleNet:def __init__(self):self.W np.random.rand(2, 3) # 随机形状为2*…

AI向量数据库之LanceDB快速介绍

LanceDB LanceDB 是一个开源的向量搜索数据库,具备持久化存储功能,极大地简化了嵌入向量的检索、过滤和管理。 LanceDB的主要特点 LanceDB 的主要特点包括: 生产级向量搜索:无需管理服务器。 存储、查询和过滤向量、元数据以…

CentOS7 安装配置FTP服务

CentOS7 安装配置FTP服务 CentOS7 安装配置FTP服务1. FTP简介2. 先行准备2.1 关闭防火墙2.2 关闭 SELinux 3.安装FTP软件包4. 创建 FTP 用户及目录4.1 创建 FTP 目录并设置权限4.2 防止 FTP 用户登录 Linux 终端4.3 创建 FTP 用户组及用户4.4 创建 FTP 可写目录 5. 配置ftp服务…

【设计模式】03-理解常见设计模式-行为型模式(专栏完结)

前言 前面我们介绍完创建型模式和创建型模式,这篇介绍最后的行为型模式,也是【设计模式】专栏的最后一篇。 一、概述 行为型模式主要用于处理对象之间的交互和职责分配,以实现更灵活的行为和更好的协作。 二、常见的行为型模式 1、观察者模…

编程题-最大子数组和(中等-重点【贪心、动态规划、分治思想的应用】)

题目: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 解法一(枚举法-时间复杂度超限): …