第一门课 神经网络和深度学习(Neural Networks and Deep Learning)

3.1神经网络概述(Neural Network Overview)

感觉这块没啥好记的

3.2 神经网络的表示(Neural Network Representation)

神经网络包括

  • 输入层(input layer):包含输入特征x1,x2,...x_1,x_2,...x1,x2,...
  • 隐藏层(hidden layer):训练数据
  • 输出层(output layer):产生预测值y1,y2,...y_1,y_2,...y1,y2,...

将输入层的激活值记为a[0]a^{[0]}a[0],隐藏层的激活值记为a[1]a^{[1]}a[1],第一个结点记为a1[1]a^{[1]}_{1}a1[1],第二个结点记为a2[1]a^{[1]}_{2}a2[1],以此类推,输出层的y^\hat yy^a[2]a^{[2]}a[2]
在这里插入图片描述

3.3 计算一个神经网络的输出(Computing a Neural Network’s output)

给定一个只有一个隐藏层的两层神经网络结构,xxx表示输入特征,aaa表示每个神经元的输出,WWW表示特征的权重,上标表示神经网络的层数(隐藏层为1),小标表示该层的第几个神经元。

神经网络的计算

在这里插入图片描述
隐藏层节点单元的计算:
z1[1]=w1[1]Tx+b1[1],a1[1]=σ(z1[1])z^{[1]}_1=w^{[1]T}_1x+b^{[1]}_1,a^{[1]}_1=\sigma(z^{[1]}_1)z1[1]=w1[1]Tx+b1[1],a1[1]=σ(z1[1])

z2[1]=w2[1]Tx+b2[1],a2[1]=σ(z2[1])z^{[1]}_2=w^{[1]T}_2x+b^{[1]}_2,a^{[1]}_2=\sigma(z^{[1]}_2)z2[1]=w2[1]Tx+b2[1],a2[1]=σ(z2[1])

z3[1]=w3[1]Tx+b3[1],a3[1]=σ(z3[1])z^{[1]}_3=w^{[1]T}_3x+b^{[1]}_3,a^{[1]}_3=\sigma(z^{[1]}_3)z3[1]=w3[1]Tx+b3[1],a3[1]=σ(z3[1])

z4[1]=w4[1]Tx+b4[1],a4[1]=σ(z4[1])z^{[1]}_4=w^{[1]T}_4x+b^{[1]}_4,a^{[1]}_4=\sigma(z^{[1]}_4)z4[1]=w4[1]Tx+b4[1],a4[1]=σ(z4[1])

向量化计算
在这里插入图片描述
z[n]=w[n]x+b[n]z^{[n]}=w^{[n]}x+b^{[n]}z[n]=w[n]x+b[n]

其中www是一个4X3的矩阵

3.4 多样本向量化(Vectorizing across multiple examples)

在这里插入图片描述
a[2](i)a^{[2](i)}a[2](i)[2][2][2]指神经网络的第二层,(2)(2)(2)指第iii个训练样本。

对于矩阵A,Z,XA,Z,XA,Z,X,水平方向上代表了各个训练样本,竖直方向上对应不同的输入特征,即不同的索引对应于不同的隐藏单元。

3.5 向量化实现的解释(Justification for vectorized implementation)

对单个样本的计算z[1](i)=W[1]x[i]+b[1]z^{[1](i)}=W^{[1]}x^{[i]}+b^{[1]}z[1](i)=W[1]x[i]+b[1],当有不同的训练样本时,将其堆到矩阵XXX的各列中。
在这里插入图片描述

3.6 激活函数(Activation functions)

在神经网络的前向传播中的a[1]=σ(z[1])a^{[1]}=\sigma (z^{[1]})a[1]=σ(z[1])使用到了sigmoid函数,sigmoid函数在这里被称为激活函数:a=σ(z)=11+e−za=\sigma (z)=\frac{1}{1+e^{-z}}a=σ(z)=1+ez1

通常情况下我们使用不同的非线性函数g(z)g(z)g(z)tanh函数或者双曲正切函数是总体上都优于sigmoid函数的激活函数。
a=tanh(z)=ez−e−zez+e−za=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}a=tanh(z)=ez+ezezez

tanh函数的值域在-1到1之间,数据的平均值接近0而不是0.5,这会使下一层的学习更加简单。sigmoid函数和tanh函数共同的缺点:在z特别大或特别小时导数的梯度或者函数的斜率接近于0,导致降低梯度下降的速度降低。

