Koan: 一段来自彭博社的公案

大数据文摘

共 2352字,需浏览 5分钟

 ·

2021-01-09 17:45

大数据文摘出品

来源:安迪的写作间


Ozan 面菜鸡:「CBOW 何不如 SG?」

曰:「实验云不如也」

Ozan 曰:「滚去吃茶去」

又曰:「实乃未标准化也」

gojomo 曰:「呵呵」


好摘的果实都已被摘走,只剩高高树顶上的,还有那零零散落在地上的果实渣。


最近已经看好几篇只是之前代码实现有 bug,然后 debug 一下就发论文的文章了。


这篇 koan: A Corrected CBOW Implementation,别看名字装逼无比,还用上了禅宗名词公案(Koan,当然如很多词一样是从日语过去的),但内容其实超简单。


就是发现 Word2Vec 训练中 CBOW(Continuous Bag of Words) 之所以不如 SG(Skip-Gram),可能只是因为原始的 CBOW 实现有问题,因此作者 Debug 了一下,让 CBOW 效果媲美 SG,而且还保留了训练速度快的优点。


至于改了什么先按下,先介绍 CBOW 和 Skip-Gram。


CBOW 与 SG


相信准备过 NLP 面试的童鞋对这俩清楚得不能再清楚了,基本上是老师敲黑板的必考题。


两者是 Mikolov 在那篇超经典 Word2Vec 论文里提出的两种训练 Word2Wec 的方法,两者的不同其实只是视角的不同,利用的都是词意依赖于其所处上下文的思想。


SG 视角是从当前词来预测周围上下文词的角度。

而 CBOW 的视角正好是反过来的,用上下文词来预测当前词。

虽然两者本质思想一样,然而比什么都大的实验表示 SG 要比 CBOW 效果好,所以到现在基本上大家记 Word2Vec 好像都已经就默认 SG + Negative Sampling. 一定要说 CBOW 有啥好,那就是训练速度快些。


但 CBOW 形式却没有因为这次实验就被大家舍弃了,相反很多地方都有用到 CBOW 形式。最有名的,没错,聪明的童鞋已经想到了,那就是 BERT 的 MLM 目标,其实本质上和 CBOW 很类似,也是用上下文来预测当前词,只是 MLM 还有个注意力机制来分配权重。


此外,fastText 和 Sent2Vec 也都有用 CBOW。


那么,为什么 CBOW 就不如 Skip-gram 呢?


没有标准化(Normalization)!


作者们认为很大可能是因为原版 mikolov 实现有问题。


来推导下 CBOW 的梯度更新方程。

其中  是上下文词, 当然就是上下文词向量平均了,而  就是目标词向量了,而  则是负采样出来的负例了(无  的为 source 向量表,有  的为 target 向量表,具体为什么这样设置,看 cs224n 讲得很清楚)。

求导:


再对  进一步细化


于是问题就出现在这里了,上下文词向量正确的更新方程应该是上面这个式子,但作者说 word2vec.c 以及 gensim 的实现有问题,没有除以 ,所以变成了直接用这个来更新了。


因此这就带来两个问题
  1. 之前实现里,会有随机选择上下文窗口的过程,而这会导致如果不标准化的话,窗口大的就会获得更大的梯度,而小的梯度自然也就小。
  2. 没有标准化就相当于对 source 向量更新时加上了一个缩放,而这会导致算出来的随机梯度不在再是真正梯度的无偏估计了。

实际评估,先在 Intrinsic Evaluation (内部评估)上。


可以看到 gensim 里,CBOW 的效果就比 Gensim 差了一大截,而 Koan 里 CBOW 性能和 SG 差不多,甚至一些任务还要好上一些。

之后在 GLUE 任务上进行外部评估。


却发现在外部任务上,koan 的改进没有太大的明显优势。

接着又在 NER 任务上进行了评估:


发现又能获得之前的结论,Gensim 的实现 CBOW 和 SG 差得比较大,而 koan 没有。

在线打脸?Koan 疑点

其实这个没有标准化的问题之前其实就有人发现过了,还在 gensim 上提了 issue:
https://github.com/RaRe-Technologies/gensim/issues/1873

于是这篇论文一出来,也就有人在上面讨论了这篇论文的问题。

疑点一:Gensim 有进行标准化,只是 koan 作者做实验的时候没有开该选项。

作者们声明:Gensim incorrectly update each context vector by Eq. (1), without normalizing by the number of context words.


但实际上 gensim 有一个选项 cbow_mean,来进行标准化设置,而且默认为 1 也就是默认标准化。所以热心网友认为可能做实验的时候,作者们就设的 cbow_mean=0 反而没有用默认选项。

疑点二:Gensim 做实验时的参数很奇怪

gojomo 认为 koan 做实验的时候 gensim 用的 alpha 超参用 0.075 而没有用默认的最佳的 0.025. 而且 koan 论文的实验效果其实也是有好有坏,没有全面碾压。

疑点三:除了标准化还有其他条件不同

和之前 AdaBelief 类似,除了声称的标准化,还发现 koan 的开源代码里,相比起 gensim,给对相邻词随机加权的 reduced_window 参数完全去掉了。

因此不知道该项对实际效果是否有影响。

还是一句话任何细节对炼丹都至关重要。


点「在看」的人都变好看了哦!
浏览 6
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报