吴恩达机器学习
目录
深入理解前后向传播 (向量化表示)(笔记未完工)
基础 - 机器学习
符号表示
符号表示
符号 | 意思 |
---|
n | 特征的数量 |
m | 样本的数量 |
n2 | 下一层特征的数量 |
▬▬▬▬▬▬▬▬▬▬ | |
右上角加[ ]的上标 | 表示处于第几个网络层 |
右上角加(i)的上标 | 表示用的是第几个样本(在向量化的公式里是看不到这个表示的) |
右下角数字j的下标 | 表示是该网络层的第j个单元。是输入层的第j个特征。也对应于矩阵或向量中的 “第几行” 注意:其中x1=x1(1),前者表示第一个特征,后者表示第一个特征的第一个样本 |
▬▬▬▬▬▬▬▬▬▬ | |
wj[l]、bj[l] | 表示处于第l个神经网络层的第j个神经元所使用函数的参数 |
x | 表示输入层的矢量表示,等价于a[l] |
a[l] | 表示序列l (注意从0开始计数) 的神经网络层的输出的矢量表示 |
想要和矩阵对应起来,有两种方案
一种用矩阵:
- 将特征竖向排布、样本横向排布(与表格思维相谬,与列向量相谬,但可能会和程序较匹配)
- w×x的叉乘顺序(也符合变换矩阵在前的规则)
另一种方案就是嵌套,不用矩阵用向量:
- (事实上都是点乘,根本没有用矩阵的必要),X=[xi]是竖向量,x1=[x1(j)]也是竖向量。X就是一个嵌套竖向量,里面的元素也是竖向量
一些理解的建议:先向量化特征,再向量化样本。即多特征单样本多输出作为切入点,而不是单特征多样本多输出
.assets/L1_week3_1-16642670577931.png)
向量化
概念与作用
什么是向量化?
去除for=向量化
向量化=矩阵乘法
复习一下点乘和叉乘
a=a1a2⋮an,b=b1b2⋮bn a⋅b=a⋅b=aT×b=aT×bi=1∑naibi[∑i=1naibi]
向量化的目的
简化公式
fw,b(x)=w1x1+w2x2+w3x3+⋯+b可写成fw,b(x)=w⋅x+b
简化代码,减少for语句
加快计算,利用并行资源
对比向量化和非向量化的时间差异(点乘)
import numpy as np # 导入numpy库
a = np.array([1,2,3,4]) # 创建一个数据a
print(a) # 结果:[1 2 3 4]
import time # 导入时间库
a = np.random.rand(1000000)
b = np.random.rand(1000000) # 通过round随机得到两个一百万维度的数组
tic = time.time() # 现在测量一下当前时间
# 向量化的版本
c = np.dot(a,b)
toc = time.time()
print("Vectorized version:" + str(1000*(toc-tic)) +"ms") # 打印一下向量化的版本的时间。结果:1.5027ms
# 非向量化的版本
c = 0
tic = time.time()
for i in range(1000000):
c += a[i]*b[i]
toc = time.time()
print(c)
print("For loop:" + str(1000*(toc-tic)) + "ms") # 打印for循环的版本的时间。结果:474.2951ms
三个for
无向量化的情况,对于样本数m和特征数n,分别有1个循环,共2个循环
特征数n的循环,可以向量化
fw,b(x)=w1x1+w2x2+w3x3+⋯+b向量化后:fw,b(x)=w⋅x+b
样本数m的循环,可以向量化
Loss函数为\~\~平方误差\~\~为例:\\ J(\vec w,b)=\frac{1}{2 m} \sum_{i=1}^{m}\left(f_{\vec w,b}\left(x_{(i)}\right)-y_{(i)}\right)^{2}\\ (sigmoid回归Loss函数为例,这里有问题,用空要再算一遍)向量化后:\\ J(\vec w,b)=\frac{1}{2 m} (A-Y)
dw1=dzdLdw1dz=m1i∑mx1(i)(a(i)−y(i)) 向量化后:dZ=dw1=db=A−Ym1×X×dzTm1×np.sum(dZ)
补充:话说推荐系统的协同过滤算法有两个∑,那个能简化掉不?A:TODO:等我有空再写
神经网络中,循环遍历每一层。不能向量化
- 由于不同层的向量尺寸不同,没办法连成一个矩阵。这个for省不了
前向传播
唯一目的就是通过 x 计算 a
反向传播
唯一目的就是通过 X,y,计算W,b
至于Loss函数和代价函数都是引入的中间概念,在实际计算当中并不需要计算这两个中间变量的,一般只知道需要a就能算出W,b
至于梯度下降,知道W,b和α后就能直接下降
基础 - 深层神经网络
核对矩阵的维数
当实现深度神经网络的时候,其中一个我常用的检查代码是否有错的方法就是拿出一张纸过一遍算法中矩阵的维数。
在你做深度神经网络的反向传播时,一定要确认所有的矩阵维数是前后一致的,可以大大提高代码通过率。
shape(w[l])=shape(b[l])=shape(z[l])=shape(a[l])=w的维度=(n[l],n[l−1])=(下一层的维数,前一层的维数)b 的维度=(n[l],1) =(下一层的维数,1)z 的维度= ↓a 的维度=(n[l],1) dw[l]和w[l]维度相同,db[l]和b[l]维度相同,且w和b向量化维度不变,但z,a以及x的维度会向量化后发生变化。
向量化后:
shape(Z[l])=shape(A[l])=shape(X )=Z的维度=(n[l],m)A的维度=(n[l],m)shape(A[0])=(n[l],m) 其中Z[l]可以看成由每一个单独的Z[l]叠加而得到Z[l]=(z[l][1],z[l][2],z[l][3],…,z[l][m])
多种情况
单特征 多特征 单输出
符号
符号 | 描述 | 展开 |
---|
w | 标量 | |
b | 标量 | |
x(i) | 标量 | |
a(i)=y^(i)=g(z(i))=g(fw,b(x(i))) | 标量 | |
y(i) | 标量 | |
x | (1, m) 矩阵 | [x(1)⋯x(m)] |
a=g(z)=g(fw,b(x)) | (1,m) 矩阵 | [a(1)⋯a(m)] |
y | (1,m) 向量 | [y(1)⋯y(m)] |
线性回归 - 非向量化表示
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 (线性回归模型) | z(i)=y^(i)=fw,b(x(i)) | wx(i)+b | wx(i)+b |
激活函数 (无) | a(i)=g(z(i)) | z(i) | wx(i)+b |
| | | |
损失函数 (平方误差函数) | L(a(i),y(i)) | (a(i)−y(i))2 | (wx(i)+b−y(i))2 |
代价函数 | J(a1,⋯,am,y1,⋯,ym) | 2m1∑i=1m(L(a(i),y(i))) | 略 |
| | | |
w偏导数 | dw=∂w∂J(w,b) | m1∑i=1m(a(i)−y(i))x(i) | m1∑i=1m(fw,b(x(i))−y(i))x(i) |
b偏导数 | db=∂b∂J(w,b) | m1∑i=1m(a(i)−y(i)) | m1∑i=1m(fw,b(x(i))−y(i)) |
线性回归 - 向量化表示
(不会出现 (i)的上标)
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 (线性回归模型) | z=fw,b(x) | wx+b | wx+b |
激活函数 (无) | a=g(z) | z | wx+b |
| | | |
损失函数 (平方误差函数) | L(a,y) | (a−y)⋅(a−y) | 略 |
代价函数 | J(a,y) | 2m1∑i=1m(L(a,y)) | 略 |
| | | |
w偏导数 | dw=∂w∂J(w,b) | m1∑(a−y)x | 略 |
b偏导数 | db=∂b∂J(w,b) | m1∑(a−y) | 略 |
逻辑回归 - 非向量化表示
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 (逻辑回归模型) | z(i)=y^(i)=fw,b(x(i)) | wx(i)+b | wx(i)+b |
激活函数 (sigmoid) | a(i)=g(z(i)) | σ(z(i)) | σ(wx(i)+b) |
| | | |
损失函数 (逻辑回归误差) | L(a(i),y(i)) | −y(i)loga(i)−(1+y(i))log(1−a(i)) | 略 |
代价函数 | J(a1,⋯,am,y1,⋯,ym) | m1∑i=1m(L(a(i),y(i))) | 略 |
| | | |
w偏导数 | dw=∂w∂J(w,b) | m1∑i=1m(a(i)−y(i))x(i) | m1∑i=1m(fw,b(x(i))−y(i))x(i) |
b偏导数 | db=∂b∂J(w,b) | m1∑i=1m(a(i)−y(i)) | m1∑i=1m(fw,b(x(i))−y(i)) |
逻辑回归 - 向量化表示
(不会出现 (i)的上标)
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 (逻辑回归模型) | z=fw,b(x) | wx+b | wx+b |
激活函数 (sigmoid) | a=g(z) | σ(z) | σ(wx+b) |
| | | |
损失函数 (逻辑回归误差) | L(a,y) | −yloga−(1+y)log(1−a) | 略 |
代价函数 | J(a,y) | m1∑i=1m(L(a,y)) | 略 |
| | | |
w偏导数 | dw=∂w∂J(w,b) | m1∑(a−y)x | 略 |
b偏导数 | db=∂b∂J(w,b) | m1∑(a−y) | 略 |
多特征 单样本 单输出
.assets/L1_week3_1-16642670577931.png)
.assets/L1_week3_6.png)
多特征 多样本 单输出
这里一般分两步,不会一步到位,因为第一步是向量化的乘法
z[1](i)=a[1](i)=z[2](i)=a[2](i)=W[1](i)x(i)+b[1](i)σ(z[1](i))W[2](i)a[1](i)+b[2](i)σ(z[2](i))
符号
符号 | 描述 | 展开 |
---|
w | (n,1) 向量 | [w1⋯wn] |
W广播 | (m,n) 向量 | ⋮w1⋮⋯⋮wn⋮(广播) |
b | 标量 | |
xj(i) | 标量 | |
a(i)=y^(i)=g(z(i))=g(fw,b(x(i))) | 标量 | |
y(i) | 标量 | |
xj | (1, n) 向量 | [x1⋯xn]T |
x(i) | (m,1) 向量 | [x(1)⋯x(m)] |
X | (m,n) 向量 | x1(1)⋮xn(1)⋯⋯x1(m)⋮xn(m) |
a=g(z)=g(fw,b(x)) | (m,1) 向量 | [a(1)⋯a(m)] |
y | (m,1) 向量 | [y(1)⋯y(m)] |
线性回归 - 非向量化表示
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 (线性回归模型) | z(i)=y^(i)=fw,b(xj(i)) | ∑j=1n(wjxj(i))+b | w1x1(i)+w2x2(i)+⋯+b |
激活函数 (无) | a(i)=g(z(i)) | z(i) | wx(i)+b |
| | | |
损失函数 (平方误差函数) | L(a(i),y(i)) | (a(i)−y(i))2 | (wx(i)+b−y(i))2 |
代价函数 | J(a,y) | 2m1∑i=1m(L(a(i),y(i))) | 略 |
| | | |
| | | |
| | | |
线性回归 - 向量化表示
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 (线性回归模型) | z=fw,b(X) | =w⋅x(i)+b =W广播⋅X+B广播 | |
激活函数 (无) | a(i)=g(z(i)) | z(i) | wx(i)+b |
| | | |
损失函数 (平方误差函数) | L(a(i),y(i)) | (a(i)−y(i))2 | (wx(i)+b−y(i))2 |
代价函数 | J(a,y) | 2m1∑i=1m(L(a(i),y(i))) | 略 |
| | | |
| | | |
| | | |
逻辑回归 - 向量化表示
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 (线性回归模型) | z(i)=y^(i)=fw,b(x(i)) | wx(i)+b | wX+b |
激活函数 (无) | a(i)=g(z(i)) | z(i) | wx(i)+b |
| | | |
损失函数 (平方误差函数) | L(a(i),y(i)) | (a−y)2 | (wx(i)+b−y(i))2 |
代价函数 | J(a,y) | 2m1∑i=1m(L(a,y)) | 略 |
| | | |
| | | |
| | | |
多特征 单样本 多输出
即将x1,x2,x3都分别看成是一个值,没有x(1),x(2),x(3),只有x(1)
不谈模型训练只谈前向传播
对于下面的这个表格,我们只需要前两行,后面的不需要
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 | | | |
激活函数 | | | |
损失函数 | | | |
代价函数 | | | |
w_j偏导数 | | | |
b偏导数 | | | |
符号
向量化表示
内容 | 符号 | 公式(不展开) | 公式(展开) |
---|
预测模型 | z=fw,b(x) | =w⋅x(i)+b | |
激活函数 | | | |
损失函数 | | | |
代价函数 | | | |
w_j偏导数 | | | |
b偏导数 | | | |
多特征 多样本 多输出
旧版,错误版
(前向过程:该过程中每个特征只有一个数,x是一个列向量)
该例子使用向量化
.assets/L1_week3_2.png)
.assets/L1_week3_8.png)
符号(第一层,第二层和前面的多特征无中间层的情况基本一样)
第一层符号 | 描述 | 展开 |
---|
W[1] | (n,n2)向量 | w1⋮w1,n2⋯⋯wn⋮wn,n2 |
b[1] | (n,1)向量 | b1⋮bn |
xj(i)=aj(i)[0] | 标量 | |
a(i)[1]=g(z(i)[1])=g(fw,b(xj(i))) | 标量 | |
xj | (1,n)向量 | [x1⋯xn] |
x(i) | (m,1)向量 | [x(1)⋯x(m)]T |
x | (m,n)向量 | x1(1)⋮xn(1)⋯⋯x1(m)⋮xn(m) |
a[1]=g(z)=g(fw,b(x)) | (m,n2)向量 | [a(1)⋯a(m)]T |
A[1] | | |
其中:Wx+b=a,shape(n,n2)⋅shape(m,n)=shape(m,n2),很合理
向量参数的shape
shape(a[0])=shape(W[1])=shape(b[1])= shape(a[1])=shape(W[2])=shape(b[2])= (n[0],1) (n[1],n[0]) (n[1],1) (n[1],1) (n[2],n[1]) (n[2],1)
0~1层:3节点 => 4节点
x=a[0]= −−−−−−−z[1]=== −−−−−−−y[1]=a[1]==x1x2x3=a1[0]a2[0]a3[0]−−−−−−−−−−−−−W[1]x+b[1]w11[1]w21[1]w31[1]w41[1]w12[1]w22[1]w32[1]w42[1]w13[1]w23[1]w33[1]w43[1]×a1[0]a2[0]a3[0]+b1[0]b2[0]b3[0]b4[0]=w11[1]a1[0]+w12[1]a2[0]+w13[1]a3[0]+b1[1]w21[1]a1[0]+w22[1]a2[0]+w23[1]a3[0]+b2[1]w31[1]a1[0]+w32[1]a2[0]+w33[1]a3[0]+b3[1]w41[1]a1[0]+w42[1]a2[0]+w43[1]a3[0]+b4[1]z1[1]z2[1]z3[1]z4[1]−−−−−−−−−−−−−σ(z[1])=σ(W[1]a[0]+b[1])a1[1]a2[1]a3[1]a4[1]
1~2层:4节点 => 1节点
y[2]=a[2]== −−−−−−−z[2]=== −−−−−−−y[2]=a[2]== −−−−−−−J=σ(z[2])=σ(W[2]⋅a[1]+b[2])a1[2]a2[2]a3[2]a4[2]−−−−−−−−−−−−−W[2]a[1]+b[2][w1[2]w2[2]w3[2]w4[2]]×a1[1]a2[1]a3[1]a4[1]+b[2]w1[2]a1[1]+w2[2]a2[1]+w3[2]a3[1]+w4[2]a4[1]+b[2]−−−−−−−−−−−−−σ(z[2])=σ(W[2] a[1]+b[2])[a1[2]]−−−−−−−−−−−−−i=1∑mL(yi,a1[2](i))
其他写法
或者用另一种写法来表示W
z1[1]z2[1]z3[1]z4[1]=...W1[1]T......W2[1]T......W3[1]T......W4[1]T...W[1]∗x1x2x3input+b1[1]b2[1]b3[1]b4[1]b[1]
新版
.assets/L1_week3_8.png)
用维数检测
Z[1]=W[1]A[0]:(4,3)(3,100)=(4,100)A[1]:Z[1]:(4,100)
展开
w11w21w31w41w12w22w32w42w13w23w33w43×x1(1)x2(1)x3(1)x1(2)x2(2)x3(2)⋯⋯⋯m=z1(1)z2(1)z3(1)z4(1)z1(2)z2(2)z3(2)z4(2)⋯⋯⋯⋯m
0
多样本向量化
(该过程中每个特征有m个样本,x是一个矩阵,高m宽n)
.assets/L1_week3_8.png)
输入层
x=⋮x(1)⋮⋮x(2)⋮⋮⋯⋮⋮x(m)⋮
第一层网络层的中间变量
Z[1]=⋮z[1](1)⋮⋮z[1](2)⋮⋮⋯⋮⋮z[1](m)⋮
第一层网络层的输出
A[1]=⋮α[1](1)⋮⋮α[1](2)⋮⋮⋯⋮⋮α[1](m)⋮
以此类推
z[1](i)=W[1](i)x(i)+b[1]α[1](i)=σ(z[1](i))z[2](i)=W[2](i)α[1](i)+b[2]α[2](i)=σ(z[2](i))⎭⎬⎫⟹⎩⎨⎧A[1]=σ(z[1])z[2]=W[2]A[1]+b[2]A[2]=σ(z[2])
该例子中为求简化省略了+b的步骤,z=w⋅x
现在 W[1] 是一个矩阵,x(1),x(2),x(3)都是列向量,矩阵乘以列向量得到列向量,下面将它们用图形直观的表示出来:
W[1]x=⋯⋯⋯⋮x(1)⋮⋮x(2)⋮⋮x(3)⋮⋮⋮⋮=⋮w(1)x(1)⋮⋮w(1)x(2)⋮⋮w(1)x(3)⋮⋮⋮⋮=⋮z[1](1)⋮⋮z[1](2)⋮⋮z[1](3)⋮⋮⋮⋮=Z[1]
其他写法
W[1]x=⋯⋯⋯⋮x(1)⋮⋮x(2)⋮⋮x(3)⋮⋮⋮⋮=⋮w(1)x(1)⋮⋮w(1)x(2)⋮⋮w(1)x(3)⋮⋮⋮⋮=⋮z[1](1)⋮⋮z[1](2)⋮⋮z[1](3)⋮⋮⋮⋮=Z[1]
多特征有中间层 - 反向传播
吴恩达老师认为反向传播的推导是机器学习领域最难的数学推导之一,矩阵的导数要用链式法则来求
(我也觉得这部分有点难了,这也许也是这章是 “选修” 的原因)
如果这章内容掌握不了也没大的关系,只要有这种直觉就可以了。
还有一点,就是初始化你的神经网络的权重,不要都是0,而是随机初始化,下一章将详细介绍原因。
.assets/image-20220925212615658.png)
随机初始化
初始化你的神经网络的权重,不要都是0,而是随机初始化
在逻辑回归中,将权重参数初始化为0是可行的。但在神经网络中,初始化为0会得不到预期结果