Transformer 利用正弦和余弦函数生成位置编码,公式如下:
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i d model ) P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i d model ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{\frac{2i}{d_{\text{model}}}}}\right) \\ \ \\ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d_{\text{model}}}}}\right) PE(pos,2i)=sin(10000dmodel2ipos) PE(pos,2i+1)=cos(10000dmodel2ipos)
其中:
p o s pos pos:位置索引(从 0 开始)。
i i i:维度索引(从 0 到 ( \frac{d_{\text{model}}}{2} - 1$)。
d model d_{\text{model}} dmodel:模型的嵌入维度。
1.3. PyTorch 实现
以下是利用 PyTorch 实现位置编码的代码:
import torch
import torch.nn as nn
class PositionalEncoding(nn.Module):
def __init__(self, d_model, max_len=5000):
"""
初始化位置编码
:param d_model: 嵌入维度
:param max_len: 最大序列长度
"""
super(PositionalEncoding, self).__init__()
# 初始化位置编码矩阵
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) # (max_len, 1)
对于 Skip-gram 模型,损失函数界说为:
L = − 1 T ∑ t = 1 T ∑ − c ≤ j ≤ c , j ≠ 0 log p ( w t + j ∣ w t ) L = -\frac{1}{T} \sum_{t=1}^{T} \sum_{-c \leq j \leq c, j \neq 0} \log p(w_{t+j} | w_t) L=−T1t=1∑T−c≤j≤c,j=0∑logp(wt+j∣wt)
其中:
T T T:语料库中的总词数。
c c c:上下文窗口大小。
w t w_t wt:中心词。
w t + j w_{t+j} wt+j:上下文词。
p ( w t + j ∣ w t ) p(w_{t+j} | w_t) p(wt+j∣wt):给定中心词 w t w_t wt 时,上下文词 w t + j w_{t+j} wt+j 的条件概率。
(2)CBOW 的损失函数
对于 CBOW 模型,损失函数界说为:
L = − 1 T ∑ t = 1 T log p ( w t ∣ w t − c , … , w t − 1 , w t + 1 , … , w t + c ) L = -\frac{1}{T} \sum_{t=1}^{T} \log p(w_t | w_{t-c}, \dots, w_{t-1}, w_{t+1}, \dots, w_{t+c}) L=−T1t=1∑Tlogp(wt∣wt−c,…,wt−1,wt+1,…,wt+c)
其中:
T T T:语料库中的总词数。
c c c:上下文窗口大小。
w t w_t wt:中心词。
w t − c , … , w t + c w_{t-c}, \dots, w_{t+c} wt−c,…,wt+c:上下文词。
p ( w t ∣ w t − c , … , w t + c ) p(w_t | w_{t-c}, \dots, w_{t+c}) p(wt∣wt−c,…,wt+c):给定上下文词时,中心词 w t w_t wt 的条件概率。
(3)条件概率的计算
条件概率 p ( w O ∣ w I ) p(w_O | w_I) p(wO∣wI) 通过 Softmax 函数计算:
p ( w O ∣ w I ) = exp ( v w O T v w I ) ∑ w = 1 V exp ( v w T v w I ) p(w_O | w_I) = \frac{\exp(v_{w_O}^T v_{w_I})}{\sum_{w=1}^{V} \exp(v_w^T v_{w_I})} p(wO∣wI)=∑w=1Vexp(vwTvwI)exp(vwOTvwI)
其中:
v w I v_{w_I} vwI:输入词 w I w_I wI 的向量表示。
v w O v_{w_O} vwO:输出词 w O w_O wO 的向量表示。
V V V:词汇表大小。
3. 负采样(Negative Sampling)
由于 Softmax 的计算复杂度较高(与词汇表大小 V V V 成正比),Word2Vec 通常利用负采样(Negative Sampling)来近似损失函数。负采样的损失函数界说为:
L = − log σ ( v w O T v w I ) − ∑ i = 1 k log σ ( − v w i T v w I ) L = -\log \sigma(v_{w_O}^T v_{w_I}) - \sum_{i=1}^{k} \log \sigma(-v_{w_i}^T v_{w_I}) L=−logσ(vwOTvwI)−i=1∑klogσ(−vwiTvwI)
其中:
σ \sigma σ:Sigmoid 函数。
k k k:负样本的数目。
w i w_i wi:负样本词。
四、为什么可以通过负采样近似 Softmax?
4.1. Softmax 的计算复杂度问题
Softmax 函数的计算复杂度为 O ( V ) O(V) O(V),其中 V V V 是词汇表的大小。对于大规模词汇表(如数百万词),Softmax 的计算本钱非常高,重要体现在:
Softmax 的条件概率界说为:
p ( w O ∣ w I ) = exp ( v w O T v w I ) ∑ w = 1 V exp ( v w T v w I ) p(w_O | w_I) = \frac{\exp(v_{w_O}^T v_{w_I})}{\sum_{w=1}^{V} \exp(v_w^T v_{w_I})} p(wO∣wI)=∑w=1Vexp(vwTvwI)exp(vwOTvwI)
其中:
v w I v_{w_I} vwI:输入词 w I w_I wI的向量表示。
v w O v_{w_O} vwO:输出词 w O w_O wO 的向量表示。
V V V:词汇表大小。
(2)负采样的近似情势
负采样通过采样少量负样本 w i w_i wi 来近似 Softmax 的分母。具体步调如下:
正样本:计算正样本的概率:
σ ( v w O T v w I ) \sigma(v_{w_O}^T v_{w_I}) σ(vwOTvwI)
其中 σ \sigma σ是 Sigmoid 函数。
负样本:计算负样本的概率:
σ ( − v w i T v w I ) \sigma(-v_{w_i}^T v_{w_I}) σ(−vwiTvwI)
损失函数:将正样本和负样本的概率结合起来,界说损失函数:
L = − log σ ( v w O T v w I ) − ∑ i = 1 k log σ ( − v w i T v w I ) L = -\log \sigma(v_{w_O}^T v_{w_I}) - \sum_{i=1}^{k} \log \sigma(-v_{w_i}^T v_{w_I}) L=−logσ(vwOTvwI)−i=1∑klogσ(−vwiTvwI)
其中 k k k 是负样本的数目。