【白话机器学习系列】白话Broadcasting

news2024/11/16 12:05:24

白话 Broadcasting

文章目录

    • 什么是 Broadcasting
    • Broadcasting 的规则
    • 逐元素操作
      • 向量与标量运算
      • 矩阵与向量运算
        • 行向量
        • 列向量
      • 张量与向量运算
      • 张量与矩阵运算
    • 矩阵与张量的点积
    • 总结

什么是 Broadcasting

在 《白话张量》 中我们讲过,张量之间进行运算需要满足一定的维数条件的,形状大小不满足条件的两个张量之间是无法进行运算的。为了能执行运算,我们通常需要将较小的张量被“拉伸”到与较大张量兼容的形状,这一步“拉伸”操作就是 Broadcasting。

在这里插入图片描述

图1. Broadcasting 示意图

Broadcasting 在不创建重复数据的情况下确保张量运算可以执行,从而确保算法可以更高效的执行。

Broadcasting 的规则

根据 PyTorch 的文档,张量在以下情况下可以 Broadcasting :

每个张量至少有一个维度

迭代维度大小时,会从尾部维度开始,向前推进,维度大小要么相等,要么其中一个为1或不存在。

比较形状时,尾部维度指的是最右边的数字。我们以上面的图 1 为例,解释一下 Broadcasting 的通用过程:

  1. 确定最右边的维度是否兼容
    • 每个张量是否至少有一个维度?
    • 尺寸是否相等?其中一个是 1 或不存在吗?
  2. 将尺寸拉伸到合适的大小
  3. 对下一个维度重复前面的步骤

逐元素操作

所有按元素操作的运算都要求张量具有相同或兼容的形状。

向量与标量运算

在这里插入图片描述

图2. 向量与标量运算中的 Broadcasting 示意图

在此示例中,标量的形状为 ( 1 , ) (1,) (1,) ,向量的形状为 ( 3 , ) (3,) (3,)。 如图 2 所示,标量 b b b 被 Broadcasting 为 ( 3 , ) (3,) (3,) 的形状,并且按预期执行了 Hadamard 乘积。

上面的示例用 PyTorch 实现如下:

import torch

a = torch.tensor([1, 2, 3])
b = 2 # 会拉伸为 ([2, 2, 2])

a * b
# Output: tensor([2, 4, 6])

矩阵与向量运算

行向量

在这里插入图片描述

图3. 矩阵与行向量运算中的 Broadcasting 示意图

在上面示例中,矩阵 A A A 的形状为 ( 3 , 3 ) (3, 3) (3,3),向量 b b b 的形状为 ( 3 , ) (3,) (3,)。当运算时,向量 b b b 被逐行拉伸成一个 ( 3 , 3 ) (3,3) (3,3) 矩阵,如图 3 所示。 现在,A 和 b 的形状都是 ( 3 , 3 ) (3, 3) (3,3),可以进行逐元素操作。

上面的示例用 PyTorch 实现如下:

A = torch.tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

b = torch.tensor([1, 2, 3])

A * b
# Output: tensor([[ 1,  4,  9],
#         		  [ 4, 10, 18],
#         		  [ 7, 16, 27]])

列向量

在这里插入图片描述

图4. 矩阵与列向量运算中的 Broadcasting 示意图

在上面示例中,矩阵 A A A 的形状为 ( 3 , 3 ) (3, 3) (3,3),列向量 b b b 的形状为 ( 3 , 1 ) (3, 1) (3,1)。当运算时, b b b 被按列拉伸创建另外 2 列,如图 4 所示。 现在,A 和 b 的形状都是 ( 3 , 3 ) (3, 3) (3,3),可以进行逐元素操作。

上面的示例用 PyTorch 实现如下:

A = torch.tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

b = torch.tensor([[1], 
                  [2], 
                  [3]])
A * b
# Output: tensor([[ 1,  2,  3],
#         		  [ 8, 10, 12],
#         		  [21, 24, 27]])

张量与向量运算

