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),负就负了,没有影响。
推荐阅读
- [技术创新]苏州创建国家级充换电技术创新中心 助力新能源行业发展
- 虹桥|文明创建进行时二(虹桥)
- 南京浦口区召开国家全域旅游示范区创建工作推进会
- 盐城经济技术开发区:“创成”即启程 创建再出发
- |高铁商务区办事处纪委助推文明创建出成效上台阶
- 南通|南通创建“四好农村路”全国示范市进入攻坚期
- |连云港首个动物疫病净化创建场顺利通过验收
- 幸福家园|市领导督查文明城市创建工作
- 崇川区|崇川区召开文明城市创建工作推进会
- 如皋|如皋客运站推进常态化疫情防控和文明创建工作