【吴恩达深度学习笔记】1.3 浅层神经网络Shallow neural networks
3.1神经网络概述(Neural Network Overview)3.2 神经网络的表示(Neural Network Representation)3.3 计算一个神经网络的输出(Computing a Neural Network’s output)3.4 多样本向量化(Vectorizing across multiple examples)3.5 向量化实现的解释(Justificati
第一门课 神经网络和深度学习(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+e−z1
通常情况下我们使用不同的非线性函数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+e−zez−e−z
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+e−z1)=1+e−z1(1−1+e−z1)=g(z)(1−g(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(1−a)
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+e−zez−e−z)=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)′=1−a2
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的分布并且彼此不同。

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