最近在使用tensorflow完成句子相似度建模等任务时常常会用到各种距离的计算,而且有很多论文提出了Attention机制,所以这里就介绍一下如何使用tensorflow实现上述各种功能。

这里首先假定我们的输入是两个四维的Tensor,然后我们需要计算的是其中某个维度的距离。比如说我们的输入是batch个句子,句长是sent_len, 每个词被表示成embed_size的词向量。所以我们的输入就是一个[batch_size, sent_len, embed_size, 1]的Tensor,需要计算的就是两个句子的Attention矩阵。Aij表示句子1中第i个单词和句子2中第j个单词的距离(余弦距离,欧氏距离,L1距离等),也就是计算两个长度为embed_size的向量之间的距离。

为了方便表示和调试,我们这里使用shape为[2,3,4,1]的Tensor来表示上述句子。

1,Euclidean distance

欧氏距离很简单,以向量为例(x1, x2, x3,….,xn),(y1, y2, y3,….,yn),那么其欧氏距离的计算公式如下图所示:

fefb002c01c1d418a8bd4e7318644b3a.png

在tensorflow中如何实现呢,代码如下:

import tensorflow as tf

x3 = tf.constant([[[[1], [2], [3], [4]],

[[5], [6], [7], [8]],

[[9], [10], [11], [12]]],

[[[1], [2], [3], [4]],

[[5], [6], [7], [8]],

[[9], [10], [11], [12]]]], tf.float32)

x4 = tf.constant([[[[3], [4], [1], [2]],

[[5], [7], [8], [6]],

[[9], [12], [11], [10]]],

[[[1], [2], [3], [4]],

[[5], [6], [7], [8]],

[[9], [10], [11], [12]]]], tf.float32)

with tf.Session() as sess:

dis = sess.run(tf.square(x3-x4))

dis1 = sess.run(tf.reduce_sum(tf.square(x3-x4), 2))

euclidean = sess.run(tf.sqrt(tf.reduce_sum(tf.square(x3-x4), 2)))

print dis, dis1, euclidean

这部分代码实现的功能是:我们有x3,x4两个输入,每个有两句话,每句话有三个单词。计算的是对应单词之间的距离。下面是输出:

dis:

[[[[ 4.]

[ 4.]

[ 4.]

[ 4.]]

[[ 0.]

[ 1.]

[ 1.]

[ 4.]]

[[ 0.]

[ 4.]

[ 0.]

[ 4.]]]

[[[ 0.]

[ 0.]

[ 0.]

[ 0.]]

[[ 0.]

[ 0.]

[ 0.]

[ 0.]]

[[ 0.]

[ 0.]

[ 0.]

[ 0.]]]]

dis1:

[[[ 16.]

[ 6.]

[ 8.]]

[[ 0.]

[ 0.]

[ 0.]]]

Euclidean:

[[[ 3.99999976]

[ 2.44948959]

[ 2.82842684]]

[[ 0. ]

[ 0. ]

[ 0. ]]]

所以Euclidean距离的计算方法就是:

euclidean = tf.sqrt(tf.reduce_sum(tf.square(x3-x4), 2))

余弦距离

跟Euclidean距离相似,余弦距离也可以用来表征两个向量之间的相似度。其计算公式如下图所示:

c289ad0f86b034b3def90d5ea20c5465.png

在tensorflow中实现方法如下,这里我们仍然沿用x3,x4的定义,之写出sess.run()部分的代码:

with tf.Session() as sess:

#求模

x3_norm = tf.sqrt(tf.reduce_sum(tf.square(x3), axis=2))

x4_norm = tf.sqrt(tf.reduce_sum(tf.square(x4), axis=2))

#内积

x3_x4 = tf.reduce_sum(tf.multiply(x3, x4), axis=2)

cosin = x3_x4 / (x3_norm * x4_norm)

cosin1 = tf.divide(x3_x4, tf.multiply(x3_norm, x4_norm))

a, b, c, d, e = sess.run([x3_norm, x4_norm, x3_x4, cosin, cosin1])

print a, b, c, d, e

上述代码按照cosine的计算公式进行分步求解。最终的到了两个句子对应词之间的余弦距离。从结果会看出cosin和cosin1是一样的。结果如下所示:

x3_norm:

