Vectorizing across multiple examples
Sogiveninput:xz[1](4,1)=W[1](4,3)x(3,1)+b[1](4,1)→a[1](4,1)=σ(z[1](4,1))→z[2](1,1)=W[2](1,4)a[1](4,1)+b[2](1,1)→a[2](1,1)=σ(z[2](1,1))(1)(2)(3)(4)
在上次学习中,我们主要推导上面这四条公式
图1.单个样本
这个图就是我们计算单个样本的输出时所用到的,现在我们需要重复多次这种运算,所以我们首先想到的肯定还是向量化:
对于单个样本我们有x→a[2]=^y所以对于m个样本,我们有x(1)→a[2](1)=^y(1)x(2)→a[2](2)=^y(2)⋮→⋮x(m)→a[2](m)=^y(m)在这里,我们容易知道x是一个样本,同时也是个n×1的向量而x(1),x(2),⋯,x(m)则表示我们有m个这种样本(解释一下a[2](i)的[[2]]表示第二层,而[(i)]则表示对应第i个样本)很容易想到后面我们可以把他们一列一列地放在一起组成一个n×m的矩阵
如果我们用for-loops去一个个样本执行时,我们可以这样(伪代码)
fori=1tom:z[1](i)=W[1]x(i)+b[1]a[1](i)=σ(z[1](i))z[2](i)=W[2]a[1](i)+b[2]a[2](i)=σ(z[2](i))(5)(6)(7)(8)
我们把m个样本x向量化后记为X
X=⎡⎢⎣∣∣∣x(1)x(2)⋯x(m)∣∣∣⎤⎥⎦(nx,m)注:nx指的时x中的数据数目
所以我们去写代码时应该是这样
Z[1]=W[1]X+b[1]A[1]=σ(Z[1])Z[2]=W[2]A[1]+b[2]A[2]=σ(Z[2])(9)(10)(11)(12)
里面的Z同样
Z[1]=⎡⎢⎣∣∣∣z[1](1)z[1](2)⋯z[1](m)∣∣∣⎤⎥⎦(nz,m)A[1]=⎡⎢⎣∣∣∣a[1](1)a[1](2)⋯a[1](m)∣∣∣⎤⎥⎦(nz,m)注:容易知道nz不一定等于nx,但na=nz
对于我们刚刚所提到的矩阵,我们可以画个这样的图:
到目前为止,我们可以得到一个在神经网络中正向传播的向量化实现,下面我们将对其进一步解释:
我们不妨假设只有三个样本,而且还是应用上面那个神经网络:
X[1]=⎡⎢⎣∣∣∣x[1](1)x[1](2)x[1](3)∣∣∣⎤⎥⎦z[1](1)=W[1]x[1](1)+b[1]→⎡⎢
⎢
⎢⎣⋅⋅⋅⋅⎤⎥
⎥
⎥⎦(1)=⎡⎢
⎢
⎢⎣⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⎤⎥
⎥
⎥⎦⎡⎢⎣⋅⋅⋅⎤⎥⎦(1)+⎡⎢
⎢
⎢⎣⋅⋅⋅⋅⎤⎥
⎥
⎥⎦Z[1]=W[1]X[1]+b[1]→⎡⎢
⎢
⎢
⎢
⎢⎣⎡⎢
⎢
⎢⎣⋅⋅⋅⋅⎤⎥
⎥
⎥⎦(1)⎡⎢
⎢
⎢⎣⋅⋅⋅⋅⎤⎥
⎥
⎥⎦(2)⎡⎢
⎢
⎢⎣⋅⋅⋅⋅⎤⎥
⎥
⎥⎦(3)⎤⎥
⎥
⎥
⎥
⎥⎦=⎡⎢
⎢
⎢⎣⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⎤⎥
⎥
⎥⎦⎡⎢
⎢
⎢⎣⎡⎢⎣⋅⋅⋅⎤⎥⎦(1)⎡⎢⎣⋅⋅⋅⎤⎥⎦(2)⎡⎢⎣⋅⋅⋅⎤⎥⎦(3)⎤⎥
⎥
⎥⎦+⎡⎢
⎢
⎢⎣⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⎤⎥
⎥
⎥⎦注:由于广播b的每一列应该都是一样的
由矩阵相乘的知识我们容易知道这是对的,这样,我们也就直观解释了这样向量化的原因;
下面一章我们继续学习不同激活函数的作用,除了sigmoid函数,我们应该也有更好的激活函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人