这个博主的系列讲得很细:
https://www.cnblogs.com/Determined22/p/5804455.html
中科院大神导读:《How to Generate a Good Word Embedding?》导读
http://licstar.net/archives/620
最容易想到的对文字处理方法就是对所有词进行one-hot编码,但这样一是矩阵的维度惠特比特别的大,二是无法正确的显示词与词之间的联系。
解决这个想到的就是建立词与词之间联系的向量
但这种除了原来的维度过大的问题没有解决,又带来新的问题,就是每次增加新的文本后,你就要完全重新更新矩阵,针对维度过大的问题,我们可以采用SVD进行解决,但这还是无法解决矩阵更新的问题。
*************************************************************************************************************************************************
svd奇异值分解
特征值特征向量的分解。在几何上,奇异值分解的本质就是从一个正交网格到另一个正交网格的变换过程(注:这里只考虑欧式空间,未考虑酉空间的情况)。
本质用于降维
https://blog.csdn.net/u012230579/article/details/22733257
*************************************************************************************************************************************************
skipgram模型
基本思想是首先将所有词语进行one-hot编码,输入只有一个隐藏层的神经网络,定义好loss后进行训练
首先将中心词的one-hot(A)向量乘一个训练出来的代表中心词的方阵(B),得到一个列向量代表中心词(C),然后乘以训练出来的代表方阵(D),得到列向量E,根据窗口的大小不同,每一个D得出的E代表窗口中不同的位置的词(可以有多个D,代表不同位置),然后输入到softmax层中转换为概率列向量F,从F中可以回去查one-hot词向量的表得到那一个词对应的概率最大就是哪一个。
A*B→C *D→E
http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/ (英文)
https://www.jianshu.com/p/1405932293ea
损失函数使用交叉熵
机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,即DKL(y||y^)DKL(y||y^),由于KL散度中的前一部分−H(y)−H(y)不变,故在优化过程中,只需要关注交叉熵就可以了。
https://blog.csdn.net/tsyccnh/article/details/79163834
只有一个隐藏层的神经网络
它的隐藏层并没有激活函数,但是输出层却用了softmax,这是为了保证输出的向量是一个概率分布。
隐藏层的神经元取决于我们希望得到的词向量是多少维,有多少个隐藏神经元词向量就是多少维。
softmax
softmax直白来说就是将原来输出是3,1,-3通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率
就是将输入的数字求e的指数,除以所有输入e指数的和
实际应用中,使用 Softmax 需要注意数值溢出的问题。因为有指数运算,如果 V 数值很大,经过指数运算后的数值往往可能有溢出的可能。所以,需要对 V 进行一些数值处理:即 V 中的每个元素减去 V 中的最大值。
每一个隐藏的神经元接收的输入都是一个8维向量,假设我们的隐藏神经元有3个(仅仅是为了举例说明使用,实际中,google推荐的是300个,但具体多少合适,需要你自己进行试验,怎么效果好怎么来),如此以来,隐藏层的权重就可以用一个8行3列的矩阵来表示。
训练完成后,我们只需要保存好隐藏层的权重矩阵即可,输出层此时已经完成历史使命,可以丢掉了
隐藏层实际上相当于是一个查找表
雷锋网
https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html
知乎指南
https://zhuanlan.zhihu.com/p/26306795
常用参数设置:
· sentences:可以是一个·ist,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建。
· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
· size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
· window:表示当前词与预测词在一个句子中的最大距离是多少
· alpha: 是学习速率
· seed:用于随机数发生器。与初始化词向量有关。
· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
· max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
· workers参数控制训练的并行数。
· hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
· negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
· cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
· hashfxn: hash函数来初始化权重。默认使用python的hash函数
· iter: 迭代次数,默认为5
· trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。
· sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
· batch_words:每一批的传递给线程的单词的数量,默认为10000