[ [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] ] ⊙ [ [ 1 ] [ 2 ] [ 3 ] ] = [ [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] ] ⊙ [ [ [ 1 1 1 ] [ 2 2 2 ] [ 3 3 3 ] ] [ [ 1 1 1 ] [ 2 2 2 ] [ 3 3 3 ] ] ] \begin{bmatrix} \begin{bmatrix} [1 \enspace2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \begin{bmatrix} [1\enspace 2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \end{bmatrix}\odot \begin{bmatrix} [1]\\ [2]\\ [3] \end{bmatrix}= \begin{bmatrix} \begin{bmatrix} [1 \enspace2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \begin{bmatrix} [1\enspace 2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \end{bmatrix}\odot \begin{bmatrix} \begin{bmatrix} [1 \enspace \textcolor{red}{1\enspace 1}]\\ [2\enspace \textcolor{red}{2\enspace 2}]\\ [3\enspace \textcolor{red}{3\enspace 3}] \end{bmatrix}\\ \begin{bmatrix} [\textcolor{red}{1\enspace 1\enspace 1}]\\ [\textcolor{red}{2\enspace 2\enspace 2}]\\ [\textcolor{red}{3\enspace 3\enspace 3}] \end{bmatrix}\\ \end{bmatrix} [123][456][789] [123][456][789] [1][2][3] = [123][456][789] [123][456][789] [111][222][333] [111][222][333]

3-D 及以上维度的张量很难用图形清晰地展示,这里我改用公式来表达。上面公式中,红字部分展示了向量如何 Broadcasting 到与张量兼容的尺寸。具体来说,上面示例中张量的形状为 ( 2 , 3 , 3 ) (2,3,3) (2,3,3),向量的形状为 ( 3 , 1 ) (3,1) (3,1),维度大小之间的对应关系为:
A = ( 2 , 3 , 3 ) b = ( , 3 , 1 ) \mathcal{A} = (2,3,3)\\ b = (\enspace,3,1) A=(2,3,3)b=(,3,1)
从最右边的维度开始,每个元素按列拉伸以生成 ( 3 , 3 ) (3, 3) (3,3) 矩阵。中间维度尺寸相等,无需拉伸。 b b b 不存在最左边的维度,因此必须添加一个维度。因此,必须 Broadcasting b b b 拉伸后的矩阵以创建大小为 ( 2 , 3 , 3 ) (2, 3, 3) (2,3,3) 的张量,张量中包含两个 ( 3 , 3 ) (3, 3) (3,3) 矩阵。此时张量 A \mathcal{A} A 与向量 b b b Broadcasting 后得到的张量形状相同,可以计算 Hadamard 积。

上面的示例用 PyTorch 实现如下:

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],

                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

b = torch.tensor([[1], 
                  [2], 
                  [3]])

A * b
# Output: tensor([[[ 1,  2,  3],
# 			       [ 8, 10, 12],
#         		   [21, 24, 27]],
#
#        		  [[ 1,  2,  3],
#         		   [ 8, 10, 12],
#         		   [21, 24, 27]]])

张量与矩阵运算

[ [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] ] ⊙ [ [ 1 2 3 ] [ 1 2 3 ] [ 1 2 3 ] ] = [ [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] ] ⊙ [ [ [ 1 2 3 ] [ 1 2 3 ] [ 1 2 3 ] ] [ [ 1 2 3 ] [ 1 2 3 ] [ 1 2 3 ] ] ] \begin{bmatrix} \begin{bmatrix} [1 \enspace2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \begin{bmatrix} [1\enspace 2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \end{bmatrix}\odot \begin{bmatrix} [1\enspace 2\enspace 3]\\ [1\enspace 2\enspace 3]\\ [1\enspace 2\enspace 3] \end{bmatrix}= \begin{bmatrix} \begin{bmatrix} [1 \enspace2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \begin{bmatrix} [1\enspace 2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \end{bmatrix}\odot \begin{bmatrix} \begin{bmatrix} [1 \enspace 2\enspace 3]\\ [1\enspace 2\enspace 3]\\ [1\enspace 2\enspace 3] \end{bmatrix}\\ \begin{bmatrix} [\textcolor{red}{1\enspace 2\enspace 3}]\\ [\textcolor{red}{1\enspace 2\enspace 3}]\\ [\textcolor{red}{1\enspace 2\enspace 3}] \end{bmatrix}\\ \end{bmatrix} [123][456][789] [123][456][789] [123][123][123] = [123][456][789] [123][456][789] [123][123][123] [123][123][123]

理解了上面张量与向量的运算,张量与矩阵的运算会很简单。上面示例中张量的形状为 ( 2 , 3 , 3 ) (2,3,3) (2,3,3),矩阵的形状为 ( 3 , 3 ) (3,3) (3,3),维度大小之间的对应关系为:
A = ( 2 , 3 , 3 ) B = ( , 3 , 3 ) \mathcal{A} = (2,3,3)\\ B = (\enspace,3,3) A=(2,3,3)B=(,3,3)
这个例子比上一个更容易,因为最右边的两个维度是相同的。这意味着矩阵只需在最左边的维度上 Broadcasting 即可变为 ( 2 , 3 , 3 ) (2, 3, 3) (2,3,3) 的形状。而这仅意味着需要一个额外的矩阵。

上面的示例用 PyTorch 实现如下:

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],
                   
                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

B = torch.tensor([[1, 2, 3], 
                  [1, 2, 3], 
                  [1, 2, 3]])

A * B
# Output: tensor([[[ 1,  4,  9],
#          		   [ 4, 10, 18],
#          		   [ 7, 16, 27]],
# 
#         		  [[ 1,  4,  9],
#          		   [ 4, 10, 18],
#          		   [ 7, 16, 27]]])

矩阵与张量的点积

前面所有的示例,目标都是最终得到相同的形状以允许逐元素操作。而点积并不要求两个张量形状一样,只需要第一个矩阵或张量的最后一个维度与第二个矩阵或张量的倒数第二个维度相同即可(详见 《白话张量》 )。

矩阵点积要求
( m , n ) × ( n , r ) = ( m , r ) (m,n) \times (n,r) = (m, r) (m,n)×(n,r)=(m,r)
3维张量点积要求
( c , m , n ) × ( c , n , r ) = ( c , m , r ) (c,m,n) \times (c,n,r) = (c, m, r) (c,m,n)×(c,n,r)=(c,m,r)
4维张量点积要求
( z , c , m , n ) × ( z , c , n , r ) = ( z , c , m , r ) (z,c,m,n) \times (z,c,n,r) = (z,c, m, r) (z,c,m,n)×(z,c,n,r)=(z,c,m,r)
以此类推,可以扩展到任意维张量。

举个例子
[ [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] ] ⋅ [ [ 1 2 ] [ 1 2 ] [ 1 2 ] ] = [ [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] ] ⋅ [ [ [ 1 2 ] [ 1 2 ] [ 1 2 ] ] [ [ 1 2 ] [ 1 2 ] [ 1 2 ] ] ] \begin{bmatrix} \begin{bmatrix} [1 \enspace2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \begin{bmatrix} [1\enspace 2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \end{bmatrix}\sdot \begin{bmatrix} [1\enspace 2]\\ [1\enspace 2]\\ [1\enspace 2] \end{bmatrix}= \begin{bmatrix} \begin{bmatrix} [1 \enspace2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \begin{bmatrix} [1\enspace 2\enspace 3]\\ [4\enspace 5\enspace 6]\\ [7\enspace 8\enspace 9] \end{bmatrix}\\ \end{bmatrix}\sdot \begin{bmatrix} \begin{bmatrix} [1 \enspace 2]\\ [1\enspace 2]\\ [1\enspace 2] \end{bmatrix}\\ \begin{bmatrix} [\textcolor{red}{1\enspace 2}]\\ [\textcolor{red}{1\enspace 2}]\\ [\textcolor{red}{1\enspace 2}] \end{bmatrix}\\ \end{bmatrix} [123][456][789] [123][456][789] [12][12][12] = [123][456][789] [123][456][789] [12][12][12] [12][12][12]
上面例子中,张量 A \mathcal{A} A 的形状为 ( 2 , 3 , 3 ) (2,3,3) (2,3,3),矩阵 B B B 的形状为 ( 3 , 2 ) (3,2) (3,2)。截至目前,最后两个维度是符合点积乘法条件的。只需要将一个维度添加到 B B B,在该维度上 Broadcasting ( 3 , 2 ) (3, 2) (3,2) 矩阵到 ( 2 , 3 , 2 ) (2, 3, 2) (2,3,2) 的形状。因此实例中点积结果为 ( 2 , 3 , 3 ) × ( 2 , 3 , 2 ) = ( 2 , 3 , 2 ) (2, 3, 3) \times (2, 3, 2) = (2, 3, 2) (2,3,3)×(2,3,2)=(2,3,2)

上面的示例用 PyTorch 实现如下:

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],
                   
                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

B = torch.tensor([[1, 2], 
                  [1, 2], 
                  [1, 2]])

A @ B # A.matmul(B)
# Output: tensor([[[ 6, 12],
#         		   [15, 30],
#         		   [24, 48]],
#
#        		  [[ 6, 12],
#         		   [15, 30],
#         		   [24, 48]]])

总结

Broadcasting 还是很好理解的,并且在实际开发中机器学习框架和库会自动处理,但了解 Broadcasting 的机制对理解代码实现非常有益,因此建议大家还是要了解一下 Broadcasting 。

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

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

相关文章

Hadoop之MapReduce概述

MapReduce概述 MapReduce定义MapReduce优缺点MapReduce核心思想MapReduce进程MapReduce编程规范MapTask并行度决定机制ReduceTask并行度决定机制mapreduce中job的提交流程MapReduce工作流程shuffle机制分区partition数据清洗(ETL)进一步分析MapTask和Red…

Jenkins+RF持续集成测试(二) 定时更新SVN完成构建

在上一篇中讲了Jenkins的安装,这篇将介绍 定时从SVN库中(git库与之类似,这里就不具体介绍了,有需要自己折腾)拉取最新的测试脚本,完成jenkins的定时构建。这是我们做自动化测试最基本的环节,每天…

【Linux】还在用top命令?可以试试atop工具,信息一目了然,运维工程师的新选择

atop使用 Linux以其稳定性,越来越多地被用作服务器的操作系统(当然,有人会较真地说一句:Linux只是操作系统内核:)。但使用了Linux作为底层的操作系统,是否我们就能保证我们的服务做到7*24地稳定呢?非也,要…

06.05

1.二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 考虑一个最朴素的方法:先将 aaa 和 bbb 转化成十进制数,求和后再转化为二进制数。利用 Python 和 Java 自带的高精度运算,我们可以很简单地写出这…

发现问题更全面,减少测试成本:WEB自动化测试的价值分析!

目录 前言: 一、WEB自动化测试的价值 1. 提高测试效率 2. 提高软件的质量 3. 减少测试成本 二、WEB自动化测试的瓶颈 1. 可维护性差 2. 兼容性问题 3. 比手工测试慢 三、代码示例 四、总结 前言: 自动化测试是软件开发中必不可少的一环&…

shell简单命令

命令入门: [rootlocalhost ~]# #/root [jinxflocalhost ~]$ #/home/jinxf 用户名主机名 当前目录 #系统权限 $普通权限 命令格式 命令 选项 参数(三者之间要有空格,区分大小写) command [-options] [args]…

004-从零搭建微服务-认证中心(四)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址:https://gitee.com/csps/mingyue 文档地址:https://gitee.com/csps/mingyue/wikis 搭建前端框架 感谢开源项目【vue-next-adm…

最厉害的缓存框架,没有之一!

Redis有多火爆? 现在阿里、腾讯这样的大厂和大部分互联网公司,基本上都需要使用到Redis技术。网上发布的Java开发工程师岗位的招聘信息,对Redis的要求都是熟练掌握。 而且现在大厂的大部分面试题都和Redis有关,尤其是在阿里、字节…

在 iPhone 和 Android 上恢复已删除的微信消息/聊天的 3 种方法

微信是一款面向移动用户的免费即时通讯应用程序。它适用于 iOS 和 Android。 好消息是,在微信 经历了如此艰难的运行之后,它仍在我们身边,并将在其新所有者恢复工具的帮助下继续发展。 微信 是一个相当受欢迎消息应用程序。非常简单易用&am…

【论文阅读】Megatron-LM要点

Megatron-LM论文要点 本文主要是对李沐老师的b站分享做一下自己的理解和总结。 李沐老师b站分享 模型结构无非就是那样,相比而言,想要训练更大的模型而又能平稳进行,是一项非常高超的技术! nvidia 跟gpipe类似,也是…

mysql中sql语句之分组(group by)

文章目录 前言分组查询定义语法说明 group by使用group by group_concat()的使用group by 聚合函数的使用group by having的使用group by with rollup的使用分组查询小结 前言 今天遇到公司新来的小伙伴咨询问题,统计集团内部的在职员工与离职员工数量&#xf…

负载不堵塞,稳定可靠,企业性能测试指南!

目录 前言: 基准测试 - 确认你的产品在正常使用条件下的性能 负载测试 - 确认你的产品在高负荷下的性能 压力测试 - 确认你的产品的极限性能 稳定性测试 - 确认你的产品在长时间高负荷下的表现 总结 前言: 在当今竞争激烈的商业环境中,…

我敢说,这是科普路由协议的最高境界

大家好,我是许公子。 路由协议,经常看我文章的小友都知道,给你们说过很多期了。 这是网络世界里,很重要的一个概念,总得来说,它负责将数据包从源节点传递到目的节点。 最近又有很多萌新关注过来&#xff…

C语言:计算n的阶乘(不考虑溢出)

题目: 从键盘输入一个值n,计算n的阶乘, 如:输入5,计算5的阶乘 --> 5! 1 * 2 * 3 * 4 * 5 思路: 第一步: 创建一个变量 ret ,用来存放每次相乘后的值, 因为 0 乘 任何…

uipath 实现连接pg数据库

1、下载ODBC 如需要使用UiPath连接数据库进行操作,需要先准备必需条件先安装ODBC。 postgresql ODBC下载链接:https://www.postgresql.org/ftp/odbc/versions/msi/ 下载最新的安装包即可。 2、配置ODBC 下载完pgsql ODBC的安装包直接打开压缩包进行…

实验篇(7.2) 07. 通过安全隧道访问指定网站 (SSL) ❀ 远程访问

【简介】通过前面的实验,我们已经了解了SSL VPN的隧道模式。FortiClient客户端拨号后,访问服务器IP的流量,会通过安全隧道到达远端防火墙,并访问DMZ接口下的服务器。那如果我想让更多的访问走安全隧道,但是又不确定是哪…

最受欢迎的十个开源大数据技术

导读大数据已然成为当今最热门的技术之一,正呈爆炸式增长。每天来自全球的新项目如雨后春笋般涌现。幸运地是,开源让越来越多的项目可以直接采用大数据技术,下面就来盘点最受欢迎的十大开源的大数据技术。 大数据已然成为当今最热门的技术之…

热烈庆祝兴业法拍网与中关村科技融资担保有限公司签订业务合作

6月1日,兴业法拍网与北京中关村科技融资担保有限公司签订“法拍贷”合作协议。 “法拍贷”是以法院房产拍卖为核心、线上平台拓宽拍卖渠道、保险公司提供阶段性保证、公证机构加大司法效力、银行提供全程金融服务的“14”创新合作模式。该模式汇聚五方合力让更多竞…

在本地Windows 11 系统的桌面版Docker上搭建PlantUML

文章目录 在本地Windows系统的桌面版Docker上搭建PlantUML简介步骤步骤 1:安装Docker Desktop步骤 2:启动Docker Desktop步骤 3:拉取PlantUML镜像步骤 4:运行PlantUML容器步骤 5:访问PlantUML Web界面 结论参考资料 结…

stable-diffusion-webui 更换 Python 版本

目录 一、原因二、解决方法 一、原因 stable-diffusion-webui 推荐版本是 Python 3.10 ,如果电脑中安装了其他版本到Python,会警告推荐使用Python 3.10版本。 官方安装教程 Automatic Installation on Windows Install Python 3.10.6 (Newer version of…