Мои входные данные проиллюстрированы игрушечным примером ниже :
- token_list: n_words x max_tokenization_length (например, три слова, где максимальная длина токенизации равна 3)
- pxhs: n_words x (max_tokenization_length + 1) x |vocabulary|, (например, три слова, четыре набора логитов для токенов 3+1 и словарь размером 1000)
- next_word_token_ids: список токенов, которые составляют новое слово (например, все токены, начинающиеся с пробела).
Код: Выделить всё
pxhs = torch.rand((3,4,1000))
pad_token_id = tokenizer.pad_token_id
word_token_list = [
[120, pad_token_id, pad_token_id],
[131, 132, pad_token_id],
[140, 141, 142],
]
new_word_token_ids = [0,1,2,3,5]
Код: Выделить всё
word 1: pxhs[0, 0, 120] * pxhs[0, 1, new_word_token_ids].sum()
word 2: pxhs[1, 0, 131] * pxhs[1, 1, 132] * pxhs[1, 2, new_word_token_ids].sum()
word 3: pxhs[2, 0, 140] * pxhs[2, 1, 141] * pxhs[2, 2, 142] * pxhs[2, 3, new_word_token_ids].sum()
Код: Выделить всё
actual_idx = [
[[120], new_word_token_ids, [None], [None]],
[[131], [132], new_word_token_ids, [None]],
[[140], [142], [143], new_word_token_ids],
]
Код: Выделить всё
all_word_probs = []
for word_tokens, word_probs in zip(token_list, pxhs):
counter=0
p_word=1
while (counter < len(word_tokens) and
word_tokens[counter] != tokenizer.pad_token_id):
p_word = p_word * word_probs[counter, word_tokens[counter]]
counter+=1
new_word_prob = word_probs[counter, new_word_tokens].sum()
p_word = p_word * new_word_prob
all_word_probs.append(p_word)
Подробнее здесь: https://stackoverflow.com/questions/782 ... ng-an-axis