# Transformer 架构
原始的 Transformer 采用编码器 - 解码器(Encoder–Decoder)架构,Encoder 和 Decoder 又由多层小 encoder 和 decoder 组成。
# 评估过程
原始输入信息在进入 Encoder 之后,首先需要进行词嵌入和位置信息编码转换为一组向量,然后将该组向量向量经过多层的抽取会被映射为一组抽象的连续表示,其中包含了原始输入的所有可学习信息(可以理解为一种总结概括,保留输入中对机器有用的信息,然后输出成一种机器能看懂的形式),然后将该组表示输入到 Decoder 中。每层小 decoder 利用输入的那些表示来生成输出信息,注意,小 decoder 生成的信息同样也会被输入到其他小 decoder 中参与后续的输出,即每一次小 decoder 的输入是其他小 decoder 之前的输出和 Encoder 的输出。
# 训练过程
相比于评估阶段,在 transformer 的训练阶段,Decoder 的输入有所不同。在训练时,Decoder 的输入是 Encoder 的输出和正确答案,目的是让 Decoder 能根据正确的答案计算交叉熵,这样才能进行参数更新。关于这部分的细节,我会在后文中详细讲解。
# Transormer 细节
# 词嵌入
一种最简单的表示方法是
one-hot
编码,这种编码方法会将每一个需要嵌入的单词转换成one-hot
向量,例如,想表示三个单词:apple、orange、iphone,他的one-hot
编码可以为:
- apple:[1, 0, 0]
- orange:[0, 1, 0]
- iphone:[0, 0, 1]
这种一个向量中只有一个
1
,其余全是0
向量称为one-hot
向量,但这会带来两个问题:
- 实际应用中往往需要表示几十万甚至百万个单词,用
one-hot
编码会形成一个几十万维的矩阵,且该矩阵极其稀疏,导致计算和存储的效率都非常低下。- 无法表达不同单词之间的关系。例如,直觉上,我们会认为 apple 和 orange 这两个单词语义更加相近(都是水果),而 iphone 和 orange 这两个词语义更远,但是,
one-hot
编码无法体现出这层信息,对于one-hot
编码来说,每一个词都是彼此独立的,不利于机器去理解词义。
词嵌入也是一种表示方法,不过他解决了 one-hot
表示的问题,更加适用于大量单词的表示。
词嵌入并不是某种特定的算法,而是一种表示方法的统称,指的是将一个单词嵌入到一个多维的特征矩阵中。为了方便理解词嵌入,我们首先引入 “特征” 的概念。以 apple 为例,它有一些特征,例如,属于水果、可以吃、圆的、甜的...。而每一个词都可以总结出来一些特征,只要我们总结出足够多的特征,就可以以特征为维度来表示单词,这种表示形成的矩阵就是特征矩阵。
上图就一个例子,例如我们总结出了 300 个特征,分别是 gender、royal、age、food...,用数值的大小来表示单词在该特征维度上的得分。那么 apple 和 orange 在 food 这一特征上就应该有比较大的数值,而在 gender、royal 等特征维度上数值很小,而 king 和 queen 这两个单词就应该在 royal 这个特征维度就应该有比较大的值。只要我们的特征选取的足够合适且丰富,就可以将任意单词 “嵌入” 到这个 300 维的特征矩阵中(用一组特征值来唯一对应某个单词,且能体现单词词意之间的关系),这就是词嵌入的原理。
词嵌入有一个重要的特性,它可以帮助实现类比推理。例如在上面的例子中,通过不同向量之间的减法运算,可以发现不同词之间的类比关系,例如,man 和 woman 相减,可以发现这两个单词在 gender 维度上差别较大,而在其他维度上差别较小。这种特性非常有助于模型去发现词和词之间的关联,因此在 transformer 中 encoder 之前会先进行词嵌入来帮助模型学习。
在实际情况中,通常是用机器学习去学习一组单词,生成一个特征矩阵,因此选取的特征可能并不能很简单的描述,同时,词嵌入的特征维度也根据任务的不同和不同,但是总的来说,都是基于上述原理来实现词嵌入的。
# encoder 详解
# 参考
- https://zhuanlan.zhihu.com/p/506711169