【深度学习】Sentence Embedding-BERT-Whitening

前言

        flow模型本身很弱,BERT-flow里边使用的flow模型更弱,所以flow模型不大可能在BERT-flow中发挥至关重要的作用。反过来想,那就是也许我们可以找到更简单直接的方法达到BERT-flow的效果。

        BERT-whitening则认为,flow模型中涉及到的逆变换和雅可比行列式计算实际需要满足变换简单、易计算的特点。因此每一层的非线性变换能力就“很弱”,为了保证充分的拟合能力,模型就必须堆得非常深。但实际上BERT-flow所使用的模型计算量并大。因此,作者提出可以使用一种简单的线性变换(相当于白化操作)来浅层地对BERT的向量进行转换,能到达和BERT-flow接近甚至超越的效果。

1.向量的内积

        计算文本相似度时,首先将文本表示为句向量,然后计算两个句向量之间的余弦相似度,通过相似度的大小判断这两个文本是否相似。

        那么这里就有一个问题,余弦相似度为什么就能计算两个向量的相似性呢?想要弄清楚这个问题,就需要我们对于向量的内积有一个充分的理解。

        在线性代数中,我们知道,对于向量 A 和 B 来说,它们的内积形式是这样的

        从上面的公式我们可以看出,向量内积的运算是将两个向量映射为实数。接下来,我们从几何的角度来进行分析,假设 A 和 B 为二维向量来进行分析,则:

        经过变换后我们就可以得到:

         其几何图如下:

        可以看到,向量 A 与 B 的乘积为 A 到 B 投影的长度乘以 B 的模。 假设 |B|=1 ,则公式变为:

        也就是说,向量 A  B 的乘积可以看作 A  B 所在直线投影的标量大小。如果把 A 和 B 这两个向量扩展至 d 维,可以得到:

     上述等号只在“标准正交基”下成立。换句话说,向量的“夹角余弦”本身是具有鲜明的几何意义的,但上式右端只是坐标的运算,坐标依赖于所选取的坐标基,基底不同,内积对应的坐标公式就不一样,从而余弦值的坐标公式也不一样。

2.标准正交基

        对于两个向量 A 和 B 来说,如果A⋅B=0,那么,我们称这两个向量正交(零向量与任何向量正交)。 我们知道,在n维的欧式空间中,由n个向量组成的正交向量组称为正交基;由单位向量组成的正交基称为标准正交基

        对于一个向量A来说,其中不同维度的值表示的就是在该维上的投影,是一个标量。所以,我们可以大致的得出一个结论:要准确描述向量,首先要确定一组基,然后给出在基所在的各个维度上的投影值,就可以了。为了方便求坐标,我们希望这组基向量模长为 1。因为向量的内积运算,当模长为 1 时,内积可以直接表示投影。然后还需要这组基是线性无关的,我们一般用正交基,非正交的基也是可以的,不过正交基有较好的性质。

        Bert模型输出的 [CLS] 向量为什么在文本语义计算任务中无法取得好的效果呢,那么原因可能就是此时的句向量所属的坐标系并非标准正交基。而且如果基的数量少于向量本身的维数,则可以达到降维的效果。但是我们还没回答一个最关键的问题:如何选择基才是最优的。或者说,如果我们有一组 N 维向量,现在要将其降到 K 维(K 小于 N),那么我们应该如何选择 K 个基才能最大程度保留原有的信息?

        一种直观的看法是:希望投影后的投影值尽可能分散,因为如果重叠就会有样本消失。当然这个也可以从熵的角度进行理解,熵越大所含信息越多。所以,这里我们希望的是投影后的数值尽可能的分散,那么,该如何让投影值分散呢?而在数学中,可以用方差来表示数值的分散程度。

