我开始了解变压器架构,但有些事情我还无法掌握。
在无解码器的转换器中,例如 BERT,分词器始终包含句子前后的标记 CLS 和 SEP。我知道 CLS 既充当 BOS,又充当提供分类信息的单个隐藏输出,但我有点不明白为什么它需要 SEP 来进行掩码语言建模部分。
我将更多地解释我期望获得的实用程序。就我而言,我想训练一个变压器作为自动编码器,所以目标=输入。不会有解码器,因为我的想法是将原始词汇的维度减少到更少的嵌入维度,然后研究(还不确定如何,但会到达那里)减少的空间以提取有用的信息。
因此,一个例子是:
string_input = "The cat is black"
tokens_input = [1,2,3,4]
string_target = "The cat is black"
tokens_output = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
现在在通证化的时候,假设我们是逐字通证的,那么加入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]
Run Code Online (Sandbox Code Playgroud)
然而,BERT 没有自注意力解码器,而是一个简单的前馈层。这就是为什么我不确定是否理解这些特殊令牌的用途。
总之,问题是:
首先我想说我已经读过这个帖子:
\n\n\n\n虽然它看起来确实与我想知道的相似,但我(根本)对递归还不够熟练,无法使其发挥作用。
\n\n如果我有以下片段:
\n\nI = ["i" + str(i+1) for i in range(3)]\nJ = ["j" + str(i+1) for i in range(4)]\nK = ["k" + str(i+1) for i in range(2)]\nRun Code Online (Sandbox Code Playgroud)\n\n然后我可以创建一个执行以下操作的函数:
\n\ndef f(*Sets):\n size = len(Sets)\n if size == 1:\n for i in Sets[0]:\n print(i)\n elif size == 2:\n for i in Sets[0]:\n for j in Sets[1]:\n print(i,j)\n elif size == 3:\n for i in Sets[0]:\n for j in Sets[1]:\n for k …Run Code Online (Sandbox Code Playgroud)