人工智能 文章

RNN隐藏状态全解析:它到底是什么?传给谁?何时输出?
人工智能
2024-05-29 0k

RNN隐藏状态全解析:它到底是什么?传给谁?何时输出?

在学习循环神经网络(RNN)时,很多初学者在推导数据流时会产生一系列连环疑问: “当前时间步输出的隐藏状态,和传给下一个时间步的信息,是同一份数据吗?” “既然传给下一步了,那当前步的隐藏状态还留着干啥?” “每一个时间步都需要把隐藏状态接上 Softmax 输出预测结果吗?” 这些问题直击 RNN 的核心架构。今天,我们就把传统 RNN(Vanilla RNN)掰开揉碎,从本质、去向、输出时机三个维度,彻底理清隐藏状态(Hidden State)的前世今生。 一、 破除迷思:传给下一步的信息 和 隐藏状态 是同一个东西吗? 直接给出结论:在传统 RNN 中,它们是完全相等的,就是同一份数据(同一个张量)。 传统 RNN 的核心递推公式为: $$h_t = \tanh(W_{xh} x_t + W_{hh} h_{t-1} + b_h)$$ 在这个公式中,计算出的 $h_t$ 只有一个。它既被定义为“当前时间步的隐藏状态”,又在下一个时间步 $t+1$ 的计算中,原封不动地作为 $h_{t}$(即下一步眼中的 $h_{t-1}$)传入。不存在任何额外的变换或门控机制来区分这两者。 ⚠️ 重要区分:LSTM 不是这样 这种“输出 = 下一步输入”的特性仅适用于传统 RNN。在 LSTM 中,有两条状态线:细胞状态(Cell State, $c_t$)和隐藏状态(Hidden State, $h_t$)。$c_t$ 是真正的“记忆传送带”传给下一步,而 $h_t$ 是经过输出门过滤后的版本用于对外输出。所以在 LSTM 中,两者是不相等的。 二、 隐藏状态的“双重使命”:它到底留着干啥? 既然“传给下一步的信息”和“隐藏状态”是同一个东西,那为什么还要专门叫它“隐藏状态”?它计算出来后到底被拿去干嘛了? 这里需要破除一个思维误区:它们不是两个东西,而是“同一个东西”的两个去向。 当 $h_t$ 被计算出来后,它面临着 “一分为二”的双重使命:

RNN 隐藏状态 深度学习
阅读更多
一文读懂 RNN:循环神经网络原理与结构解析
人工智能
2024-04-04 0k

一文读懂 RNN:循环神经网络原理与结构解析

