Neural Networks
1. 引入原因
简单的逻辑回归并不是一个在 n 很大时学习复杂的非线性假设的好办法(计算量过大)。
2. 初步认识
E.g. 输入一个28*28像素的表格,输出一个0-9之间的个位数
输入图像的每一个像素分别代表每一个神经元,其中装着的数字代表对应像素的灰度值,叫做“激活值(Activation)”
参数展开:将28*28的矩阵转换成向量作为第一层激活值(中间为隐藏层),经过逐步训练,得到结果。
W:权重,每一条线上均赋有权重值。若果想表示一区域,可将其余区域的权重值设为0.
b:偏置。当w*a(i) > 0时,仍不想激发,此时可以设置偏置值。
Neural Networks Learing
总体步骤:
1.随机初始化权重
2.正向传播求出预测函数 h
3.计算代价函数 J
4.反向传播计算 J(θ) 对 θ 的偏导
5.梯度检测
6.使用梯度下降算法或者高级优化算法得到 θ,使得代价函数最小。
1. Random initialization(随机初始化)
Set initialTheta = zeros(n,1) 在逻辑回归是可用的,但在神经网络中是不允许的(对训练起不到任何作用,会导致所有的隐藏单元都以相同的函数作为输入,高度冗余)。
如果你把权重都初始化为 0,那么由于隐含单元开始计算同一个函数,所有的隐含单元就会对输出单元有同样的影响。一次迭代后同样的表达式结果仍然是相同的,即隐含单元仍是对称的。通过推导,两次、三次、无论多少次迭代,不管你训练网络多长时间,隐含单元仍然计算的是同样的函数。
方法(将权重随机初始化为接近 0 的数,范围在[-ε,ε]之间):
?[1] = ??.??????.?????(2,2) ∗ 0.01 (根据需求设置值)
?[1] = ??.?????((2,1))
?[2] = ??.??????.?????(2,2) ∗ 0.01 , ?[2] = 0为什么需接近0:
我们通常倾向于初始化为很小的随机数。如果?很大,那么你很可能最终停在(甚至在训练刚刚开始的时候)?很大的值,这会造成 tanh/Sigmoid 激活函数饱和在龟速的学习上。
2. Cost function(对比logistic回归)
Σ(k=1,K)项:k个输出单元之和(相比logistic仅一个输出)
标准化项(所有层的 θ):
Σ(l=1,L)表示层数。θ^l表示从 l 层到 l+1 层的映射
Σ(j=1,S(L+1))表示当前层的第几个激活值
Σ(i=1,S(L))表示激活该值的第几个权重值
3. Backpropagation algorithm(反向传播算法)-梯度下降
Gradient computation
正向传播
反向传播
δ:误差
只需计算到第二层即可,同时不计算偏置项
如果忽略标准化项,偏导数项 = 激活值 * δ
算法流程
1.▲表示所有训练集偏导之和,最后处以 m
2.for循环表示对所有训练集依次进行计算,先正向传播,再反向传播
3.对于j = 0,表示偏置,不需要正则化,及不需要 (+λθ)
4.最后将D带入梯度下降算法或高级优化算法中进行更新 θ,直到取得最小 J
4. Gradient checking(梯度检测)
目的: 确保梯度下降以正确的方式进行
注意:在使用你的代码进行学习之前,重要的是要关掉梯度检验(因为计算量非常大,导致运行速度很慢),同时在检验正确之后,也应立即关掉。
方法
反向传播公式推导
从最后一层的误差计算,误差是激活单元的预测与实际值之间的误差,用δ表示误差。即δ(4)=a(4)−y
对于单个激活单元的代价函数:J(θ)=−ylogh(x)−(1−y)log(1−h(x))
误差计算:
▲推导