李宏毅机器学习笔记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和"卷"看不到"起"。

相关推荐
万里鹏程转瞬至1 小时前
InternVL(1~3.5版本)多模型大模型训练中的数据集构造总结
人工智能
badhope6 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
吴佳浩7 小时前
GPU 编号进阶:CUDA\_VISIBLE\_DEVICES、多进程与容器化陷阱
人工智能·pytorch·python
吴佳浩7 小时前
GPU 编号错乱踩坑指南:PyTorch cuda 编号与 nvidia-smi 不一致
人工智能·pytorch·nvidia
小饕8 小时前
苏格拉底式提问对抗315 AI投毒:实操指南
网络·人工智能
卧蚕土豆8 小时前
【有啥问啥】OpenClaw 安装与使用教程
人工智能·深度学习
GoCodingInMyWay8 小时前
开源好物 26/03
人工智能·开源
AI科技星8 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
zhangfeng11338 小时前
Windows 的 Git Bash 中使用 md5sum 命令非常简单 md5做文件完整性检测 WinRAR 可以计算文件的 MD5 值
人工智能·windows·git·bash
hjxu20168 小时前
【OpenClaw 龙虾养成笔记一】在远程服务器,使用Docker安装OpenClaw
服务器·笔记·docker