0. 前言
茫然中不知道该做什么,更看不到希望。
偶然看到coursera上有Andrew Ng教授的机器学习课程以及他UFLDL上的深度学习课程,于是静下心来,视频一个个的看,作业一个一个的做,程序一个一个的写。N多数学的不懂、Matlab不熟悉,开始的时候学习进度慢如蜗牛,坚持了几个月,终于也学完了。为了避免遗忘,在这里记下一些内容。由于水平有限,Python也不是太熟悉,英语也不够好,有错误或不当的地方,请不吝赐教。
神经网络有非常丰富的资料,在这里只是记录自己学习的过程、内容和心得。
1. 神经网络的表示
首先用一张图来表示多层神经网络的结构,如图1。
图1 神经网络结构图
1.1 符号说明
- 输入向量 x=[x1,x2,…,xn0]T 是一个列向量。
- 标签(label)
y
未在图中表示,它和
x 有相同维度。 - nl 为第L层的神经节点个数。
- W(l)∈Rnl×nl−1 为第L层的权重矩阵。截距 b(l)∈Rnl×1 未在图上表示。
-
Z(l)
表示第L层的活动水平向量,
- Z(l+1)i=Σnlj=1(W(l+1)ij×a(l)j+b(l+1)i) , a(0) 即为输入向量 x
Z(l+1)=W(l+1)×a(l)+b(l+1) ,矢量化表示。
- f(∙) 为激活函数,可以是sigmoid、tanh等。
- a(l)=f(Z(l)) 为第L层的激活向量,即输出向量。
- 若
l
层为输出层,定义假设函数
hW,b(x)=a(l)
1.2 反向传播算法
神经网络的反向传播算法是建立在最速梯度下降基础上的,希望误差的能量函数最小。对于输入向量
x
和标签
我们要找到一个合适的W和b,使 J(W,b;x,y) 最小,即
使用梯度下降法:
α 为学习率。
下面通过推导求 ∇W,∇b 。
令误差项(大部分教材中,都把误差项分配到 l+1 层,但从个人编程的角度理解,把它归入到 l 层更方便)
或矢量化形式:
其中:
若 l 层为输出层,则:
则:
或
(12)式中的“ ∙ ”是向量和矩阵中元素相乘运算符。
若 l 层是隐藏层,我们还需要对
代入(6)式,有
矢量化后有
至此推导完成。
1.3 批量学习的函数形式
在上一节中
x
是一个向量,如果有m个向量,定义输入矩阵X和标签y:
其中 x(i) 为具有n个特征的列向量, y(i) 为表示类别的标量。
代价函数:
对于梯度
和误差项
1.4 规范化
为了防止过拟合(overfiting),需要对误差函数和W梯度添加L2范式惩罚项。假定网络有L层,
2. 算法描述
重复直到收敛{
- 执行前向传播,得到各层的激活值
- 计算最后一层的
δ
- 反向传播计算各层
δ
- 计算各层W和b的梯度
- 使用梯度下降更新W和b
}