我开始对变压器架构有了一些了解,但有些东西我还不能理解。
在无需解码器的转换器(如BERT)中,tokenizer总是在句子前后包含标记CLS和SEP。我知道CLS既充当BOS,又充当提供分类信息的单个隐藏输出,但我有点不明白为什么它需要SEP来进行掩码语言建模部分。
我将进一步解释我期望得到的实用程序。在我的例子中,我想训练一个转换器充当自动编码器,所以target = input。没有解码器,因为我的想法是将原始词汇表的维度减少到更少的嵌入维度,然后研究(还不知道如何,但会做到)减少的空间,以提取有用的信息。
因此,示例如下:
string_input = "The cat is black"
tokens_input = [1,2,3,4]
string_target = "The cat is black"
tokens_output = [1,2,3,4]
现在,在标记化时,假设我们在逐字的基础上进行标记化,添加BOS和EOS有什么好处?
我认为这些只有在使用自注意解码器时才有用,对吗?因此,在这种情况下,对于解码器,输出必须右移,向量将为:
input_string = "The cat is black EOS"
input_tokens = [1,2,3,4,5]
shifted_output_string = "BOS The cat is black"
shifted_output_tokens = [6,1,2,3,4]
output_string = "The cat is black EOS"
output_token = [1,2,3,4,5]
然而,BERT没有自我注意解码器,只有一个简单的前馈层,这就是为什么我不能肯定理解这些特殊令牌的用途。
总之,这些问题是:
- 即使没有变压器解码器,您是否始终需要BOS和EOS令牌?
- 为什么没有转换器解码器的BERT需要屏蔽语言模型部分的SEP标记?
1条答案
按热度按时间o2g1uqev1#
首先,关于BERT的一些知识- BERT单词嵌入允许基于单词被使用的上下文,对同一个单词进行多个向量表示。在这个意义上,BERT嵌入是上下文相关的。BERT在计算其嵌入时显式获取每个单词在句子中的索引位置。BERT的输入是句子而不是单个单词。这是因为BERT需要整个句子的上下文来确定句子中单词的向量,如果你只向BERT输入单个单词向量,那么它将完全违背BERT的双向性的目的,上下文性质。然后,输出是整个输入句子的固定长度向量表示。BERT提供对超出因为模型在**“子词”级别(也称为“词片段”**)学习单词。
SEP标记用于帮助BERT区分两个不同的单词序列。这在下一个序列预测(NSP)中是必需的。CLS在NSP中也是必需的,以便BERT知道第一个序列 * 何时 * 开始。理想情况下,您应该使用如下格式:
CLS [序列1] SEP [序列2] SEP
请注意,我们没有使用任何BOS或EOS标记。标准BERT标记器不包含这些标记。如果运行以下代码,我们可以看到这一点:
输出:无无[SEP] [CLS]
对于屏蔽语言建模(MLM),我们只关心MASK标记,因为模型的目标仅仅是猜测屏蔽标记。
BERT接受了NSP和MLM培训,正是这两种培训方法的结合使BERT如此有效。
因此,为了回答您的问题,您并不“总是需要”EOS和/或BOS。事实上,您根本不“需要”它们。但是,如果您正在为特定的下游任务微调BERT,而您打算使用BOS和EOS令牌(方式,是由你),那么是的,我想你会把它们作为特殊令牌包括在内。但是要明白,BERT并没有在脑海中训练这些,你可能会看到不可预测/不稳定的结果。