第二章 神经网络基础
符号说明
样本:(x,y),x∈Rnx,y∈{0,1}
m个训练样本:{(x(1),y(1)),(x(2),y(2)),…,(x(m),y(m))}
训练样本:m_train
测试样本:m_test
总样本:X=(x(1),x(2),…,x(m))X.shape=(nx,m)
Y=(y(1),y(2),…,y(m))Y.shape=(1,m)
模型参数:w,b
1 Logistic 回归
1.0 使用场景
有监督的二元分类问题,即输出标签为0或1。
1.1 模型任务
对于给定的X,预测 y^=P(y=1|x) 。
1.2 模型参数
w∈Rnx,b∈R
1.3 模型输出
y^=σ(wTx+b)
其中,
σ(x)=11+e−x
使
y^
符合概率定义,其函数图象为:(令
z=wT+b
)
1.4 参数训练
1.4.1 损失函数(Loss function)
损失函数用于刻画单个样本的预测值与实际值的差异。
L(y^,y)=−(ylog(y^)+(1−y)log(1−y^))
该函数可以起到与
12(y−y^)2
同样的描述真实值与预测值间距离的作用,用时使得优化问题为凸,即可以找到全局最优而非停滞在局部最优。
1.4.2 成本函数(Cost funciton)
成本函数描述模型在预测总体样本时的表现。参数训练的目标是使找到使成本函数值最小的参数,即实现全局最优。
J(w,b)=1m∑mi=1L(y^,y)=−1m∑mi=1[ylog(y^)+(1−y)log(1−y^)]
1.4.3 梯度下降算法
Repeat {
w=w−α∂J(w)∂w
b=b−α∂J(b)∂b
}
其中,
α
是学习速率。
1.4.4 未向量化实现
符号说明
a(i)=σ(z(i))
dz(1)=a(1)−y(1) ,dz(2)=a(2)−y(2)…
dZ=[dz(1)dz(2)…dz(m)]
Z.shape=(nx,m)
A=[a(1)a(2)…a(m)]
Y=[y(1)y(2)…y(m)]
dZ=A−Y=[a(1)−y(1)a(2)−y(2)…a(m)−y(m)]
dw=0
dw+=x1*dz1
dw+=x2*dz2
...
dw+=xm*dzm
dw/=m
db=0
db+=dz1
db+=dz2
...
db+=dzm
db/=m
1.4.5 向量化实现
db=1/m*np.sum(dZ)
dw=1/m*np.dot(X,dZ.T)
1.5模型代码
import math
import numpy as np
def basic_sigmoid(x):
s=1/(1+math.exp(-x))
return s
J=0
dw=0
db=0
for i in range(1000):
Z=np.dot(w.T,X)+b
A=basic_sigmoid(Z)
dZ=A-Y
dw=1/m*np.dot(X,dZ.T)
db=1/m*np.sum(dZ)
w+=-alpha*dw
b+=-alpha*db
2 python中的广播(broadcasting)
m行n列的矩阵,加减乘除1行n列的矩阵或m行1列的矩阵时,会将1行n列或m行1列的矩阵分别在行和列上复制n和m次,得到m行n列的矩阵后,再和第一个m行n列的矩阵相运算。
3 作业笔记
What you need to remember:
- np.exp(x) works for any np.array x and applies the exponential function to every coordinate
- the sigmoid function and its gradient
- image2vector is commonly used in deep learning
- np.reshape is widely used. In the future, you’ll see that keeping your matrix/vector dimensions straight will go toward eliminating a lot of bugs.
- numpy has efficient built-in functions
- broadcasting is extremely useful
np.dot() performs a matrix-matrix or matrix-vector multiplication.
This is different from np.multiply() and the * operator (which is equivalent to .* in Matlab/Octave), which performs an element-wise multiplication.
np.outer()是a的第一个元素跟b的每一个元素相乘作为第一行,第二个元素跟b的每一个元素相乘作为第二个元素…结果的shape为(a的维数的累积,b的维数的累积)