Transformer,大模型的幻觉太严重,仅作参考吧

假设:

输入(中文): "我有一本书"
目标(英文): "I have a book"

 

A,一般过程

一,训练阶段:

在 训练阶段,我们希望训练模型从源语言(中文)生成目标语言(英文)。在这个过程中,解码器依赖于编码器的输出,并通过与目标序列进行比较来计算损失,并优化模型参数。

# 1. 输入序列(中文):
输入句子为中文 “我有一本书”,它将作为 编码器 的输入,生成一个上下文相关的隐状态表示。

# 2. 输入嵌入(Input Embedding):
输入的中文词汇(“我”,“有”,“一本”,“书”)通过 输入嵌入 转换为向量,传递给 编码器:
“我” → [向量1]
“有” → [向量2]
“一本” → [向量3]
“书” → [向量4]

# 3. 编码器处理输入:
编码器接收到输入的词向量,并通过一系列自注意力(SelfAttention)和前馈网络(FeedForward)处理,生成上下文相关的隐状态表示:
编码器的输出:隐状态序列 [H1, H2, H3, H4],这些隐状态表示了输入句子中每个词的上下文信息。

# 4. 目标序列右移(Shifted Right):
在训练过程中,我们将目标序列 “I have a book” 进行右移,得到:
右移后的目标序列:[空] I have a book

这使得解码器能够在生成每个词时,只依赖于前面已生成的词(而不是后面的词)。

# 5. 解码器生成输出:
解码器接收到右移后的目标序列,并根据 编码器的隐状态序列 来生成预测输出。在每个时间步,解码器会根据前一个时间步的输出序列(而不是单独的词)生成下一个词。

## 第1步:
输入:[空](<start>标记)+ 编码器的隐状态 [H1, H2, H3, H4]
输出:解码器生成 “I位置的单词”

## 第2步:
输入:“I” + 编码器的隐状态 [H1, H2, H3, H4]
输出:解码器生成 “have位置的单词”

## 第3步:
输入:“I have” + 编码器的隐状态 [H1, H2, H3, H4]
输出:解码器生成 “a位置的单词”

## 第4步:
输入:“I have a” + 编码器的隐状态 [H1, H2, H3, H4]
输出:解码器生成 “book位置的单词”

# 6. 计算损失(交叉熵损失):
在训练时,每个时间步都会计算 交叉熵损失,比较解码器的输出与真实目标序列的对应词。每个时间步的损失通过交叉熵计算,衡量模型生成的词与目标词的差异。

在第1步,计算 “I位置的单词” 和目标 “I” 的交叉熵损失。
在第2步,计算 “have位置的单词” 和目标 “have” 的交叉熵损失。
在第3步,计算 “a位置的单词” 和目标 “a” 的交叉熵损失。
在第4步,计算 “book位置的单词” 和目标 “book” 的交叉熵损失。

损失的累加:所有时间步的损失会被累加起来(通常是取平均),得到总损失。总损失将通过 反向传播 来计算梯度并更新模型的参数。

# 7. 反向传播与优化:
通过反向传播算法计算梯度,并使用优化算法(如Adam)来更新模型的权重。通过多次迭代训练,模型逐渐优化,能够更好地从输入序列生成目标序列。

# 8. 重复训练:
整个过程在训练数据上重复进行,模型通过反向传播不断优化参数,使其能够准确地从输入句子生成目标句子。

如果损失函数收敛到很小,则,训练阶段的生就是“I have a book”了。也就是“参数对了”

 

二,推理阶段(生成阶段):

在 推理阶段,模型已经训练完成,此时我们使用训练好的模型进行实际的预测。不同于训练阶段,推理阶段并没有目标序列的右移,我们通过 逐步生成 目标序列中的词。

# 1. 输入序列(中文):
输入为中文句子 “我有一本书”。

# 2. 输入嵌入(Input Embedding):
输入句子通过输入嵌入转换为向量,并传入编码器。

# 3. 编码器的处理:
编码器生成上下文相关的隐状态 [H1, H2, H3, H4]。

# 4. 解码器的生成过程:
第1步:解码器从 [空](<start>标记)开始生成,基于编码器的隐状态序列生成第一个词 “I”。

