Lesson1--浅层神经网络

本文介绍了神经网络的基本组成部分,包括输入层、隐藏层和输出层的概念。详细解析了神经网络的正向传播过程,以及如何利用不同的激活函数(如tanh、sigmoid、ReLU等)进行非线性映射。同时,文章还探讨了反向传播算法用于计算梯度下降,并讨论了参数初始化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.神经网络的表示

这里写图片描述

  1. 名称:输入层,隐藏层hidden layer,输出层。
  2. 神经网络的层数,我们一般不计入输入层,因此这是一个两层的神经网络;
  3. a[0],a[1]..a^{[0]},a^{[1]}..a[0],a[1]..分别表示每一层的激活单元,用下标表示每个激活单元中的第几个结点,所以a1[1]a^{[1]}_1a1[1]表示第一层的激活单元的第一个结点;
  4. w,bw,bw,b向量的维数,w的行是这一层的单元数,列是上一层的单元数;b的行是这一层的单元数,列是1.

2.神经网络的输出

当只有一个样本输入时:
这里写图片描述
这个图中可以看出每一层的每一个结点都需要一个w,b矢量来计算,图中给出了第一层的每一个ai[1]a^{[1]}_iai[1]的计算,将这个用向量化表示,就可以将w,b写成矩阵形式,也就得出了w,b矩阵的size。
最终对单个样本的向量化计算公式为:
当有多个输入x时,将每个输入x(i)x^{(i)}x(i)按列排列成一个矩阵,那么可以向量化为
这里写图片描述

3 激活函数

因为tanh函数可以将数据中心点移到0点,因此经常被用来代替sigmoid函数,当输出为{0,1}的时候,在隐藏层的激活函数使用tanh⁡=ez−e(−z)ez+e(−z)\tanh=\frac{e^z-e^{(-z)}}{e^z+e^{(-z)}}tanh=ez+e(z)eze(z),而只在输出层使用sigmoid函数。但它们的共同缺点是当Z太大或者太小的时候,函数斜率接近为0,会降低梯度下降的速度,因此可以使用Relu(修正线性单元)函数或者Leaky Relu函数代替tanh函数或者sigmoid函数作为隐藏层的激活函数。Relu函数在Z大于0的时候,斜率不会接近于0,只有当Z小于0时,斜率为0,但一般通过设计w,b参数,可以使得z一直大于0.
这里写图片描述
那为什么需要使用非线性激活函数呢?
如果在隐藏层只使用线性函数,那么神经网络只是把输入线性组合再输出,那么隐藏层就没有起到实质上的作用。只有在输出为实数R时,我们可以在输出层使用一个线性函数组合输出。
已知激活函数之后,如何计算激活函数的导数?
(为什么要计算导数?因为在梯度下降的时候,dw=xdz=xdadzdLda{\rm d}w=x{\rm d}z=x\frac{{\rm d}a}{{\rm d}z}\frac{{\rm d}L}{{\rm d}a}dw=xdz=xdzdadadL,其中dadz\frac{{\rm d}a}{{\rm d}z}dzda就是激活函数的导数)
对于sigmoid函数,dadz=a(1−a)\frac{{\rm d}a}{{\rm d}z}=a(1-a)dzda=a(1a)
对于tanh函数,dadz=1−a2\frac{{\rm d}a}{{\rm d}z}=1-a^2dzda=1a2
对于Relu函数,dadz={1,if z>00,if z<0\frac{{\rm d}a}{{\rm d}z}=\begin{cases} 1 , \text{if z>0}\\ 0, \text{if z<0} \end{cases}dzda={1,if z>00,if z<0,另外在工程中可以自己定义z=0时导数为1。
对于Leaky Relu函数,dadz={1,if z > 00.01,if z <0\frac{{\rm d}a}{{\rm d}z}=\begin{cases} 1, \text{if z > 0}\\ 0.01, \text{if z <0} \end{cases}dzda={1,if z > 00.01,if z <0
(注意上面的导数形式都是对a,即因变量表示的)

4 反向推导梯度下降

假设隐藏层只有一层,输出激活函数为sigmoid函数时:
这里写图片描述
每次只对Z,w,b计算梯度,有:
这里写图片描述
注意,反向传播的公式向量化之后有一个1m\frac{1}{m}m1的系数,这是因为使用矩阵计算时对m个样本求平均。(使用一个样本时是w,使用m个样本时对求出来的矩阵除m求均值)。

5 参数初始化

当初始化参数均为0时,隐藏层中的各个单元呈对称性,在计算梯度下降时,各层的各个单元也呈对称性,那么多个隐藏单元都在做同样的事情,因为多个隐藏单元没有意义。
那么在初始化时,我们应该将各个隐藏层的w函数初始化为:
w=np.random.randn((shape))∗0.01\textbf w=\text{np.random.randn((shape))}*0.01w=np.random.randn((shape))0.01
参数b可以初始化为0,因为它不会使整个网络呈对称性。参数乘0.01的原因是当参数值很大时,会使得每一层的线性输出z很大,那么就有可能落在tanh函数或sigmoid函数的平缓区域,此时梯度很小,会降低梯度下降的速度。在深层神经网络中,我们可以需要用到除0.01之外的其他常数,在下一周的深层神经网络中会给出。

总结

学完本周内容你应该知道:

  1. 神经网络的一些参数符号;
  2. 正向传播与反向传播的公式表达;
  3. 激活函数有哪几种,如何选择,为什么?
  4. 参数初始化怎么做,为什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值