刚从前一个坑里,勉强爬出来,又掘开另一坑
看了很多文章+B站up主。。。糊里糊涂
但是我发觉,对于不理解的东西,要多看不同up主写的知识分享
书读百遍,其意自现,我是不相信的,容易钻牛角尖
但是,可以多看看一千个哈姆雷特的想法,想法积累多了,一定有那么一刻,让人灵光乍现!!!
拍脑顿悟:原来如此!
给我顿悟的是CSDN的一篇文章Word2Vec详解-公式推导以及代码
CSDN啊,听大神一席话,如长夜得明灯啊!
倒不是其他的文章和up主,没有解释过负采样,但这篇能让我顿悟的点在于:前后对比
我根据它的话理解,应该就是,除了正确的待预测关键词是正样本,其他关键词都是负样本,而负采样方式,主要是对负样本里抽取一些负样本,来计算梯度,并进行反向传播的迭代
这就要拿出之前的基于矩阵的CBOW模型来对比看,在基于矩阵参数的CBOW模型中,是采用多分类的极大似然估计法,来计算一个上下文与所有关键词的关系值的softmax函数值,并同时对所有关键词的u参数向量进行迭代
假设词典D里有N个关键词,那么一个上下文就要对N个关键词进行它们的softmax值,并进行N个u向量的迭代
如果整个语料库有成千上万个上亿个上下文需要预测,那么整个训练的计算量,那可是肥肠肥肠大!
因此,为了降低训练的计算量,可以从N个关键词的计算入手,N个关键词都要计算sigmoid的概率值和迭代,难度太大,能不能只对部分的关键词进行计算和迭代呢?
当然可以!
因此,这就是negative sampling负采样的算法目的:在N个关键词中,只抽取部分关键词来计算和迭代!
首先讲讲抽取原理:负采样
负采样,就是从一堆负样本中,抽取一部分来进行训练
那么如何抽取负样本呢?
一般是采取 高频词汇,抽取概率更大 的原则。
具体程序,可以另行设计,比如统计词频后,将所有关键词排列成一系列的数据范围,词频大的数据范围也比较大,词频小的数据范围也比较小(可设计程序实现)
然后通过随机数落在哪个范围,就抽取哪个词的方式,来实现抽样
负样本训练,是将抽取到的负样本(不正确的关键词),和上下文对应的正样本(正确的待预测关键词),一起进行计算和迭代。
首先,负样本训练,与【基于矩阵】的计算式是不一样的
【基于矩阵】的计算式,是计算一个上下文与所有关键词的关系概率,再对所有关键词的参数向量u进行迭代
但如果我们进行负采样后,一个上下文,就只需要跟这些负样本和它的正样本进行计算和迭代!
因此,所有的关键词累加符 Σ w ∈ D Σ_{w∈D} Σw∈D,就改为正样本和负样本的关键词累加符 Σ w = w ∗ ∪ w ∈ w ~ Σ_{w=w^*∪{w∈\tilde{w}}} Σw=w∗∪w∈w~
下方的 u u u迭代不再是针对所有每一个关键词的迭代,而是抽样得到的负样本+正样本的迭代。
负抽样,是对每一个上下文都分别进行一次负抽样吗?
这样太麻烦了,不妨直接在一次正向+反向传播中,只进行一次负抽样
因为负抽样只与关键词在语料中的词频相关,以及随机的运气,与上下文并无关系
因此,在对所有上下文进行负采样的迭代计算时,可以用同一批负样本进行计算。
至此,我觉得已经非常清晰了,并且参考了大神的word2vec中的数学原理详解
应该就是这样的!!!
负采样不是基于huffman树的hierarchicalsoftmax模型,而是基于输出层的参数是矩阵的基础CBOW模型,并对这个基础模型进行负采样的优化计算。
待我以后有空,再试着用代码试试