浅层神经网络概述
[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+e−z1
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+e−zez−e−z
- 总体上都
优于
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(1−a) 见上文
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+1−a1−y×a(1−a)=a−y
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