1. 词向量模型–Word2vec
词向量模型认为如果两个词相似,那么他们周围的词很有可能也是相似的,或者如果中心词的周围词相似那么这个中心词可能也是相似的
2. 两种网络结构
2.1 CBOW
2.1.1 算法任务
CBOW 的目标是根据上下文出现的词语来预测当前词的生成概率
具体来说,不考虑上下文的词语输入顺序,CBOW是用上下文词语的词向量的均值来预测当前词。CBOW的好处是对上下文词语的分布在词向量上进行了平滑,去掉了噪声,因此在小数据集上很有效
2.1.2 算法步骤
① 随机生成一个大小为(vocabulary_size, embedding_size)的embedding矩阵(即所有单词的词向量矩阵,每一个行对应一个单词的向量)
② 对于某一个单词(中心词),从embedding矩阵中提取其周边单词的词向量
③ 求周边单词的词向量的均值向量
④ 在该均值向量上使用logistic regression进行训练,softmax作为激活函数
⑤ 期望logistic regression得到的概率向量可以与真实的概率向量(即中心词的one-hot编码向量)相匹配。
缺点:均值处理未考虑语序
2.2 Skip-gram
2.2.1 算法任务
Skip-gram 是根据当前词来预测上下文中各词的生成概率
2.2.2 算法步骤
① 随机生成一个大小为(vocabulary_size, embedding_size)的embedding矩阵(即所有单词的词向量矩阵,每一个行对应一个单词的向量)
② 对于某一个单词,从embedding矩阵中提取单词向量
③ 在该单词向量上使用logistic regression进行训练,softmax作为激活函数
④ 期望logistic regression得到的概率向量可以与真实的概率向量(即周边词的one-hot编码向量)相匹配。
缺点:计算量依赖于语料
3. Word2Vec特点
- 无隐层
- 使用双向上下文窗口
- 上下文词序无关(CBoW)
- 输入层直接使用低维稠密表示
- 投影层简化为求和(平均)
4. 如何优化
①层次Softmax: 使用HuffmanTree来编码输出层的词典,只需要计算路径上所有非叶子节点词向量的贡献即可,计算量为树的深度
②负例采样: 由于上下文是有限的,非上下文的部分是极大量的,为了简化计算,采用负例采样
5. 代码实现与解析
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as tud
from torch.nn.parameter import Parameter
from collections import Counter
import scipy
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np,random,math,pandas as pd,sklearn
class WordEmbeddingDataset(tud.Dataset): #tud.Dataset父类
def __init__(self, text, word_to_idx, idx_to_word, word_freqs