浅层神经网络的前向传播
计算流程
第一个激活函数是为了把线性变换的各条线变成更便于拟合的,具有非线性特征的线
第二个线性变换是为了把这些具有非线性特征的线拟合成一条线
第二个激活函数是为了把结果限制在0-1之间
与单神经元相比,不同在于每个不同的神经元对相同的输入有不同权
n*m n为隐层神经元个数,m为输入的特征x的数目
- 这是W权重的矩阵
输入的特征x | x1 | x2 | x3 | … | xm |
---|---|---|---|---|---|
神经元 | |||||
a1 | |||||
a2 | |||||
a3 | |||||
a4 | |||||
… | |||||
an |
而在单神经元中 w w w仅有一行
矩阵在运算时形状的变化
n 是隐层神经元的个数, m 是特征 x 的数目(一个样本里有 m 个 x ), M 是样本数目 n是隐层神经元的个数,m是特征x的数目(一个样本里有m个x),M是样本数目 n是隐层神经元的个数,m是特征x的数目(一个样本里有m个x),M是样本数目
- 前向过程计算:
第一步,各神经元线性代换 第一步,各神经元线性代换 第一步,各神经元线性代换
z [ 1 ] = W [ 1 ] x + b [ 1 ] ( 形状: ( n , M ) = ( n , m ) ∗ ( m , M ) + ( M , 1 ) ) z^{[1]} = W^{[1]}x + b^{[1]} (形状:(n,M) = (n,m) * (m,M) + (M,1)) z[1]=W[1]x+b[1](形状:(n,M)=(n,m)∗(m,M)+(M,1))
第二步,对各神经元的代换结果进行激活函数 ( z ) 第二步,对各神经元的代换结果进行激活函数(z) 第二步,对各神经元的代换结果进行激活函数(z)
a [ 1 ] = σ ( z [ 1 ] ) ( 形状: ( n , M ) ) a^{[1]} = \sigma(z^{[1]}) (形状:(n,M)) a[1]=σ(z[1])(形状:(n,M))
第三步 , 对各个神经元的激活函数 ( z ) 结果进行线性代换 第三步,对各个神经元的激活函数(z)结果进行线性代换 第三步,对各个神经元的激活函数(z)结果进行线性代换
z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ] ( 形状: ( 1 , M ) = ( 1 , n ) ∗ ( n , M ) + ( 1 , M ) ) z^{[2]} = W^{[2]}a^{[1]} + b^{[2]} (形状:(1,M) = (1,n) * (n,M) + (1,M)) z[2]=W[2]a[1]+b[2](形状:(1,M)=(1,n)∗(n,M)+(1,M))
第四步,对汇总的线性代换进行 σ ( z ) 第四步,对汇总的线性代换进行\sigma(z) 第四步,对汇总的线性代换进行σ(z)
a [ 2 ] = σ ( z [ 2 ] ) ( 形状: ( 1 , M ) ) a^{[2]} = \sigma(z^{[2]}) (形状:(1,M)) a[2]=σ(z[2])(形状:(1,M))
- 第一步的结果(n,M),一个样本占一列
输入的样本 | M1 | M2 | M3 | … | MM |
---|---|---|---|---|---|
神经元 | |||||
a1 | 线性代换的结果 | ||||
… | |||||
an |
- 第二步的结果(n,M),一个样本占一列
输入的样本 | M1 | M2 | M3 | … | MM |
---|---|---|---|---|---|
神经元 | |||||
a1 | σ ( 线性代换的结果 ) \sigma(线性代换的结果) σ(线性代换的结果) | ||||
… | |||||
an |
- 第三步的结果,一个样本占一格
输入的样本 | M1 | M2 | M3 | … | MM |
---|---|---|---|---|---|
各个神经元的 σ ( z ) \sigma(z) σ(z)结果 | σ ( z ) \sigma(z) σ(z)线性代换的结果 |
- 第四步的结果,一个样本占一格
输入的样本 | M1 | M2 | M3 | … | MM |
---|---|---|---|---|---|
σ ( z ) \sigma(z) σ(z)线性代换的结果 | σ ( 第三步线性代换 ) \sigma(第三步线性代换) σ(第三步线性代换)线性代换的结果,最终的预测概率 |
激活函数的作用
就是非线性变换
为什么要有激活函数
线性变换1 根据权重数据化到各个神经元,
线性变换2 将各个神经元非线性化后的结果线加上偏置后,拟合(加)成一条线,最终根据这条线 σ ( z ) \sigma(z) σ(z)进行预测
隐层中有n神经元,最终就是n条激活函数的线拟合
如果不加激活函数,那么神经元就仅仅做线性变换,以AlexNet为例,这个神经网络就会成为一个线性回归模型。而一个线性回归模型对于复杂非线性任务的处理能力是十分有限的。因此,我们需要添加非线性的激活函数,在神经网络的输入输出之间形成非线性映射,让网络能力更为强大。
仅线性变化得到的,拟合(加起来)效果不如激活函数得到的非线性线的拟合
反向传播
是单个神经元的反向传播的叠加
深层神经网络
与浅层神经网络相同,只是隐层部分由多层神经元构成
提取图片文字内容如下:
参数
参数即是我们在过程中想要模型学习到的信息(模型自己能计算出来的),例如W[l],b[l],而超参数(hyper parameters)即为控制参数的学习的一些信息(需要人经验判断)。超参数的改变会导致最终得到的参数W[l],b[l]的改变。
超参数
典型的超参数有:
• 学习速率: a 学习速率:a 学习速率:a
• 迭代次数: N 迭代次数:N 迭代次数:N
• 隐藏层的层数: L 隐藏层的层数:L 隐藏层的层数:L
• 每一层的神经元个数: n [ 1 ] , n [ 2 ] , . . . 每一层的神经元个数:n^{[1]},n^{[2]},... 每一层的神经元个数:n[1],n[2],...
• 激活函数 g ( z ) 的选择 激活函数g(z)的选择 激活函数g(z)的选择
参数初始化
· 为什么要随机初始化权重
权重初始化随机,防止因相同变化始终相同
如果在初始时将两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。
在初始化的时候,W参数要进行随机初始化,不可以设置为0。b因为不存在上述问题,可以设置为0。
以2个输入,2个隐藏神经元为例:
W = n p ⋅ r a n d o m ⋅ r a n d n ( 2 , 2 ) ∗ 0.01 W=np \cdot random \cdot randn(2,2)*0.01 W=np⋅random⋅randn(2,2)∗0.01
b = n p ⋅ z e r o s ( ( 2 , 1 ) ) b=np \cdot zeros((2,1)) b=np⋅zeros((2,1))
·初始化权重的值选择
在tanh中初始权重要小一点,使其在0附近,是激活函数变化敏感的区域
这里将W的值乘以0.01(或者其他的常数值)的原因是为了使得权重W初始化为较小的值,这是因为使用sigmoid函数或者tanh函数作为激活函数时,W比较小,则Z=WX+b所得的值趋近于0,梯度较大,能够提高算法的更新速度。而如果W设置的太大的话,得到的梯度较小,训练过程因此会变得很慢。
ReLU和Leaky ReLU作为激活函数时不存在这种问题,因为在大于0的时候,梯度均为1。