[[[ 5.47722483]

[ 13.19090366]

[ 21.11871338]]

[[ 5.47722483]

[ 13.19090557]

[ 21.11871147]]]

x4_norm:

[[[ 5.47722483]

[ 13.19090366]

[ 21.11871338]]

[[ 5.47722483]

[ 13.19090557]

[ 21.11871147]]]

x3_x4:

[[[ 22.]

[ 171.]

[ 442.]]

[[ 30.]

[ 174.]

[ 446.]]]

cosin:

[[[ 0.73333353]

[ 0.98275894]

[ 0.99103123]]

[[ 1.00000024]

[ 1.00000012]

[ 1.00000012]]]

cosin1:

[[[ 0.73333353]

[ 0.98275894]

[ 0.99103123]]

[[ 1.00000024]

[ 1.00000012]

[ 1.00000012]]]

Attention矩阵计算

如上面提到的那样,Attention矩阵A中的每个元素Aij表示句子1中第i个单词和句子2中第j个单词的距离。那么如何实现呢。我们先介绍一种比较简单的思路:

def input_attention(x1, x2):

#将每个句子按单词进行切分

x1_unstack = tf.unstack(x1, axis=1)

x2_unstack = tf.unstack(x2, axis=1)

D = []

for i in range(len(x1_unstack)):

d = []

for j in range(len(x2_unstack)):

#计算两个单词之间的相似度距离

dis = tf.sqrt(tf.reduce_sum(tf.square(x1_unstack[i]- x2_unstack[j]), axis=1))

d.append(dis)

D.append(d)

D1 = tf.reshape(D, [2, 3, 3])

D2 = tf.reshape(tf.transpose(D, perm=[2, 0, 1, 3]), [2,3,3])

return D1, D2

with tf.Session() as sess:

A, A1 = input_attention(x3, x4)

a, a1 = sess.run([A, A1])

print a, a1

这种方法是先将句子进行unstack,也就是“分词”。经过下面这行命令我们就得到了3个[2, 4, 1]的tensor。即3个单词

x1_unstack = tf.unstack(x1, axis=1)

所以下面这条命令之后我们就得到一个[2, 1]的tensor。在经过两个循环(3×3),我们就获得了[3, 3, 2, 1]的tensor。D是一开始我用的,当时觉得是没问题的,但是经过调试发现,他返回的结果是错误的,因为D是[3,3,2,1],2在最里面,reshape时不会被直接调到外面。结果如下所示:

dis = tf.sqrt(tf.reduce_sum(tf.square(x1_unstack[i]- x2_unstack[j]), axis=1))

A:

[[[ 4. 0. 8.36660004]

[ 8. 16.24807739 16. ]

[ 8.94427204 8. 2.44948983]]

[[ 0. 8.48528099 8. ]

[ 16.4924221 16. 8.36660004]

[ 8. 2.82842708 0. ]]]

A1:

[[[ 4. 8.36660004 16.24807739]

[ 8.94427204 2.44948983 8.48528099]

[ 16.4924221 8.36660004 2.82842708]]

[[ 0. 8. 16. ]

[ 8. 0. 8. ]

[ 16. 8. 0. ]]]

根据上面的结果,我们很明显可以看出A1才是我们想要的数据。

