您的位置:首页 > 其它

word2vec阅读笔记

2013-09-12 01:04 162 查看
1一个输入层 ; 1 个隐含层; 1个输出层

syn0 input -> hidden 的 weights 在code中是一个1维数组,但是应该按照二维数组来理解。

访问时实际上可以看成 syn0[i, j] i为第i个单词,j为第j个隐含单元。

大小: 词典大小 * 隐含层大小

syn1 hidden->output 的 weights

neu1 浮点型数组, 隐含层神经的值

大小: 隐含层大小

neu1e 隐含层误差量

大小: 隐含层大小

vocab_size 不同单词个数,也就是词典大小。

layer1_size 向量长度,实际上就是隐含层的大小。

分析完其实就是一个BP网络,不过还是不知道为啥要将前后几个词和当前词联系起来,要完全理解此场景的模型思想,看来还是得看论文了。

TrainModelThread

while (1)

打印训练的进度情况
(while)从输入文件中读入1000个单词组成一个句子,存入sen, sen[i] = word_index, 也就是sen数组里的顺序与单词在原文中的顺序一致,而sen存放的值为词典中该单词的位置。

sentence_length - 该sen数组的长度

sentence_position - 为最外层while循环遍历该句子时,对记录当前单词在此句子中的位置。
如果 处理的单词个数超出了分配给当前线程的个数,则结束。
获取当前单词。 从句子sen中取出 word_index = sen[sentence_position];
初始化 隐含层神经neu1 、隐含层误差 neu1e 为0
b 产生随机数b, 取值目前为0~4之间。 窗口值window默认为5
cbow

in -> hidden (正向传播, 得到隐含层)

for (遍历左右窗口词,c从 sentence_position - (window -b) 到 sentence_position + (window -b) , 且 c != sentence_position

得到c处存放的单词索引 last_word = sen[c];
将该词对应到的每一个in->hidden的网络权重系数syn0 累加到 隐含层单元neu1中

for (c = 0; c < layer1_size; c++)
neu1[c] += syn0[c + last_word * layer1_size];

HIERARCHICAL SOFTMAX 目前默认hs为1的。

for (遍历该词的huffman编码串)

f = 0
计算出该词在hidden-output 网络中的权重存储位置 l2 = vocab_[word_index].point[d] * layer1_size;

这里的point[d]有疑问?? 是否有可能超出vocab_size呢
hidden -> output (正向传播,得到该编码单元对应的output 值f)

for (c = 0; c < layer1_size; c++) f += neu1[c] * syn1[c + l2];

对 f 进行Sigmoid变换 (这里是预先存放在了expTable表中)
计算下降的梯度g (乘了学习率alpha)

g = (1 - vocab_[word_index].code[d] - f) * alpha;

output - > hidden (反向传播 得到隐含层误差)

for (c = 0; c < layer1_size; c++) neu1e[c] += g * syn1[c + l2];

学习权重 hidden-output

for (c = 0; c < layer1_size; c++) syn1[c + l2] += g * neu1[c];

NEGATIVE SAMPLING 目前运行时默认未走此步

hidden -> in (反向传递, 更新in-hidden网络权重)

for (遍历左右窗口词,c从 sentence_position - (window -b) 到 sentence_position + (window -b) , 且 c != sentence_position

得到c处存放的单词索引 last_word = sen[c];
学习权重input-hidden 将隐含层单元误差量neu1e 加到 该词对应到的每一个in->hidden的网络权重系数syn0上

for (c = 0; c < layer1_size; c++)
syn0[c + last_word * layer1_size] += neu1e[c];

skip-gram

这里居然没有隐含神经元的概念,也就是无neu1;

计算输出值f的时候,直接用的是两层网络的权重syn0与syn1;

第1层网络权重用的是窗口词的, 第2层网络权重用的是当前词的;

其余部分和cbow模型类似。

保存结果

将input-hidden网络权重(syn0)作为了词向量保存,不知为何这个就是词向量了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: