斯坦福机器学习笔记四
来源:互联网 发布:中国经济数据统计网 编辑:程序博客网 时间:2024/05/17 21:58
神经网络
当输入变量的特征太多时,线性回归算法和逻辑回归算法的计算负荷会非常大,不能有效地处理这么多的特征,因此需要使用神经网络。神经网络是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。
1、前向传播
如图所示是一个三层的神经网络。第一层是输入层,有3个输入单元,分别是
在神经网络中,
上图中神经网络的激活单元和输出分别是:
a(2)1=g( Θ (1)10x0+ Θ (1)11x1++ Θ (1)12x2+ Θ (1)13x3)
a(2)2=g( Θ (1)20x0+ Θ (1)21x1++ Θ (1)22x2+ Θ (1)23x3)
a(2)3=g( Θ (1)30x0+ Θ (1)31x1++ Θ (1)32x2+ Θ (1)33x3)
hθ(x)=a(3)1=g( Θ (2)10a(2)0+ Θ (2)11a(2)1++ Θ (2)12a(2)2+ Θ (2)13a(2)3)
使用向量化的方法会使得计算更为简便。将上述的栗子向量化。
令:
第一层到第二层之间的计算:
向量化化简得到:
z(2)= Θ (1)X
a(2)=g(z(2))
然后添加
第二层到第三层之间的计算:
化简得到:
z(3)= Θ (2)a2
h θ (x)=g(z(2))
通过上述的栗子,可以得到一个一般的神经网络向量化的式子。
将 x 和 z 向量化,
输入层向隐藏层传递的公式:
z(2)= Θ (1)X
a(2)=g(z(2))
然后添加
隐藏层之间传递的公式:
z(j)= Θ (j−1)aj−1
a(j)=g(z(j))
计算完要为求出的
最后传到输出层的公式为:
h θ (x)=a(j+1)=g(z(j+1))
上述的神经网络的输出层只有一个单元,对应的是二分类问题。神经网络在多分类问题上也有应用。
上图中输出层有 3 个输入单元,两个隐藏层,输出层的 4 个神经元用来表示 4 类,输出的结果为以下四种可能的情形之一,分别表示 1, 2, 3, 4 类。
神经网络的代价函数为:
J( Θ )=−1m[∑mi=1∑Kk=1(y(i)klog(h Θ (x(i)))k+(1−y(i)k)log(1−h Θ (x(i)))k)]+λ2m∑L−1l=1∑sli=1∑sl+1j=1( Θ lji)2
对于多分类问题,它会把所有类的输出与期望值做比较,再求和。
2、反向传播
想要计算使得代价函数最小的权重矩阵Θ ,需要用到梯度下降法。为了计算代价函数的偏导数,引入了反向传播算法,它首先计算的是最后一层的误差,然后再一层一层的反向求出各层的误差,直到倒数第二层。
如图所示的栗子,从最后一层的误差开始计算,误差是激活单元的预测
δ(4)=a(4)−y
再利用这个误差值来计算前一层的误差:
δ(3)= ( Θ (3))Tδ(4)⋅*g′(z(3))
其中 ,
依次类推,
δ(2)=( Θ (2))Tδ(3)⋅*g′(z(2))
由于训练集是一个矩阵而非向量,需要计算每一层的误差单元来计算代价函数的偏导数。
Δ (l)i,j:= Δ (l)i,j+aljδl+1i
最后的到代价函数的偏导数为:
D(l)i,j:=1m( Δ (l)i,j+λ Θ li,j) , if j≠0
D(l)i,j:=1m Δ (l)i,j , if j=0
3、梯度检测
当对一个较为复杂的模型使用梯度下降算法时,可能会存在一些不易察觉的错误,为了避免这个问题,引入了梯度的数值检验。使用在高数里对导数的定义,即某点的梯度等于在代价函数上沿着切线方向选择两个非常近的点,然后计算两个点的平均值用以估计梯度。
∂∂θ1J(θ)≈J(θ1+ε,θ2,θ3…θn)−J(θ1−ε,θ2,θ3…θn)2ε
∂∂θ2J(θ)≈J(θ1,θ2+ε,θ3…θn)−J(θ1,θ2−ε,θ3…θn)2ε
⋮
∂∂θnJ(θ)≈J(θ1,θ2,θ3…θn+ε)−J(θ1,θ2,θ3…θn−ε)2ε
一般ε 会取一个非常小的值,例如
实现梯度检测的步骤一般是:先使用BP算法计算梯度,再使用数值算法(梯度检测算法)计算梯度,确定两个值相等或近似,则认为算法计算正确。为了提高算法的效率,在已经确保算法正确的前提下,在迭代训练开始之前,关掉梯度检查,否则程序会非常慢。
4、随机初始化
任何算法的参数都需要初始化,一般算法都是初始化所有的参数为0,如果神经网络的参数也都初始化为0,这就会导致第二层的所有激活单元都会有相同的值,因此要对神经网络随机初始化。
通常初始参数为正负ε 之间的随机数,假设随机初始化一个尺寸为10*11的参数矩阵,代码如下:
5、网络结构的选择
输入层的单元个数等于输入的训练样本 X 的特征数;输出层的单元个数等于最后想要得到的分类的类数; 隐藏层个数的选择:一般默认使用一层隐藏层,当然正则化后的大型神经网络往往效果更好。如果使用的隐藏层数目超过 1,则每个隐藏层的单元数应该相等。一般来说,隐藏层的单元数越多越好,但是过多的隐藏层会导致大量的计算。同时,隐藏层的单元数还应该和输入层的维度、特征元素数目相匹配,一般来说,隐藏层的单元数会稍微大于输入层的特征数目。使用较小的神经网络计算量小,但是容易发生欠拟合。大型神经网络容易出现过度拟合,在这种情况下,可以使用正则化(增加 λ),以解决过度拟合。
总结一下神精网络算法的实现步骤:
第一步,需要对参数进行随机初始化;
第二步,利用正向传播方法计算所有的
第三步:写出代价函数 J;
第四步:利用反向传播算法计算所有的偏导数;
第五步:利用数值检验方法检验这些偏导数;
第六步:使用优化算法来最小化代价函数。
- 斯坦福机器学习笔记四
- 斯坦福机器学习公开课笔记(四)--规格化
- 斯坦福机器学习笔记一
- 斯坦福机器学习笔记二
- 斯坦福机器学习笔记三
- 斯坦福机器学习笔记五
- 斯坦福机器学习笔记六
- 斯坦福机器学习笔记七
- 斯坦福机器学习笔记八
- 斯坦福机器学习笔记九
- 斯坦福机器学习笔记十
- 斯坦福机器学习笔记十一
- 斯坦福机器学习笔记十二
- 斯坦福CS231N机器学习笔记
- 斯坦福机器学习笔记_1
- 斯坦福机器学习笔记01
- 斯坦福机器学习课程 Exercise 习题四
- 斯坦福机器学习-week 2 学习笔记
- static_cast, dynamic_cast, const_cast, reinterpret_cast
- F
- LeetCode-169.229. Majority Element II (JAVA)主要元素
- Searching and Sorting
- 199. Binary Tree Right Side View
- 斯坦福机器学习笔记四
- Linux必学的60个命令(自己文档备份)
- Java for Web学习笔记(五七):Spring框架简介(6)代码设置
- PHP设计模式系列(八):建造者模式
- CSS层叠样式表重点整理
- 算法导论复习(3) 堆排序
- linux搭建SSR
- Hibernate知识整理4---关系映射及持久化对象
- 解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题