当前位置: 首页 > news >正文

工程师转型算法工程师 深入浅出理解transformer-手搓板

以下部分引用台湾大学李宏毅教授的ppt 自己理解解释一遍(在youtobe 上可以搜索李宏毅即可)

首先先来看transformer的架构图

Embedding

我们先从Imput Embedding 跟 OutPutEmbedding 开始,让我们用 bert 模型来做一个解释

从huggingface上下载的bert-base-chinese模型中 有一个vocab.txt 放的是这个模型所有能认识的字;

在config.json 中可以看到这个模型最大做事的vocab 是21128 

让我们来写个py测试类来验证编码的过程

from transformers import AutoTokenizer, BertTokenizer#加载字典和分词器
token = BertTokenizer.from_pretrained("bert-base-chinese")
# print(token)sents = ["价格在这个地段属于适中, 附近有早餐店,小饭店, 比较方便,无早也无所"]#批量编码句子
out = token.batch_encode_plus(batch_text_or_text_pairs=[sents[0]],add_special_tokens=True,#当句子长度大于max_length时,截断truncation=True,max_length=50,#一律补0到max_length长度padding="max_length",#可取值为tf,pt,np,默认为listreturn_tensors=None,#返回attention_maskreturn_attention_mask=True,return_token_type_ids=True,return_special_tokens_mask=True,#返回length长度return_length=True
)
#input_ids 就是编码后的词
#token_type_ids第一个句子和特殊符号的位置是0,第二个句子的位置1()只针对于上下文编码
#special_tokens_mask 特殊符号的位置是1,其他位置是0
print(out)
for k,v in out.items():print(k,";",v)#解码文本数据
# print(token.decode(out["input_ids"][0]),token.decode(out["input_ids"][1]))

我们可以看到第一字价是字典的817的位置,第一张图已经展示了;整个流程简单的说明了transfomer的Embedding 过程,就是把文字变成 Token的过程

当然后面的GPT3 这些其他的transfomer 都把这个词典vocab.txt 给隐藏起来了;

多头注意力机制

第一步 embding完后把相近的token 放到一个多维矩阵里面了;这样相近的词就靠的更近了

需要加入位置编码,这样矩阵才能感知句子的词的前后顺序

自注意力计算过程:

  • 对每个输入token,GPT计算三个向量:查询(Q)、键(K)和值(V)
  • 这些向量通过输入与学习到的权重矩阵相乘得到
  • 然后计算Q与K的点积来确定注意力分数
  • 最后将注意力分数用于对V进行加权求和

 这块其实理解的不是很好

Feed Forward

前向传播是模型预测/推理的过程,如图右侧所示。它的步骤非常直观:

  1. 将数据输入到神经网络
  2. 数据在网络内部经过一系列数学计算
  3. 网络输出预测结果

这就像人类的思考过程:接收信息 → 思考处理 → 得出结论。

输出线性层与Softmax

        将解码器输出转换为概率分布

完整流程:

在完整的处理流程中:

  1. 输入经过嵌入层、位置编码和多层 Transformer 块处理
  2. 最终的隐藏状态通过一个线性层(通常是与输入嵌入共享权重的)
  3. 线性层输出经过 softmax 函数转换为概率分布
  4. 这个概率分布就是最终的输出,表示下一个 token 可能是词表中每个词的概率

对于像 GPT 这样的自回归模型,在每个位置上模型输出的是词表中所有可能 token 的概率分布,最高概率的 token 通常被选为该位置的预测结果。

这些概率是模型对"下一个 token 应该是什么"的预测,是用于实际生成文本或计算损失函数的关键输出。 注意GPT 只使用transformer 中的解码器部分

更多神经网络相关的学习笔记见我的github: https://github.com/caicongyang/ML2LLM/blob/main/LLM/neural_network_fundamentals_simplified.md

相关文章:

  • 雅努斯问题(Janus Problem)及解决方案
  • RISC-V JTAG:开启MCU 芯片调试之旅
  • 鸿蒙NEXT开发动画案例3
  • python-71-基于pyecharts的通用绘图流程
  • Unity-Socket通信实例详解
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月7日第71弹
  • 14前端项目----登录/注册
  • Android 有线网开发调试总结
  • STC单片机--仿真调试
  • 安装spark与配置环境变量
  • 【Python】算法笔记
  • TR-5000
  • Linux系统基本指令和知识指南
  • Vue 3 中的 nextTick 使用详解与实战案例
  • MES 运维
  • Vuerouter 的底层实现原理
  • boost笔记: Cannot open include file: ‘boost/mpl/aux_/preprocessed/plain/.hpp‘
  • 用3D slicer 去掉影像中的干扰体素而还原干净影像(脱敏切脸处理同)
  • CUDA:out of memory的解决方法(实测有效)
  • 【MATLAB代码解析】基于蜜蜂交配优化算法的排列组合优化问题MATLAB实现
  • 山西忻州市人大常委会副主任郭建平接受审查调查
  • 匈牙利史专家阚思静逝世,享年87岁
  • 巴西总统卢拉将访华
  • 北京2025年住房发展计划:供应商品住房用地240-300公顷,建设筹集保租房5万套
  • 临港新片区:发布再保险、国际航运、生物医药3个领域数据出境操作指引
  • 优秀“博主”在上海杨浦购房最高补贴200万元,有何条件?