java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...相关推荐

  1. 使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算

    最近在使用tensorflow完成句子相似度建模等任务时常常会用到各种距离的计算,而且有很多论文提出了Attention机制,所以这里就介绍一下如何使用tensorflow实现上述各种功能. 这里首先 ...

  2. 为什么不可以使用哈曼顿距离_请对比下欧式距离和曼哈顿距离的差别

    ●今日面试题分享● 在k-means或kNN,我们常用欧氏距离来计算最近的邻居之间的距离,有时也用曼哈顿距离,请对比下这两种距离的差别 解析: 欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之 ...

  3. java椭圆写字距离_保持轨道椭圆的距离

    我在Unity游戏引擎中使用太阳能系统进行了4x游戏 . 我有行星,我想以椭圆形方式围绕它们的恒星运行 . 由于各种原因,行星不是星星的父级 . 游戏在3D空间中具有俯视图,因此轨道位于x和z平面上, ...

  4. wifi rssi 计算 距离_用RSSI/TOF判断距离靠谱吗?浅谈RSSI/TOF测距优劣

    RSSI测距 RSSI测距RSSI的英文全称为Received SignalStrength Indication,即接收信号的强度指示.可通过接收到的信号强弱测定信号点与接收点的距离,进而根 RSS ...

  5. python 余弦距离_距离公式汇总以及Python实现

    1.余弦距离: 描述:余弦夹角也可以叫余弦相似度.几何中夹角余弦可用来衡量两个向量方向的差异,机 器学习中借用这一概念来衡量向量样本之间的差异.余弦的取值范围[-1,1],求的两个向量 的夹角并得出夹 ...

  6. 简单粗暴理解与实现机器学习之K-近邻算法(三):距离度量、欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化距离、余弦距离、汉明距离、杰卡德距离、马氏距离

    K-近邻算法 文章目录 K-近邻算法 学习目标 1.3 距离度量 1 欧式距离**(Euclidean Distance):** 2 **曼哈顿距离(Manhattan Distance):** 3 ...

  7. 数据的距离度量 二、余弦距离,汉明距离,测地距离,布雷柯蒂斯距离

    数据的距离度量 二.余弦距离,汉明距离,测地距离,布雷柯蒂斯距离 前言 余弦距离 汉明距离 测地距离 布雷柯蒂斯距离 前言 本篇记录余弦距离,汉明距离,测地距离,布雷柯蒂斯距离. 余弦距离 又名余弦相 ...

  8. K邻近算法概述、欧式距离、Scikit-learn使用 、kNN邻近算法距离度量、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧氏距离、余弦距离、汉明距离、杰卡德距离、马氏距离

    一.K-邻近算法概述 K邻近算(K Nearest Neighbor算法,KNN算法):如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...

  9. java 计算向量cos距离_欧氏距离和cos相似度

    两者相同的地方,就是在机器学习中都可以用来计算相似度,但是两者的含义有很大差别,以我的理解就是: 前者是看成坐标系中两个 点 ,来计算两点之间的 距离 : 后者是看成坐标系中两个 向量 ,来计算两向量 ...

  10. 高德地图获取坐标距离_利用java、js或mysql计算高德地图中两坐标之间的距离

    前言 因为工作的原因,最近在做与地图相关的应用,使用了高德地图,研究了下高德地图计算两坐标距离的方法,官网上提供的开发包中有相关的方法,但是我的产品中比较特殊,无法直接使用提供的方法,所以就自己封装了 ...

最新文章

  1. 【iOS开发】静态库 a文件合成脚本解释
  2. python语言能干什么-python语言能做什么
  3. BZOJ 3836 Codeforces 280D k-Maximum Subsequence Sum (模拟费用流、线段树)
  4. 自动化运维工具Ansible之roles
  5. 【引用】将整数转化为十进制字符串的函数Convert integer to Decimal string
  6. 围棋,与生活,与编程
  7. 如何提炼游戏IP的价值,《梦幻西游三维版》给我们上了一课
  8. 光伏发电与计算机控制,独立太阳能光伏发电系统的控制设计与实现
  9. 阿里云服务器实现内网互通
  10. 斯坦福大学自然语言处理第四课 语言模型(Language Modeling)笔记
  11. 被遗忘的设计模式——空对象模式(转载)
  12. 镶嵌数据集工具小结(七)色彩平衡与接缝线 Ⅰ
  13. 杭电计算机考研经验交流
  14. 愚人节看到的两则IT界的玩笑
  15. HCIP第十七天笔记
  16. android认证失败怎么办,小米VIP认证失败怎么办
  17. 互联网晚报 | 8月25日 星期三 | 拼多多年度活跃买家数达8.5亿;钉钉推出首个数字工牌产品“钉工牌”;小度科技完成B轮融资...
  18. 你了解次世代吗?你知道为什么导出的基本上都是低模,不是高模?
  19. CDH修改静态资源池配置,NodeManager重启失败问题
  20. matlab 处理眼动仪数据总结(一) :数据读取

热门文章

  1. Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染
  2. 微信公众号第三方平台开发概况
  3. 基于RPA的自动化测试研究
  4. Python基础入门教学
  5. 硬件钱包 Ledger使用教程
  6. 在word表格中如何快速清除表格内容?
  7. EIGamal encryption VS Pairing encryption
  8. (郭霖)Android图片加载框架最全解析(一),Glide的基本用法
  9. LayUI 之动态树形菜单
  10. 送一些专属红包封面。