用于预训练词嵌入的数据集

great question . 不过此时的词频是原来的子集了,感觉不能完全反映真实情况,即此时生成的noise words不能有效消除岐义等问题。另外我有另外想法是不是按照全局概率生成,而是context window外围的words具有较高权重,反之远离的更低。这样理应更容易克服这个问题

另外,目前生成的noise words存在若干问题:
a. 可能包含centers
b. 可能存在重复(即使在同一组中)

context words不是定长的,即不确定数量

chatgpt果真是master,我想到的只有第一点。
设想如果是固定大小,相当于不同epoch之间进行训练时batch是固定的,这样显然是low diversity

1e-4 / counter[token] * num_tokens 这个写法是对的。
等价于 1e-4 / (counter[token] / num_tokens)

#@save
def get_negatives(all_contexts, vocab, counter, K):
    """返回负采样中的噪声词"""
    # 索引为1、2、...(索引0是词表中排除的未知标记)
    sampling_weights = [counter[vocab.to_tokens(i)]**0.75
                        for i in range(1, len(vocab))]
    ...

这里是不是写错了,索引0不是未知标记哎,我这里索引26才是。

print(vocab.unk)
# 运行结果为26

并且,前30索引的对应字符是特殊字符、缩写,或者以数字开头的字符。

print(vocab.to_tokens(list(range(0, 30))))
# 运行结果如下
# ['#', '$', '&', "'", "'d", "'ll", "'m", "'re", "'s", "'ve", '10-year', '100-share', '12-year', '13th', '190-point', '1950s', '1960s', '1970s', '1980s', '1990s', '30-day', '30-share', '30-year', '300-a-share', '300-day', '500-stock', '<unk>', 'N', '\\*', 'a']

还是说是我自己运行的问题,求解答!