• 整体上,一个输入序列,先做embedding, 变为低维向量表示,这个表示经过Q,K,V线性变换,变成与原输入向量同样维度同样长度的不同向量。再经过多头注意力,得到的注意力输出仍然是同样维度,同样长度的向量。只是这个向量表示已经拥有了自注意力信息。要把整个输入序列整体上理解。

    但是具体上,是一个个token并行处理,独立进行自注意力操作和技术的。每一个token都独立存在。

    更为详细的理解可以反复看课程视频的内容。

  • 补充说一些: 每个输入的token会被映射到一个嵌入向量,然后这些嵌入向量会被送入多头注意力层。在这个层中,每个嵌入向量都会和其他所有嵌入向量进行交互,并产生一个新的嵌入向量。这个新的嵌入向量会包含原始token以及它与其他token之间交互的信息。

    因此,我们可以说,每个token都对应一个自注意力向量,这个向量包含了原始token和其他所有token交互的信息。这种处理方式使得Transformer可以并行处理所有的输入token,大大提高了处理效率。同时,由于每个token都可以和其他所有token进行交互,因此Transformer能够很好地处理长距离依赖问题。

    最后,注意力机制的输出是对所有头的输出进行拼接然后进行一次线性变换,而不是简单的相加。这样每个头学习到的不同类型的信息就可以被保留下来,而不是被相加操作混合在一起。

  • 都有可能,取决于训练策略,请看下面的详细解释:

    在训练Seq2Seq模型时,通常采用所谓的“教师强制”(Teacher Forcing)策略。也就是说,无论模型在前一步的输出(预测)是什么,解码器的输入都是目标序列中的真实值。这种方法可以使模型更快地收敛,并能更有效地学习到正确的输出。

    然而,在实际推理或测试阶段,我们并不知道目标序列的真实值。此时,解码器的输入是前一步的预测输出。

    需要注意的是,虽然教师强制策略在训练阶段表现得很好,但它可能会引入训练和测试之间的不一致性(也称为曝露偏差)。因为在训练过程中,模型总是看到真实的前一步输出作为输入,而在测试过程中,它看到的是自己生成的可能有误的前一步输出。这个问题的一种解决方案是在训练过程中逐渐减少教师强制的使用,更多地使用模型自己的预测作为下一步的输入。

    对于这个解释有疑惑的话,继续讨论。

  • 针对Axiostpc的问题:

    1. 教师强制的概率是不是线性减少:这取决于你的具体实现,没有一定原则的。一种常见的策略是线性地减少教师强制的概率,但也可以采用其他的策略。比如,可以在一开始的几个 epoch 中使用 100% 的教师强制,然后逐渐减少,或者可以在每个 epoch 中随机选择一个教师强制的概率。

    2. 在同一个序列中混合使用真值和模型输出:当然也可以。例如,可以在一个序列的开始使用教师强制,然后在序列的末尾使用模型的预测。这可以帮助模型在序列的开始时得到一个“好的启动”,然后让它在序列的末尾学会自我生成。这种策略可以用一个概率来实现,比如在每一步有 50% 的概率使用真值,50% 的概率使用模型的预测。

  • 嗯,让我们先从PyTorch官网拷贝nn.embedding参数的定义。https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html

    Parameters:

    • num_embeddings (int) – size of the dictionary of embeddings  ---- 这里我们可以看出,这个参数需要设置为整个语料库的词典大小。这是Embedding的基本要求,初始化时,它要根据词典的一个很高的维度来学习词的低维嵌入向量。这个维度可能有好几万。

    • embedding_dim (int) – the size of each embedding vector ---- 这是一个较低的维度,比如512,或者128,256.

    所以我们说nn.Embedding在NLP模型中,被用来为词汇表中的每一个单词赋予一个向量表示。

    nn.Embedding(voc_size, embedding_size)的含义是,你有一个voc_size大小的词汇表,且你希望每一个单词都有一个embedding_size维度的向量表示。因此,你不能将它设置为nn.Embedding(n_step, embedding_size)。

    n_step在NLP模型中通常表示一个序列的长度或者步数。例如,在一段文本或者一个句子中,n_step可能是你的句子长度。但在你的词汇表中,你可能有大量的单词,远远超过了一个具体句子的长度,因此你需要的嵌入矩阵的大小必须能够包含你的所有单词,而不只是一个句子长度的单词数量。

  • 同学,我觉得你说的对。似乎是反了,尽管这样做也可以训练出有意义的向量,如同你所说,它们都是相互一一对应的。但原来的这段代码的逻辑似乎成了CBOW。

    改成下面的代码就更清晰的展示Skip-Gram。

            X = one_hot_encoding(target, word_to_idx).float() # 将中心词转换为One-Hot向量   
            y_true = torch.tensor(word_to_idx[context], dtype=torch.long) # 将周围词转换为索引值  

    优化课件时,我需要把这个代码更新一些,避免混淆。

     

  • 1. 预测的是一句话中中心词后面的词呢还是中心词前面的词呢?
    回答:预测的是中心词的上下文,也就是指定窗口内的周围词。对于“一二三四五”这句话,给出三,窗口为2,你要预测出 一 二 四 五这四个词。
    2. 训练的时候逻辑是什么样的呢,因为一句话不可能包含词表中所有的词?
    回答:训练的时候,就是给模型一大堆的正样本。比如 (三 ,二)(三,四)(三,五),就对;而(三,人)(三,我)就错,这些也可以视为是负样本。用这些语料库也就是真实句子制作出来的样本对模型进行训练,模型就逐渐能够猜出来“三”的周围应该哪些词的概率毕竟高。我们有大量的句子生成这种征服样本,因此并不需要一句话来完成所有的词向量的训练。关键是模型是整个语料库,很多很多句话拆分出来的Skip-gram一起训练出来的。

    希望解答你的疑惑,有问题继续讨论。

  • @Victor94 这个要基于神经网络的设计。我们目前设计成二元组,相当于是每次预测出4个最佳候选答案中的一个就算对。

  • @Victor94 可以这么认为,输出了一个周围词,就猜对了其中一个二元组。

  • 1. 词向量的维度是根据什么来定义的?
    我们自己决定的,比如128,64,16,512 - 经验决定的。语料库大,网络,维度就高一些。维度高,储存的语义信息就精细一些。
    2. 他的值是怎么训练出来的?
    训练的时候,就是给模型一大堆的正样本。比如 (三 ,二)(三,四)(三,五),就对;而(三,人)(三,我)就错,这些也可以视为是负样本。用这些语料库也就是真实句子制作出来的样本对模型进行训练,模型就逐渐能够猜出来“三”的周围应该哪些词的概率毕竟高。我们有大量的句子生成这种样本,因此并不是用一句话来完成所有的词向量的训练。关键是模型是整个语料库,很多很多句话拆分出来的Skip-gram或者CBOW一起训练出来的。

  • @armorse 对对 可以作为一个超参数!尝试不同的维度

  • 这两个概念是包含与被包含的关系。向量空间模型这个概念更加广泛。

    1. 词袋模型:BoW是一种简化的表示文本数据的方式,它将文本视为一个包含若干词汇的集合(或者“袋子”),忽略词汇在文本中的顺序和语法结构。每个文本都可以被表示为一个长向量,向量的每个元素对应一个词汇,元素的值表示该词汇在文本中出现的频次或权重。

    2. 向量空间模型:VSM是一种把文本映射到向量空间中的方法,它假设文本可以被表示为一个向量,向量的每个维度对应一个特征(比如一个词汇)。VSM可以应用于一系列自然语言处理任务,如信息检索、文本聚类和分类等。

    词袋模型实际上就是向量空间模型的一个特例。在BoW中,每个文本被表示为一个向量,这个向量在一个多维空间中(每个维度对应一个词汇),因此BoW也可以视为一种特殊的VSM。然而,VSM不仅限于BoW。VSM可以采用更复杂的特征和权重机制,例如TF-IDF(词频-逆文档频率)、主题模型、词嵌入(word embeddings)等。这些方法可以捕获到更丰富的语义信息,而不仅仅是词频。

  • @acpb 不客气!