继续学习深度学习(十六)
继续理解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主学的,感觉很不错。
什么是扩散模型?
(如下图所示,一张图片可以通过T步 加噪 (高斯分布)变成一个充满噪声的图片,那么我们如何进行一个反向操作,进行去噪,这就是DDPM做的)
扩散模型可以形象的比喻为:"在我开始工作之前,雕塑已经在大理石块内完成。它已经在那里了我只需要雕刻掉多余的材料。"
正向扩散过程:

其中,正向扩散公式可推导为:
这里说明:我们可以从x_0跳跃式的跳到任意一步。
反向过程

最大似然估计
我们需要拟合每一步的分布:
什么是 q( x_(t-1) | x_t, x_0 )?
因此,我们可以得出:
移除x_0
将前向公式拿过来,将x_0进行代替,可得到:
由上面的公式可以消掉x_0,但是其中ε_t无法确定。
为什么我们不能直接预测x_0? ------ 首先预测一个大概的x_0,但肯定不会那么准确,因此我们每次只预测一点。
训练和采样

与原文对比:
-
整个训练过程如下所示:
-
采样过程:

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