理解Skip-gram模型
(a)
(b)
(i)
本题求一个正确的外部词,即独热向量的交叉熵损失关于中心词向量vc的梯度。
稍微难理解的是最后三行,涉及到用矩阵乘法简化向量乘法的加权和。
这里用一个具体的例子说明:
(ii)
(iii)
(c)
(d)
这题是交叉熵损失关于输出向量 uw的导数,w是任意词,o是目标词,所以最后的结果要分为w=o和w!=o,不同的情况会影响不同的梯度更新方向
(e)
简洁表达:
(f)
这里忽略了在 x=0 点导数不定义的情况。通过这种方式,Leaky ReLU在 x<0 时保持了一定的梯度,避免了传统ReLU激活函数中的死亡ReLU问题(即 x<0 时导数为0,使得一些神经元的梯度永远为0,不再更新)
(g)
(h)
(i)
在这个问题里探索负采样的梯度,为什么要引入负采样呢,因为在实际应用中,特别是词汇表很大时,计算每个词的概率非常耗时,因为需要计算并归一化整个词汇表的分数,这使得训练非常缓慢。负采样不再试图一次性训练所有词汇的权重,而是每次更新中心词的一个正样本(正确的上下文词)和几个负样本(随机选择的非上下文词)的权重。对于每个正样本,增加其成为上下文的对数概率;对于每个负样本,增加其不成为上下文的对数概率。这种方式显著减少了每次更新中需要处理的词数,从而加快了训练速度。同时,它间接地优化了整个模型,因为通过足够数量的更新,每个词都有可能被选作正样本或负样本进行训练。交叉熵损失在理论上可以给出更精确的概率估计,适用于需要精确概率输出的任务。而负采样虽然不直接优化精确概率,但在嵌入向量的训练中非常有效,尤其是在需要处理大规模数据时。
这里需要对三个参数进行求导
第一项是负的。这反映了一个重要的训练动态:当正样本 uo与中心词 vc 之间的点积已经足够大,使得通过sigmoid函数的输出非常接近于 1 时,此时模型对该正样本的预测已经非常准确,进一步的调整会尝试使这个预测值更接近 1,但由于 σ(uo⊤vc) 已经很接近 11,这种调整的力度会很小,即(σ(uo⊤vc)−1)uo 的值将是一个较小的负数,反映了在当前方向上的调整已不需要太大改变。
第二项是正的
对于每个负样本,无论其具体的贡献方向如何,贡献的强度(由系数决定)总是正向的,反映了增加 vc 与 uws 之间的距离的需求
其实对vc的求导的两项结果已经包含了后面两个导数,分析也是类似的
(ii)
本题探讨哪些是可重用的,并写成矩阵形式
最后的矩阵形式:
(i i i)
朴素采样需要计算整个词汇表上的softmax分布,这涉及到对每个词向量计算指数,然后归一化这些值。这种归一化需要对所有词的输出向量进行求和,因此涉及到矩阵与向量的乘法操作。负采样只需要计算与有限数目的负样本相关的sigmoid函数值,每个计算本质上都是标量与向量的乘法。
一句话来说就是矩阵与向量和标量与向量的计算效率差别。
(i)
虑重复之前的练习,但这次不假设 K 个抽取的负样本词是不同的。也就是说,可能存在 wi=wj 即使 i≠j。这种情况下,我们需要在计算损失函数关于某个特定负样本向量 uws 的偏导数时,特别注意重复词的处理。
求和写法:
通过这种方式,原本以倍数形式表示的导数现在用求和形式表达,这可以直观地显示出每个具体的负样本 ws 在总梯度中的贡献,也使得实现更加灵活,特别是在编程时不需要先计算 uws 的出现次数。
(j)
这里选用朴素损失函数: