1.Skip-Gram 跳字模型:假设背景词由中心词生成,即建模P(Wo|Wc) ,其中Wc为中心词, Wo为任一背景词
2.CBOW:假设中心词由背景词生成,即建模P(Wc|Wo),其中 为背景词的集合。
补充:这里注意一下nn.Embedding 的输出[seq_len,batch_size,embedding_size],不要把embedding和词向量搞混了。Embedding只是随机初始化向量,没有意义的。
使用二次采样:每一个词都有一个丢弃概率。
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)
# 返回 true or flase
def discard(idx):
return np.random.uniform(0, 1) < 1 - math.sqrt(
1e-4 / counter[idx_to_token[idx]] * num_tokens)
原来这里就是每一个单词都有可能是中心词,然后根据中心词的前后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(wo∣wc)=∑i∈Vexp(ui⊤vc)exp(uo⊤vc):
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(wo∣wc)=P(D=1∣wc,wo)k=1,wk∼P(w)∏KP(D=0∣wc,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=1∣wc,wo)=σ(uo⊤vc), σ ( ⋅ ) \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方法
∑ 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=1∑T−m≤j≤m,j=0∑[−logP(D=1∣w(t),w(t+j))−k=1,wk∼P(w)K∑logP(D=0∣w(t),wk)]
理解:感觉应该是每一个词,然后通过计算他的背景词,背景向量,找到相似性。这相当于自动给了label?
因为隐含层的矩阵大小就是(词数,embed_size这个是超参数)记起来上课讲过应该就是这样 肯定是的,需要的是向量。输入词(背景),输出背景(词)。最后softmax。
在Skip-Gram模型上做改变:
综上,我们获得了 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 i∈V∑j∈V∑h(xij)(uj⊤vi+bi+cj−logxij)2
从而增加了数据集的全局统计信息。
观测概率公式,中心词的向量很大程度取决于背景词向量来决定,从而联想到同义词。
类比词,知道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 就是维数