第2步:解码器将 “I” 作为输入,继续生成下一个词 “have”。

第3步:解码器将 “I have” 作为输入,生成 “a”。

第4步:解码器将 “I have a” 作为输入,生成 “book”。

每一步的生成都依赖于前一步的输出。

# 5. 生成结束:
生成过程会在遇到 结束符号(<end>)时停止,或者当解码器生成完所有目标词时结束。生成的句子就是模型的最终输出。

推理阶段的关键区别:
在推理阶段,解码器生成的每个词都会作为输入传递给下一个时间步,这样模型可以逐步生成整个输出序列。
与训练阶段不同,推理时我们没有目标序列的右移,只有模型自己生成的输出。

 

 三,训练阶段和推理阶段总结:

# 训练阶段:
1. 输入中文句子(如“我有一本书”)通过编码器生成隐状态。
2. 目标序列(如“I have a book”)右移,作为解码器的输入。
3. 解码器生成输出,通过与真实目标的比较,计算交叉熵损失。
4. 反向传播更新参数,逐步优化模型。

# 推理阶段:
1. 输入中文句子通过编码器生成隐状态。
2. 解码器从 [空](<start>)开始生成输出,并逐步生成目标语言的每个词。
3. 生成的输出会逐步作为下一时刻的输入,直到生成完毕。

 

B,编码器的谁与解码器的什么结合?

解码器通过计算 Q(Query) 和 K(Key) 的相似性,得到的 注意力权重 会加权 V(Value) 向量,然后用这些加权后的 V 向量来帮助生成目标语言的单词。

# 详细过程:

1. 计算注意力权重:
解码器的 Q(Query) 来自解码器已经生成的部分目标语言词(或初始的 `<start>` 标记)。
编码器的 K(Key) 和 V(Value) 来自源语言的表示(即编码器的输出)。这些是源语言的词向量或隐状态。
解码器的 Q 与编码器的 K 计算相似度(通常是点积),得到 注意力得分(Attention Scores),然后使用 Softmax 进行归一化,得到 注意力权重,即表示源语言和目标语言之间的相关性。

2. 加权 V 向量:
使用计算得到的 注意力权重 对 V(Value) 向量进行加权。这里的 V 是源语言的信息,它代表了源语言词汇的语义信息。
通过加权后的 V 向量,解码器可以获取到与目标词生成最相关的源语言信息。

3. 生成目标语言的词:
加权后的 V 向量(包含了源语言的信息)将被传递到解码器的后续部分,帮助生成当前的目标语言词。
这一过程是通过解码器的神经网络(例如前馈神经网络)进一步处理,并根据当前状态预测目标语言的下一个词。

# 举个简单的例子:

假设我们在进行 机器翻译,从中文翻译成英文。

源语言(中文): "我 有 一本 书"
目标语言(英文): "I have a book"

假设目标是生成目标词 “I”(英文句子的第一个词)。解码器此时的输入是 [空](或者 `<start>`)。这个输入通过 Q(Query) 转换为向量。

编码器的输出提供了源语言(中文)的表示,K(Key) 和 V(Value) 来自源语言的每个词向量(例如,中文词 "我"、"有"、"一本"、"书" 的词向量)。

Q(Query):来自解码器(目标语言),表示当前目标语言上下文的向量。
K(Key):来自编码器(源语言),表示源语言的每个词的语义信息。
V(Value):也是来自编码器(源语言),表示源语言每个词的具体值信息。

解码器的 Q 与编码器的 K 进行计算,得到源语言的每个词对于当前目标词("I")的重要性权重(即注意力权重)。然后,使用这些权重对 V(Value) 向量进行加权。

加权后的 V 向量结合目标语言的上下文信息,将帮助生成 “I” 这个词。

# 总结:
解码器的 Q(Query) 与编码器的 K(Key) 计算相似性,得到注意力权重。
注意力权重用来加权编码器输出的 V(Value) 向量,从而提取源语言中与当前目标词相关的信息。
最后,通过加权后的 V 向量,解码器生成当前目标语言的词。

这个过程会在每一步都重复进行,直到生成完整的目标句子。

# 最后的目标:
通过加权的源语言信息(V)帮助解码器预测目标语言的下一个词,最终完成翻译任务。

posted @   Augustone  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示