重学transformer【学习笔记】

以前对transformer的了解只能说个大概 你要说会吧 会的不彻底  不会吧 还能扯一顿。

来源:B站 老弓的学习笔记

 

 这一步讲 decoder的工作原理 怎么感觉像个串行的?一会需要多注意

 

 

 分批的时候是按照批次内的最长 我记得不是可设置吗 填充到多少?

 

拿一个batch举例

 

 input不需要处理 ,tar需要处理

 

 为什么要做这个处理呢 原因如下

 

 还有个创建mask的过程(要我看就跟 就是分段似的 )就是对不起来的符号置1 原来的还是0

 

 这里要仔细看原图。看看 decoder_padding_mask是怎么来的 

【输入层】embedding这里用最原始的embedding 比如说 将每个字用一个4维的向量表示

 

 【位置编码】

 

 embedding的结果加上这个位置编码。因为transformer并行计算 没理解到位置信息

位置编码公式:

 

 所得的位置向量和embedding相加

 

 在每个字的维度中 sin cos是交错的。

特点:1 当d_model 跟seq_length确定时候,位置编码即可确定(d_model按照自己通常的理解就是 每个字的维度长,seq_len则是句子长)2.同时引入了绝对位置信息与相对位置信息。

 

 绝对位置:每个横框相当于一个 向量 可以看到是独一无二的

相对位置:周期性变化规律

 

 改进方向:也就是说存在缺陷

现存缺点:相对位置信息在self-attention线性变化后消失(为什么消失??

 缩放 希望是embedding占绝大部分

 

 【Encoder部分】

 

 self-attention

 

 self-attention大致过程

 

 

 

 【scaled dot-product attention缩放点积注意力】

原因:1 前向传播角度 2.反向传播角度

前向传播角度

 

 为什么q*k之后均值是0 方差是dk了呢?

相当于求这块的呗

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 (自注:终于从方差角度讲清楚了 居然还听懂了 嘿嘿)

 反向传播角度

 

 (自注 为啥会梯度消失 )

 

 为0也不行

 

 【Multi head】

理论上

 

 实际上

用同一套W参数  然后将QKV拆分

 

 

 

 

 

 为什么要使用多头:

保证了transformer可以注意到不同子空间的信息,捕捉到更加丰富的特征信息

11【padding 掩码】消除padding的影响 具体就产生在softmax处

 

 如果没有掩码 那绿色的0项目也会产生对应权重。

 【add & norm】

add实际上是残差网络

 

 这个add残差 就是 这个Inp输入经过多头注意力后 在与这个inp相加

作用:能使训练层数达到比较深的层次。

这里作者主要讲述了原因:(ps:以前自己只知道面上的作用,并不了解其原理)

 

 仔细看图中的1是哪来的,y=XA+XC所以 为1.

 

 有了1这项保证,无论第二项怎么样 也不会造成梯度消失。

 

 

 这个视频有专门去讲

什么是batchnorm 对每个特征求一个均值 方差。对每个值减去均值 除以 标准差

 

 什么是layernorm?

 

 为什么用layernorm而不用batchnorm

首先最直观的原因是batchnorm在nlp领域效果不好

 

 如图所示,你这个batchnorm加了padding项算出来的 肯定不好啊

 

 【前馈神经网络】

其实就是两层全连接层

【decoder】

 

 

 

 

 

 看一个并集   上三角是look ahead mask  矩形是padding mask

 

 

 这个的多头注意力 是左边产生了 k v   右边decoder的产生了q

这里为什么没有Look ahead mask呢?

因为现在是decoder跟encoder进行交互

 

 【linear层】隐藏神经元的个数是词表个数包含开头结尾

【损失函数】交叉熵损失

要有1 标签值 2消除padding项带来的影响。

 

 

 

 注意此处的padding项   与以前的做法相反 此处是padding的置为0

准确的说是两项相乘。之前是相加是因为后边经过softmax

 

 

注意:

如果标签是one-hot就可以categoricalCrossentropy

 

 如上图所示 右边的标签是个one hot的时候

注意这个交叉熵损失 解决了自己以前的一个困惑 就是每个字符都分类  得出一个序列的损失如何计算

查pytroch里边该是什么函数没查到啊 看起来像这个?

nn.MultiMarginLoss  https://blog.csdn.net/weixin_43687366/article/details/107927693?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.pc_relevant_default&spm=1001.2101.3001.4242.2&utm_relevant_index=4

 

 (这里他说 进来的predi是个概率值 那yi是个什么东西 是1?不能吧)

 

 要把绿色产生的损失消除掉  因为是填充的 准不准的无所谓

 

 

 然后对这个loss求一个平均的损失

 【自定义学习率】

 

posted on 2022-04-12 15:09  nlp如此迷人  阅读(134)  评论(0)    收藏  举报

导航