李宏毅机器学习笔记24

目录

摘要

Transformer代码部分理解


摘要

本篇文章继续学习李宏毅老师2025春季机器学习课程,学习内容是transformer的代码部分,通过代码帮助理解transformer。

Transformer代码部分理解

首先复习一下transformer的整体结构,如下图所示

先看下面这张图左下角"我爱你"为encoder的输入,右下角的"S I LOVE YOU"为decoder的输入,

右上角的"I LOVE YOU E"为真实的标签(答案)。用于计算decoder输出的损失。

下图的代码部分与上图对应起来

就是这样

其中的特殊字符"S"表示开始信号,"E"表示END信号,"P"为填充字符,即不足最大长度的部分用"P"填充。参考下图的例子。

模型的相关参数如下,512为字符转换为embedding的大小,前馈神经网络映射维度为2048,K,V维度为64,encoder和decoder的个数,multi-head的head数为8。

encoder部分代码

src_emb对应词表功能

通过词表将字符转化为向量

对于位置编码,基本公式如下图,对奇数偶数的位置不同也有不同的公式,pos为位置,例如维度为512时,pos为0-511之中的一个数。

位置编码对应实现代码如下图,div_term实现的是公式中共有的部分。最后的forward部分对应词向量与位置编码相加。

需要注意的是,下图的函数获取pad字符的位置。

为什么需要知道pad字符的位置?在下图的例子中,这个图可理解为两个字之间的相似性,pad符号原本是句子不存在的,所有在计算分数时应该去掉pad。

如何获取位置?使用一个符号矩阵,1表示为pad字符。

具体实现代码如下

实现encoder的具体函数,一个实现前馈神经网络,一个实现多头自注意力层。

多头自注意力层如下,其中Q,K矩阵维度相同。

decoder部分代码,decoder与encoder类似。

差别的地方在自注意力层的masked,实现时其实就是一个上三角矩阵,为1时就表示为pad,即被去除,所以在输入S时,只能看见S看不到"卷",在输入S和"卷"时,只能看见S和"卷"看不到"起"。

相关推荐
格砸39 分钟前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
可观测性用观测云1 小时前
可观测性 4.0:教系统如何思考
人工智能
sunny8651 小时前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github
小笼包包仔1 小时前
OpenClaw 多Agent软件开发最佳实践指南
人工智能
smallyoung2 小时前
AgenticRAG:智能体驱动的检索增强生成
人工智能
_skyming_2 小时前
OpenCode 如何做到结果不做自动质量评估,为什么结果还不错?
人工智能
HXhlx2 小时前
CART决策树基本原理
算法·机器学习
南山安2 小时前
手写 Cursor 核心原理:从 Node.js 进程到智能 Agent
人工智能·agent·设计
掘金安东尼2 小时前
如何为 AI 编码代理配置 Next.js 项目
人工智能
aircrushin3 小时前
轻量化大模型架构演进
人工智能·架构