deeplearning.ai 重点整理 | 课程一

标题:Neural Networks and Deep Learning

什么是神经网络?
神经网络是一种学习算法,受大脑工作方式的启发而产生。

Logistic Regression 逻辑回归

logistic regression 适用于二分类问题。输入一张猫的图片,判断是否为猫,就是一个二分类问题。

逻辑回归其实就是一种非常简单的神经网络:
deeplearning.ai 重点整理 | 课程一

Hypothesis:y^=σ(wTx+b)\hat{y}=\sigma(w^Tx+b)σ(z)=11+ez\sigma(z)=\frac{1}{1+e^{-z}}

Loss function(针对单个样本点):L(y^,y)=ylog(y^)(1y)log(1y^)L(\hat{y},y)=-y\log(\hat{y})-(1-y)\log(1-\hat{y})

Cost function(针对整个数据集):J(w,b)=1mi=1mL(y^(i),y(i))J(w,b)=\frac{1}{m}\sum^m_{i=1}L(\hat{y}^{(i)},y^{(i)})

Logistic regression 的梯度下降:deeplearning.ai 重点整理 | 课程一

计算图

deeplearning.ai 重点整理 | 课程一

计算图的思路:

  • 正向计算 JJ 的值
  • 反向求导:从右到左一一对应,分别求 dv=dJdvdv=\frac{dJ}{dv}du=dJdudu=\frac{dJ}{du}da=dJdada=\frac{dJ}{da}db=dJdbdb=\frac{dJ}{db}dc=dJdcdc=\frac{dJ}{dc}

用计算图来求导数其实就是用链式法则求导数。后面的小节中,吴用计算图计算了逻辑回归的导数,其实就是用链式法则推导 J(w,b)w\frac{\partial J(w,b)}{\partial w}J(w,b)w\frac{\partial J(w,b)}{\partial w},如下图:
deeplearning.ai 重点整理 | 课程一

向量化

使用向量化可以批处理数据,并且向量化后再进行计算比直接使用 for 循环效率高很多。

向量化逻辑回归

X=[x(1)x(2)x(m)]nx×mX= \left[\begin{array}{c}x^{(1)} & x^{(2)} & \cdots & x^{(m)}\end{array}\right]_{n_x \times m}

z=[z(1)z(2)z(m)]=wTX+b=[wTx(1)+bwTx(2)+bwTx(m)+b]z = \left[\begin{array}{c}z^{(1)} & z^{(2)} & \cdots & z^{(m)}\end{array}\right] =w^TX+b=\left[\begin{array}{c}w^Tx^{(1)}+b & w^Tx^{(2)}+b & \cdots & w^Tx^{(m)}+b\end{array}\right]

z = np.dot(w.T,X)+b

A=[a(1),a(2),,a(m)]=σ(z)A=[a^{(1)},a^{(2)},\dots,a^{(m)}]=\sigma(z)

Shallow Neural Network 浅层神经网络

deeplearning.ai 重点整理 | 课程一
这一主题讲的是只有一个 hidden layer 的神经网络。该神经网络的前向传播、反向传播。

1. 前向传播

z[1]=W[1]x+b[1]z^{[1]}=W^{[1]}x+b^{[1]}
a[1]=σ(z[1])a^{[1]}=\sigma(z^{[1]})
z[2]=W[2]a[1]+b[2]z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}
a[2]=σ(z[2])a^{[2]}=\sigma(z^{[2]})

W1[1]=[w11[1]w12[1]w13[1]]W_1^{[1]}=\left[\begin{array}{c}w_{11}^{[1]} \\w_{12}^{[1]} \\w_{13}^{[1]} \end{array}\right]

z[1]=[z1[1]z2[1]z3[1]z4[1]]=[W1[1]TW2[1]TW3[1]TW4[1]T]×[x1x2x3]+[b1[1]b2[1]b3[1]b4[1]]z^{[1]}=\left[\begin{array}{c}z_{1}^{[1]} \\z_{2}^{[1]} \\z_{3}^{[1]} \\z_{4}^{[1]}\end{array}\right]={\left[\begin{array}{ll}\cdots W_{1}^{[1] T} \cdots \\\cdots W_{2}^{[1] T} \cdots \\ \cdots W_{3}^{[1] T} \cdots \\\cdots W_{4}^{[1] T} \cdots\end{array}\right]}\times \left[\begin{array}{c}x_{1} \\x_{2} \\x_{3}\end{array}\right]+\left[\begin{array}{c}b_{1}^{[1]} \\b_{2}^{[1]} \\b_{3}^{[1]} \\b_{4}^{[1]}\end{array}\right]

a[1]=[a1[1]a2[1]a3[1]a4[1]]=σ(z[1])a^{[1]}=\left[\begin{array}{c}a_{1}^{[1]} \\a_{2}^{[1]} \\a_{3}^{[1]} \\a_{4}^{[1]}\end{array}\right]=\sigma(z^{[1]})

2. 反向传播

随机初始化

activation function **函数

sigmoid: a=11+eza=\frac{1}{1+e^{-z}}

deeplearning.ai 重点整理 | 课程一

tanh: a=tanh=ezezez+eza=\tan h=\frac{e^z-e^{-z}}{e^z+e^{-z}}
deeplearning.ai 重点整理 | 课程一

ReLU: a=max(0,z)a=max(0,z)

deeplearning.ai 重点整理 | 课程一

leaky ReLU: a=max(0.01z,z)a=max(0.01z,z)

deeplearning.ai 重点整理 | 课程一

**函数的选择
sigmoid 现在已经不怎么用了,在逻辑回归中可能还会用到。现在一般用到的都是 ReLU。但自己在解决问题时,如果不知道用哪个**函数,最好每个**函数都可以用一用,因为各个**函数都有各自的针对性。

为什么需要用非线性的**函数?

附录:符号约定

符号 描述
yy 输出标签
nxn_x 特征向量的维度
xx 特征向量
(x(i),y(i))(x^{(i)},y^{(i)}) ii 组数据
mm 样本数量
X=[x(1),x(2),,x(m)]nx×mX=[x^{(1)},x^{(2)},\dots,x^{(m)}]_{n_x \times m} 数据集的输入值
Y=[y(1),y(2),,y(m)]1×mY=[y^{(1)},y^{(2)},\dots,y^{(m)}]_{1 \times m} 数据集的输出值
MtrainM_{train} 训练集样本个数
MtestM_{test} 测试集样本个数
Wij[l]W^{[l]}_{ij} ll 表示第 ll 层神经链接;
ii 表示后一层神经元的个数;
jj 表示前一层神经元的个数
MtestM_{test} 测试集样本个数