跟着李沐老师学习深度学习(十六)

server/2025/2/26 14:07:14/

继续学习深度学习(十六)

继续理解transformer

对于transformer的理解感觉还是云里雾里的,今天又找了一些视频进行一个梳理。

一个浅解

在B站学习发现评论区真的很不错,在沐神讲transformer论文的评论下,有一个评论特别好,感觉将transformer的核心讲出来了,看完感觉又清晰了不少:

  • 假设输入是一个句子,每个单词是一个token,首先将每个token进行embedding,映射到一个高维向量空间。这个向量仅表示该词的静态含义。

  • 有三个可训练的权重矩阵W_Q、W_K和W_V:

    • 每个token的embedding向量通过与W_Q相乘得到Q,可以理解为一系列这个token关心的查询问题,比如“你是一个形容词吗?”,“你是一个动词吗?”,“你是一种颜色吗?”

    • 每个token的embedding向量通过与W_K相乘得到K,可以理解为对于这个token的信息描述,或者说对于Q当中的问题的回答,比如“我是一个动词”,“我是一个形容词”,“我是一个颜色”等信息。

  • Q*K^T得到的就是一个大小为n*n的相关性矩阵。具象的理解,这个矩阵相当于每一个token通过K来回答其他token的Q的问题,每个位置上的乘积数值表示一个token基于问题的回答得到的对于另一个token的关注程度

    • 相关性矩阵需要除以 \sqrt{d_k}。原因是当d_k很大的时候,因为两个token的相关性是通过点积得到的,结果会趋向于极大或极小,这会导致softmax函数的结果偏向1和0,进入梯度非常小的区域,影响训练效率。(数值稳定性)
  • 然后,应用softmax函数,转换为总和为1的概率分布,表示每个token对其他token的注意力权重。softmax的结果反映了每个token在当前上下文中对于其他token的关注程度。
    在这里插入图片描述

    • 带有掩码的注意力:为了不让下文影响上文,将 当前token对下文的token的 Q*K^T 值赋值为-∞,然后在进行softmax回归( -∞变为0 ,最后保证总和还是1)
  • 每个token的embedding向量通过与W_V相乘得到V,这个矩阵可以理解为,如果有一个token B和该token A相关,那么token B该偏移多少得到以这个token A作为上下文的语义。

  • 最后,将注意力权重矩阵与V矩阵相乘,得到每个token在上下文中的表示。这个结果相当于对V矩阵中的值进行加权平均,使每个token的最终表示既保留了它的原始含义,又结合了与其他token的上下文关系。这样,模型能够在当前token的基础上综合其他相关token的信息,得出一个更符合整体语境的表示。

  • 多头注意力机制:在transformer文中,使用了多头注意力进行并行多头计算,以下就是图解,将每个头得到的结果进行相加,就得到了新的嵌入向量,对于输入的内容,能提炼出更高级、更抽象的概念。
    在这里插入图片描述

BERT网络

NLP里的迁移学习

  • 使用预训练好的模型来抽取词、句子的特征
    • 例如 word2vec(是一种典型的用于词向量表示学习的模型,它通过利用边上的词来预测中间词的方式(Skip-gram 模型)或反之(CBOW 模型)来学习词的分布式表示,将每个词映射到一个低维向量空间中,使得语义上相似的词在向量空间中距离较近)
    • 或者 语言模型(用于学习语言的概率分布,预测一个词序列出现的概率或者根据前文预测下一个词等)
  • 做迁移学习的时候:不更新预训练好的模型
    • 在当时的迁移学习实践中,通常会直接使用预训练好的模型(如 word2vec 或一些简单的语言模型)所得到的特征表示,而不更新这些预训练模型的参数。
  • 需要构建新的网络来抓取新任务需要的信息
    • Word2vec忽略了时序信息(即词在句子中的顺序对于理解句子语义的重要性)
    • 语言模型只看了一个方向,比如只能根据前文来预测后文,而没有同时利用后文信息来理解前文。

在BERT之前这是整个NLP的样子

BERT的动机

  • 基于微调的NLP模型
  • 预训练的模型抽取了足够多的信息(使得抽出来的特征足够好,能抓住足够的语义信息)
  • 新的任务只需要增加一个简单的输出层

在这里插入图片描述

BERT架构

  • 只有编码器的Transformer架构
  • 两个版本:
    • Base:#blocks=12, hidden size=768, heads=12,parameters=110M
    • Large:#blocks=24, hidden size=1024, heads=16,#parameters=340M
  • 在大规模数据上训练 > 3B词

与transformer解码器不同之处

  • 对输入的修改

    • 每个样本都是一个句子对
    • 加入额外的片段嵌入
    • 位置编码学习
      在这里插入图片描述
  • 预训练任务1:带掩码的语言模型

    • Transfomer的编码器是双向(完形填空),标准语言模型要求单向(预测未来)
    • 带掩码的语言模型每次随机(15%概率)将一些词元换成< mask>,比如句子 “我爱苹果”,可能会把 “苹果” 替换为< mask>,变成 “我爱< mask>”;模型需要根据被掩码词元周围的上下文信息,来预测这个被掩码的词原本是什么,以此让模型学习到更丰富的上下文语义信息,提升对文本整体语义的理解能力。
    • 因为微调任务中不出现< mask>(减少预训练和微调阶段的差异),在实际操作中,被选中替换的词元并非直接换成< mask>,而是按照一定概率分别处理,比如:
      • 80%概率下,将选中的词元变成
      • 10%概率下换成一个随机词元
      • 10%概率下保持原有的词元
  • 预训练任务2:下一句子预测

    • 预测一个句子对中两个句子是不是相邻
    • 训练样本中:
      • 50%概率选择相邻句子对:< cls>this movieis great< sep>like it < sep>
      • 50%概率选择随机句子对:this movie is great< sep>hello world <sèp>
    • 将< cls>对应的输出放到一个全连接层来预测

