Task 07- 进阶优化算法-Word2Vec-词嵌入进阶
1 进阶优化算法
1.1 Momentum
A example for steepest descent: f ( x 1 , x 2 ) = 0.1 x 1 2 + 2 x 2 2 , learning rate α = 0.4 \text{A example for steepest descent:} \\ f(x_1,x_2)=0.1x_1^2+2x_2^2,\text{learning rate }{\alpha=0.4} A example for steepest descent:f(x1,x2)=0.1x12+2x22,learning rate α=0.4
同⼀位置上,目标函数在竖直方向( x 2 x_2 x2轴方向)比在水平方向( x 1 x_1 x1轴方向)的斜率的绝对值更大,因此,给定学习率,梯度下降迭代⾃变量时会使⾃变量在竖直⽅向⽐在⽔平⽅向移动幅度更⼤。那么,我们需要⼀个较小的学习率从而避免⾃变量在竖直⽅向上越过⽬标函数最优解。然而,这会造成⾃变量在⽔平⽅向上朝最优解移动变慢。
-
在时间步 0 0 0,动量法创建速度变量 v 0 = 0 v_0=0 v0=0;
-
在时间步 t > 0 t>0 t>0,动量法做如下迭代:
v t ← γ v t − 1 + η t g t ( 0 < γ < 1 ) ⇒ Exponentially Weighted Moving Average x t ← x t − 1 − v t The same example with γ = 0.5 : v_t \leftarrow \gamma v_{t-1} + \eta_t g_t \ (0<\gamma<1) \Rightarrow \text{Exponentially Weighted Moving Average} \\ x_t \leftarrow x_{t-1} - v_t \\ \text{The same example with } {\gamma = 0.5}: vt←γvt−1+ηtgt (0<γ<1)⇒Exponentially Weighted Moving Averagext←xt−1−vtThe same example with γ=0.5:
1.2 AdaGrad
AdaGrad根据自变量在每个维度 ( x 1 , x 2 , ⋯ , x n ) (x_1,x_2,\cdots,x_n) (x1,x2,⋯,xn)的梯度值的⼤小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题
s t ← s t − 1 + g t ⊙ g t x t ← x t − 1 + η s t + ϵ ⊙ g t ⊙ : element-wise tensor multiplication s_t \leftarrow s_{t-1} + g_t \odot g_t \\ x_t \leftarrow x_{t-1} + \frac{\eta}{\sqrt{s_t+\epsilon}} \odot g_t \\ {\odot}\text{: element-wise tensor multiplication} st←st−1+gt⊙gtxt←xt−1+st+ϵη⊙gt⊙: element-wise tensor multiplication
- 问题:由于 s t s_t st累加了元素平方的梯度,故学习率在一直降低/不变,在迭代后期可能会由于学习率国小而收敛过慢
1.3 RMSProp (AdaGrad + Exponentially WMA)
s t ← γ s t − 1 + ( 1 − γ ) g t ⊙ g t x t ← x t − 1 + η s t + ϵ ⊙ g t s_t \leftarrow \gamma s_{t-1} + (1-\gamma)g_t \odot g_t \\ x_t \leftarrow x_{t-1} + \frac{\eta}{\sqrt{s_t+\epsilon}} \odot g_t st←γst−1+(1−γ)gt⊙gtxt←xt−1+st+ϵη⊙gt
1.4 AdaDelta (RMSProp replace η \eta η with Δ x t − 1 \sqrt{\Delta x_{t-1}} Δxt−1)
s t ← γ s t − 1 + ( 1 − γ ) g t ⊙ g t x t ← x t − 1 + Δ x t − 1 + ϵ s t + ϵ ⊙ g t Δ x t ← ρ Δ x t − 1 + ( 1 − ρ ) g t ′ ⊙ g t s_t \leftarrow \gamma s_{t-1} + (1-\gamma)g_t \odot g_t \\ x_t \leftarrow x_{t-1} + \sqrt{\frac{\Delta x_{t-1}+\epsilon}{s_t+\epsilon}} \odot g_t \\ \Delta x_{t} \leftarrow \rho\Delta x_{t-1}+(1-\rho)g_t^\prime\odot g_t st←γst−1+(1−γ)gt⊙gtxt←xt−1+st+ϵΔxt−1+ϵ⊙gtΔxt←ρΔxt−1+(1−ρ)gt′⊙gt
1.5 Adam (RMSProp + Momentum)
v t ← β 1 v t − 1 + ( 1 − β 1 ) g t s t ← β 2 s t − 1 + ( 1 − β 2 ) g t ⊙ g t v ^ t ← v t 1 − β 1 t , s ^ t ← s t 1 − β 2 t (偏差修正) x t ← x t − 1 + η v ^ t s ^ t + ϵ ⊙ g t v_t \leftarrow \beta_1v_{t-1} + (1-\beta_1)g_t \\ s_t \leftarrow \beta_2 s_{t-1} + (1-\beta_2)g_t \odot g_t \\ \hat{v}_t \leftarrow \frac{v_t}{1-\beta_1^t},\hat{s}_t \leftarrow \frac{s_t}{1-\beta_2^t} \text{ (偏差修正)} \\ x_t \leftarrow x_{t-1} + \frac{\eta\hat{v}_t}{\sqrt{\hat{s}_t}+\epsilon} \odot g_t vt←β1vt−1+(1−β1)gtst←β2st−1+(1−β2)gt⊙gtv^t←1−β1tvt,s^t←1−β2tst (偏差修正)xt←xt−1+s^t+ϵηv^t⊙gt
2 word2vec
- 词向量:词的特征向量或表征,把词映射为实数域向量的技术叫词嵌入(word embedding)
2.0 Why not One-Hot?
-
One-Hot:每个向量长度等于词典大小 N N N,词的索引为 i i i,向量第 i i i位为1
-
缺陷:词向量无法准确表达不同词之间的相似度(e.g., 任意两个词向量的余弦相似度为0)
2.1 word2vec
2.1.1 跳字模型(skip-gram)
- 基于某个词(中心词)生成文本序列周围的词(背景词),参数为每个词所对应的中心词向量和背景词向量
- 每个词表示为两个 d d d 维向量,中心词向量 v i ∈ R d v_i \in \mathbb{R}^d vi∈Rd,背景词向量 u i ∈ R d u_i \in \mathbb{R}^d ui∈Rd
- 中心词 w c w_c wc,背景词 w o w_o wo
P ( w o ∣ w c ) = e x p ( u o ⊤ v c ) ∑ i ∈ V e x p ( u i ⊤ v c ) P(w_o|w_c) = \frac{exp(u_o^{\top}v_c)}{\sum_{i\in \mathcal{V}}exp(u_i^{\top}v_c)} P(wo∣wc)=∑i∈Vexp(ui⊤vc)exp(uo⊤vc)
- 给定长度为 T T T的文本序列,窗口大小为 m m m,则给定任一中心词生成所有背景词的概率为:
∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w ( t + j ) ∣ w ( t ) ) \prod_{t=1}^{T}\prod_{-m\leq{j}\leq{m},j\ne0}P(w^{(t+j)}|w^{(t)}) t=1∏T−m≤j≤m,j=0∏P(w(t+j)∣w(t))
- 训练:通过梯度下降训练需要计算 V \mathcal{V} V中所有词作为 w c w_{c} wc背景词的条件概率对参数进行更新
min v , u L = − ∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 log P ( w ( t + j ) ∣ w ( t ) ) log P ( w o ∣ w c ) = u o ⊤ v c − log ∑ i ∈ V exp ( u i ⊤ v c ) ∂ log P ( w o ∣ w c ) ∂ v c = u o − ∑ j ∈ V P ( w j ∣ w c ) u j \min_{\bold{v},\bold{u}}{L=-\prod_{t=1}^{T}\prod_{-m\leq{j}\leq{m},j\ne0}\log{P(w^{(t+j)}|w^{(t)})}} \\ \log{P(w_o|w_c)} = u_o^{\top}v_c-\log{\sum_{i \in \mathcal{V}}\exp(u_i^{\top}v_c)} \\ \frac{\partial \log P(w_o|w_c)}{\partial v_c} = u_o-\sum_{j \in \mathcal{V}}P(w_j|w_c)u_j v,uminL=−t=1∏T−m≤j≤m,j=0∏logP(w(t+j)∣w(t))logP(wo∣wc)=uo⊤vc−logi∈V∑exp(ui⊤vc)∂vc∂logP(wo∣wc)=uo−j∈V∑P(wj∣wc)uj
- 使用skip-gram的中心词向量作为词的表征向量
2.1.2 连续词袋模型(continuous bag of words, CBOW)
-
与skip-gram类似,区别在于CBOW基于背景词生成中心词
-
使用CBOW的背景词向量作为词的表征向量
2.1.3 二次采样
- 文本数据中一般会出现一些高频词,如英文中的“the”“a”和“in”。通常来说,在一个背景窗口中,一个词(如“chip”)和较低频词(如“microprocessor”)同时出现比和较高频词(如“the”)同时出现对训练词嵌入模型更有益。因此,训练词嵌入模型时可以对词进行二次采样;
- 丢弃概率(越高频的词被丢弃的概率越大):
P ( w i ) = max ( 1 − t f ( w i ) , 0 ) P(w_i)=\max(1-\sqrt{\frac{t}{f(w_i)}},0) P(wi)=max(1−f(wi)t,0)
- 代码
def discard(idx):
'''
@params:
idx: 单词的下标
@return: True/False 表示是否丢弃该单词
'''
return random.uniform(0, 1) < 1 - math.sqrt(
1e-4 / counter[idx_to_token[idx]] * num_tokens)
2.1.4 负采样近似训练(negative sampling)
- 近似训练:输出概率之和本应为1,但计算开销太高(通过梯度下降训练需要计算 V \mathcal{V} V中所有词作为 w c w_{c} wc背景词的条件概率对参数进行更新),故通过采样的方法降低计算开销,但概率之和不严格等于1
- 负采样:对于一个中心词,背景词往往占总词典比例较小,而负样本(噪声词)的比例较大,故对负样本进行采样(噪声词采样概率 P ( w ) P(w) P(w)设为词频与总词频之比的 0.75 0.75 0.75次方)
3 词嵌入进阶
3.1 子词嵌入
英语单词通常有其内部结构和形成⽅式。例如,我们可以从“dog”“dogs”和“dogcatcher”的
字⾯上推测它们的关系。这些词都有同⼀个词根“dog”,但使⽤不同的后缀来改变词的含义。
- FastText:以固定大小的 n-gram 形式将单词更细致地表示为了子词的集合
- BPE (Byte Pair Encoding):根据语料库的统计信息,自动且动态地生成高频子词的集合
3.2 GloVe全局向量词嵌入
-
使用非概率分布的变量 p i j ′ = x i j p_{ij}^{\prime}=x_{ij} pij′=xij 和 q i j ′ = exp ( u j ⊤ v i ) q_{ij}^{\prime}=\exp(u_j^{\top}v_i) qij′=exp(uj⊤vi),并对它们取对数;
-
为每个词 w i w_i wi 增加两个标量模型参数:中心词偏差项 b i b_i bi 和背景词偏差项 c i c_i ci,松弛了概率定义中的规范性;
-
将每个损失项的权重 x i x_i xi 替换成函数 h ( x i j ) h(x_{ij}) h(xij),权重函数 h ( x ) h(x) h(x) 是值域在 [ 0 , 1 ] [0,1] [0,1] 上的单调递增函数,松弛了中心词重要性与 x i x_i xi 线性相关的隐含假设;
-
用平方损失函数替代了交叉熵损失函数:
L = ∑ i ∈ V ∑ j ∈ V h ( x i j ) ( u j ⊤ v i + b i + c j − log x i j ) 2 L=\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} h(x_{ij}) (\boldsymbol{u}^\top_j\boldsymbol{v}_i+b_i+c_j-\log x_{ij})^2 L=i∈V∑j∈V∑h(xij)(uj⊤vi+bi+cj−logxij)2