one hot
比如有7个字,红橙黄绿青蓝紫,它们用onehot的表示形式如下:
红:(1,0,0,0,0,0,0)
橙:(0,1,0,0,0,0,0)
黄:(0,0,1,0,0,0,0)
绿:(0,0,0,1,0,0,0)
青:(0,0,0,0,1,0,0)
蓝:(0,0,0,0,0,1,0)
紫:(0,0,0,0,0,0,1)
这是最初的字(词)向量的表示方式,有多少字就需要多少维度,造成维度过高,表示过于稀疏。并且字与字之间的距离都相等,这不符合实际情况,比如,红橙的距离小于红绿的距离,onehot表示法无法体现这一特征,也即缺乏语义信息。
Word2Vec
由于OneHot编码方式的缺陷,所以诞生了诸如Word2Vec这类新的编码算法。
原来的编码是(vocabSize,dimension)。以七色前个字为例,oneHot的编码后的矩阵为H = (2,7),第一个2是输入字的个数,第二个7是一个字表示的维度,在onehot表示方法中也是词汇表中字的总个数。现在通过新的一种办法将字的表示维度降低到3,也就是(2,7)*(7,3)=>(7,3)。这里矩阵(7,3)是参数矩阵,onehot矩阵将会通过这个参数矩阵映射到新的维度中,也是降维。(7,3)第一个位置依然是词汇表字的个数,3表示一个字的表示维度。当然这个3是调控的。
到这里,你会发现一个有趣的现象,第一个字映射后的字向量就是参数矩阵的第一行,依此类推,第二个字映射后的字向量就是参数矩阵的第二行。有这样的一种性质存在,矩阵乘法都不用做了,直接都过索引查找参数矩阵就可以了。
到这里也就发现了,其实字向量的获取就是通过语言模型的训练得到的一组参数阵。语言模型的训练有很多种,比如,通过预测前后两句话是否是连续。则模型通过onehot=>全连接参数阵w=>…=>softmax,通过训练这样的一种任务来更新参数阵,最终,参数阵将会承受着表示字向量的任务。
为什么这样表示的字向量可以正确表示字之间的距离。