3.方差与协方差

        当协方差为 0 时,表示两个变量完全线性不相关。为了让协方差为 0,我们选择第二个基时只能在与第一个基正交的方向上进行选择,因此最终选择的两个方向一定是正交的。

        到这里,我们就可以得到一个优化目标:将一组 N 维向量降为 K 维,其目标是选择 K 个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0,而变量方差则尽可能大(在正交的约束下,取最大的 K 个方差)。

        对于向量 A 和 B 来说,我们按照行组成一个向量矩阵 X 为

        然后根据协方差的计算公式,可得

        我们可以看到这个矩阵对角线上的分别是两个变量的方差,而其它元素是 a 和 b 的协方差。两者被统一到了一个矩阵里。 我们很容易被推广到一般情况:

        设我们有 m 个 n 维数据记录,将其排列成矩阵X_{n,m} ,设 \frac{1}{m}XX^{T} ,则 C 是一个对称矩阵,其对角线分别对应各个变量的方差,而第 i 行 j 列和 j 行 i 列元素相同,表示 i 和 j 两个变量的协方差。

        由此可知,我们需要将除对角线外的其它元素化为 0,并且在对角线上将元素按大小从上到下排列(变量方差尽可能大),这里就是将协方差转为一个单位矩阵,也就是矩阵的对角化。

        设原始数据矩阵 X 对应的协方差矩阵为 C,而 P 是一组基按行组成的矩阵,设 Y=PX,则 Y 为 X 对 P 做基变换后的数据。设 Y 的协方差矩阵为 D,我们推导一下 D 与 C 的关系:

        这样我们就看清楚了,我们要找的 P 是能让原始协方差矩阵对角化的 P。换句话说,优化目标变成了寻找一个矩阵 P,满足PCP^{T}是一个对角矩阵,并且对角元素按从大到小依次排列,那么 P 的前 K 行就是要寻找的基,用 P 的前 K 行组成的矩阵乘以 X 就使得 X 从 N 维降到了 K 维并满足上述优化条件。

4.whitening

        回到Bert本身的输出,根据上述的协方差矩阵,作者假设有一组句子向量,也可以写为行向量 x_{i=1}^{N},然后对其进行如下线性变换。

         使得x_{i=1}^{N}的均值为0、协方差矩阵为单位阵。为了让均值为0,可以设置

        下面求解 W ,将原始数据的协方差记为

        根据公式, 可以得到 ,所以,我们的实际目标是  ,然后,可得

         我们知道 Σ 是一个正定对称矩阵,正定对称矩阵都具有如下形式的SVD分解

        其中 U 是一个正交矩阵, Λ 是一个正对角矩阵,则可以让  ,则可以得到 

        关于PCA和SVD的差异分析,首先是PCA,PCA可以把一个方阵分解为特征值和特征向量。但是对于任意形状的矩阵都可以进行SVD分解。

5.实验对比

        首先是与Bert-flow进行对比:

        可以看到,简单的BERT-whitening确实能取得跟BERT-flow媲美的结果。除了STS-B之外,笔者的同事在中文业务数据内做了类似的比较,结果都表明BERT-flow带来的提升跟BERT-whitening是相近的,这表明,flow模型的引入可能没那么必要了,因为flow模型的层并非常见的层,它需要专门的实现,并且训练起来也有一定的工作量,而BERT-whitening的实现很简单,就一个线性变换,可以轻松套到任意的句向量模型中。

        相信如果是一步步看下来的读者肯定知道了,前面的一系列介绍,其实就是PCA降维的操作。作者表示在降维的时候结果更好。

        从上表可以看出,我们将base版本的768维只保留前256维,那么效果还有所提升,并且由于降维了,向量检索速度肯定也能大大加快;类似地,将large版的1024维只保留前384维,那么降维的同时也提升了效果。这个结果表明,无监督训练出来的句向量其实是“通用型”的,对于特定领域内的应用,里边有很多特征是冗余的,剔除这些冗余特征,往往能达到提速又提效的效果。

6.代码实现