在机器学习中有一个很流行的函数:修正线性单元函数(ReLu),在z是正数时导数恒等于1,在z是负数时,导数恒等于0。
a=ReLu(z)=max(0,z)a=ReLu(z)=max(0,z)a=ReLu(z)=max(0,z)

激活函数选择的经验法则:

  • 若输出是0、1值(二分类问题),则输出层选择sigmoid函数,其余所有单元选择ReLu函数
  • 若隐藏层不确定使用哪个激活函数,通常选择ReLu函数

还有另一版本的ReLu函数Leaky ReLu,当z是负值时函数值不为0,而是微微倾斜,这个函数的激活效果优于ReLu,尽管使用不多。在这里插入图片描述

3.7 为什么需要非线性激活函数?(Why need a nonlinear activation function?)

如果你是用线性激活函数或者叫恒等激励函数,那么神经网络只是把输入线性组合再输出。不能在隐藏层用线性激活函数,可以用ReLU或者tanh或者leaky ReLU或者其他的非线性激活函数,唯一可以用线性激活函数的通常就是输出层。

3.8 激活函数的导数(Derivatives of activation functions)

1.Sigmoid activation function
ddzg(z)=ddzg(11+e−z)=11+e−z(1−11+e−z)=g(z)(1−g(z))\frac{d}{dz}g(z)=\frac{d}{dz}g(\frac{1}{1+e^{-z}})=\frac{1}{1+e^{-z}}(1-\frac{1}{1+e^{-z}})=g(z)(1-g(z))dzdg(z)=dzdg(1+ez1)=1+ez1(11+ez1)=g(z)(1g(z))

z=±10z=±10z=±10时,g(z)′≈0g(z)'≈0g(z)0
z=0z=0z=0时,g(z)′=14g(z)'=\frac{1}{4}g(z)=41
在神经网络中,a=g(z),g(z)′=a(1−a)a=g(z),g(z)'=a(1-a)a=g(z),g(z)=a(1a)

2.Tanh activation function
ddzg(z)=ddzg(ez−e−zez+e−z)=1−(tanh(z))2\frac{d}{dz}g(z)=\frac{d}{dz}g(\frac{e^z-e^{-z}}{e^z+e^{-z}})=1-(tanh(z))^2dzdg(z)=dzdg(ez+ezezez)=1(tanh(z))2

z=±10z=±10z=±10时,g(z)′≈0g(z)'≈0g(z)0
z=0z=0z=0时,g(z)′=0g(z)'=0g(z)=0
在神经网络中,a=g(z),g(z)′=1−a2a=g(z),g(z)'=1-a^2a=g(z),g(z)=1a2

3.Rectified linear unit(ReLu)
g(z)=max(0,z)g(z)=max(0,z)g(z)=max(0,z)

g(z)′={0if z<01if z>0undefinedif z=0g(z)'=\left\{\begin{matrix} 0 & if\space z<0\\ 1 & if\space z>0\\ undefined & if\space z=0 \end{matrix}\right.g(z)=01undefinedif z<0if z>0if z=0

通常在z=0z=0z=0时给定其导数1,0;当然z=0z=0z=0的情况很少。

4.Leaky Rectified linear unit(Leaky ReLu)

g(z)=max(0.01z,z)g(z)=max(0.01z,z)g(z)=max(0.01z,z)

g(z)′={0.01if z<01if z>0undefinedif z=0g(z)'=\left\{\begin{matrix} 0.01 & if\space z<0\\ 1 & if\space z>0\\ undefined & if\space z=0 \end{matrix}\right.g(z)=0.011undefinedif z<0if z>0if z=0

通常在z=0z=0z=0时给定其导数1,0.01;当然z=0z=0z=0的情况很少。

3.9 神经网络的梯度下降(Gradient descent for neural networks)

给定一单层神经网络,包括参数W[1]W^{[1]}W[1]b[1]b^{[1]}b[1]W[2]W^{[2]}W[2]b2]b^{2]}b2]nxn_xnx代表输入特征的个数,n[1]n^{[1]}n[1]表示隐藏层单元个数,n[2]n^{[2]}n[2]表示输出层单元个数。
矩阵W[1]W^{[1]}W[1]维度为 (n[1],n[0])(n^{[1]},n^{[0]})(n[1],n[0]),矩阵b[1]b^{[1]}b[1]维度为(n[1],1)(n^{[1]},1)(n[1],1),矩阵W[2]W^{[2]}W[2]维度为 (n[2],n[1])(n^{[2]},n^{[1]})(n[2],n[1]),矩阵b[2]b^{[2]}b[2]维度为(n[2],1)(n^{[2]},1)(n[2],1)Z[1]Z^{[1]}Z[1]A[1]A^{[1]}A[1]的维度均为(n[1],m)(n^{[1]},m)(n[1],m)

