草庐IT

SVD解决词分布式表示稀疏性

51Ann 2023-03-28 原文
这篇文章是接着一文拿捏点互信息(PMI)解决词分布式表示稀疏性问题写的。解决分布式表示稀疏性问题另一个方法是使用**奇异值分解(Singular Value Decomposition,SVD)**。

我把例子搬过来了。还是原来的三个句子及其共现矩阵M

  • 我 喜欢 自然 语言 处理。
  • 我 爱 深度 学习。
  • 我 喜欢 机器 学习。
$$ \begin{array}{ccccccccccc} \hline & \text { 我 } & \text { 喜欢 } & \text { 自然 } & \text { 语言 } & \text { 处理 } & \text { 爱 } & \text { 深度 } & \text { 学习 } & \text { 机器 } & \circ \ \hline \text { 我 } & 0 & 2 & 1 & 1 & 1 & 1 & 1 & 2 & 1 & 3 \ \text { 喜欢 } & 2 & 0 & 1 & 1 & 1 & 0 & 0 & 1 & 1 & 2 \ \text { 自然 } & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 0 & 0 & 1 \ \text { 语言 } & 1 & 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 1 \ \text { 处理 } & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 1 \ \text { 爱 } & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1 \ \text { 深度 } & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 1 \ \text { 学习 } & 2 & 1 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 1 \ \text { 机器 } & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 1 \ \text { 。 } & 3 & 2 & 1 & 1 & 1 & 1 & 1 & 2 & 1 & 0 \ \hline \end{array} $$

SVD奇异值分解

从矩阵角度来看

公式为:

$$ M = U\Sigma V^T $$

怎么分解的涉及到数学知识,我等就不必深究了。总之简单来讲就是将$M$矩阵分解成一个$U$,一个$\Sigma$,一个$V^T$三个矩阵相乘。

  • $V$和$U$都是正交矩阵

    • 正交矩阵: 如果$A\times A^T = E(单位矩阵)$,那A就是正交矩阵。
    • 正交矩阵都是方阵。
  • $\Sigma$是一个半正定$m×n$阶对角矩阵,其对角线上的值就是$M$矩阵分解的奇异值。

  • $M$矩阵的形状是$m×n$,那它的特征值最多为$\min(m,n)$个。

也就是说奇异值分解最终得到的奇异值只有这个小方阵里的对角线元素。

若在 ${\Sigma}$ 中仅保留 $d$ 个 $(d<\min(m,n))$ 最大的奇异值($U$和 ${V}$ 也只保留相应的维度),则被保留的奇异值组成的对角矩阵被称为**截断奇异值分解 (Truncated Singular Value Decomposition,TSVD)**。

从向量角度看

$$ M=\sigma_1 u_1 v_1^{\mathrm{T}}+\sigma_2 u_2 v_2^{\mathrm{T}}+\ldots+\sigma_r u_r v_r^{\mathrm{T}} \quad 其中r = \min(m,n) $$

其中等式右边每一项前的系数 $\sigma$ 就是奇异值, $u$ 和 $v$ 分别表示列向量,每一项 $u v^{T}$ 都是秩为 1 的矩阵。奇异值满足 $\sigma_1 \geq \sigma_2 \geq \ldots \geq \sigma_r>0$ 。

这样就可以和前边的截断奇异值对上了。前边我们提到,我们可以选择保留多少奇异值。一个矩阵$M$分解后最多有$\min(m,n)$个奇异值。

看一下下图,是借用知乎上的图,从左到右依次是原图、奇异值选1、5、50时候的样子。

当截断奇异值矩阵选择$r = 1$时,

$M' = \sigma_1 u_1 v_1^{\mathrm{T}}$

当截断奇异值矩阵选择$r = 5$时,

$M' = \sigma_1 u_1 v_1^{\mathrm{T}} + \sigma_2 u_2 v_2^{\mathrm{T}} + \sigma_3 u_3 v_3^{\mathrm{T}} +\sigma_4 u_4 v_4^{\mathrm{T}} +\sigma_5 u_5 v_5^{\mathrm{T}}$

当截断奇异值矩阵选择$r = 50$时,

$M' = \sigma_1 u_1 v_1^{\mathrm{T}}+ \sigma_2 u_2 v_2^{\mathrm{T}} + ... + \sigma_{50} u_{50} v_{50}^{\mathrm{T}}$

随着项数逐渐增大,$M'$逐渐还原$M$,就像泰勒展开式一样,项数越多越接近原图。

截断奇异值分解实际上是对矩阵 $M$ 的低秩近似。通过截断奇异值分解所得到的矩阵$U$中的每一行,则为相应词的$d$维向量表示, 该向量一般认为其具有连续、低维和稠密的性质。由于$U$的各列相互正交,因此可以认为词表示的每一维表达了该词的一种独立的“潜在语义”,所以这种方法也被称作潜在语义分析(Latent Semantic Analysis,LSA)。另外,$ΣV^T$的每一列也可以作为相应上下文的向量表示。

注意 :$U$和$\Sigma V^T$是不相等的,相当于两套表示,我们在这选择$U$作为$M$的稠密表示。

代码

不管是NumPy还是PyTorch 中都自带了SVD分解。

直接使用.linalg.svd()方法即可。

