优点:
(1)解决了分类器不好处理离散数据的问题
(2)在一定程度上起到了扩充特征的作用
缺点: 尤其是在文本特征表示上
(1)是一个词袋模型,不考虑词与词之间的顺序,丢失词的顺序信息。
(2)假设词与词相互独立。在大多数情况下,词与词是相互影响的。
(3)得到的特征是离散稀疏的。比如将世界所有城市名称作为语料库,那这个向量会过于稀疏,并且会造成维度灾难。
Q: 对于神经网络而言,在输入特征多数为categorical类别变量时,使用one-hot会使维度大大增加,使用one-hot真的比直接用离散数字表示好吗?
S: 分类问题里,损失函数经常定义为预测值和真实值的误差平方和。离散数字编码之后,3被预测为1的损失>3预测为2(与现实不符)。而one-hot则保证了不同的类别距离相同。 当然实际生活中有许多分类变量也带有距离的含义(比如职称),所以标准基乘上系数可能会更好。当然最后还是要结合实际情况。
Dristributed representation通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是在训练时指定的。
在 NLP 中,把 x x x看做一个句子里的一个词语, y y y是这个词语的上下文词语,那么这里的 f ( x ) → y f(x)\rarr y f(x)→y就是语言模型(language model)。这个模型的目的,就是判断 ( x , y ) (x,y) (x,y) 这个样本,是否符合自然语言的法则,更通俗点说就是:词语x和词语y放在一起,是不是人话。
Word2vec正是来源于这个思想,但它的最终目的,不是要把 f f f训练得多么完美,而是只关心模型训练完后的副产物——模型参数(这里特指神经网络的权重),并将这些参数,作为输入x的某种向量化的表示,这个向量便叫做——词向量。
目的:将“不可计算”“非结构化”的词转化为“可计算”“结构化”的向量。
百度百科:
Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。
1. Word2vec模型其实就是简单化的神经网络。
2. Word2vec 本质上是一种降维操作:把词语从One-Hot编码形式降维到 Word2vec 形式。
I n p u t Input Input:One-Hot vector
H i d d e n l a y e r Hidden~layer Hidden layer:线性单元,没有激活函数。
O u t p u t L a y e r Output Layer OutputLayer:Softmax回归,维度与Input Layer相同。
O u t p u t Output Output:模型通过训练数据所学得的参数,隐层的权重矩阵。
CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。
全名:Continuous Bag-of-Words
I n p u t l a y e r Input~layer Input layer:上下文单词的one-hot,假设单词的特征空间的维度为 V V V。
H i d d e n l a y e r Hidden~layer Hidden layer:输入层的所有one-hot分别乘以共享的输入权重矩阵 W V × d W_{V×d} WV×d,相加求平均,得到隐藏层向量,size为 1 × d 1×d 1×d。
L o s s f u n c t i o n Loss~function Loss function:一般为交叉熵代价函数,采用梯度下降算法更新 W W W和 W ′ W' W′。
O u t p u t l a y e r Output~layer Output layer:隐藏层向量乘以输出层权重矩阵 W d × V ′ W'_ {d×V} Wd×V′,得到 1 × V 1×V 1×V 向量。经激活函数,得到维度为 V V V的概率分布,其中的每一维代表着一个单词的概率(因为是one-hot)。概率最大的index所指示的单词为预测出的中间词(target word),将概率与true label的one-hot做比较,误差越小越好(根据误差更新权重矩阵)。
N e e d O u t p u t Need~Output Need Output:权重矩阵 W V × d W_{V×d} WV×d,其中 d d d为自己设定的数。训练完毕后,输入层的每个单词的one-hot与矩阵 W W W相乘,得到的向量的就是我们想要的词向量(word embedding)。矩阵 W W W就是所有单词的word embedding,也叫做look up table。 也就是说,任何一个单词的one-hot乘以 W W W都将得到该单词的词向量。有了look up table就可以免去训练过程,直接查表得到单词的词向量了。
举例:窗口大小是2,表示选取coffe前面两个单词和后面两个单词,作为input词。
训练出来的look up table为矩阵W。即,任何一个单词的one-hot表示乘以W都将得到该单词的word embedding。
神经网络基于这些训练数据,输出概率分布(代表着词典中的每个词是output word的可能性)。如先拿一组数据 (‘dog’, ‘barked’) 来训练神经网络,那么模型通过学习这个训练样本,会告诉我们词汇表中每个单词是“barked”的概率。模型的输出概率代表着:词典中每个词有多大可能性跟input word同时出现。
过程:通过给神经网络输入文本中成对的单词来训练它完成上述概率计算。
再次注意:我们需要的是训练出来的权重矩阵。
此处需要还是 W W W,而不是 W ′ W' W′。因为 y y y是概率,而不是one-hot!词向量是one-hot × W ×W ×W。
Word2vec是一个多分类问题。但实际当中,词语的个数非常多,计算难,所以需要用加速技巧。
import gensim
sentences=word2vec.Text8Corpus("test.txt") #加载语料库,此处训练集为英文文本或分好词的中文文本,注意去停用词
model=gensim.models.Word2Vec(sentences,sg=1,size=100,window=5,min_count=2,negative=3,sample=0.001,hs=1,workers=4)
model.save("文本名") # 模型保存,打开为乱码
#model.wv.save_word2vec_format("文件名",binary = "Ture/False") #通过该方式保存的模型,能通过文本格式打开,也能通过设置binary是否保存为二进制文件。但该模型在保存时丢弃了树的保存形式(详情参加word2vec构建过程,以类似哈夫曼树的形式保存词),所以在后续不能对模型进行追加训练
gensim.models.Word2Vec.load("模型文件名") # 对.sava保存的模型的加载
model = model.wv.load_word2vec_format('模型文件名') # 对..wv.save_word2vec_format保存的模型的加载
model.train(more_sentences) # 追加训练。如果对..wv.save_word2vec_format加载的模型进行追加训练,会报错
model.most_similar("word",topn=10) # 计算与该词最近似的10个词
model.similarity("word1","word2") # 计算两个词的相似度
model ['word'] # 获取词向量
Natural Language Toolkit:自然语言处理工具包,在NLP领域中,最常使用的一个Python库。
来斯惟博士在它的博士论文附录部分,证明了Skip-gram 模型和GloVe的cost fucntion本质上是一样的。
Word2vec考虑了上下文,那算考虑了词顺序吗?
https://www.jianshu.com/p/471d9bfbd72f
https://zhuanlan.zhihu.com/p/26306795
https://easyai.tech/ai-definition/word2vec/
https://blog.csdn.net/qq_28840013/article/details/89681499