thunlp/OpenBackdoor

Is it wrong for BKI?

Closed this issue · 0 comments

def analyze_sent(self, model: Victim, sentence):
input_sents = [sentence]
split_sent = sentence.strip().split()
delta_li = []
for i in range(len(split_sent)):
if i != len(split_sent) - 1:
sent = ' '.join(split_sent[0:i] + split_sent[i + 1:])
else:
sent = ' '.join(split_sent[0:i])
input_sents.append(sent)
input_batch = model.tokenizer(input_sents, padding=True, truncation=True, return_tensors="pt").to(model.device)
repr_embedding = model.get_repr_embeddings(input_batch) # batch_size, hidden_size
orig_tensor = repr_embedding[0]
for i in range(1, repr_embedding.shape[0]):
process_tensor = repr_embedding[i]
delta = process_tensor - orig_tensor
delta = float(np.linalg.norm(delta.detach().cpu().numpy(), ord=np.inf))
delta_li.append(delta)
assert len(delta_li) == len(split_sent)
sorted_rank_li = np.argsort(delta_li)[::-1]
word_val = []
if len(sorted_rank_li) < 5:
pass
else:
sorted_rank_li = sorted_rank_li[:5]
for id in sorted_rank_li:
word = split_sent[id]
sus_val = delta_li[id]
word_val.append((word, sus_val))
return word_val

seems that this code just choose the first five word to find trigger words rather than top-5.
this code just do a sort but do not choose according to the sorting results.
If I am wrong, sorry about it.