应该是监督学习啊,训练的时候有个tgt_vocab
我也许并不能很好的回答你的问题,我找寻了很久也没有获得想要的答案,我思考了很久总结了一些观点,希望能和大家一起讨论讨论这个问题,以下是个人的一些看法.
我们知道,embedding
是一种缩放(缩小或放大)语义信息到一定维度空间的手段,在这里是输入一个 vocab_size
的 query
,然后获得hidden_size
维度的 embedding
, embedding
的好处是可以通过学习使得语义相近的样本在 embedding
后距离更相近.
一种可能的解释是:当num_hiddens
增大时,嵌入向量的维度也会相应增大,这会增加模型学习到的单词或符号的语义信息.然而,(num_hiddens 较大时)此时我们想要加入位置编码,就有种有心杀贼无力回天的感觉,我们无法确保在茫茫数据海中(而且数据本身也是服从(0, 1)的分布),提取出位置信息,我认为如果不扩大位置编码提供的位置信息,将无法很好地区分不同位置处的单词或符号.因此,为了更好地结合语义信息和位置信息,一种可行的做法是增加位置编码在嵌入中的比例,但是我们知道的是模型的参数最好能控制在较小的范围(稳定性和收敛速度),不能无限制的根据 num_hiddens 放大这个占比,所以选用了平方根进行一定的缩放(你也可以试试log 缩放).
也许我的理解是错误的,希望如果有人能有正确的结论,请不吝赐教,我十分感谢.
token是one-hot,经过embedding相当于从词嵌入矩阵W中取特定行,而W被 Xavier初始化,其方差和嵌入维数成反比。也就是嵌入维数越大,方差越小,权重越集中于0,后续再和positional encoding相加,词嵌入特征由于绝对值太小,可能被位置信息掩盖,难以影响模型后续计算。因此需要放大W的方差,最直接的方法就是乘以维度的平方根。
你说的只是用到了X的无监督可能是BERT,使用了transformer的encoder部分,基于自监督学习做预训练,然后作为特征提取器用于下游任务。和MLP、RNN一样,transformer只是一种架构,既可以无监督(比如BERT、GPT)也可以有监督(比如ViT)。
中文版的代码没有更新,看d2l的API文档很多写法都变了,有些甚至输入参数数量都变了,这章建议就看个原理,代码实现还是看看英文版吧
你不说我还没注意,不止是代码,章节都不一样,英文版多了不少新内容。
英文版的代码一年前就被重构了,看来中文版出版以后很少维护了。
original:
def init(self, ffn_num_hiddens, ffn_num_outputs, **kwargs):
super(PositionWiseFFN, self).init(**kwargs)
new:
def init(self, ffn_num_hiddens, ffn_num_outputs):
super().init()