训练参数需要做梯度下降,在训练神经网络时,要随机初始化参数,而不是初始化为全零。

forword propagation:

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

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

back propagation:
dz[2]=A[2]−Y,Y=[y[1] y[2] ... y[m]]dz^{[2]}=A^{[2]}-Y,Y=[y^{[1]}\space y^{[2]}\space ...\space y^{[m]}]dz[2]=A[2]Y,Y=[y[1] y[2] ... y[m]]

dW[2]=1mdz[2]A[1]TdW^{[2]}=\frac{1}{m}dz^{[2]}A^{[1]T}dW[2]=m1dz[2]A[1]T

db[2]=1mnp.sum(dz[2],axis=1,keepdims=True)db^{[2]}=\frac{1}{m}np.sum(dz^{[2]},axis=1,keepdims=True)db[2]=m1np.sum(dz[2],axis=1,keepdims=True)

dz[1]=W[2]Tdz[2]∗g[1]′(z[1])dz^{[1]}=W^{[2]T}dz^{[2]}*g^{[1]'}(z^{[1]})dz[1]=W[2]Tdz[2]g[1](z[1])

dW[1]=1mdz[1]xTdW^{[1]}=\frac{1}{m}dz^{[1]}x^{T}dW[1]=m1dz[1]xT

db[1]=1mnp.sum(dz[1],axis=1,keepdims=True)db^{[1]}=\frac{1}{m}np.sum(dz^{[1]},axis=1,keepdims=True)db[1]=m1np.sum(dz[1],axis=1,keepdims=True)

其中axis=1在python中表示水平相加求和,keepdims确保矩阵db[2]db^{[2]}db[2]这个向量输出的维度为(n,1)(n,1)(n,1)这样的标准形式。

3.10(选修)直观理解反向传播(Backpropagation intuition)

在这里插入图片描述

3.11 随机初始化(Random Initialization)

如果在神经网络中将权重或者参数初始化为0,那么梯度下降将不起作用。
在这里插入图片描述
实际中应该把W[1]W^{[1]}W[1]设为np.random.randn(2,2)(生成高斯分布),通常再乘一个很小的数,如0.01,这样把它初始化为很小的随机数。bbb没有对称问题,可以将其初始化为0。只要随机初始化WWW就有不同的隐含单元计算不同的东西,就不会存在symmetry breaking problem,相似的W[2]W^{[2]}W[2]也是如此。

W[1]=np.random.randn(2,2)∗0.01,b[1]=np.zeros((2,1))W^{[1]}=np.random.randn(2,2)*0.01,b^{[1]}=np.zeros((2,1))W[1]=np.random.randn(2,2)0.01,b[1]=np.zeros((2,1))

W[2]=np.random.randn(2,2)∗0.01,b[2]=0W^{[2]}=np.random.randn(2,2)*0.01,b^{[2]}=0W[2]=np.random.randn(2,2)0.01,b[2]=0

乘0.01而不是100或者1000是因为如果使用sigmoid/tanh为激活函数,初始化值很大的时候zzz会很大或者很小,梯度下降会很慢,学习速度就会很慢。

错题笔记

Logistic Regression doesn’t have a hidden layer. If you initialize the weights to zeros, the first example x fed in the logistic regression will output zero but the derivatives of the Logistic Regression depend on the input x (because there’s no hidden layer) which is not zero. So at the second iteration, the weights values follow x’s distribution and are different from each other if x is not a constant vector.
Logistic回归没有隐藏层。 如果将权重初始化为零,则Logistic回归中的第一个示例x将输出零,但Logistic回归的导数取决于不是零的输入x(因为没有隐藏层)。 因此,在第二次迭代中,如果x不是常量向量,则权值遵循x的分布并且彼此不同。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