"Bidirectional attention"
Thanks for your careful observation! The bi-directional attention is indeed used on this model. The code has already been updated now.
@zyznull
, it seems that you didn't properly update the code. is_causal
is still set to True
by default in the model forward which is the main entrypoint for Transformers
and SentenceTransformers
.
@zyznull , it seems that you didn't properly update the code.
is_causal
is still set toTrue
by default in the model forward which is the main entrypoint forTransformers
andSentenceTransformers
.
This bug has been fixed in PR.
当我使用此模型的时候,比如我就编码一个文本“1”,我知道模型的tokenizer会把1作为1个token,然后在尾部加上一个eos特殊token,我打印出来也确实是这样。
但是,我发现最终模型输出的hidden_states[-1]的shape是[1,3,1536],这我就很懵了,为什么输出是3个token的embedding?多的那个哪来的?我找了半天代码也没见那个地方有提
当我使用此模型的时候,比如我就编码一个文本“1”,我知道模型的tokenizer会把1作为1个token,然后在尾部加上一个eos特殊token,我打印出来也确实是这样。
但是,我发现最终模型输出的hidden_states[-1]的shape是[1,3,1536],这我就很懵了,为什么输出是3个token的embedding?多的那个哪来的?我找了半天代码也没见那个地方有提没有遇到这个问题啊
你看我的
红框是你的,确实是[1,2,1536],但是内容和绿框里的[1,3,1536]完全不一样,而且句子Embedding和这[1,2,1536]也没关系,那这个[1,2,1536]是什么?
但你看绿框,是我的,输出是[1,3,1536],然后句子Embedding就是第3 个token的Embedding,但不知道为什么是3个token。
这个hidden_states,是我在class Encoder这个类里加了两行print。Encoder类的定义来自模型文件scripts中的eval_mteb.py中。我之所以要这么写代码,是因为我要完全按照官方代码的使用逻辑来进行编码。
当我使用此模型的时候,比如我就编码一个文本“1”,我知道模型的tokenizer会把1作为1个token,然后在尾部加上一个eos特殊token,我打印出来也确实是这样。
但是,我发现最终模型输出的hidden_states[-1]的shape是[1,3,1536],这我就很懵了,为什么输出是3个token的embedding?多的那个哪来的?我找了半天代码也没见那个地方有提没有遇到这个问题啊
你看我的
红框是你的,确实是[1,2,1536],但是内容和绿框里的[1,3,1536]完全不一样,而且句子Embedding和这[1,2,1536]也没关系,那这个[1,2,1536]是什么?
但你看绿框,是我的,输出是[1,3,1536],然后句子Embedding就是第3 个token的Embedding,但不知道为什么是3个token。这个hidden_states,是我在class Encoder这个类里加了两行print。Encoder类的定义来自模型文件scripts中的eval_mteb.py中。我之所以要这么写代码,是因为我要完全按照官方代码的使用逻辑来进行编码。
我觉得应该是这里出了问题,tokenize后重复加入了eos token,当trust_remote_code=True
的时候,tokenizer会自动给token补上eos token,反之则不会补;但这个实现代码里,既使用了自动补充eos,又在这张图片的部分手动加入了eos,导致有两个eos token,因此出现了问题
当我使用此模型的时候,比如我就编码一个文本“1”,我知道模型的tokenizer会把1作为1个token,然后在尾部加上一个eos特殊token,我打印出来也确实是这样。
但是,我发现最终模型输出的hidden_states[-1]的shape是[1,3,1536],这我就很懵了,为什么输出是3个token的embedding?多的那个哪来的?我找了半天代码也没见那个地方有提没有遇到这个问题啊
你看我的
红框是你的,确实是[1,2,1536],但是内容和绿框里的[1,3,1536]完全不一样,而且句子Embedding和这[1,2,1536]也没关系,那这个[1,2,1536]是什么?
但你看绿框,是我的,输出是[1,3,1536],然后句子Embedding就是第3 个token的Embedding,但不知道为什么是3个token。这个hidden_states,是我在class Encoder这个类里加了两行print。Encoder类的定义来自模型文件scripts中的eval_mteb.py中。我之所以要这么写代码,是因为我要完全按照官方代码的使用逻辑来进行编码。
我觉得应该是这里出了问题,tokenize后重复加入了eos token,当
trust_remote_code=True
的时候,tokenizer会自动给token补上eos token,反之则不会补;但这个实现代码里,既使用了自动补充eos,又在这张图片的部分手动加入了eos,导致有两个eos token,因此出现了问题
你说的没错,我检查了autotokenizer的代码,发现trust_remote_code默认是False。当设置了True时,实际会调用qwen2模型文件中的qwen2tokenizer类和tokenizer_config,tokenizer_config中设置了add_eos_token参数为True,所以仅这一句就已经在句子后加了eos了。而后边Wrapper又对模型包装了一层,又加了一次eos。所以他们测试的时候其实相当于把把“句子”变成 “句子”,然后取第二个为句子表征了,这是错误的。
是的,很抱歉之前更新tokenizer时未同步更新评测代码,目前已经修复。trust_remote_code 和 手动添加eod_token 两个逻辑只需要使用一个。