word2vec原理和实现

词的表示

    机器当然是无法直接识别单词的,因此需要通过某种方法把单词编码为机器可以识别的形式。因此词与词之间是有关系的,因此比的表示最好能保证单词在向量空间分布有一定的语义规律。

    设词典为:{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also":6, "football": 7, "games": 8, "Mary": 9, "too": 10}

词的离散表示

索引表示法:John likes to watch movies表示为[1,2,3,4,5]

One-hot(独热码):John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

Bag of Words(词袋模型):句子:John likes to watch movies. Mary likes too.表示为[1, 2, 1, 1, 1, 0, 0, 0, 1, 1],相当于对各个单词的One-hot求和。

TF-IDF(Term Frequency-Inverse Document Frequency):使用词权重编码文本,计算单词t的公式为:log(1+N/nt),N为文档总数,nt是含有词t的文档数。如某一句话可以表示为:[0.693, 1.386, 0.693, 0.693, 1.099, 0, 0, 0, 0.693, 0.693]

N-gram:建立N-gram词表,然后用n-gram词袋表示。比如为2-gram建索引{"John likes” : 1,"likes to” : 2,"to watch” : 3,"watch movies” : 4,"Mary likes” : 5,"likes too” : 6,"John also” : 7,"also likes” : 8,“watch football”: 9,"football games": 10}。则句子:John likes to watch movies. Mary likes too.表示为:[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]。该表示方法考虑了词的顺序。

    离散表示的缺点:无法衡量词向量之间的关系;词表维度随着语料库增长膨胀,n-gram词序列随语料库膨胀更快;数据稀疏。


词的分布式表示

    词的分布式表示意思是用一个词附近的其他词来表示该词。

共现矩阵(Cocurrence matrix)

    如语料库如下: I like deep learning. I like NLP. I enjoy flying.使用对称的窗函数(左右window length都为1,即矩阵轴数) ,则共现矩阵表示如下。

10.png

    例如:“I like”出现在第1,2句话中,一共出现2次,所以=2。 对称的窗口指的是,“like I”也是2次。将共现矩阵行(列)作为词向量表示后,可以知道like,enjoy都是在I附近且统计数目大约相等,他们意思相近。则可以用单词附近的单词来表示该单词。

    共现矩阵可以挖掘语法和语义信息。但是也存在稀疏性、向量维数随着词典大小线性增长,模型欠稳定等问题。解决的办法:SVD、PCA降维,但是计算量大。

SVD降维

问题:计算量巨大,n^3,每次新加入词都要重新分配词向量,与其它深度学习模型的框架差异大。

神经网络语言模型(NNML)

    词向量表示,通过神经网络语言模型训练得到,具体看博文《神经网络语言模型》。

Word2Vec

    word2vec是基于NNML的改进,分为CBOW和Ski-gram。




CBOW

    用上下文单词(左右窗口)预测中间的词。结构特点:无隐层,使用双向上下文窗口,上下文词序无关,输入层直接使用低维稠密表示,投影层简化为求和。结构图如下:

11.png




Ski-gram

    用中间的词预测周围的词。结构图如下:

11.png


未完待续。。。






下一篇: 没有了

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于