吴恩达深度学习笔记(一)
笔记前言:距离开学过去也有两个半月了,浮躁期也渐渐过去,两个半月糊里糊涂的接触了些机器学习/深度学习的知识,看了不少资料,回来过头来看还是觉得看吴恩达老师的课受益最深,深入浅出,在此也强烈推荐每一个想进入机器学习领域又苦于无从入手的同学以该视频课程作为入门。上周做了组内的第一次汇报便是讲神经网络,准备过程中发现之前自认为弄懂的知识点甚是模糊,然后又想想这几个月的学习,大都变得混乱与模糊,故准备以写博客的方式帮助自己理清知识点。距看完第一门课已经将近两个月,故此笔记并不包含课程中的每个细节,只把重要的知识点罗列出来,并加上自己的理解。
关于笔记内容
本笔记主要是关于反向传播算法(BP)的推导,至于视频中有关数学内容并未列出。关于反向传播算法主要包含两个关键词:梯度下降与链式求导,课程中吴恩达老师由浅入深,从单神经元单样本的梯度下降讲起(课程2.9),接着是单神经元多样本的梯度下降(课程2.10),然后引入向量作为优化计算的工具并介绍了其python实现(2.11-2.17);接着第三周介绍了浅层神经网络—一个单隐层的的神经网络,推导了单隐层神经网络的梯度下降,值得一提的是由于引入了向量化表示,这块学习时曾遇到过困难,主要是对矩阵求导不熟悉;第四周介绍了多隐层神经网络(深层神经网络)。本篇博文的内容为课程前两周的内容—只涉及感知机的推导,即只有输入层和输出层
单神经元单样本的梯度下降
注:不管是哪种形式的梯度下降的计算,首先必须把前向传播过程的计算写下来,才可以进行后面的反向传播下降计算。 这里我们假设输入样本的特征维度为2。再次强调本篇博文的推导都是针对如上图所示的模型推导,其神经元模型如下图。 这里的
θ=0
θ
=
0
,
f
f
为sigmoid函数(虽然模型简单,但是弄懂了这部分推导,后面的多层神经网络自然水到渠成)
前向传播:
反向传播:
参数更新:
单神经元多样本的梯度下降
这里我们继续假设输入样本的特征维度为2,关于多样本的误差函数定义为每个样本产生的误差求和取均值即:
J(w,b)=1m∑mi=1L(y^(i),y(i))−−−−−−−−−−(1.1)
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
−
−
−
−
−
−
−
−
−
−
(
1.1
)
参数更新公式:
直观理解参数更新公式,对 w,b w , b 的求导其实分为了m步进行,每一步互相 独立,求导步骤同 单神经元单样本的求导
前向传播:
反向传播:课程中给出的伪代码如下
注:对于误差函数 J J 的求和可以放在for循环内第二步的任何位置,因为对的求导与 J J 无关,最后得到的参数更新公式为
向量化梯度下降
涉及到向量(矩阵)时,必须弄清楚每个每个矩阵的维度,弄清楚这个后便对矩阵内部的运算有更清晰的理解,首先我们以一个简单的例子来说明引入向量的作用,以上面求得的(1.5)-(1.7)式为例,我们可以令
X=[x(1)1,x(2)1,⋯x(m)1]
X
=
[
x
1
(
1
)
,
x
1
(
2
)
,
⋯
x
1
(
m
)
]
,令
dZ=[a(1)−y(1),a(2)−y(2),⋯a(m)−y(m)]
d
Z
=
[
a
(
1
)
−
y
(
1
)
,
a
(
2
)
−
y
(
2
)
,
⋯
a
(
m
)
−
y
(
m
)
]
,则用python我们可以做一步运算
dw1=1mnp.dot(X,dZT)
d
w
1
=
1
m
n
p
.
d
o
t
(
X
,
d
Z
T
)
即得到
dw1
d
w
1
,利用二维矩阵
X=
X
=
利用python做 dW=1mnp.dot(X,dZT) d W = 1 m n p . d o t ( X , d Z T ) 便可以同时得到 dW=[dw1dw2]T d W = [ d w 1 d w 2 ] T , db=np.sum(dZ) d b = n p . s u m ( d Z ) ,现对参数向量化来重新推导上面的传播过程:
输入矩阵 X X :
权重矩阵 W W :
偏置 b b :为一个常数
输出矩阵: (1,m) ( 1 , m )
正向传播:
python代码实现
Z = np.dot(w.T,X) + b
A = sigmoid(Z)
反向传播:
python代码实现
db = 1/m*np.sum(dZ)
dw = 1/m*np.dot(X,dZ.T)
python简介
课程中主要介绍了python的广播机制以及关于一维向量初始化时的易错点
广播机制
import numpy as np
A=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(A)
输出
按列求和
print(A.sum(axis=0))
矩阵元素全部加1
print(A+1)
输出
对于其他的运算有类似的广播机制
一维向量初始化易错点
例如初始化一个含有五个高斯随机变量时,必须以如下形式初始化
a=np.random.rand(1,5)
b=np.random.rand(5,1)