今天要更新的是Embedding Similarity,这个评价指标呢,是通过嵌入向量来计算相似度的一种方式,我们一起来学习下。

欢迎关注知乎: 世界是我改变的

知乎上的原文链接

一. Embedding Similarity介绍

1. 原理介绍及公式

Embedding Similarity,顾名思义就是通过嵌入向量来计算相似度,这个评价指标在网上的资料比较少,我今天来总结一哈。

相似度度量(Similarity),即计算个体间的相似程度,相似度度量的值越小,说明个体间相似度越小,相似度的值越大说明个体差异越大。

对于多个不同的文本或者短文本对话消息要来计算他们之间的相似度如何,一个好的做法就是将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度。

采用Embedding的方式来进行相似性度量,并返回一个度量相似性的数字。请记住,Embedding只是数字的向量,查找两个向量之间的相似性 A = [a_1,a_2,a_3,...,a_n] 和 B = [b_1,b_2,b_3,...,b_n] ,它主要分为三种相似性指标方式:

  • 欧式距离(Euclidean distance):意义是向量两端之间的距离,公式为 :

\,\,\,\,\,\,\,\,\,\,\,\, \sqrt{(a_1 - b_1)^2 + (a_2 - b_2)^2 + ...+(a_N - b_N)^2 } \quad

  • 余弦(Cosine):角度余弦\theta向量之间,公式为:

\frac {a^Tb}{|a|*|b|} \quad

  • 点积(dot):余弦乘以两个向量的长度,公式为:

a_1b_1+a_2b_2+...+a_nb_n = |a||b|cos(\theta)

2. 度量方式的选择

与余弦相反,点积与向量长度成正比。这很重要,因为在训练集中经常出现的示例往往具有较大的嵌入向量。示例可能会使相似性指标产生偏差。为了平衡这种偏斜,可以将长度增加到指数 \alpha < 1 计算点积为 |a|^\alpha|b|^\alpha cos(\theta) 。

为了更好地了解向量长度如何改变相似性度量,请将向量长度归一化为1并注意这三个度量变得彼此成比例。

  • 证明:相似度量的比例性

在规范化a和b后,||a|| = 1  和||b|| = 1  ,这三项措施的相关性如下:

  • 欧式距离 = ||a - b || = \sqrt{||a||^2 + ||b||^2 -2a^Tb } \ = \sqrt{2-2cos(\theta_\text{ab})}
  • 点积 = |a||b| cos(\theta_\text{ab}) = 1 * 1 * cos(\theta_\text{ab})= cos(\theta_\text{ab})|a||b| cos(\theta_\text{ab}) = 1 * 1 * cos(\theta_\text{ab})= cos(\theta_\text{ab})
  • 余弦 = cos(\theta_\text{ab})

由此得出:三个相似性度量都是等效的。所以我们用余弦相似度来计算,后面代码也是CosineSimilarity。

二. CosineSimilarity的MindSpore代码实现

好了,原理已经讲完,话不多说,我们开始上代码。使用的是MindSpore框架实现的代码。

  • MindSpore代码实现

"""CosineSimilarity."""
import numpy as np
from mindspore._checkparam import Validator as validator
from .metric import Metricclass CosineSimilarity(Metric):def __init__(self, similarity='cosine', reduction='none', zero_diagonal=True):super().__init__()similarity_list = ['dot', 'cosine']reduction_list = ['none', 'sum', 'mean']similarity = validator.check_value_type("similarity", similarity, [str])# 度量方式有两种,dot和cosineself.similarity = validator.check_string(similarity, similarity_list, "similarity")# reduction有三种,none', 'sum', 'mean'reduction = validator.check_value_type("reduction", reduction, [str])self.reduction = validator.check_string(reduction, reduction_list, "reduction")self.zero_diagonal = validator.check_value_type("zero_diagonal", zero_diagonal, [bool])self.clear()def clear(self):"""清除历史数据"""self.sqr_mtx_res = 0self._is_update = Falsedef update(self, *inputs):"""更新输入数据,输入为1个"""# 输入必须是一个tensor,numpy或者listinput_data = self._convert_data(inputs[0])# 选择使用的度量方式if self.similarity == 'cosine':data = np.linalg.norm(input_data, ord=2, axis=1)input_data = input_data / np.expand_dims(data, 1)self.sqr_mtx_res = np.dot(input_data, input_data.transpose(1, 0))self._is_update = Truedef eval(self):"""计算cosine similarity,返回的是一个矩阵"""if not self._is_update:raise RuntimeError('Call the update method before calling eval.')if self.zero_diagonal:np.fill_diagonal(self.sqr_mtx_res, 0)if self.reduction == 'mean':self.sqr_mtx_res = np.mean(self.sqr_mtx_res, axis=-1)if self.reduction == 'sum':self.sqr_mtx_res = np.sum(self.sqr_mtx_res, axis=-1)return self.sqr_mtx_res
使用方法如下:
import numpy as np
from mindspore.nn.metrics import CosineSimilaritytest_data = np.array([[5, 8, 3, 2], [5, 8, 3, 2], [4, 2, 3, 4]])
metric = CosineSimilarity()
metric.clear()
metric.update(test_data)
square_matrix = metric.eval()
print(square_matrix)np.array([[0, 1, 0.78229315], [1, 0, 0.78229315], [0.78229315, 0.78229315, 0]])
  • 补充说明