import numpy as np
data = np.random.rand(5,768)
print('data.shape = ')
print(data.shape,data)
def compute_kernel_bias(vecs):"""计算kernel和biasvecs.shape = [num_samples, embedding_size],最后的变换:y = (x + bias).dot(kernel)"""mu = vecs.mean(axis=0, keepdims=True)cov = np.cov(vecs.T)u, s, vh = np.linalg.svd(cov)W = np.dot(u, np.diag(1 / np.sqrt(s)))return W, -mudef transform_and_normalize(vecs, kernel=None, bias=None):"""应用变换,然后标准化"""if not (kernel is None or bias is None):vecs = (vecs + bias).dot(kernel)return vecs / (vecs**2).sum(axis=1, keepdims=True)**0.5kernel,bias = compute_kernel_bias(data)
kernel = kernel[:,:256]
print('kernel.shape = ')
print(kernel.shape)
print('bias.shape = ')
print(bias.shape)
data = transform_and_normalize(data, kernel, bias)
print('data.shape = ')
print(data.shape,data)

 Reference

        1.细说Bert-whitening的原理 - 知乎

        2.Bert-whitening 向量降维及使用_bert得到的句向量经过降维后全部堆在了一起_loong_XL的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS 知识一:如何在AWS上启动云AD服务器(详细到极致)

前言: 首先这里指的云AD服务器,只是为了让读友更好理解。云AD服务器在AWS中称为目录。AWS一共提供了4种目录类别,下面我将全程使用AWS托管微软AD这种目录类别进行示例。他完全提供了和Microsoft AD的功能,包括NTLM,Ker…

欧洲版OpenAI疑似将在24年发布并开源GPT-4级别模型!

大家好,我是二狗。 今天在推特上看到一条振奋人心的消息: “ 欧洲版OpenAI、法国初创公司 Mistral 首席执行官 Arthur Mensch 在法国国家广播电台宣布,Mistral 将在 2024 年发布开源 GPT-4 级别模型。” 这位老哥接着表示甚至可能是免费的&a…

传统软件集成AI大模型——Function Calling

传统软件和AI大模型的胶水——Function Calling 浅谈GPT对传统软件的影响Function Calling做了什么,为什么选择Function CallingFunction Calling简单例子,如何使用使用场景 浅谈GPT对传统软件的影响 目前为止好多人对chatGPT的使用才停留在OpenAI自己提…

数据可视化---箱线图

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

【MySQL】数据库和表的操作

数据库和表的操作 一、数据库的操作1. 创建数据库2. 字符集和校验规则(1)查看系统默认字符集以及校验规则(2)查看数据库支持的字符集(3)查看数据库支持的字符集校验规则(4)校验规则对…

RabbitMQ 基础

1.初识RabbitMQ 1.1.同步调用 我们现在基于OpenFeign的调用都属于是同步调用,那么这种方式存在哪些问题呢? 拓展性差性能下降级联失败 而要解决这些问题,我们就必须用异步调用的方式来代替同步调用。 1.2.异步调用 异步调用方式其实就是基…

EG网关网口连接MCGS触摸屏应用案例

EG网关网口连接MCGS触摸屏应用案例 前言:MCGS触摸屏广泛应于工业控制领域,是一款性能高,运行稳定的人机交互设备。此次我们要把MCGS的TPC7062系列触摸屏通过Modbus协议连接EG系列网关,将数据传输到EMCP物联网云平台,实…

马云笔下的AI电商时代,到底长啥样?

前两天,马云“惊现”阿里内网,正面回应拼多多市值接近阿里巴巴。 AI电商时代刚刚开始,对谁都是机会,也是挑战。要祝贺pdd过去几年的决策,执行和努力。谁都牛x过,但能为了明天后天牛而改革的人,…

页面置换算法详解专题

页面置换算法的功能是:当缺页中断发生,需要调入新的页面而内存已满时,选择内存当中哪个物理页面被置换~ 页面置换算法的目的:尽可能地减少页面的换进换出次数(既缺页中断的次数)。具体来说,把未…