大家好!今天我们来聊聊深度学习中一个非常有趣且重要的概念——循环神经网络(Recurrent Neural Network,简称RNN)。 如果你之前了解过普通的神经网络(比如用来识别图片的CNN),你可能会发现它们有一个共同的弱点:记性不好。它们处理每一张图片时都是独立的,不会记得上一张图片是什么。但是,在处理语言、语音或者股票走势这种有前后顺序的数据时,“记忆”就变得至关重要了。 这就轮到RNN登场了!让我们结合这张结构图,用最通俗的语言来拆解它。 1. RNN的核心思想:时间就是生命 请看图片左侧那个绿色的方块链条。这就是RNN最直观的形态。 普通神经网络:像是一个个独立的工人,每个人只负责处理手头的任务,做完就忘,不跟下一个人交流。 RNN:像是一条流水线上的工人团队。第二个工人不仅拿到了新的原料(输入数据),还收到了第一个工人传过来的“半成品”或“笔记”(隐藏状态)。 在图中,我们可以看到三个绿色的大方块,分别标记为: 第一个时间步 第二个时间步 第三个时间步 这代表了时间的流逝。RNN不仅仅是在处理空间上的数据,它还在处理时间序列。每一个绿色方块其实代表的是同一个神经网络层(Neural Network Layer) 在不同时间点的状态。这就是为什么叫“循环”神经网络——它在时间轴上自我循环。 2. 深入内部:到底发生了什么? 让我们把目光聚焦在中间那个最详细的绿色方块(第二个时间步)上。这里展示了RNN工作的核心秘密。 两个输入,一个输出 在这个时间步里,神经网络层 A 接收了两股信息流: 本次输入数据 ($X_t$):这是当前时刻的新信息。比如在翻译句子时,这就是当前读到的那个单词。 **上次时间步的隐藏状态 ($h_{t-1}$)**:这是从上一个绿色方块传过来的箭头。这代表了“过去的记忆”。 记忆的传递 注意看那个向上的箭头,指向紫色的圆圈 $h_t$。 $h_{t-1}$ 是**过去**的记忆。 $X_t$ 是现在的信息。 经过神经网络层 A 的处理(通常包含一个激活函数,如图中黄色的 tanh),生成了 $h_t$。 $h_t$ 既包含了现在的信息,也融合了过去的记忆。然后,它会作为“这次时间步的隐藏状态”,传递给下一个时间步(右边的绿色方块),同时也可能输出给外界(比如预测下一个词是什么)。 简单总结:RNN通过把上一步的计算结果传给下一步,从而实现了对历史信息的“记忆”。 3. 数学公式大揭秘(别怕,很简单!) 图片右上角给出了RNN核心的数学公式: $$h_t = \tanh(W_t[X_t, h_{t-1}] + b_t)$$ 看着复杂,其实拆开看就像做一道菜: $X_t$ (本次输入数据):这是主料。 **$h_{t-1}$ (上次时间步的隐藏状态)**:这是上一顿剩下的老汤,用来提味(提供上下文)。 **$[X_t, h_{t-1}]$ (Concatenate)**:图中的红色箭头汇聚在一起,表示把主料和老汤**拼接**在一起。 $W_t$ (权重矩阵):这是厨师的调味手法,决定了我们多重视新输入,多重视旧记忆。 $b_t$ (偏置矩阵):这是一个基础底味调整。 $\tanh$ (激活函数):这是最后的烹饪工序(比如烘烤),把数据压缩到 -1 到 1 之间,防止数值爆炸,并引入非线性特征。 $h_t$ (本次时间步的隐藏状态):出锅的美味佳肴,既可以直接吃(输出结果),也可以留一部分做下一顿的老汤(传给下一步)。 4.

RNN 循环神经网络 深度学习
阅读更多
PyTorch GPU 配置指南:CUDA 安装与环境验证
人工智能
2024-02-09 0k

PyTorch GPU 配置指南:CUDA 安装与环境验证

PyTorch 作为主流的深度学习框架,在安装时严格区分了 CPU 版本与 GPU 版本。这两个版本对应不同的底层二进制分发包,并非仅通过代码参数进行区分。在实际开发与部署中,准确判断当前环境并进行相应的版本切换是保障模型训练与推理效率的基础。 一、 验证当前 PyTorch 版本类型 确认已安装版本的最直接方式是通过 Python 代码进行检测。通过导入 torch 库并调用相关函数,可以获取当前的版本信息及硬件加速状态: import torch print("PyTorch版本:", torch.__version__) print("CUDA是否可用:", torch.cuda.is_available()) print("CUDA版本:", torch.version.cuda) 在输出结果中,若 torch.cuda.is_available() 返回 True,且版本号包含 +cuXXX 后缀(如 2.1.0+cu118),则表明当前为 GPU 版本;若返回 False,或版本号包含 +cpu 后缀,则表明当前为纯 CPU 版本。此外,也可在终端使用 pip show torch 命令,通过查看包版本号的后缀来快速判断。 二、 从 CPU 版本切换至 GPU 版本 若检测到当前为 CPU 版本且需要启用硬件加速,需执行卸载与重装操作。首先,通过 pip uninstall torch torchvision torchaudio -y 命令彻底卸载现有的 CPU 版本。 随后,需确认系统显卡驱动所支持的最高 CUDA 版本(可通过终端执行 nvidia-smi 命令查看)。根据查到的 CUDA 版本,从 PyTorch 官方源拉取对应的 GPU 版本进行安装。例如,对于支持 CUDA 12.

