avatar
文章
121
标签
128
分类
34
Home
Archives
Categories
Tags
About
LsWorld
Home
Archives
Categories
Tags
About

LsWorld

RoPE详解:从二维旋转到PyTorch手写旋转位置编码
发表于2026-08-14|自然语言处理
前面的 Transformer 和 Mini-GPT 文章分别使用了固定正弦位置编码与可学习绝对位置向量。它们都在解决同一个问题: Self-Attention 可以比较 token 内容,却不会天然知道 token 的先后顺序。 这篇文章继续研究另一种位置编码:RoPE(Rotary Position Embedding,旋转位置编码)。 RoPE 的做法很特别。它不把位置向量直接加到 token 表示上,而是在每个注意力头内部,把 Query 和 Key 按位置旋转不同角度: token hidden state -> 线性投影得到 Q、K、V -> 根据 position 旋转 Q 和 K -> 计算 QK^T -> Softmax -> 对没有旋转的 V 加权求和 它的核心价值可以浓缩为一句话: 用绝对位置决定旋转角度,让 Query 与 Key 的点积自然只显式依赖相对位置。 本文会从二维向量开始,逐步回答下面的问题: 为什么旋转能够表示位置? 为什么两个绝对位置最后会变成一个相对距离? 为什么只旋转 Q 和 K,不旋转 V? 高维向量怎...
手写Mini-GPT:从因果语言模型到PyTorch完整实现
发表于2026-08-12|自然语言处理
上一篇文章从 Encoder-Decoder 结构出发,完整介绍了 Transformer 的 Self-Attention、Multi-Head Attention、位置编码、Mask、Encoder 和 Decoder。 这一次,我们不再调用 nn.Transformer,而是只使用 PyTorch 的基础层,从零手写一个能够训练和生成文本的 Mini-GPT。 它会包含 GPT 最核心的组件: 字符级 Tokenizer。 Token Embedding 和可学习 Position Embedding。 手写 Multi-Head Causal Self-Attention。 Pre-Norm Transformer Block。 GELU 前馈网络。 自回归语言模型损失。 AdamW、学习率 warmup、余弦衰减和梯度裁剪。 Temperature、Top-k 与多项式采样。 权重绑定和 KV Cache 原理。 最终模型只有约 35 万个参数,可以在 CPU 上训练。它当然不是 ChatGPT,也不会拥有通用知识,但它足以把 GPT 内部最重要的数据流完整跑通。 ...
Transformer详解:从自注意力手算到PyTorch完整实现
发表于2026-08-11|自然语言处理
上一篇 Seq2Seq 文章中,我们使用 GRU 构造了 Encoder-Decoder,并通过 Attention 缓解“把整句话压缩成一个向量”的信息瓶颈。 不过,RNN、LSTM 和 GRU 还有一个很难绕开的特点: 必须按照时间顺序逐步计算,后一个位置需要等待前一个位置的隐藏状态。 假设一句话有 100 个 token,RNN 需要从第 1 个 token 一直算到第 100 个 token。即使 GPU 很擅长矩阵并行,也不能完全消除这种前后依赖。 Transformer 改变了处理序列的方式: 不再使用循环逐步传递信息,而是让每个 token 直接通过 Attention 查看序列中的其他 token。 这样一来,训练时可以并行处理整段序列,也更容易建模相距很远的词之间的关系。 1. Transformer 要解决什么问题先看一句话: 小明 把 苹果 放在 桌子 上,因为 他 刚刚 买了 它 理解这句话时,需要建立多处联系: “他”更可能指向“小明”。 “它”更可能指向“苹果”。 “放在”与“桌子上”共同表达一个位置关系。 在 RNN 中,前面的信...
AdamW Optimizer:为什么要把权重衰减与梯度更新解耦
发表于2026-08-10|机器学习
在上一篇 Adam Optimizer 文章中,我们知道 Adam 会同时维护梯度的一阶矩和二阶矩,并根据历史梯度为不同参数调整有效步长。 当模型出现过拟合时,我们还希望限制参数避免变得过大,于是经常会为优化器设置 weight_decay: optimizer = torch.optim.AdamW( model.parameters(), lr=1e-3, weight_decay=1e-2, ) 这里为什么常用 AdamW,而不是简单地给 Adam 加一个 L2 正则项?AdamW 中的字母 W 又代表什么? 一句话概括: AdamW 把权重衰减从 Adam 的梯度与矩估计中分离出来,让“根据损失优化参数”和“按比例缩小参数”成为两件独立的事。 1. 先回顾 AdamAdam 对当前梯度 $g_t$ 维护两种状态。 一阶矩: $$m_t=\beta_1m_{t-1}+(1-\beta_1)g_t$$ 二阶矩: $$v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2$$ 经过偏差修正后: $$\hat...
Seq2Seq:从Encoder-Decoder到Attention与PyTorch实现
发表于2026-08-10|自然语言处理
前面的文本处理和 Word2Vec 文章主要解决了两个问题: 如何把文本转换成 token id。 如何把 token id 转换成词向量。 但很多自然语言处理任务不是“输入一句话,输出一个类别”,而是“输入一个序列,输出另一个序列”。 例如机器翻译: 输入:我 喜欢 自然语言处理 输出:I like natural language processing 输入和输出的长度可能不同,词序也可能不同。普通 MLP 或单纯的文本分类器很难直接处理这种映射。 Seq2Seq,全称 Sequence to Sequence,就是专门学习“序列到序列”映射的一类模型框架。 一句话概括: Seq2Seq 先用 Encoder 理解整个输入序列,再让 Decoder 根据编码结果逐步生成输出序列。 1. 什么是序列到序列任务Seq2Seq 的输入和输出都是有顺序的元素序列: $$X=(x_1,x_2,\ldots,x_{T_x})$$ $$Y=(y_1,y_2,\ldots,y_{T_y})$$ 其中输入长度 $T_x$ 与输出长度 $T_y$ 不必相同。 ...
Adam Optimizer:从梯度下降到自适应学习率
发表于2026-08-09|机器学习
训练神经网络时,我们经常会看到下面这行代码: optimizer = torch.optim.Adam(model.parameters(), lr=0.001) 它很短,却承担着一个关键任务:根据反向传播得到的梯度,不断更新模型中的权重和偏置。 Adam 的全称是 Adaptive Moment Estimation,可以翻译为“自适应矩估计”。它同时利用梯度的移动平均和梯度平方的移动平均,为不同参数自动调整更新方向与步长。 一句话概括: Adam 在动量方法的基础上记录梯度方向,又根据历史梯度大小为每个参数调整学习率,因此通常比普通 SGD 更容易上手。 1. 优化器到底负责什么神经网络训练通常包含三个核心步骤: optimizer.zero_grad() loss.backward() optimizer.step() 它们的职责并不相同: 代码 作用 optimizer.zero_grad() 清空上一轮保存在参数上的梯度 loss.backward() 根据计算图和链式法则计算梯度 optimizer.step() 根据梯度和优化算法更...
Word2Vec:从词向量训练到神经网络分类器
发表于2026-08-03|自然语言处理
前面学习文本处理时,我们已经知道:自然语言不能直接送进模型,必须先变成数字。 最朴素的方法是 One-hot。比如词表里有 10000 个词,每个词就用一个长度为 10000 的向量表示,属于自己的位置为 1,其他位置为 0。 但 One-hot 有两个明显问题: 向量太稀疏,绝大多数位置都是 0。 词和词之间没有语义关系,“国王”和“王后”在 One-hot 空间里并不比“国王”和“香蕉”更接近。 word2vec 要解决的就是这个问题: 把词表示成低维、稠密、带有语义关系的向量。 例如: 国王 -> [0.32, -0.18, 0.71, ...] 王后 -> [0.29, -0.15, 0.69, ...] 香蕉 -> [-0.44, 0.83, 0.12, ...] 如果训练得好,“国王”和“王后”的向量会更接近,而“国王”和“香蕉”的向量会更远。 这篇文章就从 word2vec 出发,理解词向量是怎么训练出来的、怎么改进和评价词向量,并进一步过渡到神经网络文本分类器。 1. 词向量到底是什么词向量,也叫 word embedding,本质上就是给每个词分...
深度学习入门:从神经网络到学习路线
发表于2026-07-08|机器学习
学习深度学习时,很多人一上来就会被一堆名词淹没:神经网络、反向传播、CNN、RNN、Transformer、Embedding、优化器、损失函数、过拟合、预训练、微调…… 这些概念当然重要,但如果一开始没有一张地图,就很容易出现一种感觉:每个词好像都看过,但不知道它们之间到底是什么关系。 所以这篇文章不急着推公式,也不急着写复杂代码,而是先回答几个更基础的问题: 深度学习到底在学什么? 神经网络为什么可以拟合复杂关系? 一个模型是如何被训练出来的? 入门之后应该按什么顺序继续学? 一句话概括: 深度学习就是用多层神经网络从数据中自动学习特征表示,再用这些表示完成分类、回归、生成、推荐、预测等任务。 1. 深度学习是什么在传统机器学习中,我们经常需要手动设计特征。 比如要判断一封邮件是不是垃圾邮件,可能会人工提取这些特征: 是否包含“免费”“中奖”“限时”等关键词。 邮件长度是多少。 是否包含很多链接。 发件人是否陌生。 这些特征再送入逻辑回归、决策树、随机森林、GBDT 等模型中进行预测。 深度学习的思路稍微不一样。它希望模型自己从原始数据中逐层学习特征。 以图...
MLP多层感知机:从原理到PyTorch实现
发表于2026-07-05|机器学习
MLP(Multilayer Perceptron,多层感知机)是最基础也最重要的神经网络之一。 如果说线性回归、逻辑回归只有一层线性变换,那么 MLP 就是在多层线性变换之间加入非线性激活函数,让模型能够拟合更复杂的关系。 它的结构并不神秘: 输入特征 -> 隐藏层 -> 激活函数 -> 隐藏层 -> 激活函数 -> 输出层 一句话概括: MLP 用多个全连接层和非线性激活函数,把输入特征一步步变换成适合分类或回归的输出。 1. 为什么需要 MLP前面学习线性回归时,模型大致是: $$\hat{y}=wx+b$$ 对于多维输入,可以写成: $$\hat{y}=xW+b$$ 这类模型只能表达线性关系。 例如下面这种问题,线性模型就比较吃力: 两个特征单独看都不能决定类别, 但它们组合起来以后才有意义。 经典例子是 XOR: $x_1$ $x_2$ 标签 0 0 0 0 1 1 1 0 1 1 1 0 这四个点无法用一条直线完美分开。 MLP 的作用就是:先通过隐藏层把原始特征映射到新的空间,再在新空间里完成分类或回归。...
图神经网络GNN:让模型学会理解关系数据
发表于2026-06-20|机器学习
前面学习线性回归、逻辑回归、决策树、GBDT 这类模型时,我们面对的数据通常是表格、向量或图片。每个样本大多可以单独看待。 但现实中还有很多数据天然带有“关系”: 社交网络中,用户之间有好友关系。 推荐系统中,用户、商品、点击、购买构成交互图。 分子结构中,原子是节点,化学键是边。 交通网络中,路口是节点,道路是边。 知识图谱中,实体和实体之间有语义关系。 这些数据的重点不只在于“单个对象有什么特征”,还在于“对象之间如何连接”。图神经网络(Graph Neural Network,GNN)就是专门用来处理这类图结构数据的神经网络。 一句话概括: GNN 让每个节点不断接收邻居的信息,更新自己的表示,从而把节点特征和图结构一起编码进向量里。 1. 为什么普通神经网络不够用假设我们要判断一个社交网络用户是否可能对某个话题感兴趣。 如果只看用户自己的特征,例如年龄、地区、历史点击,当然能得到一些信息。 但在社交网络里,用户的邻居也很重要: 他的朋友是否都关注这个话题? 他是否处在某个兴趣社区中? 他和哪些关键用户有连接? 他在网络中的位置是否特殊? 普通全连接神经网...
PPO算法:从策略梯度到裁剪目标函数
发表于2026-06-15|机器学习
PPO(Proximal Policy Optimization,近端策略优化)是深度强化学习中非常常用的一类策略优化算法。 如果前面已经理解了 MDP、奖励、价值函数和策略,那么 PPO 要解决的问题可以这样理解: 智能体已经有一个策略了。 现在我们根据新采样到的经验,让这个策略变得更好。 但每次更新不能太激进,否则好不容易学到的行为可能被一下子破坏。 这也是 PPO 名字里 “Proximal” 的含义:更新策略时,希望新策略离旧策略近一点。 一句话概括: PPO 是一种策略梯度算法,它通过裁剪新旧策略概率比值,限制单次策略更新幅度,从而在实现简单和训练稳定之间取得平衡。 1. 为什么需要 PPO在强化学习中,我们最终想学到一个策略: $$\pi_\theta(a|s)$$ 它表示在状态 $s$ 下选择动作 $a$ 的概率。这里的 $\theta$ 是神经网络参数。 如果某个动作带来了更高的长期回报,我们就希望以后在类似状态下更倾向于选择它;如果某个动作表现很差,就希望降低它被选中的概率。 这就是策略梯度的基本思想: 好动作的概率提高 坏动作的概率降低 但普通策...
HEFT算法:异构计算中的任务调度方法
发表于2026-06-14|算法
在并行计算、云计算、边缘计算和异构芯片中,我们经常会遇到这样的问题:一个应用不是一个单独任务,而是一组有依赖关系的子任务;这些子任务可以运行在不同处理器上,但每个处理器的速度并不一样。 例如: 图像处理流水线中,解码、滤波、特征提取、分类之间有先后依赖。 科学计算工作流中,某些矩阵运算必须等前面的数据准备完成。 CPU、GPU、FPGA 同时存在时,不同任务适合的执行设备不同。 边缘计算中,任务可以放在本地设备、边缘服务器或云端执行。 这类问题的核心是: 哪些任务先执行? 每个任务放到哪个处理器上执行? 怎样让整个工作流尽快完成? HEFT(Heterogeneous Earliest Finish Time,异构最早完成时间)就是一个经典的异构任务调度启发式算法。它不保证一定得到全局最优解,但因为思想清晰、计算复杂度相对较低、效果通常不错,所以经常作为异构计算调度问题中的基线算法。 一句话概括: HEFT 先根据任务到出口任务的“平均关键路径长度”给任务排序,再按照这个顺序把每个任务放到能最早完成它的处理器上。 1. 为什么需要 HEFT假设我们有 4 个任务:...
12…11
avatar
LsWorld
专注机器学习、深度学习与工程实践
文章
121
标签
128
分类
34
GitHub
公告
欢迎来到 LsWorld,这里记录机器学习学习路线、实验笔记和代码实践。
最新文章
RoPE详解:从二维旋转到PyTorch手写旋转位置编码2026-08-14
手写Mini-GPT:从因果语言模型到PyTorch完整实现2026-08-12
Transformer详解:从自注意力手算到PyTorch完整实现2026-08-11
AdamW Optimizer:为什么要把权重衰减与梯度更新解耦2026-08-10
Seq2Seq:从Encoder-Decoder到Attention与PyTorch实现2026-08-10
分类
  • C5
  • Flutter2
  • Hexo2
  • JavaScript1
  • TypeScript1
  • Vercel1
  • Vue4
  • Vue31
标签
数据链路层 PySide6 中央处理器 GRU 总线 MLP AI角色 计算机网络体系结构 梯度下降 javascript 机器学习 前端工程化 Transformer Vue 泛化能力 文本处理 决策树 python PyTorch AI聊天 Dart Attention es6 回归算法 爬虫 嵌入式 GCN 存储系统 NLP Vue3 指令系统 GBDT 自然语言处理 文本分类 Decoder-only mysql 马尔可夫决策过程 操作系统 词向量 Self-Attention
归档
  • 八月 2026 7
  • 七月 2026 2
  • 六月 2026 7
  • 五月 2026 13
  • 二月 2025 2
  • 一月 2025 10
  • 十二月 2024 1
  • 二月 2024 3
网站信息
文章数目 :
121
本站访客数 :
本站总浏览量 :
最后更新时间 :
© 2025 - 2026 By LsWorld框架 Hexo 6.2.0|主题 Butterfly 5.5.5-b1