论文笔记:Bilinear Attention Networks

更精简的论文学习笔记 1、摘要 多模态学习中的注意力网络提供了一种选择性地利用给定视觉信息的有效方法。然而,学习每一对多模态输入通道的注意力分布的计算成本是非常昂贵的。为了解决这个问题,共同注意力为每个模态建立了两个独立的注意分布&#x…

【YOLOv8量化】普通CPU上加速推理可达100+FPS

NNCF介绍 OpenVINO2023版本衍生出了一个新支持工具包NNCF(Neural Network Compression Framework – 神经网络压缩框架),通过对OpenVINO IR格式模型的压缩与量化更好的提升模型在OpenVINO框架上部署的推理性能,github。 https://github.com/openvinoto…

STM32单片机项目实例:基于TouchGFX的智能手表设计(5)硬件驱动层程序设计

STM32单片机项目实例:基于TouchGFX的智能手表设计(5)硬件驱动层程序设计 目录 一、 概述 二、 新建工程与外设配置 三、 TouchGFX配置 四、 增加TouchGFX关键驱动 一、 概述 本文内容主要进行工程新建,硬件外设的配置以及添加…

【Python】—— 如果使用matplotlib做数据可视化

matplotlib做数据可视化 相关知识掌握matplotlib的基本使用方法1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图6. 等高线图7. 图形定制 掌握数据处理的基本方法1. 数据筛选2. 缺失值处理3. 异常值处理 理解数据可视化的原则和方法1. 选择合适的图表类型2. 避免数据混淆3. 突出重…

【java IO】|java NIO总结

在传统的 Java I/O 模型(BIO)中,I/O 操作是以阻塞的方式进行的。也就是说,当一个线程执行一个 I/O 操作时,它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈,因为需要为每个连…

Tarjan-割点问题

文章目录 前言割点定义割点的求解割点判定定理证明(非严谨) 算法实现算法流程代码详解 再看SCCOJ练习 前言 之前介绍Tarjan算法求强连通分量时,提到了代码段中对于访问过的邻接点应用其时间戳来更新追溯值,不是说用追溯值更新会导…

结果实例: 一个cpu的parsec结果

简介 限于篇幅限制,很多教程和论文只展示部分结果。我们这里展示非常细节的结果,包括输出的许多命令行结果。 运行命令行 的shell窗口 ./build/X86/gem5.opt -d m5out/onlyoneCPUkvmCheckPointDifferRCS20231218restore \configs/deprecated/example/…

教务系统一键评教

利用浏览器的开发者模式实现“一键评教”,本教程针对金智教务系统 步骤 1、打开教务系统的评教页面。 2、按下键盘快捷键 F12,或者点击鼠标右键打开浏览器的开发者工具,然后选择控制台(Console)。 3、复制以下 Java…

大数据机器学习-梯度下降:从技术到实战的全面指南

大数据机器学习-梯度下降:从技术到实战的全面指南 文章目录 大数据机器学习-梯度下降:从技术到实战的全面指南一、简介什么是梯度下降?为什么梯度下降重要? 二、梯度下降的数学原理代价函数(Cost Function)…

[德人合科技]——设计公司 \ 设计院图纸文件数据 | 资料透明加密防泄密软件

国内众多设计院都在推进信息化建设,特别是在异地办公、应用软件资产规模、三维设计技术推广应用以及协同办公等领域,这些加快了业务的发展,也带来了更多信息安全挑战,尤其是对于以知识成果为重要效益来源的设计院所,防…

vue内容渲染

内容渲染指令用来辅助开发者渲染DOM元素的文本内容。常用的内容渲染指令有3个 1.v-text 缺点:会覆盖元素内部原有的内容 2.{{}}:插值表达式在实际开发中用的最多,只是内容的占位符,不会覆盖内容 3.v-html:可以把带有标…