标题:Neural Networks and Deep Learning
课程一讲述了神经网络方面的基础知识。
什么是神经网络?
神经网络是一种学习算法,受大脑工作方式的启发而产生。
神经网络的计算过程包括前向传播和反向传播这两个过程。
一、Logistic Regression 逻辑回归
logistic regression
适用于二分类问题。
输入一张图片,判断图片中是否有猫,就是一个二分类
问题。
逻辑回归其实就是一种非常简单的神经网络:
Hypothesis: y ^ = σ ( w T x + b ) \hat{y}=\sigma(w^Tx+b) y^=σ(wTx+b), σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+e−z1
Loss function(针对单个样本点): L ( y ^ , y ) = − y log ( y ^ ) − ( 1 − y ) log ( 1 − y ^ ) L(\hat{y},y)=-y\log(\hat{y})-(1-y)\log(1-\hat{y}) L(y^,y)=−ylog(y^)−(1−y)log(1−y^)
对于 logistic regression,没有使用均方误差作为损失函数的原因是因为,使用均方误差会使得它的代价函数变为非凸函数,不方便寻找全局最小值。
Cost function(针对整个数据集): J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) J(w,b)=\frac{1}{m}\sum^m_{i=1}L(\hat{y}^{(i)},y^{(i)}) J(w,b)=m1∑i=1mL(y^(i),y(i))
梯度下降公式:
计算图
计算图的思路:
- 正向计算 J J J 的值
- 反向求导:从右到左一一对应,分别求 d v = d J d v dv=\frac{dJ}{dv} dv=dvdJ, d u = d J d u du=\frac{dJ}{du} du=dudJ, d a = d J d a da=\frac{dJ}{da} da=dadJ, d b = d J d b db=\frac{dJ}{db} db=dbdJ, d c = d J d c dc=\frac{dJ}{dc} dc=dcdJ
用计算图来求导数其实就是用链式法则求导数。后面的小节中,吴用计算图计算了逻辑回归的导数,其实就是用链式法则推导
∂
J
(
w
,
b
)
∂
w
\frac{\partial J(w,b)}{\partial w}
∂w∂J(w,b) 和
∂
J
(
w
,
b
)
∂
b
\frac{\partial J(w,b)}{\partial b}
∂b∂J(w,b),如下图:
向量化
使用向量化可以批处理数据,并且向量化后再进行计算比直接使用 for 循环效率高很多。
向量化逻辑回归
X = [ x ( 1 ) x ( 2 ) ⋯ x ( m ) ] n x × m X= \left[\begin{array}{c}x^{(1)} & x^{(2)} & \cdots & x^{(m)}\end{array}\right]_{n_x \times m} X=[x(1)x(2)⋯x(m)]nx×m
z = [ z ( 1 ) z ( 2 ) ⋯ z ( m ) ] = w T X + b = [ w T x ( 1 ) + b w T x ( 2 ) + b ⋯ w T x ( 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=[z(1)z(2)⋯z(m)]=wTX+b=[wTx(1)+bwTx(2)+b⋯wTx(m)+b]
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) A=[a(1),a(2),…,a(m)]=σ(z)
二、Shallow Neural Network 浅层神经网络
这一主题讲的是只有一个 hidden layer 的神经网络。该神经网络的前向传播、反向传播。
1. 前向传播
Z
[
1
]
=
W
[
1
]
X
+
b
[
1
]
Z^{[1]}=W^{[1]}X+b^{[1]}
Z[1]=W[1]X+b[1]
A
[
1
]
=
σ
(
Z
[
1
]
)
A^{[1]}=\sigma(Z^{[1]})
A[1]=σ(Z[1])
Z
[
2
]
=
W
[
2
]
A
[
1
]
+
b
[
2
]
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]})
A[2]=σ(Z[2])
W 1 [ 1 ] = [ w 11 [ 1 ] w 12 [ 1 ] w 13 [ 1 ] ] W_1^{[1]}=\left[\begin{array}{c}w_{11}^{[1]} \\w_{12}^{[1]} \\w_{13}^{[1]} \end{array}\right] W1[1]=⎣⎢⎡w11[1]w12[1]w13[1]⎦⎥⎤
Z [ 1 ] = [ Z 1 [ 1 ] Z 2 [ 1 ] Z 3 [ 1 ] Z 4 [ 1 ] ] = [ ⋯ W 1 [ 1 ] T ⋯ ⋯ W 2 [ 1 ] T ⋯ ⋯ W 3 [ 1 ] T ⋯ ⋯ W 4 [ 1 ] T ⋯ ] × [ x 1 x 2 x 3 ] + [ b 1 [ 1 ] b 2 [ 1 ] b 3 [ 1 ] b 4 [ 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] Z[1]=⎣⎢⎢⎢⎡Z1[1]Z2[1]Z3[1]Z4[1]⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡⋯W1[1]T⋯⋯W2[1]T⋯⋯W3[1]T⋯⋯W4[1]T⋯⎦⎥⎥⎥⎤×⎣⎡x1x2x3⎦⎤+⎣⎢⎢⎢⎡b1[1]b2[1]b3[1]b4[1]⎦⎥⎥⎥⎤
A [ 1 ] = [ a 1 [ 1 ] a 2 [ 1 ] a 3 [ 1 ] a 4 [ 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]}) A[1]=⎣⎢⎢⎢⎡a1[1]a2[1]a3[1]a4[1]⎦⎥⎥⎥⎤=σ(Z[1])
2. 反向传播
只有一个隐层的神经网络中,已有的参数有 W [ 1 ] W^{[1]} W[1], b [ 1 ] b^{[1]} b[1], W [ 2 ] W^{[2]} W[2], b [ 2 ] b^{[2]} b[2] 。
该神经网络进行梯度下降需要计算: d Z [ 2 ] , d W [ 2 ] , d b [ 2 ] , d Z [ 1 ] , d W [ 1 ] , d b [ 1 ] dZ^{[2]},dW^{[2]},db^{[2]},dZ^{[1]},dW^{[1]},db^{[1]} dZ[2],dW[2],db[2],dZ[1],dW[1],db[1] 。公式分别如下:
d Z [ 2 ] = A [ 2 ] − Y dZ^{[2]}=A^{[2]}-Y dZ[2]=A[2]−Y
d W [ 2 ] = 1 m d Z [ 2 ] A [ 1 ] T dW^{[2]}=\frac{1}{m}dZ^{[2]}A^{[1]T} dW[2]=m1dZ[2]A[1]T
d b [ 2 ] = 1 m np.sum ( d Z [ 2 ] , axis= 1 , keepdims=True ) db^{[2]}=\frac{1}{m}\text{np.sum}(dZ^{[2]},\text{axis=}1,\text{keepdims=True}) db[2]=m1np.sum(dZ[2],axis=1,keepdims=True)
d Z [ 1 ] = W [ 2 ] d Z [ 2 ] × g [ 1 ] ′ ( Z [ 1 ] ) dZ^{[1]}=W^{[2]}dZ^{[2]} \times g^{[1]'}(Z^{[1]}) dZ[1]=W[2]dZ[2]×g[1]′(Z[1])
d W [ 1 ] = 1 m d Z [ 1 ] X T dW^{[1]}=\frac{1}{m}dZ^{[1]}X^T dW[1]=m1dZ[1]XT
d b [ 1 ] = 1 m np.sum ( d Z [ 1 ] , axis= 1 , keepdims=True ) db^{[1]}=\frac{1}{m}\text{np.sum}(dZ^{[1]},\text{axis=}1,\text{keepdims=True}) db[1]=m1np.sum(dZ[1],axis=1,keepdims=True)
推导思路:用计算图
随机初始化
三、activation function 激活函数
激活函数 | 表达式 | 图像 | 导数 |
---|---|---|---|
① sigmoid | g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1 | g ′ ( z ) = [ 1 − g ( z ) ] g ( z ) g'(z)=[1-g(z)] g(z) g′(z)=[1−g(z)]g(z) | |
② tanh | : g ( z ) = tanh ( z ) = e z − e − z e z + e − z g(z)=\tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} g(z)=tanh(z)=ez+e−zez−e−z | g ′ ( z ) = 1 − ( tanh ( z ) ) 2 g'(z)=1-(\tanh(z))^2 g′(z)=1−(tanh(z))2 | |
③ ReLU | g ( z ) = m a x ( 0 , z ) g(z)=max(0,z) g(z)=max(0,z) | g ′ ( z ) = { 0 z < 0 1 z > 0 undefine z = 0 g'(z)=\begin{cases}0& z < 0\\1& z > 0 \\\text{undefine}& z=0\end{cases} g′(z)=⎩⎪⎨⎪⎧01undefinez<0z>0z=0 | |
④ leaky ReLU | g ( z ) = m a x ( 0.01 z , z ) g(z)=max(0.01z,z) g(z)=max(0.01z,z) | g ′ ( z ) = { 0.01 z < 0 1 z ≥ 0 g'(z)=\begin{cases}0.01& z < 0\\1& z \geq 0 \end{cases} g′(z)={0.011z<0z≥0 |
激活函数的选择:
sigmoid 现在已经不怎么用了,在逻辑回归中可能还会用到。现在一般用到的都是 ReLU。但自己在解决问题时,如果不知道用哪个激活函数,最好每个激活函数都可以用一用,因为各个激活函数都有各自的针对性。
为什么需要用非线性的激活函数?
四、深层神经网络
输入一系列特征,经过第 1 个隐层计算后,可以理解为形成了一系列新的特征,之后各层也是如此,直到得到最后的输出。
前向传播和反向传播过程
五、超参数
超参数 hyper parameter
就是那些能够控制参数(如
w
w
w 和
b
b
b )的参数。如:
学习率、迭代次数、隐层层数、隐层单元数、激活函数、momentum term、mini batch size 和正则化参数。
附录:符号约定
符号 | 描述 |
---|---|
y y y | 输出标签 |
n x n_x nx | 特征向量的维度 |
x x x | 特征向量 |
y ^ \hat y y^ | 模型的输出 |
( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)) | 第 i i i 组数据 |
m m m | 样本数量 |
X = [ x ( 1 ) , x ( 2 ) , … , x ( m ) ] n x × m X=[x^{(1)},x^{(2)},\dots,x^{(m)}]_{n_x \times m} X=[x(1),x(2),…,x(m)]nx×m | 数据集的输入值 |
Y = [ y ( 1 ) , y ( 2 ) , … , y ( m ) ] 1 × m Y=[y^{(1)},y^{(2)},\dots,y^{(m)}]_{1 \times m} Y=[y(1),y(2),…,y(m)]1×m | 数据集的输出值 |
M t r a i n M_{train} Mtrain | 训练集样本个数 |
M t e s t M_{test} Mtest | 测试集样本个数 |
W i j [ l ] W^{[l]}_{ij} Wij[l] |
l
l
l 表示第
l
l
l 层神经链接; i i i 表示后一层神经元的个数; j j j 表示前一层神经元的个数 |
M t e s t M_{test} Mtest | 测试集样本个数 |