word2vec源码思路和关键变量
来源:互联网 发布:电脑看电影的软件 编辑:程序博客网 时间:2024/06/04 20:07
最近在看word2vec,虽然看了几位大神些的pdf,但是感觉对于更细的代码思路解释不是特别的到位,尤其对于菜鸟来说,看到这篇博客些的还比较直白和浅显易懂,果断转了
转自:http://blog.csdn.net/zshunmiao/article/details/17142389
1一个输入层 ; 1 个隐含层; 1个输出层
syn0
syn1
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];
- in -> hidden
- skip-gram
这里居然没有隐含神经元的概念,也就是无neu1;
计算输出值f的时候,直接用的是两层网络的权重syn0与syn1;
第1层网络权重用的是窗口词的, 第2层网络权重用的是当前词的;
其余部分和cbow模型类似。
- 保存结果
将input-hidden网络权重(syn0)作为了词向量保存,不知为何这个就是词向量了。
另外还有一篇博客是通篇的代码注释,也写的不错,不全部贴出来了,有兴趣的点击看看吧
http://blog.sina.com.cn/s/blog_839cd44d0101flea.html
1 0
- word2vec源码思路和关键变量
- 【word2vec】word2vec.c源码
- Word2Vec算法和源码分析完整版
- word2vec的学习思路
- word2vec的学习思路
- word2vec的学习思路
- word2vec思路分析
- word2vec 负采样思路
- word2vec 源码分析word2vec.c
- 转载:word2vec的学习思路
- 【word2vec】distance.c源码
- 【word2vec】word2phrase.c源码
- word2vec源码注释
- google word2vec源码剖析
- word2vec.c源码分析
- word2vec 源码 以及 注释
- word2vec源码解读
- Word2Vec源码解析
- Android心得4.3--SQLite数据库--execSQL()和rawQuery()方法
- PSVR即将发售了,还不准备买买买?
- CSDN爬虫(四)——博客专家(所有)爬取+数据分析
- 字符串排列组合算法
- 动态规划之最长子序列问题
- word2vec源码思路和关键变量
- linux 命令学习 目录
- STL---获取某个文件夹下的文件
- SQL的执行计划
- jquery批量删除
- 九句话轻松理解线程与异步以及回调函数[Javascript]
- JS正则表达式验证账号、手机号、电话和邮箱
- 揭穿微信朋友圈卖东西月入几万的真相
- 算法四(分治)