神经网络向量化与矩阵维度 [Andrew Ng 深度学习笔记]
成本函数:
单样本时,假设成本函数为:
,
为预测值,
为标签值
那么多样本时,假设样本数为 m, 成本函数为:
就是把每个样本分别算出成本函数再相加。大概的思路是把m个样本的每次实验当作独立同分布的,所以总共m次实验在概率上应该全部乘起来。对累乘的结果取对数,增减性不变。把对数符号里的累乘符号提出,就变成累加的了。
为了方便后续计算,使 m 不同时,成本函数依然在一个数量级(保持和单样本时一样的尺度),故要对成本函数进行缩放
在前面加一个尺度因子(scale factor),公式变为:
其实全局的成本函数,就是对局部的成本函数求平均值
然后在反向传播的求偏导时, 这一项是一直存在的,所以后续的梯度就都变成了 m 个样本梯度的平均值
向量化
因为要求均值,所以要计算每个样本的各种值。
拿这个网络举例子:
非向量化,用循环实现是:
其中,x 是 x1, x2, x3组成的列向量,上标 i 表示其是第 i 个训练样本,[] 里表示的是位于哪一层
这里用的是显式的循环,依次求出每个样本的各种值,这样效率很低
向量化的方法实现:
就是把 m 个训练样本的值并起来,形成矩阵
横向表示的是不同的样本,纵向表示的是同一层中不同的神经元
公式变成了:
可以得出,只需进行一次矩阵乘法,就可以得到 m 个样本各自的值了
刚刚列举的是前向传播,现在这幅图表示的是反向传播的向量化对比:
为什么向量化比显式的循环快
因为numpy里用于计算矩阵的方法,是一种并行化指令,又名SIMD指令(单指令流多数据流),并行化的计算方式让它比逐条执行的显式循环要快许多。吴恩达老师在课上做过演示,在CPU上运行,向量化会快上“几百倍”,在GPU上性能还会更加优秀
核对矩阵的维度
表示
层神经元的个数
其中 w 与 dw,b 与 db 的维度是相同的,这很显而易见,更新方式是
若维度不匹配,无法相减
这是目前阶段的理解,日后发现错误或新的感悟再订正