-
- 词汇
- 学习目标
- 1.Neural Network Overview
- 2.Neural Network Representation
- 3.Computing a Neural Network’s Output
- 4.Vectorizing across multiple examples
- 5.Explanation for Vectorized Implementation
- 6.Activation functions
- 7.why do you need non-linear activation function?
- 8.Derivatives of activation functions
- 9.Gradient descent for Neural Networks
- 10.Backpropagation intuition(optinal)
- 11.Random Initialization
- 12.python三种矩阵乘法的对比区别
词汇
justification n. 理由;辩护;认为有理,认为正当;释罪
prime n.角分号(g’(z))
shallow 浅层
学习目标
Understand hidden units and hidden layers
Be able to apply a variety of activation functions in a neural network.
Build your first forward and backward propagation with a hidden layer
Apply random initialization to your neural network
Become fluent with Deep Learning notations and Neural Network Representations
Build and train a neural network with one hidden layer.
1.Neural Network Overview
回顾一下,逻辑回归的过程如下图:
一个简单的神经网络结构如下图,其中的每一个节点所做的工作与上图的逻辑回归一样。
z=w∗x+b,a=σ(z)
z
=
w
∗
x
+
b
,
a
=
σ
(
z
)
权重计算后进行激活。
在上图这样简单的两层网络中,相连的两个神经元所进行的计算展开后,如下图。
[第一层]权重计算->激活->[第二层]权重计算->激活
2.Neural Network Representation
一个简单的神经网络结构如上图。
‘隐藏层’是指在训练集中,中间的那一层节点的计算后的值并没有对应的监督学习中的样本标签进行对比。
在这样一个网络中,
w[1]=(4,3),b[1]=(4,1);w[2]=(1,4),b[2]=(1,1)
w
[
1
]
=
(
4
,
3
)
,
b
[
1
]
=
(
4
,
1
)
;
w
[
2
]
=
(
1
,
4
)
,
b
[
2
]
=
(
1
,
1
)
3.Computing a Neural Network’s Output
如下图,每一个神经元其实与逻辑回归类似,进行一个权值计算再进行一次激活。
每一个神经元共享一个偏置量b。
a[0]=x=(3,1)
a
[
0
]
=
x
=
(
3
,
1
)
w[1]=(4,3),b[1]=(4,1)
w
[
1
]
=
(
4
,
3
)
,
b
[
1
]
=
(
4
,
1
)
z[1]=w[1]∗a[0]+b=(4,1)
z
[
1
]
=
w
[
1
]
∗
a
[
0
]
+
b
=
(
4
,
1
)
a[1]=σ(z[1])=(4,1)
a
[
1
]
=
σ
(
z
[
1
]
)
=
(
4
,
1
)
w[2]=(1,4),b[2]=(1,1)
w
[
2
]
=
(
1
,
4
)
,
b
[
2
]
=
(
1
,
1
)
z[1]=w[2]∗a[1]+b[2]=(1,1)
z
[
1
]
=
w
[
2
]
∗
a
[
1
]
+
b
[
2
]
=
(
1
,
1
)
a[2]=σ(z[2])=(1,1)
a
[
2
]
=
σ
(
z
[
2
]
)
=
(
1
,
1
)
4.Vectorizing across multiple examples
上一小节中我的代码笔记其实已经按vectorization的方式来计算了。再表述一下:
X有m个样本,n个特征,X=(n,m)
W[1]=(4,n),第二层包含4个神经元;b[1]=(n,1)
W
[
1
]
=
(
4
,
n
)
,
第
二
层
包
含
4
个
神
经
元
;
b
[
1
]
=
(
n
,
1
)
Z[1]=W[1]∗X+b[1]=(4,m),可以将这里的4替换成其他设定下的神经元个数
Z
[
1
]
=
W
[
1
]
∗
X
+
b
[
1
]
=
(
4
,
m
)
,
可
以
将
这
里
的
4
替
换
成
其
他
设
定
下
的
神
经
元
个
数
这Z,的rows代表不同的训练样本,每一个column代表一个训练样本中不同的神经元输出(在输入层,表达的是特征)。
5.Explanation for Vectorized Implementation
6.Activation functions
几种激活函数的对比
激活函数 | 公式 | 图形 | 特性 | 应用领域 |
---|---|---|---|---|
sigmoid | a=11+e−z a = 1 1 + e − z | ![]() | 值域:(0,1);导函数值域:(0,0.25] | 一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数。较少被使用 |
tanh (双曲正切函数) | a=ez−e−zez+e−z a = e z − e − z e z + e − z | ![]() | 值域:(-1,1);导函数值域:(0,1] | 二分类问题 |
Relu | a=max(0,z) a = m a x ( 0 , z ) | ![]() | 值域:(0,+∞);导函数值域:0,1 | z为负数时,导数会为0.z<0时激活值=0,容易出现死亡神经元。广泛使用 |
Leaky Relu | a=max(0.01,z) a = m a x ( 0.01 , z ) | ![]() | 值域:(-∞,+∞);导函数值域:0.01,1 | relu的改进版,广泛使用 |
7.why do you need non-linear activation function?
为什么神经网络非要使用激活函数?
如果没有激活函数进行“非线性”化,那么无论神经网络的隐藏层有多少层,都只是输入值到输出值的线性变换。等同与机器学习中线性回归。
那么就没有必要设立隐藏层。
而线性回归是无法对现实中的大多数问题进行有效分类的。
8.Derivatives of activation functions
激活函数 | 导函数 | 图形 | 特性 |
---|---|---|---|
sigmoid(z) |
g′(z)=dg(z)dz
g
′
(
z
)
=
d
g
(
z
)
d
z
=g(z)(1−g(z)) = g ( z ) ( 1 − g ( z ) ) | ![]() | 1 |
tanh(z) | g′(z)=1−(tanh(z))2 g ′ ( z ) = 1 − ( t a n h ( z ) ) 2 | ![]() | tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。 与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好 |
ReLU(z) | g′(z)={0,ifz<01,ifz>=0 g ′ ( z ) = { 0 , i f z < 0 1 , i f z >= 0 | ![]() | ReLU 的优点: 使用 ReLU 得到的 SGD 的收敛速度会比 sigmoid/tanh 快很多. ReLU 的缺点: 训练的时候很”脆弱”,很容易就”die”了 [例如,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0. 如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了。] |
LeakyReLU(z) g(z)=max(0.01z,z) | g′(z)={0.01,ifz<01,ifz>=0 g ′ ( z ) = { 0.01 , i f z < 0 1 , i f z >= 0 | ![]() | 3 |
激活函数很多,课程中只列出了其中常用的4种。另外到目前为止因为各种用途,常见的激活函数至少有26种之多。激活函数主要是根据自身的导函数特性而被不同的场合使用。关于各种激活函数的详细解释,可以参考:从ReLU到Sinc,26种神经网络激活函数可视化
9.Gradient descent for Neural Networks
10.Backpropagation intuition(optinal)
参考自己之前的笔记:Machine Learning |吴恩达 (2-2)—神经网络,反向传播推导(超简单版)
11.Random Initialization
如果初始化权重为零将发生什么?
同一层上的神经元因为权重w都为0,或都等于同一个值。(b的权重都为0,影响并不大),那么无论输入值是什么,这一层上的神经元的输出都一样,并且方向传播时,每个神经元的梯度也是一样的。那么权值更新后的w还是一样的。这些神经元干着重复的工作,我们只需要其中一个神经元就能实现相同的功能。这种情况被称为“对称失效”。
一种解决方式:np.random.randn((2,2))*0.01(适用于sigmoid,tanh,让权重初始值在0附近并非常小)
12.python三种矩阵乘法的对比区别
python中有array,matrix两种类型可以表达矩阵形式,又有(*),dot(),multiply()三种乘法,很让我混淆。
操作函数 | 数组 | 矩阵 |
---|---|---|
np.multiply() | 点乘 | 点乘 |
np.dot() | 秩=1:对应位置相乘,再求和 秩>1:矩阵乘 | 矩阵乘 |
星号(*)乘法 | 点乘 | 矩阵乘 |