Vectorizing across multiple examples
Last updated
Was this helpful?
Last updated
Was this helpful?
在上一节课中 我们看到了如何计算神经网络 对于一个训练实例的预测 在这节课中 我们会看到如何对多个训练实例矢量化 这个结果会和我们之前看到的逻辑回归的结果很相似 通过把不同的训练实例按列堆叠在一个矩阵里面 我们就可以拿来之前的视频里的等式 做一些很小的改动 使得神经网络在同时计算 所有训练实例的预测 那么我们来看一下具体怎么做 这些是我们之前视频看到的4个等式 用来计算z1 a1 z2 和a2 (如图示) 这些等式告诉我们 给定一个特征矢量x (如图示) 我们可以用它们来取得一个训练实例的a2=y^ (如图示)
如果我们有m个训练实例 我们需要重复这个过程 比如说 对于第一个训练实例 给定x^(1) 来计算y^(1) (如图示) 这是第一个训练实例的预测 接下来用x^(2)来生成预测y^(2)(如图示) 以此类推 直到用x^(m)来生成预测y^(m) (如图示) 为了用激活函数的标记法 我会(把y^(1))写作a^(如图示) 接下来是a^ (如图示) 然后是a^ (如图示) 这个记号法a^ 这个圆括号代表第i个训练实例 而这个方括号代表第2层
这就是方括号和圆括号里的指数代表的意思
那么就让我把这一部分的代码复制到下一页 (如图示) 然后我们会看到如何把这部分矢量化
这是我们前一页看到的 for循环走过所有m个训练实例 记得我们定义矩阵X 是由训练实例按列堆叠组成的 (如图示) 也就是说拿来训练实例 把它们按列堆叠 所有这是一个维度为n 或者说n_x乘以m的矩阵 (如图示)
而当我们横向扫过的时候 我们是从第一个隐藏单元 对于第一个训练实例 GTC字幕组翻译 到第一个隐藏单元对于第二个 第三个训练实例 等等 直到这个结点 (如图示) 对应第一个隐藏单元对最后第m个训练实例的激活值
所以横向来看矩阵A代表不同训练实例
而纵向来看不同的指数 代表不同的隐藏单元
我们可以把类似的直觉用于矩阵Z 对于X也是一样 它横向来看是不同训练实例 纵向来看是不同的输入特征 这些输入特征其实也就是输入层的不同节点
所以有了这些等式 你们现在知道了怎么实现神经网络矢量化 也就是把多个实例矢量化 在下节课中 我想要多给你们一些理由 来解释为什么这是这种矢量化的一个正确实现 其实这个理由和你们之前看到的逻辑回归的很相似 我们下一节再见
在上节课里 我们看到通过将你的训练样本水平地堆叠进矩阵x 能为神经网络中的传播过程推导出一个向量化的实现 接下来我们将给出更多的解释说明 确保我们所写下的公式是对多个样本向量化的正确实现 让我们看一下对于几个样本(前向)传播计算过程的一部分 对于第一个训练样本 你最后会计算得到 (w1)x1加上b1 然后对于第二个训练样本 最终计算得到(w1)x2加上b1 接下来对于第三个训练样本 最终计算得到(w1)x3加上b1 为了简要说明问题,接下来在幻灯片上我将省略b 也就是说 通过令b等于0来做一点简化 但只需对我们将要给出的讨论做一些小的修改 就能在b是非0的情况下适用 这些改动只是为了简化在幻灯片上的描述 那么 w1会是一个矩阵 所以在这个矩阵中会有一定数量的行 观察这个对于x1的运算 你会得到的是 w1乘以x1得到的某个列向量 就像画出来的这样 相似地 如果你看x2这个向量 你会有w1乘以 x2得到另一个列向量 也就是得到这个z12 最后 如果你看x3 你会得到w1乘以x3 得到第三个列向量 也就是这个z13 现在 如果你将训练集记成大写的X 它是通过将所有的训练样本堆叠在一起得到的 矩阵X的构成是在向量x1之上 水平堆叠x2然后再水平堆叠x3 这是只有三个训练样本的情况 如果有更多的样本 会像这样一直水平堆叠下去 将w与这个矩阵x相乘 如果考虑下矩阵乘法的工作原理 你最终得到的第一列会是 这些我画在这里的紫色的数值 第二列会是这四个数值 第三列会是这些橙色的数值 它们最终会是这样 当然这等于是表示为列向量的z11 后面跟着表示为列向量的z12 后面跟着同样被表示为列向量z13 这是当你有三个训练样本的情况 当有更多的样本时矩阵中会有更多的列 因此 这个就是我们的矩阵大写的Z1 我希望这解释了为什么我们先前使用 w1乘以xi等于z1i 这是当我们只考虑一个训练样本的时候 当使用不同训练样本 并把它们堆叠到不同列的时候 对应的结果也变成了 向量z的按列堆叠 我将不再展示 但是你可以利用Python广播机制自己验证 如果把b加进来 这些b的数值仍然是正确的 实际上会发生的是通过Python的广播机制 bi被分别地加到这个矩阵的每一列上 所以在这个幻灯片上 我只证明了Z1等于 w1X加b1 前面幻灯片中四步中的第一步 是一个正确的向量化 但实际上相似的分析方法可以让你 证明其他步骤同样正确 使用非常相似的逻辑 如果你将输入按列进行堆叠 经过计算后 你会得到对应的同样按列堆叠的结果 最后总结一下我们在这个视频中所谈到的内容 如果这是你的神经网络 如果你想实现前向传播 那么你将要做的事情是 从i等于1到m 每次输入一个训练样本 然后我们像这样把训练样本按列堆叠 对于这些数值 z1 a1 z2 a2 像下面这样进行对应列的堆叠 这是一个对于A1的例子 但是对于Z1 A1 Z2和A2都是一样的 我们之前幻灯片所展示的是 这一行向量化操作 让你能同时处理m个样本 用类似的方法 你会发现所有其他行 都是所有这四行代码的正确向量化形式 再提醒一下 因为X也等于A0 因为输入的特征向量x等于a0 所以xi等于a0i 这些公式实际上具有一定的对称性 其中第一个公式也可以被写作 Z1等于w1A0加上b1 可以看到这一对公式和这一对公式 实际上看起来十分相似 只有上标之间相差1 这实际上说明了一个神经网络中的不同层 大致上都在做着相同的事情 或者说一遍又一遍地做着相同的计算 这里我们有两层神经网络 下一周的课程中我们会接触更深的神经网络 你会看到即使是更深的神经网络本质上来说 也只是在进行这两个步骤 仅仅比在这里看到的进行了更多次 这就是基于多个训练样本向量化你的神经网络的方法 到目前为止 我们的神经网络中一直在使用sigmoid函数 这实际上并不是最好的选择 在下个视频中 让我们进一步研究 你该如何使用不同的 所谓的激活函数 sigmoid函数只是其中的一个可能选择
所以如果你有一个未矢量化的实现 当你想要计算所有训练实例的预测时 你需要用一个循环 i从1到m (如图示) 实现这4个等式 需要让z^ (如图示) = W(1) x(i) + b[1] a = sigma of z z = w[2]a+ b[2] (如图示 念写的公式) (如图示 念写的公式) 所以基本上就是上面这4个等式 在所有训练实例的因变量上加上上角标(i) 也就是在x z 和a上面加上上角标(i) 来计算所有m个训练实例的输出 我们想做的是矢量化整个计算 来去除这个for循环 万一这部分看起来像是我在讲一些线性代数的繁琐细节 实际上能够正确的实现这个 在这个深度学习的纪元是很重要的 而且我们在这门课里是非常仔细的选择标记法 以便于矢量化的过程尽可能的容易 所以我希望走进这些繁琐细节能够实际上帮助你们 更快得到这些算法的正确实现
我就直接说重点 告诉你们需要做什么 来得到这个for循环的矢量化实现 实际上你们需要做的是计算 Z[1] = W[1] X + b[1] (如图示 念写的公式) (如图示 念写的公式) (如图示 念写的公式) (如图示 念写的公式) 所以如果你们想要相似对比 我们就是从小写的x们出发 把小写的x们按列堆叠得到了大写的X矩阵 如果我们对于z做同样的操作 比如说 我们把 z^ z^ 等等 (如图示) 注意这些也都是列矢量 直到z^ (如图示) 这就是这第一个变量 (左上角z^) 所有m个按列堆叠起来的 这就是矩阵Z^[1] (如图示) 类似的 如果我们看这个变量 (左上角a^) 把a^ a^ 等等 (如图示) 直到a^ 把它们按列堆叠起来 (如图示) 那么这个 就像我们从小写的x到大写的X 从小写的z到大写的Z 这里我们从小写的列矢量a们到大写的A^[1]矩阵 (箭头指示上面等式里的A^[1]) 对于Z^[2]和A^[2]是类似的 (如图示) 它们也是通过把这些矢量 横着堆叠起来 也就是把这些矢量横着堆叠起来 (如图示) 来得到大写的Z^[2]和A^[2] 这个标记法有一个性质可能会有助于你们理解它 这些矩阵 比如说Z和A 横着来看我们的指数是训练实例 这也就是为什么横的指数对应不同的训练实例 当我们从左到右扫过时 我们扫描了整个训练集 而竖着来看 竖的指数对应着圣经网络里面的不同结点 比如说 这个结点 这个矩阵最左上角的值 (如图示) 对应着 第一个训练实例的第一个隐藏单元的激活值 它下面一个值对应着第二个隐藏单元 对第一个训练实例的激活值 然后是第三个隐藏单元对第一个训练实例的激活值 以此类推 所以当我们向下扫的时候 我们对应的是隐藏单元号码