总结

  • BERT针对微调设计
  • 基于Transformer的编码器做了如下修改
    • 模型更大,训练数据更多
    • 输入句子对,片段嵌入,可学习的位置编码
    • 训练时使用两个任务:
      • 带掩码的语言模型
      • 下一个句子预测

扩散模型

这里是跟着B站一个up主学的,感觉很不错。
https://www.bilibili.com/video/BV1xih7ecEMb/?spm_id_from=333.337.search-card.all.click&vd_source=1b96401f7b3794cd336ed9054c440553

什么是扩散模型?

(如下图所示,一张图片可以通过T步 加噪 (高斯分布)变成一个充满噪声的图片,那么我们如何进行一个反向操作,进行去噪,这就是DDPM做的)
在这里插入图片描述
在这里插入图片描述
扩散模型可以形象的比喻为:“在我开始工作之前,雕塑已经在大理石块内完成。它已经在那里了我只需要雕刻掉多余的材料。”

正向扩散过程:

在这里插入图片描述

其中,正向扩散公式可推导为:
在这里插入图片描述
这里说明:我们可以从x_0跳跃式的跳到任意一步。
在这里插入图片描述

反向过程

在这里插入图片描述
最大似然估计
在这里插入图片描述
我们需要拟合每一步的分布:
在这里插入图片描述

什么是 q( x_(t-1) | x_t, x_0 )?

在这里插入图片描述在这里插入图片描述
因此,我们可以得出:

在这里插入图片描述
在这里插入图片描述
移除x_0
将前向公式拿过来,将x_0进行代替,可得到:
在这里插入图片描述
由上面的公式可以消掉x_0,但是其中ε_t无法确定。

为什么我们不能直接预测x_0? —— 首先预测一个大概的x_0,但肯定不会那么准确,因此我们每次只预测一点。

训练和采样

在这里插入图片描述
与原文对比:
在这里插入图片描述

  • 整个训练过程如下所示:
    在这里插入图片描述

  • 采样过程:

在这里插入图片描述

大概先这样,还需要继续学习


http://www.ppmy.cn/server/170763.html

相关文章

Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来

Kronecker分解&#xff08;K-FAC&#xff09;&#xff1a;让自然梯度在深度学习中飞起来 在深度学习的优化中&#xff0c;自然梯度下降&#xff08;Natural Gradient Descent&#xff09;是一个强大的工具&#xff0c;它利用Fisher信息矩阵&#xff08;FIM&#xff09;调整梯度…

《2025国内免费DeepSeek-R1自部署平台实测指南:三大运营商/腾讯/华为哪家强?附避坑清单》

更新日期&#xff1a;2025年2月24日 | 实测时效性声明&#xff1a;部分服务可能因政策调整限流或下线&#xff0c;建议结合最新信息参考。 一、前言&#xff1a;为什么关注DeepSeek-R1自部署&#xff1f; DeepSeek-R1-671B作为国内首个千亿级开源模型&#xff0c;其“满血版”…

ResNet 改进:添加LSKBlock动态调整其大空间感受场

目录 1. LSKBlock模块 2. 改进位置 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. LSKBlock模块 LSKBlock模块是一种用于深度学习模型的模块,尤其在计算机视觉任务中表现出色。它结合了局部特征、语义特征和全局特征,以…

Rk3568驱动开发_完善字符驱动_4

1.代码 驱动代码&#xff1a; #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/uaccess.h> #include <linux/io.h>#define CHREDE…

反向代理模块kfj

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

N皇后问题(位运算版本)

问题描述 在一个 的国际象棋棋盘上放置 个皇后&#xff0c;使得任意两个皇后都不能处于同一行、同一列或同一斜线上。目标是找出所有满足该条件的皇后放置方案。 时间复杂度是O(n!),对于n 乘 n的格子&#xff0c;每行都有n种选择&#xff0c;选择可能依次递减。同时要便随着…

【HDLbits--Comb组合逻辑】

HDLbits--Comb组合逻辑 1.5 组合逻辑1.5 Demo 在 Verilog 中&#xff0c;组合逻辑&#xff08;Combinational Logic&#xff09;是指输出仅依赖于当前输入的逻辑电路&#xff0c;没有记忆功能&#xff08;即没有状态存储&#xff09;。组合逻辑的特点是&#xff1a; 无时钟信号…

2025-02-25 学习记录--C/C++-用C语言实现删除字符串中的子串

用C语言实现删除字符串中的子串 在C语言中&#xff0c;你可以使用strstr函数来查找子串&#xff0c;然后用memmove或strcpy来覆盖或删除找到的子串。 一、举例 &#x1f430; #include <stdio.h> // 包含标准输入输出库&#xff0c;用于使用 printf 函数 #include <s…