01.神经网络和深度学习——week3 浅层神经网络

3.1 神经网络表示

如图是一个两层神经网络结构示意图:
两层神经网络结构
reminder: 注意两层之间参数的维度。

  • 输入层和隐藏层之间:
    w [ 1 ] → [ 4 , 3 ] : w^{[1]}\rightarrow[4,3]: w[1][4,3] 4个隐藏层神经元,3个输入层神经元;
    b [ 1 ] → [ 4 , 1 ] : b^{[1]}\rightarrow[4, 1]: b[1][4,1]和隐藏层神经元个数相同。

  • 隐藏层和输出层之间:
    w [ 2 ] → [ 1 , 4 ] : w^{[2]}\rightarrow[1,4]: w[2][1,4] 1个输出层神经元,4个隐藏层神经元;
    b [ 2 ] → [ 1 , 1 ] : b^{[2]}\rightarrow[1,1]: b[2][1,1]和输出层神经元个数相同。

总结: 神经网络中,以相邻两层为观测对象,前面一层作为输入,后面一层作为输出,两层之间的w参数大小为 ( n o u t , n i n ) (n_{out},n_{in}) (nout,nin),这里是从 z = w X + b z=wX+b z=wX+b的线性关系来说的,在神经网络中, w [ i ] = w T w^{[i]}=w^{T} w[i]=wT。logistic regression中,一般用 ( n i n , n o u t ) (n_{in},n_{out}) (nin,nout)来表示参数矩阵大小,计算公式使用: z = w T x + b z=w^Tx+b z=wTx+b

3.2 计算神经网络输出

隐藏层计算过程:隐藏层计算过程
其中,每个结点对应z和a运算两个部分。编程中我们使用向量化计算神经网络的输出:
向量化
在图中所示的神经网络结构,用python代码实现右边的四个公式即可实现神经网络的输出计算。

3.3 向量化实现

m个训练样本的神经网络中,向量化计算神经网络输出可以避免使用for循环,提高计算速度。

  • 单个样本时神经网络计算输出过程:
    单个样本时神经网络计算输出
  • m个训练样本时,对每个样本重复计算过程,得到相同大小和结构的输出,利用向量化思想将样本合并到一个矩阵,大小为 ( n x , m ) (n_x,m) (nxm) x n x_n xn表示单个样本的维度或输入网络的神经元个数。(此处可以结合上面提到的w参数的维度变化思考,每层网络中参数的维度)。
    m个训练样本时
    图中矩阵Z和A,纵向表示不同的神经元,横向表示m个样本。
  • 举例说明向量化的正确性:
    说明向量化的正确性
  • recap:
    recap

3.4 激活函数

几种激活函数比较:
激活函数比较

  • sigmoid函数: a = 1 1 + e − z a=\frac{1}{1+e^{-z}} a=1+ez1   a ′ = a ( 1 − a ) a'=a(1-a) a=a(1a)
  • tanh函数: a = e z − e − z e z + e − z a=\frac{e^z-e^{-z}}{e^z+e^{-z}} a=ez+ezezez   a ′ = 1 − a 2 a'=1-a^2 a=1a2
  • ReLU函数: a = m a x ( 0 , z ) a=max(0, z) a=max(0,z)
  • Leaky ReLU函数: a = m a x ( 0.001 z , z ) a=max(0.001z, z) a=max(0.001z,z)

激活函数选择:

  • 隐藏层:tanh函数的表现要好于sigmoid函数,因为tanh取值范围为 [ − 1 , + 1 ] [-1,+1] [1,+1] ,输出分布在0值的附近,均值为0,从隐藏层到输出层数据起到了归一化(均值为0)的效果。
  • 输出层:对于二分类任务的输出取值为 { 0 , 1 } \{0,1\} {0,1} ,故一般会选择sigmoid函数。然而sigmoid和tanh函数在当 |z| 很大的时候,梯度会很小,在依据梯度的算法中,更新在后期会变得很慢。在实际应用中,要使 ∣ z ∣ |z| z 尽可能的落在0值附近。
  • ReLU弥补了前两者的缺陷,当 z &gt; 0 z&gt;0 z>0 时,梯度始终为1,从而提高神经网络基于梯度算法的运算速度。然而当 z &lt; 0 z&lt;0 z<0 时,梯度一直为0,但是实际的运用中,该缺陷的影响不是很大。
  • Leaky ReLU保证在 z &lt; 0 z&lt;0 z<0的时候,梯度仍然不为0。

在选择激活函数的时候,如果在不知道该选什么的时候就选择ReLU,当然也没有固定答案,要依据实际问题在交叉验证集合中进行验证分析。

为什么需要非线性激活函数:

  • 如果隐藏层用线性激活函数,那么神经网络只是把输入线性组合再输出,层数再多都只是线性组合,所以不如直接去掉所有隐藏层。
  • 回归问题的输出层有些会用线性激活函数。

3.5 激活函数的导数

如图为本节中的浅层神经网络结构。

浅层神经网络
符号说明:

  • 参数: W [ 1 ] , b [ 1 ] , W [ 2 ] , b [ 2 ] W^{[1]},b^{[1]},W^{[2]},b^{[2]} W[1],b[1],W[2],b[2]
  • 输入层特征向量个数: n x = n 0 n_x=n^0 nx=n0
  • 隐藏层神经元个数: n [ 1 ] n^{[1]} n[1]
  • 输出层神经元个数: n [ 2 ] = 1 n^{[2]}=1 n[2]=1
  • 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)

反向传播计算公式及其向量化实现:反向传播计算过程

3.6 随机初始化

如果在初始时,两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。

在初始化的时候, W 参数要进行随机初始化, b 则不存在对称性的问题它可以设置为0。 以2个输入,2个隐藏神经元为例:

	W = np.random.rand((2,2))* 0.01
	b = np.zero((2,1))

这里我们将W的值乘以0.01是为了尽可能使得权重W初始化为较小的值,这是因为如果使用sigmoid函数或者tanh函数作为激活函数时,W比较小,则 $Z = WX+b $所得的值也比较小,处在0的附近,0点区域的附近梯度较大,能够大大提高算法的更新速度。而如果W设置的太大的话,得到的梯度较小,训练过程因此会变得很慢。

ReLU和Leaky ReLU作为激活函数时,不存在这种问题,因为在大于0的时候,梯度均为1。

参考资料:

[1] 博客:https://blog.csdn.net/koala_tree/article/details/78059952
[2] 网易云 Andrew Ng 深度学习课程

博文内容全部来自参考资料,非创作,仅为学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值