课程目标
- 简单回顾词向量和词向量模型word2vec
- 词向量的glove模型
- 评估词向量
- 词的含义
1.word2vec回顾
迭代语料库中的每个单词
使用词向量预测周围的单词
向量是行向量的形式。U*v4是外围词向量和中心词向量的乘积。在计算乘积的softmax。
简单的说word2vec就是把意思相近的单词放在空间中相近的地方。
J(θ)为希望最小化的代价函数。往负梯度方向更新参数,不断重复。
更新方程:
存在问题:
J(θ)是关于整个语料库所有窗口的函数,求梯度代价很大。
解决方案:SGD随机梯度下降。随机选取窗口进行梯度更新。
但是在每个窗口中,最多有2m+1个单词,所以梯度非常稀疏。
解决方案:
只更新U、V中确定的某几行。
skip-gram中的负采样。
2.共现矩阵
Matrix Factorization的原理比较简单,就是将一个矩阵D分解为U和V的乘积,即对于一个特定的规模为mn的矩阵D,估计出规模分别为mk和n*k的矩阵U和V,使得UVTUVT的值尽可能逼近矩阵D。一般来讲,k的取值应该满足k≤min{m,n}k≤min{m,n},这样矩阵分解才有意义。如果在推荐系统中,D代表用户对商品的行为矩阵的话,那么U和V则分别代表embedding表示的用户和商品向量。
以公式来表示的话,就是
其中Ui表示U矩阵第i行的向量,Vj表示V矩阵第j行向量。
为了限制U,V的取值呈现一个以0为中心的正态分布,这里对U,V的值加上正则项,得到目标优化项
Matrix Factorization的基本实现
def LFM_ed2(D, k, iter_times=1000, alpha=0.01, learn_rate=0.01):
'''
此函数实现的是最简单的 LFM 功能
:param D: 表示需要分解的评价矩阵, type = np.ndarray
:param k: 分解的隐变量个数
:param iter_times: 迭代次数
:param alpha: 正则系数
:param learn_rate: 学习速率
:return: 分解完毕的矩阵 U, V, 以及误差列表err_list
'''
assert type(D) == np.ndarray
m, n = D.shape # D size = m * n
U = np.random.rand(m, k) # 为何要一个均匀分布一个正态分布?
V = np.random.randn(k, n)
err_list = []
for t in range(iter_times):
# 这里,对原文中公式推导我认为是推导正确的,但是循环效率太低了,可以以矩阵形式计算
D_est = np.matmul(U, V)
ERR = D - D_est
U_grad = -2 * np.matmul(ERR, V.transpose()) + 2 * alpha * U
V_grad = -2 * np.matmul(U.transpose(), ERR) + 2 * alpha * V
U = U - learn_rate * U_grad
V = V - learn_rate * V_grad
ERR2 = np.multiply(ERR, ERR)
ERR2_sum = np.sum(np.sum(ERR2))
err_list.append(ERR2_sum)
return U, V, err_list
Matrix Factorization的简单测试
if __name__=='__main__':
D = np.array([[5,5,0,5],[5,0,3,4],[3,4,0,3],[0,0,5,3],[5,4,4,5],[5,4,5,5]])
U, V, err_list = LFM_ed2(D, 3, iter_times=200, learn_rate=0.01, alpha=0.01)
print(err_list[-1])
err_log = np.log(np.array(err_list))
plt.plot(err_list)
plt.show()
plt.figure(2)
plt.plot(err_log)
plt.show()
得到的估计误差和误差的对数值分别如下图所示
估计误差↓
对数误差↓
共现矩阵存在的问题:
随着语料库的大小的增大,向量的大小会增长。
非常高维,需要许多存储空间。
子序列分类问题模型有非常稀疏的问题。
模型不健壮
解决方案:
使用低维度的向量。如何降维呢?
采用奇异值分解,把所有信息量都浓缩在一个小的维度向量中。
3.评估词向量
内在词向量评估
词向量类比:使用余弦cos计算两个词向量的相似度。
问题:相同的单词有不同的含义。
怎么办?
使用加权求不同含义的和。
比如pike这个单词,有多个不同的含义,计算公式如下图所示。f为权重。
外在单词向量评估:
该类中的后续任务。
一个例子:命名体识别:识别出名字,组织和位置等。词向量表示的好效果就好。