import torch M = torch.Tensor([[0, 2, 1, 1, 1, 1, 1, 2, 1, 3], [2, 0, 1, 1, 1, 0, 0, 1, 1, 2], [1, 1, 0, 1, 1, 0, 0, 0, 0, 1], [1, 1, 1, 0, 1, 0, 0, 0, 0, 1], [1, 1, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1, 0, 1], [2, 1, 0, 0, 0, 1, 1, 0, 1, 1], [1, 1, 0, 0, 0, 0, 0, 1, 0, 1], [3, 2, 1, 1, 1, 1, 1, 2, 1, 0]]) u, s, v = torch.linalg.svd(M) print((u @ torch.diag(s) @ v).int()) # 乘起来 torch.set_printoptions(precision=3, sci_mode=False) print(u) # M 的 稠密表示 结果:

乘起来可以看到SVD之后的结果还能再拼回去,不是在骗你。

tensor([[ -0.500, 0.724, 0.351, 0.253, -0.025, 0.193,  0.000, -0.000, -0.000, 0.017],  

$\quad\quad\quad$[ -0.384, 0.052, -0.463, -0.519, 0.394, 0.363,  0.000, -0.000, -0.000, 0.282],  

$\quad\quad\quad$[ -0.218, 0.036, -0.398, 0.156, -0.168, -0.182,  0.072, -0.138, -0.802, -0.200],  

$\quad\quad\quad$[ -0.218, 0.036, -0.398, 0.156, -0.168, -0.182,  -0.501, 0.586, 0.270, -0.200],  

$\quad\quad\quad$[ -0.218, 0.036, -0.398, 0.156, -0.168, -0.182,  0.429, -0.448, 0.531, -0.200],  

$\quad\quad\quad$[ -0.183, -0.010, 0.228, -0.419, 0.070, -0.258,  0.529, 0.468, -0.033, -0.409],  

$\quad\quad\quad$[ -0.183, -0.010, 0.228, -0.419, 0.070, -0.258,  -0.529, -0.468, 0.033, -0.409],  

$\quad\quad\quad$[ -0.293, -0.300, 0.152, -0.252, -0.789, 0.302,  0.000, -0.000, 0.000, 0.155],  

$\quad\quad\quad$[ -0.208, 0.015, 0.087, -0.079, -0.027, -0.708,  0.000, 0.000, 0.000, 0.664],  

$\quad\quad\quad$[ -0.515, -0.615, 0.226, 0.416, 0.356, 0.070,  -0.000, 0.000, -0.000, -0.038]])

引出embedding

虽然在基于传统机器学习的方法中,词的分布式表示取得了不错的效果,但是其仍然存在一些问题:

  • 当共现矩阵规模较大时,奇异值分解的运行速度非常慢; 毕竟是矩阵运算,随着矩阵的增长,计算量会变得巨大。

  • 如果想在原来语料库的基础上增加更多的数据,则需要重新运行奇异值分解算法,代价非常高; 当我们更新语料库的时候要面临重建共现矩阵的问题,又增加巨大的时间和计算开销。

  • 分布式表示只能用于表示比较短的单元,如词或短语等,如果待表示的单元比较长,如段落、句子等,由于与其共现的上下文会非常少,则无法获得有效的分布式表示; 因为我们要自己选择共现的方法,所以不同共现方式也会获得不同效果。

  • 分布式表示一旦训练完成,则无法修改,也就是说,无法根据具体的任务调整其表示方式。 没办法针对某一领域进行微调。

为了解决这些问题,可引入一种新的词表示方式——词嵌入表示

这样绕了一圈之后我们终于可以回到在一文拿捏点互信息(PMI)解决词分布式表示稀疏性问题中开头提到的那一段:

之前在word embedding里浅浅的说了一下one-hot是怎么向词向量表示发展的,大家可以回顾一下。接下来我补充一下,接说二者之间还有一个阶段,词的分布式表示。

有关SVD解决词分布式表示稀疏性的更多相关文章

  1. ruby - 分布式事务和队列,ruby,erlang,scala - 2

    我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

  2. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  3. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  4. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby - 如何更快地解决 project euler #21? - 2

    原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,

  7. ruby - 为什么这些方法没有解决? - 2

    这个问题在这里已经有了答案:WhydoRubysettersneed"self."qualificationwithintheclass?(3个答案)关闭29天前。给定这段代码:classSomethingattr_accessor:my_variabledefinitialize@my_variable=0enddeffoomy_variable=my_variable+3endends=Something.news.foo我收到这个错误:test.rb:9:in`foo':undefinedmethod`+'fornil:NilClass(NoMethodError)fromtes

  8. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  9. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  10. 【RuntimeError: CUDA error: device-side assert triggered】问题与解决 - 2

    RuntimeError:CUDAerror:device-sideasserttriggered问题描述解决思路发现问题:总结问题描述当我在调试模型的时候,出现了如下的问题/opt/conda/conda-bld/pytorch_1656352465323/work/aten/src/ATen/native/cuda/IndexKernel.cu:91:operator():block:[5,0,0],thread:[63,0,0]Assertion`index>=-sizes[i]&&index通过提示信息可以知道是个数组越界的问题。但是如图一中第二行话所说这个问题可能并不出在提示的代码段

随机推荐