Word2Vec and Glove

1. Word2Vec

1.Skip-Gram 跳字模型:假设背景词由中心词生成,即建模P(Wo|Wc) ,其中Wc为中心词, Wo为任一背景词
Word2Vec and Glove_第1张图片
2.CBOW:假设中心词由背景词生成,即建模P(Wc|Wo),其中 为背景词的集合。

Word2Vec and Glove_第2张图片
补充:这里注意一下nn.Embedding 的输出[seq_len,batch_size,embedding_size],不要把embedding和词向量搞混了。Embedding只是随机初始化向量,没有意义的。

1.1如何处理高频词?eg:the,a,in

使用二次采样:每一个词都有一个丢弃概率。

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(1f(wi)t ,0)

# 返回 true or flase
def discard(idx):
    return np.random.uniform(0, 1) < 1 - math.sqrt(
        1e-4 / counter[idx_to_token[idx]] * num_tokens)

1.2 提取中心词和背景词

原来这里就是每一个单词都有可能是中心词,然后根据中心词的前后max_window_size组成一个list.
每一个dataset就是:[{word - max_wimdow_size,word + max_window_size}]

补充:矩阵批量乘法torch.bmm(X,Y) ,理解就是对应矩阵作矩阵乘法。

然后算法作前向计算,就是矩阵乘法。跟神经网络的原理一样。

问题来了:每一个词都是center_word,那不是一句话就可以生成超级无敌多dataset??
所以就要采用负采样近似来进行采样:

P ( w o ∣ w c ) = exp ⁡ ( u o ⊤ v c ) ∑ i ∈ V exp ⁡ ( u i ⊤ v c ) P(w_o\mid w_c)=\frac{\exp(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{\sum_{i\in\mathcal{V}}\exp(\boldsymbol{u}_i^\top \boldsymbol{v}_c)} P(wowc)=iVexp(uivc)exp(uovc)

P ( w o ∣ w c ) = P ( D = 1 ∣ w c , w o ) ∏ k = 1 , w k ∼ P ( w ) K P ( D = 0 ∣ w c , w k ) P(w_o\mid w_c)=P(D=1\mid w_c,w_o)\prod_{k=1,w_k\sim P(w)}^K P(D=0\mid w_c,w_k) P(wowc)=P(D=1wc,wo)k=1,wkP(w)KP(D=0wc,wk)

其中 P ( D = 1 ∣ w c , w o ) = σ ( u o ⊤ v c ) P(D=1\mid w_c,w_o)=\sigma(\boldsymbol{u}_o^\top\boldsymbol{v}_c) P(D=1wc,wo)=σ(uovc) σ ( ⋅ ) \sigma(\cdot) σ() 为 sigmoid 函数。对于一对中心词和背景词,我们从词典中随机采样 K K K 个噪声词(实验中设 K = 5 K=5 K=5)。根据 Word2Vec 论文的建议,噪声词采样概率 P ( w ) P(w) P(w) 设为 w w w 词频与总词频之比的 0.75 0.75 0.75 次方。

具体实现还没完全弄懂。。先留个坑。此外减少运算量还可以层序softmax方法

1.3 损失函数

∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 [ − log ⁡ P ( D = 1 ∣ w ( t ) , w ( t + j ) ) − ∑ k = 1 , w k ∼ P ( w ) K log ⁡ P ( D = 0 ∣ w ( t ) , w k ) ] \sum_{t=1}^T\sum_{-m\le j\le m,j\ne 0} [-\log P(D=1\mid w^{(t)},w^{(t+j)})-\sum_{k=1,w_k\sim P(w)^K}\log P(D=0\mid w^{(t)},w_k)] t=1Tmjm,j=0[logP(D=1w(t),w(t+j))k=1,wkP(w)KlogP(D=0w(t),wk)]

理解:感觉应该是每一个词,然后通过计算他的背景词,背景向量,找到相似性。这相当于自动给了label?
因为隐含层的矩阵大小就是(词数,embed_size这个是超参数)记起来上课讲过应该就是这样 肯定是的,需要的是向量。输入词(背景),输出背景(词)。最后softmax。

2.GloVe 全局向量的词嵌入

在Skip-Gram模型上做改变:

  1. 使用非概率分布的变量 p i j ′ = x i j p'_{ij}=x_{ij} pij=xij q ′ i j = exp ⁡ ( u j ⊤ v i ) q′_{ij}=\exp(\boldsymbol{u}^\top_j\boldsymbol{v}_i) qij=exp(ujvi),并对它们取对数;
  2. 为每个词 w i w_i wi 增加两个标量模型参数:中心词偏差项 b i b_i bi 和背景词偏差项 c i c_i ci,松弛了概率定义中的规范性;
  3. 将每个损失项的权重 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 线性相关的隐含假设;
  4. 用平方损失函数替代了交叉熵损失函数。

综上,我们获得了 GloVe 模型的损失函数表达式:

∑ i ∈ V ∑ j ∈ V h ( x i j ) ( u j ⊤ v i + b i + c j − log ⁡ x i j ) 2 \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 iVjVh(xij)(ujvi+bi+cjlogxij)2

从而增加了数据集的全局统计信息。

2.1 近义词和类比词

观测概率公式,中心词的向量很大程度取决于背景词向量来决定,从而联想到同义词。

类比词,知道a,b,c 求d?
同样也把abc的向量算出来,等到与结果相似的词向量

x = vecs[1] - vecs[0] + vecs[2] # 顺序可以交换

关于glove的使用:已经由于训练好的,官方给出的API.

https://nlp.stanford.edu/projects/glove/
下载:glove.6B.zip glove.6B.zip

6B就是60个,xxd 就是维数

你可能感兴趣的:(pytorch学习打卡)