PyTorch CUDA GPU加速
阅读更多
结合代码,看懂PyTorch的自动微分(Autograd)
人工智能
2023-12-16 0k

结合代码,看懂PyTorch的自动微分(Autograd)

在深度学习中,PyTorch 的自动微分(Autograd)机制极大地简化了模型训练过程。在实际的训练代码中,自动微分并不是一个孤立的函数,而是通过一套标准的训练闭环来体现的。结合一段典型的 PyTorch 模型训练代码,自动微分主要体现在以下三个核心步骤: 有的说法是叫“自动梯度”更合理 1. 开启梯度追踪(构建计算图) pred_y = model(x) loss_value = loss(pred_y, y) 在 PyTorch 中,模型的参数(如权重 w 和偏置 b)在初始化时默认带有 requires_grad=True 属性。当代码执行前向传播 model(x) 以及计算损失 loss(pred_y, y) 时,PyTorch 的 Autograd 引擎会在后台默默记录所有的运算过程,并动态构建出一张“计算图”。 2. 触发反向传播(自动计算梯度) loss_value.sum().backward() 这是自动微分最直接的体现。调用 .backward() 后,Autograd 引擎会从损失值(标量)出发,沿着之前构建的计算图逆向遍历,利用链式法则自动计算出每一个参与运算的参数的梯度。开发者完全不需要手动编写任何求导公式。 3. 梯度清零(防止梯度累加) optimzer.zero_grad() PyTorch 的自动微分机制默认会累加梯度,而不是覆盖梯度。如果不手动清零,之前批次计算出的梯度会一直叠加,导致模型参数更新混乱。因此,在每次反向传播之前,必须通过优化器将之前自动计算并累积的梯度清空。 总结 这段训练代码完美遵循了 PyTorch 自动微分的标准范式:前向传播记录计算图 -> 梯度清零 -> 反向传播自动求导 -> 优化器更新参数。理解这一过程,是掌握 PyTorch 模型训练的核心。

PyTorch 自动微分 Autograd
阅读更多
四维张量计算原理
人工智能
2023-10-22 0k

四维张量计算原理

四维张量 sum(dim) 计算原理 示例张量 t4,shape = (2, 2, 2, 3) → 2个组 × 2个块 × 2行 × 3列 📦 原始张量结构 第 0 组 (dim=0 索引0) 第 0 块 (dim=1 索引0) 123 412 第 1 块 (dim=1 索引1) 210 132 第 1 组 (dim=0 索引1) 第 0 块 (dim=1 索引0) 321 024 第 1 块 (dim=1 索引1) 142 213 dim=0:组维度  |  dim=1:块维度  |  dim=2:行维度  |  dim=3:列维度 1.

张量 PyTorch 深度学习
阅读更多
一文讲透激活函数:为什么它能搞定非线性问题?
人工智能
2023-08-28 0k

一文讲透激活函数:为什么它能搞定非线性问题?

