cs224n学习笔记 02:Word Vectors and Word Senses

课程目标

  • 简单回顾词向量和词向量模型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为权重。在这里插入图片描述
外在单词向量评估:
该类中的后续任务。

一个例子:命名体识别:识别出名字,组织和位置等。词向量表示的好效果就好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值