3.浅层神经网络

浅层神经网络概述


[1]计算出z,α(第一层)
z [ 1 ] = W [ 1 ] + b [ 1 ] z^{[1]}=W^{[1]}+b^{[1]} z[1]=W[1]+b[1] α [ 1 ] = s i g m o i d ( z [ 1 ] ) α^{[1]}=sigmoid(z^{[1]}) α[1]=sigmoid(z[1])
[2]计算出z,α(第二层)
z [ 2 ] = W [ 2 ] + b [ 2 ] z^{[2]}=W^{[2]}+b^{[2]} z[2]=W[2]+b[2] α [ 2 ] = s i g m o i d ( z [ 2 ] ) α^{[2]}=sigmoid(z^{[2]}) α[2]=sigmoid(z[2])

这只是一个简短的描述,接下来的学习希望能够理解神经网络的原理。


神经网络的表示

在这里插入图片描述

  • 输入特征 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3,成为神经网络的输入层
  • 接下来的一层我们称之为隐含层

监督学习训练一个数据集时,训练集中既有输入 x x x也有目标输出 y y y,而这一层结点的值是透明的,训练集中并不包含其值,所以称为隐藏层。
最后只有一个结点的我们称之为输出层

  • a意味着激活,也是每一个神经元的输出(后所提),以输入层为第0层,标[num]表示第几层,标num表示该层的第几个结点
    • a 2 [ 1 ] a^{[1]}_2 a2[1]表示第一层第二个结点的激活值。

本神经网络的隐藏层有个单元,所以其激活值是一个 4 × 1 4\times{1} 4×1的矩阵

最后输出层将产生某个数值a(一个数),所以 y ^ = a [ 2 ] \hat{y}=a^{[2]} y^=a[2]

输入层不算入计算网络的层数

  • 隐藏层和输出层都是带有参数的, W [ 1 ] , b [ 1 ] W^{[1]},b^{[1]} W[1],b[1], W [ 2 ] , b [ 2 ] W^{[2]},b^{[2]} W[2],b[2]
    • W [ 1 ] W^{[1]} W[1]是一个(4,3)的矩阵,4因为有4个结点,3因为上一层有三个输入特征。 b [ 1 ] b^{[1]} b[1]是个(4,1)的向量
    • W [ 2 ] W^{[2]} W[2]是一个(1,4)的矩阵,1因为有1个结点,4因为上一层有4个值输入到此层。 b [ 2 ] b^{[2]} b[2]是个(1,1)的向量

如前一章所学,在逻辑回归中W是个系数矩阵,而b是一个纠偏的向量或值,在上一章,WX是(1,1),所以b是一个值,此处WX形如(4,1),所以b是一个(4,1)向量,mark一下,理解有误后期来修正此处。


神经网络的计算在个结点计算出假设函数的值,然后作为变量输入激活函数输出a。

比如在隐藏层:
z 1 [ 1 ] = w 1 [ 1 ] x + b 1 [ 1 ] z^{[1]}_1=w^{[1]}_1x+b^{[1]}_1 z1[1]=w1[1]x+b1[1] a 1 [ 1 ] = σ ( z 1 [ 1 ] ) a^{[1]}_1=\sigma(z^{[1]}_1) a1[1]=σ(z1[1])

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

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

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


向量化就是用NumPy来进行的矩阵运算

多样本向量化就是把下标i作为列i,每个都看作是一个抽象矩阵作横向扩展。


激活函数

sigmoid函数:
a = σ ( z ) = 1 1 + e − z a=\sigma(z)=\frac{1}{1+e^{-z}} a=σ(z)=1+ez1

tanh(双曲正切函数):
a = t a n h ( z ) = e z − e − z e z + e − z a=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} a=tanh(z)=ez+ezezez

  • 总体上都优于sigmoid函数
  • 值域位于+1和-1之间
  • 经过(0,0)点
  • 均值更接近均值
  • 在二分类问题上,想让 y ^ \hat{y} y^介于0和1之间,而不是-1和+1之间,所以需要使用sigmoid激活函数。

不同可以使用不同激活函数


既然tanh效果好,为什么不用tanh后在进行归一化么?


sigmoid和tanh都会在z特别大或特别小的时候,导数的梯度或函数的斜率变得特别小
修正线性单元的函数(ReLu): a = m a x ( 0 , z ) a=max(0,z) a=max(0,z)

激活函数的经验法则

  • 如果输出是二分类问题,则输出层选择sigmoid函数,然后其他的所有单元都选择ReLu函数
  • sigmoid:除了输出层是一个二分类问题基本不会用它
  • tanh激活函数:tanh是非常优秀的,几乎适合所有场合。
  • ReLu函数:最常用的默认函数,如果不确定用哪个激活函数,jiuyongReLu或Leaky ReLu

为什么使用非线性激活函数?

个人理解:简化一下神经网络结构,假设其都是线性传递,即多层,每层单节点,从输入层到输出层只是在做这样一个计算 y = w [ 1 ] w [ 2 ] . . . w [ m ] X y=w^{[1]}w^{[2]}...w^{[m]}X y=w[1]w[2]...w[m]X而已,前面的所有系数矩阵w相乘过后得到的是一个系数矩阵。函数形式没有更复杂,反向传播也一直是等步长下降,结果还只是一个线性函数,只是将空间一分为2,而引入非线性函数,虽不能准确说明其形式,但各结点非等步长进行梯度下降,函数形式明显会变得复杂,呈现多项式形式或更为复杂精确的函数形式,甚至划分出多区域也是可能的。

sigmoid的导数:

tanh的导数:

ReLu的导数:

Leaky ReLu的导数:

以上都是对z求导


推导用LaTeX真的是太麻烦了…

根据下面 d z [ 2 ] dz^{[2]} dz[2]此处应该用的是sigmoid激活函数。

d a d z = a ( 1 − a ) \frac{da}{dz}=a(1-a) dzda=a(1a) 见上文

d L d z = d L d a × d a d z = − y a + 1 − y 1 − a × a ( 1 − a ) = a − y \frac{dL}{dz}=\frac{dL}{da}\times{\frac{da}{dz}}=-\frac{y}{a}+\frac{1-y}{1-a}\times{a(1-a)}=a-y dzdL=dadL×dzda=ay+1a1y×a(1a)=ay

d L d w [ 2 ] = d L d z [ 2 ] × d z [ 2 ] d w [ 2 ] = d L d z [ 2 ] × a [ 1 ] \frac{dL}{dw^{[2]}}=\frac{dL}{dz^{[2]}}\times{\frac{dz^{[2]}}{dw^{[2]}}}=\frac{dL}{dz^{[2]}}\times{a^{[1]}} dw[2]dL=dz[2]dL×dw[2]dz[2]=dz[2]dL×a[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]
其他的大同小异。


随机初始化

初始化为0导致隐含单元在1个以上没有意义,因为各结点对称(想象一个坐标图,输入与隐含层由于是全相联,系数和偏差一样则映射到同一个点,在该点梯度也一样,进行下降的步长就也一样)

  • w随机初始化z再乘一个很小随机数,b可初始化为0
  • 随机数太大的话,落在梯度平缓区域的概率变大,降低梯度下降的速度
  • 选取问题看后续mark
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值