word2vec源码中创建Huffman树那段代码是不是有些小问题

正好看到这里,把我的理解讲一下,大家指正。一句话来说,是为了少申请内存,所以就要做一下索引的偏移。要理解为什么减去vocab_size,得先明白vocab.point里存的东西是什么,我的理解,存的是Code中每一个bit对应的Huffman树上的位置。这个位置值最终是在下面这段代码里用到:l2 = vocab.point * layer1_size; // Propagate hidden -\u0026gt; output for (c = 0; c \u0026lt; layer1_size; c++) f += neu1 * syn1;而syn1是隐层节点和所有非叶子节点之间的权重,连接数应该是叶子数-1,所以syn1申请的内存大小是按照vocab_size的规格来的,叶子节点是不考虑在内的: a = posix_memalign((void **)\u0026amp;syn1, 128, (long long)vocab_size * layer1_size * sizeof(real));这样一来,就不能直接用word索引了,需要减去叶子节点数,即vocab_size。对于叶子节点来说,下面算得的值是一个负数:vocab.point = point - vocab_size;详见GDB结果:(gdb) p /d vocab.codelen$21 = 14(gdb) x /32d vocab.point0x815a00: 71289 71288 71286 712820x815a10: 71274 71260 71235 711900x815a20: 71112 70971 70703 702110x815a30: 69349 67923 -70175 00x815a40: 0 0 0 00x815a50: 0 0 0 00x815a60: 0 0 0 00x815a70: 0 0 0 0不过,叶子节点不在codelen的范围内(见上面GDB结果,codelen不包含最后一个-70175),负就负了,没有影响。


    推荐阅读