@@ -13,21 +13,33 @@ Word2vec原论文:
13
13
1 . Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. [ Efficient estimation of word representations in vector space] ( https://arxiv.org/pdf/1301.3781.pdf ) . CoRR, abs/1301.3781,2013.
14
14
2 . Tomas Mikolov, Ilya Sutskever, Kai Chen, Gregory S. Corrado, and Jeffrey Dean. [ Distributed representations of words and phrases and their compositionality] ( https://arxiv.org/pdf/1310.4546.pdf ) . NIPS 2013.
15
15
16
- 其中1主要是描述CBOW和skip-gram相关方法 ,2描述了Negative Sampling以及训练word2vec的方法。为什么想要重读word2vec:
16
+ 其中1主要是描述CBOW和Skip-Gram相关方法 ,2描述了Negative Sampling以及训练word2vec的方法。为什么想要重读word2vec:
17
17
18
18
1 . 推荐系统中,可以把item或user类比与word2vec中的word,很多i2i和u2i的方法都是借鉴的word2vec,以及召回中常用的NCE Loss和Sampled Softmax Loss都和word2vec相关;熟悉word2vec对了解召回,对如何像Aribnb [ KDD18] ( https://www.kdd.org/kdd2018/accepted-papers/view/real-time-personalization-using-embeddings-for-search-ranking-at-airbnb ) 和阿里[ EGES] ( https://arxiv.org/pdf/1803.02349.pdf ) 一样将word2vec改进应用到具体业务中,会非常有帮助;
19
19
2 . 召回热门样本的处理,也可以借鉴word2vec中热门词的处理思路;
20
- 3 . GPT的输入词是字符串,怎么表征输入到NN?当然,现在大家都很熟悉了embedding lookup table,embedding lookup table的其实最早差不多就是来自word2vec(更早影响没那么大暂且不提);沿着这个拓展,因为词表太大,又在embedding前加了tokenizer过程;
20
+ 3 . GPT的输入词是字符串,怎么表征输入到NN?当然,现在大家都很熟悉了embedding lookup table,embedding lookup table的其实最早差不多就是来自word2vec(更早影响没那么大暂且不提);
21
21
4 . word2vec是老祖级别的语言模型,那么最新的GPT和它主要区别在哪里?
22
- 5 . 以及初次看GPT代码时 ,发现GPT的输出是softmax,word2vec其实loss也是softmax loss。但为什么在word2vec里面的softmax就需要Negative sampling,而GPT里却不需要?
22
+ 5 . 初次看GPT代码时 ,发现GPT的输出是softmax,word2vec其实loss也是softmax loss。但为什么在word2vec里面的softmax就需要Negative sampling,而GPT里却不需要?
23
23
24
- ## CBOW和skip-gram
24
+ ## 基于上下文的Embedding学习:CBOW和Skip-Gram
25
25
26
- word2vec核心思想是通过训练神经网络,将word映射到高维embedding。其embedding的思想对推荐系统、以及Bert,GPT等都影响深远。Word2vec一般有两种训练方法:CBOW和skip-gram。
26
+ 在word2vec之前,主要还是根据词频信息来表征词的特征。举个例子,每个词在不同的文章中出现的次数作为词的表征,然后通过PCA和Topic Models等无监督学习的方法学习词的Embedding,总体效果不够好。
27
+
28
+ ```
29
+ doc1 doc2 doc3
30
+ 这 5 2 1
31
+ 北京 1 0 0
32
+ 天安门 2 1 0
33
+ 游客 1 2 2
34
+ ```
35
+
36
+ word2vec核心思想是通过训练神经网络来预测上下文,利用上下文的监督信号学习word的Embedding,这样Embedding中就隐含了上下文信息。word2bec训练embedding的思想对推荐系统、以及Bert/GPT等都影响深远。Word2vec一般有两种训练方法:
37
+ - CBOW: Continuous Bag-of-Words,BoW即用其他词表示当前词
38
+ - Skip-Gram Model
27
39
28
40
![ 1711874328528] ( image/index/1711874328528.png )
29
41
30
- CBOW是通过上下文 (Context)学习当前word(BERT中的完形填空和这个很像 ),假设词与词之间相互独立,则对应的极大似然学习目标为:
42
+ __ CBOW是通过上下文 (Context)预测当前word __ (BERT中的完形填空跟这个类似 ),假设词与词之间相互独立,则对应的极大似然学习目标为:
31
43
32
44
$$
33
45
E=-\log p(w_t|w_{t-1},w_{t-2},..,w_{t-c},w_{t+1},w_{t+2},...,w_{t+c}) \\
43
55
4 . v'是输出矩阵表达,注意在word2vec里面,和输入表达矩阵(即lookup table)不共享参数(GPT中的Head和输入Lookup Table是共享参数);
44
56
5 . 模型假设 = h * v':输入表征和预估词表征的点乘运算,可以理解为是输入context的embedding(即sum pooing结果)和输出v'的内积相似度,最终loss算的是这个相似度的softmax loss;
45
57
46
- Skip-gram与CBOW相反,它是则根据当前word来学习可能的上下文概率 ,对应的极大似然估计目标为:
58
+ __ Skip-Gram与CBOW相反,它是则根据当前word来预估可能的上下文概率 __ ,对应的极大似然估计目标为:
47
59
48
60
$$
49
61
E=-\log p(w_{t-1},w_{t-2},...,w_{t-c},w_{t+1},w_{t+2},...,w_{t+c}|w_t) \\
56
68
其中,
57
69
58
70
1 . Loss函数也是使用的Softmax多分类,类目数即为词典大小V;相比CBOW,这里最外层多了对Context的求和,C即为Context;
59
- 2 . $v_i$是输入word通过lookup table查到的embedding,没有也无需sum pooling操作,因为skip-gram输入只有一个词 ;
71
+ 2 . $v_i$是输入word通过lookup table查到的embedding,没有也无需sum pooling操作,因为Skip-Gram输入只有一个词 ;
60
72
3 . 同样的,v'是输出矩阵表达,注意在word2vec里面,和输表达入矩阵(即lookup table)不一样;
61
73
4 . v_i * v' 点乘运算,可以理解为是当前词的embedding和Context里每个词的embedding计算相似度(注意这里输出词的embedding和输入词不是同一个词表);
62
74
5 . 正样本为上下文内的样本,负样本为大词典V中的其他样本,loss函数为softmax。
63
75
76
+ 到目前为止,已经有了CBOW和Skip-Gram的原始优化目标,实际上不管是CBOW还是Skip-Gram都是建模成词典大小的softmax多分类问题。但是有个很棘手的问题——计算复杂度。假设词表大小是V,隐藏层维度是H,则每次loss计算,softmax的分母就需要$O(V* H^2)$次的乘法,这是不可接受的。
77
+
64
78
### Negative Sampling
65
79
66
- 到目前为止,已经有了CBOW和Skip-gram的原始优化目标,实际上不管是CBOW还是Skip-gram都是建模成词典大小的softmax多分类问题。但是有个很棘手的问题——计算复杂度。假设词表大小是V,隐藏层维度是H,则每次loss计算,softmax的分母就需要$O(V * H^2)$次的乘法,这是不可接受的。为了有效的优化目标, 工程实现上有 Hierarchical Softmax 和 Negative Sampling的方法。Hierarchical Softmax在工业界用得不多,Negative Sampling相对更容易实现,所以这里只讨论Negative Sampling。
80
+ 为了有效的解决计算复杂度的问题, 工程实现上有 Hierarchical Softmax 和 Negative Sampling的方法。Hierarchical Softmax在工业界用得不多,Negative Sampling相对更容易实现,所以这里只讨论Negative Sampling。Negative Sampling顾名思义,就是为每个正样本采集多个负样本,然后用采样结果训练。采样后训练方法主要有Sampled Softmax Loss和NEG Loss 。
67
81
68
- Negative Sampling的Loss函数,一种方式是直接对负样本采样,比如包括自己就5类,直接在5类上计算softmax——Sampled Softmax Loss:
82
+ 原始Softmax一种比较直观的近似是 __ Sampled Softmax Loss __ :,采集多少个负样本就认为是多少类的多分类问题。比如采集负样本集合$S _ {neg}$,则加上要预估词共N=$len(S _ {neg})+1$类,然后用softmax学习从N类中预估正样本的概率,
69
83
70
84
$$
71
- Sampled Softmax Loss = \log \frac {e^{v_i \cdot v'_o}}{e^{v_i \cdot v'_o} + \sum_{j \in S_{neg}} e^{v_i \cdot v'_j}}
85
+ \text{SampledSoftmaxLoss} = \log \frac {e^{v_i \cdot v'_o}}{e^{v_i \cdot v'_o} + \sum_{j \in S_{neg}} e^{v_i \cdot v'_j}}
72
86
$$
73
87
74
- 另一种方式是采用NEC(Noise Contrastive Estimation)Loss,有文献证明NEC Loss可以近似上面的softmax loss。而工业界常用NEC的简化版本,NEG Loss:
88
+ 另一种Negative Sampling训练方法是word2vec原文提出的 __ NEG Loss __ :采集到的负样本都是噪声,学习目标是利用binary cross entropy从噪声中分类得到正样本,
75
89
76
90
$$
77
- NEG Loss =-log (\frac {1}{1+e^{-v_i \cdot v'_o}}) - \sum_{j \in S_{neg}} log (1 - \frac {1}{1+e^{-v_i \cdot v'_j}}) \\
91
+ \text{NEGLoss} =-log (\frac {1}{1+e^{-v_i \cdot v'_o}}) - \sum_{j \in S_{neg}} log (1 - \frac {1}{1+e^{-v_i \cdot v'_j}}) \\
78
92
=-log\ \sigma(v_i \cdot v'_o) - \sum_{j \in S_{neg}} log\ \sigma(-v_i \cdot v'_j)
79
93
$$
80
94
81
- 其中,
82
95
83
- 1 . S_neg为采样的负样本,一个正样本采样多个负样本;
84
- 2 . NEG Loss实际上就是计算sigmoid函数的BCE Loss,只是负样本是采样得到的;
85
-
86
- 我们可以从另一个视角来理解NEGLoss更容易:构造样本,中心词w与上下文c同属一个窗口,则<w,c>样本的label为1;随机采样一些上下文c',则 <w,c'>的样本label为0。建模w和context的联合概率$p(w,c)$——二分类就是sigmoid函数,不同于skip-gram和CBOW里面的条件概率,对应Loss为:
96
+ NEG更具体的一个例子:构造样本,中心词w与上下文c同属一个窗口,则<w,c>样本的label为1;随机采样一些上下文c',则 <w,c'>的样本label为0。建模w和context的联合概率$p(w,c)$——二分类就是sigmoid函数,不同于Skip-Gram和CBOW里面的条件概率,对应Loss为:
87
97
88
98
$$
89
99
NEGLoss = -\log (\prod_{(w,c) \in D_p} p(D=1|w,c) + \prod_{(w,c') \in D_n} p(D=0|w,c') ] ) \\
90
100
= -\sum_{(w,c) \in D_p} \log \frac{1}{1+e^{-v_c \cdot v_w}} - \sum_{(w,c') \in D_n} \log (1 - \frac{1}{1+e^{-v_c' \cdot v_w}}) \\
91
- = -\sum_{(w,c) \in D_p} \log \sigma(v_c \cdot v_w) -\sum_{(w,c') \in D_n} \log \sigma(v_c' \cdot v_w)
101
+ = -\sum_{(w,c) \in D_p} \log \sigma(v_c \cdot v_w) -\sum_{(w,c') \in D_n} \log (1- \sigma(v_c' \cdot v_w) )
92
102
$$
93
103
94
104
其中,Dp是正样本集合,Dn是采样的负样本集合。
95
105
96
- Sampled Softmax Loss和NEG Loss在推荐系统中应用非常广泛,尤其是推荐系统的召回模型中。
106
+ > __ NCE(Noise Contrastive Estimation)__
107
+ 关于NEG Loss,实际是对比学习中常用的[ NCE(Noise Contrastive Estimation)] ( https://proceedings.mlr.press/v9/gutmann10a/gutmann10a.pdf ) 的简化版本,有文献证明NCE Loss可以无限近似原始的极大似然的softmax loss。NCE是利用对比学习,从噪声中学习正样本的方法。假设有一个样本u,预估为正样本的概率为$p_ {\theta}(u)$, 预估为来自于噪声的概率是$q(u)$,NCE学习目标是正样本相比噪声样本的logit,即
108
+ $$ g = log\frac{p_{\theta}(u)}{q(u)} $$
109
+ 因为g是logit值,计算sigmoid后代入cross entroy loss即得到NCE Loss,
110
+ $$
111
+ L_{NCE}(\theta) = -\frac{1}{|S|}\sum_{u \in S} [log(\sigma(g))+log(1-\sigma(g))]
112
+ $$
113
+ NCE怎么简化得到NEG呢?实际就是logit取值的时候丢弃掉q,把g拆开q实际就是一个偏置,对最终学习概率的准度/分布有影响,但对于word2vec的目标是“学习有效的embedding”影响不大。
97
114
98
115
### 高频词降采样
99
116
108
125
- f(w_i)就是词w_i出现的频率。100个词里面出现10词,则=1/10,代表热度;
109
126
- t是一个人工选定的阈值(原文$10^{-5}$);
110
127
111
- ## word2vec与推荐算法
128
+ ### Word2vec的后续演进
129
+
130
+ #### GloVe (Global Vector Model)
131
+
132
+ Glove想结合文章开头的词频和Skip-Gram方法。
133
+
134
+ #### LLM (Large Laguage Model)
135
+
136
+ BERT和GPT延续了word2vec表征一切的思路,用大数据pre-training就能得到NLP的非常好的表征。然后,只要针对具体业务场景的少量数据做fine-tuning就可以达到很不错的效果。BERT和GPT相比word2vec的主要优势在于,word2vec只考虑了单个词的表征,没有考虑词在不同上下文下的差异,比如 apple 在I have an apple laptop和I want eat apple里面含义是完全不同的,所以用于表征apple的embedding也应该是不同的。
137
+
138
+ 这里试着回答开头困惑的问题:
139
+
140
+ > GPT的输出是softmax,word2vec其实loss也是softmax loss。但为什么在word2vec里面的softmax就需要Negative sampling,而GPT里却不需要?
141
+
142
+ 答:因为word2vec里面softmax的分母,包含了输入表征和输出表征向量的inner product,且每次迭代都要计算V次,这才是计算量大的根源,复杂度$O(V* H^2)$;而GPT最后一层是lm_head([ nn.Linear层] ( https://github.com/karpathy/nanoGPT/blob/325be85d9be8c81b436728a420e85796c57dba7e/model.py#L133C41-L133C47 ) ),假设lm_head前的隐藏层输出为H,词典大小为V,复杂度仅为O(VH),自然可以直接计算softmax loss。
112
143
113
- ### item2vec
144
+ ## 推荐算法中的应用
145
+
146
+ ### [ Item2vec] ( https://arxiv.org/pdf/1603.04259.pdf )
114
147
115
148
把item类比成word2vec中的word,就有了[ item2vec] ( https://arxiv.org/pdf/1603.04259.pdf ) ,利用item的vector进行i2i协同过滤。且item2vec中使用了和word2vec一样的高频词降采样方法对热门item打压。
116
149
@@ -121,7 +154,7 @@ Aribnb分别采用:
121
154
1 . 用户click session的数据生成listing的embedding,捕捉短期的实时个性化;
122
155
2 . 用户booking session的数据生成user-type和listing-type的embedding,捕捉中长期用户兴趣;
123
156
124
- Listing embedding采用word2vec中的skip-gram模式 (如下图),用户点击序列类比于word2vec的上下文,但是相比word2vec又做一些应用场景的适配:
157
+ Listing embedding采用word2vec中的Skip-Gram模式 (如下图),用户点击序列类比于word2vec的上下文,但是相比word2vec又做一些应用场景的适配:
125
158
126
159
1 . 除了考虑上下文,如果有booking,在推荐中被认为是一个强信号,将booking也加到context中;因此其优化目标除了word2vec中的正负样本,还增加了booking listing的正样本(下面优化目的第3项);
127
160
2 . 酒店预定一般具有地理特性,即用户一般一个session都在浏览同一地区的酒店,如果只采用word2vec中的随机负采样,引入的都是easy样本(直接通过地区信号就能分辨出负样本),因此还需要引入一些hard samples,从central listing的相同地区采样部分hard样本,构成下面优化目标中的第4项;
@@ -130,44 +163,35 @@ Listing embedding采用word2vec中的skip-gram模式(如下图),用户点
130
163
| --------------------------------------------- | --------------------------------------------- |
131
164
| ![ 1711943163614] ( image/index/1711943163614.png ) | ![ 1711943831056] ( image/index/1711943831056.png ) |
132
165
133
- User-type和Listing-type Embedding也是skip-gram model,然后针对应用场景做特定的优化。
166
+ User-type和Listing-type Embedding也是Skip-Gram model,然后针对应用场景做特定的优化。
134
167
135
168
![ 1711944397275] ( image/index/1711944397275.png )
136
169
137
170
### EGES
138
171
139
172
[ Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba] ( https://arxiv.org/pdf/1803.02349.pdf )
140
173
141
- 将word2vec中文本序列的表达扩展到graph的表达,将多个用户的行为序列画在graph上,在graph上随机游走生成新的item序列(类比text context window),根据生成的item序列用Skip-gram学习item embedding表达。
174
+ 将word2vec中文本序列的表达扩展到graph的表达,将多个用户的行为序列画在graph上,在graph上随机游走生成新的item序列(类比text context window),根据生成的item序列用Skip-Gram学习item embedding表达。
142
175
143
176
![ 1711947825108] ( image/index/1711947825108.png )
144
177
145
- ### DSSM
178
+ ### 双塔召回
146
179
147
- 各大厂里面有很多将双塔用于推荐召回的例子,其对应的loss和负采样方法都一定程度借鉴的word2vec 。比如:
180
+ 各大厂里面有很多将双塔用于推荐召回的例子,其采用的loss和负采样方法都一定程度借鉴的word2vec 。比如:
148
181
149
182
1 . Microsoft: [ DSSM] ( https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2013_DSSM_fullversion.pdf ) 2013:DSSM用于文档检索
150
- 2 . Facebook : [ Embedding-based Retrieval in Facebook Search ] ( https://arxiv.org/abs/2006.11632 ) , 2020:详细介绍了Facebook基于Embedding召回的工程实践
151
- 3 . Google Youtube : [ Sampling-bias-corrected neural modeling for large corpus item recommendations ] ( https://research.google/pubs/sampling-bias-corrected-neural-modeling-for-large-corpus-item-recommendations/ ) , 2019:Youtube双塔召回
152
- 4 . Google Play : [ Mixed Negative Sampling for Learning Two-tower Neural Networks in Recommendations ] ( https://storage.googleapis.com/pub-tools-public-publication-data/pdf/b9f4e78a8830fe5afcf2f0452862fb3c0d6584ea.pdf ) , 2020:google play双塔召回
183
+ 2 . Google Youtube : [ Sampling-bias-corrected neural modeling for large corpus item recommendations ] ( https://research.google/pubs/sampling-bias-corrected-neural-modeling-for-large-corpus-item-recommendations/ ) , 2019:Youtube双塔召回
184
+ 3 . Google Play : [ Mixed Negative Sampling for Learning Two-tower Neural Networks in Recommendations ] ( https://storage.googleapis.com/pub-tools-public-publication-data/pdf/b9f4e78a8830fe5afcf2f0452862fb3c0d6584ea.pdf ) , 2020:google play双塔召回
185
+ 2 . Facebook : [ Embedding-based Retrieval in Facebook Search ] ( https://arxiv.org/abs/2006.11632 ) , 2020:详细介绍了Facebook基于Embedding召回的工程实践,有很多工程细节关于如何进行负采样,采用的triplet loss也是对比学习的一种(triplet loss原则上应该也能用于word embedding的学习?)
153
186
154
187
关于DSSM用于召回本身有很多工程细节,需要单独一篇文章去讲解。双塔最基本的结构基本如下:Query和Document的Embedding可以对应word2vec的输入表达和输出表达矩阵,只是word2vec的输入表达和输出表达都是word,而双塔模型中可能是i2i,也可能是u2i。
155
188
156
189
![ 1711946775608] ( image/index/1711946775608.png )
157
190
158
- 不管如何,双塔模型的negative sampling和loss函数与word2vec很相似,比如:
159
-
160
- microsoft的dssm:negative sampled softmax loss,$ P(D|Q) = \frac{exp(\gamma R(Q,D))}{\sum_ {D' \in D} exp(\gamma R(Q,D'))} $,就是sampled softmax loss,增加了温度超参数$\gamma$。
161
-
162
- ## word2vec与LLM
191
+ 双塔模型的negative sampling和loss函数与word2vec不能说很相似,有的完全一样:
163
192
164
- BERT和GPT延续了word2vec表征一切的思路,用大数据pre-training就能得到NLP的非常好的表征。然后,只要针对具体业务场景的少量数据做fine-tuning就可以达到很不错的效果。BERT和GPT相比word2vec的主要优势在于,word2vec只考虑了单个词的表征,没有考虑词在不同上下文下的差异,比如 apple 在I have an apple laptop和I want eat apple里面含义是完全不同的,所以用于表征apple的embedding也应该是不同的。
165
-
166
- 这里试着回答开头困惑的问题:
167
-
168
- > GPT的输出是softmax,word2vec其实loss也是softmax loss。但为什么在word2vec里面的softmax就需要Negative sampling,而GPT里却不需要?
169
-
170
- 答:因为word2vec里面softmax的分母,包含了输入表征和输出表征向量的inner product,且每次迭代都要计算V次,这才是计算量大的根源,复杂度$O(V* H^2)$;而GPT最后一层是lm_head([ nn.Linear层] ( https://github.com/karpathy/nanoGPT/blob/325be85d9be8c81b436728a420e85796c57dba7e/model.py#L133C41-L133C47 ) ),假设lm_head前的隐藏层输出为H,词典大小为V,复杂度仅为O(VH),自然可以直接计算softmax loss。
193
+ - Microsoft的DSSM:采用negative sampled softmax loss,$ P(D|Q) = \frac{exp(\gamma R(Q,D))}{\sum_ {D' \in \bold{D}} exp(\gamma R(Q,D'))} $,就是sampled softmax loss,增加了温度超参数$\gamma$;
194
+ - Youtube是Sampled softmax loss的变种。
171
195
172
196
## 参考
173
197
@@ -177,3 +201,4 @@ BERT和GPT延续了word2vec表征一切的思路,用大数据pre-training就
177
201
4 . Mikolov, T., Sutskever, I., Chen, K., Corrado, G. S., and Dean, J. (2013b). Distributed representations of words and phrases and their compositionality. In Advances in Neural Information Processing Systems, pages 3111–3119.
178
202
5 . Grbovic, Mihajlo, and Haibin Cheng. "Real-time personalization using embeddings for search ranking at airbnb." * Proceedings of the 24th ACM SIGKDD international conference on knowledge discovery & data mining* . 2018.
179
203
6 . nanoGPT. https://github.com/karpathy/nanoGPT/blob/325be85d9be8c81b436728a420e85796c57dba7e/model.py#L138C60-L138C107
204
+ 7 . https://lilianweng.github.io/posts/2017-10-15-word-embedding/
0 commit comments