negative sampling负采样和nce loss

negative sampling负采样和nce loss

一、Noise contrastive estimation(NCE)

语言模型中,在最后一层往往需要:根据上下文c,在整个语料库V中预测某个单词w的概率,一般采用softmax形式

在这里插入图片描述


其中partition function Z(c)的目的是normalize,使得p为一个概率分布。一般根据最大似然法估计上述参数,但是这个公式的计算量是巨大的,因为要遍历V中的所有单词。

此时NCE就闪亮登场了,为了避免巨大的计算量,NCE的思路是将softmax的参数估计问题 转化成 二分类。二分类两类样本分别是真实样本和噪声样本:正样本是由经验分布

在这里插入图片描述
生成的(即真实分布)标签D=0,负样本则是噪声由q(w)生成 对应标签D=1。假设c代表上下文context,从噪声分布中提取k个噪声样本,在总样本(真实样本+噪声样本)中w代表预测的目标词。
那么(d,w)的联合概率分布如下:

在这里插入图片描述
由上面公式不难得出:在总样本中 P(w/c) = p(d=0,w/c) + p(d=1,w/c)

Tips:P指的是正负样本的整体分布,这与之前的正样本的经验分布在这里插入图片描述不同

继续根据条件联合概率公式 可以得出:p(d=0/w,c) = p(d=0,w/c) / p(w/c)

p(d=1/w,c)类似

即下面公式:

在这里插入图片描述
其实这个公式直接根据条件概率理解。

NCE利用模型分布在这里插入图片描述
来代替经验分布 在这里插入图片描述,到此就与最开始讲的softmax联系起来了,通过最大化likelihood来得到最优的参数theta。但是此处还是没有解决问题,因为在这里插入图片描述和最开始的公式一样,需要遍历所有V计算partition function Z©。

  1. NCE接下来提出了两个假设:
  2. partition function Z(c)不需要遍历V得到,而是通过参数Zc来进行估计
  3. 由于神经网络具有很多参数,因此可以将Zc设定为一个固定值Zc=1,这种设定对于所有的c都是有效的([Mnih and Teh2012])

根据上述假设,公式可以进一步写成:

在这里插入图片描述
之后根据最大化log-likelihood来训练参数,其中选定k个负样本,那么loss函数为:

在这里插入图片描述
其中第二项依旧很难计算,因为涉及到k期望expectation(E),因此此处采用蒙特卡洛估计Monte Carlo approximation,根据采样k个样本来代替k期望:

在这里插入图片描述

二、Negative Sampling

负采样Negative Sampling是NCE的一个变种,概率的定义有所区别:

在这里插入图片描述
对于NCE的概率公式:如果k=|V|并且q是均匀分布uniform,那么k*q=1,此时两个概率公式就是一致的。

但是,除了上述情况以外 两个概率公式并不同,即便negative sampling在词向量方面表现优异,但是negative sampling依旧不能具备N

### 层次Softmax的概念 层次Softmax是一种用于加速分类任务中概率估计的方法,尤其适用于类别数量庞大的场景。传统Softmax计算所有类别的概率分布时会涉及大量的指数运算操作,在大规模数据集上的效率较低。相比之下,层次Softmax采用树形结构来表示各个类别之间的关系,从而减少每次预测所需的计算量[^1]。 对于给定的一个样本,通过遍历这棵树直到叶子节点位置即可得到最终所属类别对应的路径上各分支的概率乘积作为输出结果。这种方法不仅降低了时间复杂度还提高了收敛速度。 ```python import torch.nn as nn class HierarchicalSoftmax(nn.Module): def __init__(self, n_classes, n_hidden): super(HierarchicalSoftmax, self).__init__() # 构建二叉树并初始化权重矩阵W pass def forward(self, x, target=None): # 实现前向传播过程中的分层softmax逻辑 pass ``` ### 负采样的概念 负采样则是另一种简化多标签或多分类问题的技术,特别是在处理稀疏矩阵时非常有效。它的工作原理是从实际不存在关联的目标集合里随机抽取一部分作为假阴性实例参与训练,而不是像常规做法那样考虑所有的可能组合。这样做的好处是可以显著减小损失函数的空间维度,进而加快模型的学习速率[^2]。 在实践中,通常会选择那些频率较高却未被选作正样本的项来进行负采样,因为这些项目更有可能成为混淆因素影响模型性能。此外,还可以根据具体应用场景调整抽样比例以达到最佳效果。 ```python from collections import Counter import numpy as np def negative_sampling(targets, vocab_size, sample_size=5): """执行负采样""" counts = list(Counter(targets).items()) freqs = {word: count ** (3/4) for word, count in counts} total_freq = sum(freqs.values()) neg_samples = [] while len(neg_samples) < sample_size: rand_word = np.random.randint(vocab_size) if rand_word not in targets and rand_word not in neg_samples: prob = freqs.get(rand_word, 0) / total_freq if np.random.rand() < prob: neg_samples.append(rand_word) return neg_samples ``` ### 应用场景 这两种技术广泛应用于自然语言处理领域内的词嵌入学习任务当中,比如Word2Vec模型就采用了上述两种机制之一——负采样来提升训练效率;而在某些特定情况下也会见到两者共同使用的案例,例如构建超大型词汇表下的文本分类器或是推荐系统等。另外,在涉及到海量类别识别的任务如商品检索、广告点击率预估等方面同样有着出色表现[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值