Update from Sync Service

This commit is contained in:
FNS Service
2026-07-31 15:28:08 +08:00
commit b8a78631a4
569 changed files with 193313 additions and 0 deletions
@@ -0,0 +1,28 @@
---
doc_type: hypothesis-highlights
url: 'https://blog.csdn.net/qq_38410428/article/details/101102075'
---
# Pytorchmodel.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别_初识-CV的博客-CSDN博客_pytorch train
## Metadata
- Author: [blog.csdn.net]()
- Title: Pytorchmodel.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别_初识-CV的博客-CSDN博客_pytorch train
- Reference: https://blog.csdn.net/qq_38410428/article/details/101102075
- Category: #source/article🗞
- Tags:
## Highlights
- 如果模型中有BN层(Batch Normalization)和 Dropout,需要在训练时添加model.train()
- 在这个特定的例子中,似乎每50次迭代就会降低准确度。 如果我们检查一下代码, 我们看到确实在train函数中设置了训练模式。
- 修复很简单,我们将model.train() 向下移动一行,让其在训练循环中。理想的模式设置是尽可能接近推理步骤,以避免忘记设置它。修正后,我们的训练过程看起来更合理,没有中间的峰值出现。
- 主要用于通知dropout层和BN层在training和validation/test模式间切换: 在train模式下,dropout网络层会按照设定的参数p,设置保留激活单元的概率(保留概率=p)。BN层会继续计算数据的mean和var等参数并更新。在eval模式下,dropout层会让所有的激活单元都通过,而BN层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值。
- 2.eval模式不会影响各层的gradient计算行为,即gradient计算和存储与training模式一样,只是不进行反向传播(back probagation)。
- 而with torch.no_grad()则主要是用于停止autograd模块的工作,以起到加速和节省显存的作用。它的作用是将该with语句包裹起来的部分停止梯度的更新,从而节省了GPU算力和显存,但是并不会影响dropout和BN层的行为。
- 如果不在意显存大小和计算时间的话,仅仅使用model.eval()已足够得到正确的validation/test的结果;而with torch.no_grad()则是更进一步加速和节省gpu空间(因为不用计算和存储梯度),从而可以更快计算,也可以跑更大的batch来测试。
@@ -0,0 +1,35 @@
---
doc_type: hypothesis-highlights
url: 'https://blog.csdn.net/Tink1995/article/details/105012972'
---
# 史上最小白之Attention详解_Stink1995的博客-CSDN博客_attention小白解释
## Metadata
- Author: [blog.csdn.net]()
- Title: 史上最小白之Attention详解_Stink1995的博客-CSDN博客_attention小白解释
- Reference: https://blog.csdn.net/Tink1995/article/details/105012972
- Category: #source/article🗞
- Tags:
## Highlights
- 上图就是引入了Attention 机制的Encoder-Decoder框架。咱们一眼就能看出上图不再只有一个单一的语义编码C,而是有多个C1,C2,C3这样的编码。当我们在预测Y1时,可能Y1的注意力是放在C1上,那咱们就用C1作为语义编码,当预测Y2时,Y2的注意力集中在C2上,那咱们就用C2作为语义编码,以此类推,就模拟了人类的注意力机制。
- 将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成(对应到咱们上里面的例子,key和value是相等地,都是encoder的输出值h),此时给定Target中的某个元素Query(对应到上面的例子也就是decoder中的hi),通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数
- 点积:就是将Query和Keyi进行点积,Transformer中就是用的这种方法。
- Cosine相似性-余弦相似度: 分子就是两个向量Query与Key的点积 分母就是两个向量的L2范数,(L2范数:指向量各元素的平方和然后求平方根)
- 计算出Query和Keyi的相似性后,第二阶段引入类似SoftMax的计算方式对第一阶段的相似性得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重
- 第二阶段的计算结果 ai 即为 Valuei 对应的权重系数,然后进行加权求和即可得到Attention数值:
- 阶段1:Query与每一个Key计算相似性得到相似性评分s 阶段2:将s评分进行softmax转换成[0,1]之间的概率分布 阶段3:将[a1,a2,a3…an]作为权值矩阵对Value进行加权求和得到最后的Attention值
- 看到这你应该已经能够Attention的强大之处了,但是如此强大的Attention真的是无懈可击,没有一点缺点的吗? 优点: 1.速度快。Attention机制不再依赖于RNN,解决了RNN不能并行计算的问题。这里需要说明一下,基于Attention机制的seq2seq模型,因为是有监督的训练,所以咱们在训练的时候,在decoder阶段并不是说预测出了一个词,然后再把这个词作为下一个输入,因为有监督训练,咱们已经有了target的数据,所以是可以并行输入的,可以并行计算decoder的每一个输出,但是再做预测的时候,是没有target数据地,这个时候就需要基于上一个时间节点的预测值来当做下一个时间节点decoder的输入。所以节省的是训练的时间。 2.效果好。效果好主要就是因为注意力机制,能够获取到局部的重要信息,能够抓住重点。 缺点: 1.只能在Decoder阶段实现并行运算,Encoder部分依旧采用的是RNN,LSTM这些按照顺序编码的模型,Encoder部分还是无法实现并行运算,不够完美。 2.就是因为Encoder部分目前仍旧依赖于RNN,所以对于中长距离之间,两个词相互之间的关系没有办法很好的获取。
- Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。其具体计算过程是一样的,只是计算对象发生了变化而已,相当于是Query=Key=Value,计算过程与attention一样
- 我们想知道这句话中的its,在这句话里its指代的是什么,与哪一些单词相关,那么就可以将its作为Query,然后将这一句话作为Key和Value来计算attention值,找到与这句话中its最相关的单词。通过self-attention我们发现its在这句话中与之最相关的是Law和application,通过我们分析语句意思也十分吻合。
- 如此引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增加计算的并行性也有直接帮助作用。正好弥补了attention机制的两个缺点,这就是为何Self Attention逐渐被广泛使用的主要原因。
@@ -0,0 +1,25 @@
---
doc_type: hypothesis-highlights
url: 'https://blog.csdn.net/Tink1995/article/details/105080033'
---
# 史上最小白之Transformer详解_Stink1995的博客-CSDN博客_transformer
## Metadata
- Author: [blog.csdn.net]()
- Title: 史上最小白之Transformer详解_Stink1995的博客-CSDN博客_transformer
- Reference: https://blog.csdn.net/Tink1995/article/details/105080033
- Category: #source/article🗞
- Tags:
## Highlights
- 输入inputs embedding后需要给每个word的词向量添加位置编码positional encoding
- 咱们的Transformer 的是完全基于self-Attention地,而self-attention是不能获取词语位置信息地
- 《Attention Is All You Need》论文中Transformer使用的是正余弦位置编码。位置编码通过使用不同频率的正弦、余弦函数生成,然后和对应的位置的词向量相加,位置向量维度必须和词向量的维度一致
- 可以通过数据训练学习得到positional encoding,类似于训练学习词向量,goole在之后的bert中的positional encoding便是由训练得到地
- pos表示单词在句子中的绝对位置,pos=0,1,2…,例如:Jerry在"Tom chase Jerry"中的pos=2dmodel表示词向量的维度,在这里dmodel=512;2i和2i+1表示奇偶性,i表示词向量中的第几维,例如这里dmodel=512,故i=012…255。
- 拼接相加都可以,只是本身词向量的维度512维就已经蛮大了,再拼接一个512维的位置向量,变成1024维,这样训练起来会相对慢一些,影响效率。两者的效果是差不多地,既然效果差不多当然是选择学习习难度较小的相加了。