password
Languages
type
status
date
slug
summary
视频列表
基本分类
icon
写在前面的话:
笔者之前翻译了一篇关于爱因斯坦求和约定的博客,其中提及爱因斯坦求和约定的规则之一是对重复的索引求和。本文借助数学公式和TensorFlow1.14代码,进一步诠释这个规则。
求两个向量的点积
如果有两个向量 和 ,它们的维度相同,记为 ,那么它们的点积可以表示为:
举例来说,令,。
用TensorFlow的tf.einsum(),代码如下:
两个矩阵按行逐元素相乘再相加
假设有两个矩阵和,它们的维度相同,记为。矩阵和按行逐元素相乘再相加,得到向量,其中是第行元素相乘再相加的结果,其表达式为:
举例来说,令,,令和按行逐元素相乘再相加的结果为。
用TensorFlow的tf.einsum(),代码如下:
两个矩阵按列逐元素相乘再相加
假设有两个矩阵和,它们的维度相同,记为。矩阵和按列逐元素相乘再相加,得到向量,其中是第列元素相乘再相加的结果,其表达式为:
举例来说,令,,令和按列逐元素相乘再相加的结果为。
用TensorFlow的tf.einsum(),代码如下:
两个三维张量逐元素相乘,并在第二和第三个维度上求和
假设有两个三维张量和,它们的维度相同,记为,其中是张量的批量大小,即张量中包含的独立样本数,和表示每个样本二维结构的行数和列数。张量和逐元素相乘,并在第二和第三个维度上求和,最终得到一个一维张量,其中的第个元素为:
举例来说,令,,令和逐元素相乘并在第二和第三个维度上求和的结果为,则有:
用TensorFlow的tf.einsum(),代码如下:
两个矩阵相乘,再和第三个矩阵做Frobenius内积
Frobenius内积又称为矩阵内积,它是两个同形矩阵先做逐元素相乘,再把所得结果中的所有元素相加求和。这个操作在机器学习、信号处理和其他科学计算领域中非常常见,用于计算两个矩阵之间的相似度或相关性。
Hadamard积是指两个同形矩阵逐元素相乘。
假设矩阵和矩阵维度相同,记为。矩阵的维度为。矩阵和矩阵做矩阵乘法,所得的结果再与矩阵做Hadamard积。记最终的结果为c,其表达式为:
为了便于理解,不妨令矩阵、矩阵、矩阵都是二维矩阵。那么上式中有。把上式中的三个求和符号由里到外展开,有:
用TensorFlow的tf.einsum表示为
如果矩阵和矩阵都是三维张量,维度为,二维张量的维度为。如何理解以下代码?
把'ni,ij,nj->'对应的运算过程进行批量操作,即可得到'bni,ij,bnj->b'。
'ni,ij,nj->'的结果是一个数字。'bni,ij,bnj->b'的结果是一个向量,该向量的长度为一个批量中的样本个数(batch_size)。
全文小结
本文列举了爱因斯坦求和约定的一些常见的用法,包括它们的数学公式和TensorFlow代码。笔者写本文是因为在阅读bert4keras库中的条件随机场的源代码,其中计算目标路径的相对概率target_score这个函数中有两个tf.einsum的表达式没看懂。自行摸索了一下,才发现tf.einsum中的字符串表达式和数学表达式有关,如果能写出一个矩阵运算的数学表达式,那么就很容易知道如何用tf.einsum的字符串表达式来描述该矩阵运算。
bert4keras中的target_score函数如下。读完本文,很容易就能知道'bni,bni->b’和'bni,ij,bnj->b'仅仅是在'ni,ni->’和'ni,ij,nj->'的基础上进行批量操作。
有关本文的任何问题,欢迎您在底部评论区留言,一起交流~
如果您想支持一下溪月科技
⭐️请溪月喝杯咖啡⭐️
如果这篇文章对您有帮助,或者您想支持溪月的博客创作,欢迎您进行小额的打赏~
🦋支付宝🦋
☘️微信☘️
- 作者:溪月Yukey
- 链接:www.yukey.tech/article/7f017ea1-1da3-41cd-9db7-6ccef5508d7b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。