• 同学,具体哪一段代码,贴上来看看?

    attention weights是3行5列矩阵,x2是4行5列矩阵,数学上需要先转置。具体代码看看再说?

  • CBOW 是通过一个词的上下文(即窗口中的周围词)来预测这个词。

    Skip-Gram 是通过一个词来预测它的上下文。

    哪个模型更好取决于应用的具体情况:

    1. 数据量:CBOW 模型通常在小数据集上表现得更好,因为它更快,而且对小数据集也能得到不错的结果。而 Skip-Gram 在大数据集上表现得更好。
    2. 稀有词:Skip-Gram 模型对于稀有词的处理要好于 CBOW。
    3. 性能:CBOW 是通过上下文词来预测目标词,因此它要比 Skip-Gram 更快,但是 Skip-Gram 能够捕获到更多的上下文信息,因此通常能够得到更好的表现。

    所以,没有一种模型是在所有情况下都比另一种更好的,选择哪一种取决于具体的应用场景。

  • 建议同学针对自己的数据,进行尝试,然后可以分享你的结果和观察。

  • 同学的观察非常有趣。不过似乎很少有人讨论这个问题。我觉得之所以decoder-only几乎不需要微调是因为他是生成性质的模型,训练好了,通用性就比较强烈。而encoder-only模型是判别式应用比较多,需要在具体问题上面加上自己的一层分类器。

    总体来说,还是具体使用场景的区别。现在我们说,所谓垂类模型,就是把decoder-only的模型,比如类GPT的开源模型,在拿过来,在你的领域微调多一次。因此还是可以微调。

    但是你的观察对,生成式的模型对话能力强,通用。

     

     

  • 谢谢同学的反馈,我的示例代码的确有问题。

    这里需要同学进行修改,根据S2S的结果调整模型和输入,完成作业。

    具体来说:

    1. 模型 - 你需要实现一个标准的seq2seq模型,它由一个编码器和一个解码器组成。编码器接受中文句子并将其转换为一个隐藏状态,然后解码器使用这个隐藏状态生成英文句子。

    2. 在训练循环中,你需要更改数据的处理方式。在给定的代码中,sentence_cn没有被使用。但在新的模型结构中,你应该将sentence_cn作为输入传递给模型的编码器,将sentence_en的输入部分(不包括<eos>标记)传递给模型的解码器,将sentence_en的目标输出部分(不包括<sos>标记)用作目标输出。

  • 同学可能要仔细研究一下代码,我们的eos应该只是初始输入的占位符。decoder一旦开始输出,就会开始自回归的过程,用新的输出,作为下一步的输入。

    具体那一段代码,如果还有疑问,可以贴上来继续讨论。因为课程中decoder代码段很多,不知道具体之哪一个模型。

  • 这是PyTorch里面做一些批数据预处理和格式化的。类似于dataloader的回调函数这个意思。到后面会pass给数据加载器(data loader)的。

    具体来说,这个 collate_fn 函数的作用是:

    1. 对批次的数据进行排序:函数首先对这个批次的数据(batch)按照句子的长度进行降序排序。这是因为在处理变长序列时,通常需要对输入数据进行排序,以便能够使用 pack_padded_sequence 函数。

    2. 对批次的数据进行填充:然后,函数对这个批次的中文句子(sentence_cn)、英文输入句子(sentence_en_in)和英文输出句子(sentence_en_out)进行填充,以确保这个批次的所有句子的长度都是一样的。填充是使用特定的填充标记(padding token)进行的,对于中文句子,使用的是 <pad> 标记,对于英文输入句子,使用的是 <sos> 标记,对于英文输出句子,使用的是 <eos> 标记。

    函数最终返回这个批次的中文句子、英文输入句子和英文输出句子,这些句子都已经被填充到了相同的长度。

  •         # 计算隐藏层,求嵌入的均值:[embedding_size]
            hidden_layer = torch.mean(embeddings, dim=0)  

  • @HITSlsc 不客气!smiley

  • "##"的标记方式是BERT模型中的一种特殊符号,用于标识WordPiece tokenizer拆分的子词。在BERT中,如果一个词被拆分成几个子词,那么第一个子词会保持不变,而后续的子词会在其前面加上"##"标记。这有助于在后续的处理中识别和还原原始的词。例如,单词"embedding"可能被拆分为"em"和"##bedding"。

    这种用法并不在所有的模型和分词器中都是通用的。不同的分词器可能会有自己的标记方式。例如,SentencePiece分词器就不使用"##"来标识子词,而是使用一个特殊的字符来标记未知的词元。不同的分词算法之间的通用性取决于它们的设计和目标。在设计分词器时,主要的目标是要确保能够准确地将文本分词,以便用于下游的自然语言处理任务。

    此外,不同的分词器可能针对不同语言的特性有所优化。例如,对于处理英语和其他拉丁语系语言的任务,通常会使用空格作为单词的分隔符,但对于如中文、日语和韩语这样的语言,由于它们的文字之间没有空格分隔,通常需要使用不同的分词器或使用基于字的模型。

  • 主要差别有三:

    1. BERT编码器,GPT解码器
    2. 预训练的目标不同,BERT填空,GPT预测新词
    3. BERT双向,GPT单向

    技术上,二者都是基于Transformer架构,无本质区别。从上面三点来看,BERT更适用于做文本分类等等等1是1,2是2类型的任务。GPT做这种聊天问答任务。
    BERT现在是个小模型了。比GPT-4小几千上万倍了。你的资源很少的时候,可以选择小模型来完成很简单的任务。否则,大任务就是开源大模型的时代了。

     

  • 是的,同学说的正确。这里我讲述时有一个口误,讲反了,谢谢同学修正。

  • 这个领域我了解的有限。

    下面是搜到的一些资源。同学可以和相关领域有更多经验的人请教,或者继续搜索一些最新进展。

    https://github.com/yashbonde/text2sql

    https://arxiv.org/abs/1511.04834

  • 可以做Padding呀。

  • 同学的问题我不知道理解的对不对。skipgram, 是周围词预测中心词,如果某一个周围词是输入,那么当然只有一个中心词是目标输出。另一个周围词,又对应另一个中心词。每个词在训练数据中都可能多次出现。

  • 问题1:是的,你的理解正确。训练时就是通过后续位置掩码实现自回归机制。

    问题2:选择Transformer的Encoder部分还是Decoder部分,的确取决于具体的任务。一般来说,如果任务是生成性的,如文本生成或者机器翻译,那么可能会使用基于Decoder的模型(如GPT或者完整的Transformer)。如果任务是判别性的,如文本分类或者情感分析,那么可能会使用基于Encoder的模型(如BERT)。—— 从直觉上,也是可以说的通的,因为语言模型(解码器)本身就是生成式的。

    至于为什么某一种模型在特定任务上效果更好,这要取决于任务的性质以及模型的特性。例如,对于生成任务,一个重要的要求是模型需要能够根据前文生成新的内容,这就需要模型具有处理序列的能力,因此使用基于Decoder的模型可能会有更好的效果。而对于判别任务,一个重要的要求是模型需要能够理解输入文本的全局语义信息,这就需要模型具有处理全文的能力,因此使用基于Encoder的模型(或者说MLM的训练方式)可能会有更好的效果。

    对于这个问题的理论分析,"Attention is All You Need"这篇论文介绍了Transformer的原理,包括Encoder和Decoder的设计理念。另外,"BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"这篇论文则讨论了为何在一些任务上,如文本分类,基于Encoder的模型(即BERT)的效果要优于基于Decoder的模型(如GPT)。

    ----- 不过,上面说的只是个大概思路。到现在来说,只要模型足够大,后面上下文调优的过程做的好,那么GPT4很可能在每一个方面都碾压BERT,因为从数量级上面,已经不是一个级别的模型了。

  • 是吗,要区别大小写的。如果课程代码是这样的,那么有可能是一个笔误,我这边需要调整修改一下。

  • 一般是8到16个头。这属于一个超参数,具体试你需要多大的模型,序列长度,问题的复杂性而定。头越多,直观上是能够捕捉到序列不同维度的注意力相关信息,但会使模型更复杂。

  • 使用特征维度的平方根作为缩放因子是为了防止点积注意力的输出值过大。原因是当我们在高维度空间中进行点积运算时,结果的数量级可能会非常大,这可能导致在进行Softmax归一化后,得到的概率分布过于尖峭,即大部分概率集中在极少数几个位置上,从而导致模型难以学习和优化。

    这种选择并不是唯一的,也有其他选择。不过,选择平方根的原因是因为它是一个经验上比较好的平衡点。
     - 如果我们选择一个更大的缩放因子,例如使用特征维度本身,那么Softmax函数可能会更加尖峭,这可能会使得模型的学习更加困难。
     - 如果我们选择一个更小的缩放因子,那么Softmax函数可能会更加平缓,这可能会导致模型不能够集中注意力到重要的特征上。

    当然,不同的任务和数据集可能需要不同的缩放因子。在实际应用中,选择最佳的缩放因子可能需要通过实验来确定。也可以把它视为一个超参数来对待。不过这个超参数不是很重要,我们这里就按照经验值走吧。

  • Transformer模型结构上面可以扩展的部分是

    1. 多头注意力的头数,序列越长,可以增加头数捕捉不同维度注意力信息

    2. 编码器和解码器的层数可以一直增多,这代表了Transformer模型的深度。

    3. 后面前馈网络的线性层的层数和维度可以增多。

    4. 嵌入向量的维度:GPT-3是2048.