上面是在测试集上的表现
下面是在训练集上的表现
上面是在训练集上的评估效果
这是在测试集上的评估效果,模型是transformer模型,模型应该没问题,以上的是一个源序列没加结束符和加了结束符的情况。
transformer源序列做遮挡填充的自注意力,这就让编码器的输出中每个token的语义表示变成了整个序列的token的加权和形式,也就带上了整个序列的信息,只不过因为token不同,或者位置不同,形成的信息也不同,解码器跨注意力在query编码器输出时,其中每个目标输入序列的每个token查询到的编码器输出部分,也就带了编码器整个序列的信息,transformer解码器依此来预测下个token是 啥?在训练中,损失反向传播,所以编码器和解码器 token嵌入语义向量一直 在变,最终形成每个token语义都具有特定的信息,是这样吗
你的理解非常准确,基本上概括了Transformer模型在训练和推理过程中的核心工作机制。下面我会更详细地解释这一过程,以帮助你更好地理解。
Transformer的编码器
在Transformer的编码器中,自注意力(Self-Attention)机制允许模型在处理每个位置的输入(token)时,都能考虑到序列中其他所有位置的输入。具体来说,每个token的表示(embedding)通过自注意力层被更新为整个输入序列中所有token的加权和,其中权重由token间的相似度决定。这样,每个token的表示都融入了整个序列的上下文信息,尽管因为token本身和它们的位置不同,所以融入的上下文信息也有所不同。
Transformer的解码器
解码器的工作方式类似,但它在生成目标序列时是自回归的(autoregressive),即每个token的生成依赖于之前已经生成的token。解码器包含两部分注意力机制:自注意力和跨注意力(Encoder-Decoder Attention)。自注意力机制让解码器能够关注到已经生成的序列部分,而跨注意力机制则允许解码器“查看”编码器的输出,即整个源序列的编码表示。这样,解码器在生成每个目标token时,都能够考虑到整个源序列的信息。
训练过程
在训练过程中,模型通过最小化预测目标序列与真实目标序列之间的差异(例如,使用交叉熵损失)来学习。这个损失函数通过反向传播算法来更新模型中的所有参数,包括token的嵌入向量、自注意力和跨注意力层的权重等。随着训练的进行,模型逐渐学习到如何有效地将源序列的信息编码到每个token的表示中,并如何使用这些信息来预测目标序列。
推理过程
在推理(或称为生成)过程中,解码器逐个生成目标序列的token。对于每个新生成的token,解码器都会重新运行其自注意力和跨注意力机制,以考虑之前已经生成的token和整个源序列的信息。这个过程一直持续到生成了完整的目标序列或达到了某个停止条件(如生成了特定的结束符或达到了最大长度限制)。
总结
你的理解完全正确:Transformer模型通过其独特的自注意力和跨注意力机制,使得编码器的输出能够包含整个源序列的信息,而解码器则能够利用这些信息来预测目标序列。在训练过程中,通过损失的反向传播,模型不断优化其参数,以形成更具信息量的token表示,从而更准确地完成序列到序列的转换任务。
减小了嵌入向量为256,8头,两层,上面是训练集表现
上面是测试集表现
因为之前训练集上最后损失降的很快,评估集降的慢,我以为是过拟合,所以把嵌入弄为256,头数弄成4个头,因为头数是各个语义空间的表示,层数弄成一层,这样训练集的评估如下:
上面用的是keras,keras是个 相当便捷的框架,后端能接tensorflow,pytorch,jax,而且能看summary,参数一清二楚,根据参数就基本能弄出模型架构,上面是加了回调,让模型生成一个翻译,可以看到模型学习的过程,开始它并不会翻译,等损失跌到一定程度,它学会了翻译.损失在指引它生成合适的token语义表示,并且transformer encoder decoder参数也在损失反向传播时不断更新,最终一个好的翻译模型,就是损失反向传播,用损失对可训练参数的梯度来更新参数,最终得到合适的 一组参数,这就是深度学习,就是找到适合模型架构的最合适的参数.回归到本质,就是y=f(x),找到一组合适的系数.这个最简单的transformer训练集表现如下:
从最后一句话的翻译可以看出,模型不能理解吃惊,我感觉应该是加头数,不应该减头数
训练集一如既往的好,测试集还是不太好,你说之前嵌入维度过大,层数多,过拟合还能说通,这个只有256的语义嵌入,一层,4个头,肯定不是上面说的原因,要么是因为这个数据集本身太小,导致模型学不到足够通用的语义表示,我觉得应该是这种,数据集太小,这个数据集只有29000样本,英语词汇经过bpe分词后是1073个,中文是6000多个
上面的transformer是keras自带的,下面的transformer是自己写的transformer,用的是tensorflow梯度带训练的,嵌入向量512,8头,一层,训练集上的表现如下:
下面是测试集上的表现:
相当不错,甚至达到了keras中transformer训练集的表现,而且我并没有重启内核,模型从未在验证集数据上更新参数,言外之意就是这个评估就是模型的泛化能力,模型在从未见过的数据上表现的也很好
验证集损失降的还算不错
同样的层数和嵌入,头数,这是位置嵌入不可训练的transformer模型的测试集评估和训练集表现,训练中可以看到验证损失跌下去了,又涨回来了,可见用可训练的位置嵌入比不可训练的位置嵌入效果要好,源序列加[END]比不加效果好