很多人入门神经网络,都会卡在“激活函数”这一步。 你可能听过无数遍这句话:加入激活函数,神经网络就能处理非线性问题。但心里大概率藏着一堆问号: 什么是线性?什么是非线性?为什么一条直线就能表示线性问题? 激活函数到底做了什么,凭什么它就能处理非线性? ReLU把负数都归零了,数据不会失真吗?信息不会丢吗? 识别图片这么复杂的事,和“曲线”到底有什么关系? 这篇文章我们完全抛开公式,用生活里的例子,把这些问题一次性讲透,数学小白、计算机小白也能看懂。 一、先搞懂基础:什么是线性?什么是非线性? 先别急着看神经网络,我们从最日常的事说起。 1. 线性问题:“成正比”的简单关系 想象你去买苹果,一斤5块钱。 买1斤,花5元 买2斤,花10元 买10斤,花50元 买的重量翻倍,花的钱也跟着翻倍。这种输入变多少,输出就按固定比例跟着变的关系,就叫线性关系。 把它画在坐标图上,就是一条直直的线,“线性”这个名字就是这么来的。 生活里纯线性的事还有很多:按小时算的时薪、匀速行驶的路程和时间……它们的规律都很简单:没有拐弯、没有阈值,永远按固定比例走。 2. 非线性问题:真实世界的本来面貌 但真实世界里,绝大多数事情都不是“成正比”这么简单。 举几个最常见的例子: 体温与健康:37度是正常,38度算发烧,42度就会有生命危险。不是温度越高“病得越重”,到了某个临界点,性质就完全变了。 按开关开灯:按到一半灯还是灭的,一旦过了某个临界点,灯突然全亮。中间有一个明确的“阈值”。 房价与面积:不是面积大一倍价格就大一倍,地段、学区、楼层、装修都会影响价格,各种因素交织,关系弯弯曲曲。 识别一张猫的照片:像素亮度变一点点,它还是猫;但变多了可能就变成狗了,绝不是简单的比例关系。 这些不成正比、有拐弯、有阈值、关系复杂的问题,就叫非线性问题。画在图上,它们是曲线、折线、奇形怪状的面,一条直线根本描述不了。 二、没有激活函数的神经网络:永远只会画直线 搞懂了线性和非线性,我们再来看神经网络本身。 神经网络最基本的单元叫“神经元”,它做的事特别简单:接收一堆输入,给每个输入分配一个“重要程度”(权重),全部加起来,再加上一个偏移量,然后输出结果。 说白了就是:把各个数按比例加起来。 比如判断一个水果是不是苹果,神经元可能会算: 颜色红不红 × 0.6 + 圆不圆 × 0.3 + 大小 × 0.1 = 总分 这本质上还是一个线性计算——输入怎么变,输出都按固定比例跟着变。 叠很多层,总该变复杂了吧? 有人会说:一层是直线,我叠一百层、一千层,总该能处理复杂问题了吧? 很遗憾,不行。 你可以这么理解:第一层把输入“按比例加一遍”得到结果,第二层再把这个结果“按比例加一遍”……不管你加多少层,本质上都是“按比例加来加去”,最后数学上化简一下,仍然等价于一层线性计算。 举个最简单的例子: 第一层:y = 2x + 1 第二层:z = 3y + 2 合起来化简:z = 3(2x+1) + 2 = 6x + 5 最后还是一条直线。

激活函数 神经网络 ReLU
阅读更多
AI真的懂你的话吗?一文看透大模型的“概率魔法”与“维度陷阱”
人工智能
2023-07-03 0k

AI真的懂你的话吗?一文看透大模型的“概率魔法”与“维度陷阱”

