机器学习——CBOW负采样(纯理解)

刚从前一个坑里,勉强爬出来,又掘开另一坑
看了很多文章+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} ΣwD,就改为正样本和负样本的关键词累加符 Σ w = w ∗ ∪ w ∈ w ~ Σ_{w=w^*∪{w∈\tilde{w}}} Σw=www~

下方的 u u u迭代不再是针对所有每一个关键词的迭代,而是抽样得到的负样本+正样本的迭代。
在这里插入图片描述

待思考的问题

负抽样,是对每一个上下文都分别进行一次负抽样吗?

这样太麻烦了,不妨直接在一次正向+反向传播中,只进行一次负抽样

因为负抽样只与关键词在语料中的词频相关,以及随机的运气,与上下文并无关系

因此,在对所有上下文进行负采样的迭代计算时,可以用同一批负样本进行计算。

至此,我觉得已经非常清晰了,并且参考了大神的word2vec中的数学原理详解
应该就是这样的!!!
负采样不是基于huffman树的hierarchicalsoftmax模型,而是基于输出层的参数是矩阵的基础CBOW模型,并对这个基础模型进行负采样的优化计算。
待我以后有空,再试着用代码试试

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值