这里说明一下,通常计算相似度都是有两个输入,比如A和B,通过Embedding similarity来计算两个输入的相似度,结果是一个数值。我们这里使用的是将A、B、C放到了一个矩阵里,比如 np.array([[5,8,3,2],[5,8,3,2],[4,2,3,4]]),

A为embedding之后的[5,8,3,2],

B为embedding之后的[5,8,3,2],

C为embedding之后的[4,2,3,4]。

得到的结果是np.array([[0, 1, 0.78229315], [1, 0, 0.78229315], [0.78229315, 0.78229315, 0]]),结果可表示为如下表格:

表格说明(上面每一个格对应着下面对应位置的格):

这样看结果就很清晰明了了吧,也是解释为什么输入数量为1了。不同于网上其他资料的直接两个输入x和y,拿x和y直接比的出来一个结果。这样写的原因是对于大量数据来说,更加方便。

哦,对了,一般结果的取值范围是 [-1, 1] 。

Metric评价指标-Embedding Similarity相关推荐

  1. Metric评价指标-Perplexity语言模型

    欢迎关注知乎: 世界是我改变的 知乎上的原文链接 一. 原理介绍 在研究生实习时候就做过语言模型的任务,当时让求PPL值,当时只是调包,不求甚解,哈哈哈,当时也没想到现在会开发这个评价指标,那现在我来 ...

  2. 文本生成客观评价指标总结(附Pytorch代码实现)

    前言:最近在做文本生成的工作,调研发现针对不同的文本生成场景(机器翻译.对话生成.图像描述.data-to-text 等),客观评价指标也不尽相同.虽然网络上已经有很多关于文本生成评价指标的文章,本博 ...

  3. LightGBM之metric的选择

    指标参数metric 评价指标 {l2 for regression}, {binary_logloss for binary classification}, {multi_logloss for ...

  4. 论文笔记:Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering

    前言 初代频域GCN简单粗暴的将diag(g^(λl))diag(\hat{g}{(\lambda_l)})diag(g^​(λl​))变成了卷积核diag(θl)diag(\theta_l)diag ...

  5. Graph Neural Networks: A Review of Methods and Applications(图神经网络:方法与应用综述)

    Graph Neural Networks: A Review of Methods and Applications 图神经网络:方法与应用综述 Jie Zhou , Ganqu Cui , Zhe ...

  6. Graph Convolutional Neural Networks for Web-Scale Recommender Systems(用于Web级推荐系统的图形卷积神经网络)

    Graph Convolutional Neural Networks for Web-Scale Recommender Systems 用于Web级推荐系统的图形卷积神经网络 ABSTRACT R ...

  7. (few-shot)2020年few-shot learning Classification overview 小样本综述

    小样本学习:基础 [blog] 1. 相关问题 半监督学习(Semi-supervised Learning) 是同时从有标注和无标注的数据中学习最优假设 . 正样本半监督学习(Positive-un ...

  8. 论文《Real-time Personalization using Embeddings for Search Ranking at Airbnb》

    Real-time Personalization using Embeddings for Search Ranking at Airbnb 论文地址:https://dl.acm.org/doi/ ...

  9. 【HRNet】《Deep High-Resolution Representation Learning for Human Pose Estimation》

    CVPR-2019 代码:https://github.com/leoxiaobin/deep-high-resolution-net.pytorch 文章目录 1 Background and Mo ...

最新文章

  1. 让手机站点像原生应用的四大途径
  2. swing中怎么在原来图片的基础上切换第二张图片_狂戳痛点!毕业论文图片和公式排版!...
  3. OpenCV下利用傅里叶变换和逆变换实现图像卷积算法,并附自己对于卷积核/模板核算子的理解
  4. spark任务jvm内存溢出
  5. python中使用ZADD方法报错AttributeError: 'int' object has no attribute 'items'
  6. Linux跨平台远程控制
  7. 太神奇了!使用C#实现自动核验健康码:(2)OCR识别
  8. 用python找对象_还在单身的你 Python教你如何脱单
  9. mysql配置修改记录_mysql设置修改时间,更新记录当前时间
  10. java的mwcellarray_Java 数组
  11. snmp是什么层协议_率先拥抱TSN——CC-Link发布新一代网络协议CC-Link IE TSN
  12. pandas读取csv文件数据并对指定字段分类使用matplotlib在一张图里画四张折线图子图
  13. Suse Enterprise Server 11的安装
  14. 色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV
  15. SCI论文的Highlights怎么写(正经的教你怎么写)
  16. sp导出贴图到maya
  17. 如何批量处理/修改文件的后缀名(使用批处理.bat进行)
  18. linux根据文件名查找文件路径
  19. python编程里的幂怎么表示
  20. 安卓高通Diag命令解析

热门文章

  1. C++ RGB颜色(非图形化界面)
  2. 地火明夷 (易經大意 韓長庚)
  3. 【css】 让文字换行的样式
  4. 【原创】随手记下-电脑版微信双开
  5. 2021chrome浏览器视频加速(网盘)
  6. 使用charCodeAt()和charAt()方法,根据Unicode 编码,转换字符
  7. 5 打印选课学生名单 (25 分)
  8. 关于一些实用的资源网站,目前知道的
  9. Android安全性优化——APP加固
  10. 微核Linux(Tiny Core Linux)