今天,我们就来扒一扒人工智能与人类认知的底层逻辑,揭开 AI 运转的四大核心真相。 一、 机器学习的本质:真的只是“算概率”吗? 很多人认为“机器学习 = 概率推测”。这个说法抓住了主流,但不够全面。 “概率推测”确实是最核心的思维方式。 比如判断一封邮件是不是垃圾邮件(分类),或者大模型预测下一个词是什么(生成),本质上都在计算概率。从统计学派的角度看,很多机器学习问题就是概率推断。 但是,机器学习的武器库远不止概率,它还包括其他核心机制: 算具体数值(回归):预测明天气温25度、房价300万。模型直接输出确定的连续数值,而不是推测概率。 算距离与几何(聚类、SVM):把相似的用户分群(K-Means),核心是计算数据点之间的“空间距离”;支持向量机(SVM)是寻找“最宽的几何间隔”来切分数据。这依赖的是几何和线性代数。 算奖励与试错(强化学习):AI 下围棋、机器人学走路,核心是通过不断“试错”来最大化累积奖励,学习的是行动策略。 小结:机器学习的核心是 “从数据中学习规律,从而对未知事物进行预测或决策”。“概率”只是它最常用的一种数学工具,而非全部。 二、 人脑 vs AI:我们的大脑也是一台“概率推测机”吗? 既然 AI 在算概率,那人类呢?现代认知科学和神经科学的主流观点给出了肯定的答案:人的大脑本质上就是一台“概率推测机”。 大脑是如何做概率推测的? 贝叶斯大脑假说:大脑时刻在做贝叶斯推断。它结合“先验概率”(过去的经验)和“当前证据”(感官输入),推测出最可能的结果。大脑不是被动接收信息,而是主动预测世界。 预测编码(自由能原理):神经科学家 Karl Friston 认为,大脑的核心任务是最小化“意外”。大脑时刻生成预测,如果现实和预测不符(比如你以为台阶还有一级,结果踩空了),大脑就会产生“预测误差”,并立刻更新概率模型。 神经层面的“概率投票”:单个神经元的放电充满随机性。大脑做决定时,是成千上万个神经元在“投票”,当支持某个决定的概率累积超过阈值时,大脑才会做出行动。 但是,人脑和 AI 有本质区别 虽然都是概率推测,但两者的表现截然不同: 计算精度:AI 是精确计算(算出下一个词是“苹果”的概率为 87.3%);人脑是模糊估算(靠“直觉”,容易产生认知偏差)。 数据需求:AI 需要海量数据(看几百亿个词);人脑擅长小样本学习(小孩看一次狗,就能认出所有的狗)。 核心目标:AI 为了优化目标函数(降低误差);人脑为了生存与繁衍(草丛里有动静,宁可错认为老虎,也不能漏判)。 三、 机器的“语义魔法”:它怎么懂文字的意思? 很多人以为,机器把文字转成向量,就像是给字典里的字编号(比如“苹果”是1024号,“梨”是1025号)。如果真是这样,机器确实不懂语义,因为编号之间没有数学关系。 真相是:现代 AI 用的向量不是“编号”,而是“多维空间里的坐标”。 1. 机器怎么“知道”语义?(靠统计学的“物以类聚”) 语言学有个核心假设:“一个词的含义,由它周围的词决定。” 机器在阅读了千亿篇文章后发现:“吃 ” 后面常接“苹果”、“香蕉”;“ 手机” 前面常接“苹果”、“华为”。 机器通过神经网络,把这种 “共同出现的概率” 变成了 “空间里的距离”。在机器的多维空间里,“国王”减去“男人”加上“女人”的坐标,刚好等于“女王”!机器不懂什么是国王,但它用几何距离完美表达了人类的语义关系。 2. 机器怎么“压缩”语义?(靠注意力机制“互相染色”) 当你输入“我想吃苹果”时,编码器(Encoder)通过注意力机制(Attention) 让这5个词互相“交流”:

机器学习 概率 贝叶斯
阅读更多
从开发视角彻底读懂机器学习核心数学概念
人工智能
2023-05-08 0k

从开发视角彻底读懂机器学习核心数学概念

很多工程师一看到 导数、偏导、反向传播、自动微分、梯度下降、权重、偏置 这些词,就容易觉得机器学习门槛很高。 其实这些概念放到代码里并不神秘。本文会用一个 广告系统智能出价引擎 的例子,尽量不用复杂公式,把这组核心概念讲清楚。 一、 业务场景引入:智能广告出价引擎 为电商网站开发广告投放系统:根据用户历史活跃度(过去30天点击次数 $x$),自动算出合理的广告竞价(预测出价 $y_{pred}$)。出价太高成本爆炸,太低抢不到曝光,因此要让系统自动“学会”配置最优的出价核心参数。 二、 流程里的核心角色 可以先记住这几个最核心的角色。 权重 w:决定某个特征有多重要。 偏置 b:决定基础输出是多少。 它们一起组成最简单的模型: $ y = w \cdot x + b $ w 和 b 一开始通常是随便给的,训练的过程,就是不断把这两个值调得更合适。 把输入数据送进模型,算出预测值,这一步就叫前向传播。 比如 x = 3,w = 2,b = 1,那么: $ y_{pred} = 2 \times 3 + 1 = 7 $ 但预测值 7 和真实值 10 还有差距,所以还要用损失函数来衡量“错了多少”。 比如用平方误差: $ Loss = (y_{pred} - y_{true})^2 = (7 - 10)^2 = 9

机器学习 数学基础 梯度下降
阅读更多