文章目录
一、为什么需要神经网络
已经有了线性回归和逻辑回归为什么还需要神经网络?
许多问题的解决需要复杂的非线性假设。
现实生活中,影响房价的因素有很多,可能高达上百个特征。假设特征数 n = 100 n=100 n=100,算上所有的一次项和二次项一共有5000多的特征,由于数量过多,最后的结果有可能是过拟合的。此外,在处理这么多项时,运算量也很大。
灰色图像在计算机的视野里就是一个个像素点,每个像素点是一个0-255的值。总的来说就是一个矩阵。
对于图像分类问题来说,特征就是图像上的每个像素点的灰度值(灰色图片)或者RGB值(彩色图片)。一幅很小的50px*50px的灰色图片也有2500个特征,如果算上所有二次项特征,所有特征量将迅速膨胀,将会有30000个特征,计算成本太高。因此只是包括平方项或者立方项特征简单的logistic回归算法并不是一个在n很大时学习复杂的非线性假设。
二、前向传播神经网络基本模型构建
(1)前向传播模型展示
如何表示神经网络?运用神经网络时,我们该如何表示我们的假设或模型。
在神经网络中,激活函数是指非线性函数
g
(
z
)
=
1
1
+
e
−
z
g(z)= \frac{1}{1+e^{-z}}
g(z)=1+e−z1。
θ
\theta
θ为模型的参数
计算向量化:
如果遮住神经网络的前半部分,剩下的一部分本质上就是逻辑回归,只不过输入逻辑回归的特征不是原始的特征 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3,而是是通过隐藏层计算得到的数值 a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3
原始输入也可以是 x 1 x 2 , x 2 x 3 x_1x_2,x_2x_3 x1x2,x2x3,这个算法可以灵活地尝试快速学习任意的特征项。
这个网络有两个隐藏层,既不是输入层也不是输出层。
前向传播小结:
从输入层的激活项开始,前向传播到第一层隐藏层,然后传播到第二隐藏层,
最终到达输出层,并且以上计算可以向量化。
(2)例子
- 非线性分类问题:XOR/XNOR:
如何构建一个神经网络来拟合这个XNOR运算的数据集呢?
神经网络可以计算像XNOR这样复杂的函数。
层数越往后,计算出来的函数越复杂。
三、用神经网络解决多分类问题
(1)问题引入
输出的值用向量表示。
(2)拟合神经网络参数的代价函数
神经网络是当下最强大的学习算法之一,接下来我们来讨论在给定训练数据集时,为神经网络拟合参数的学习算法。
对于一个二分类的问题,输出层的单元数目是1;对于一个多分类的问题,输出层的单元数大于等于3。
二元分类(1 or 2)可以转化为一元分类的是否问题(0 or 1),但三元问题及以上就必须保留 3 个或以上的分类维度了
二分类的话,1和0两个数字就可以代表两个类别;而不需要用[1,0]和[0,1]代表两个类别。一般来说,分类个数和神经网络输出单元个数相同,以方便one-hot编玛。
一共有
m
m
m个样本,每个样本有
k
k
k个输出,因此是二重累加。
(3)最小化代价函数的算法——反向传播算法
把前向传播向量化,使得可以计算神经网络结构里的每一个神经元的激活值。
为了计算导数项,我们将采用反向传播算法(back propagation)
用微积分可以推导:
∂
∂
Θ
J
(
Θ
)
=
a
j
(
l
)
δ
i
(
l
+
1
)
\frac{\partial}{\partial \Theta}J(\Theta)=a_j^{(l)}\delta_i^{(l+1)}
∂Θ∂J(Θ)=aj(l)δi(l+1)
没有考虑正则化项。
看了这张ppt我对反向传播算法和最小化代价函数的关系还是不清晰。为什么需要反向传播算法来推导代价函数的关于参数 θ \theta θ的偏导数项来完成梯度下降呢?
伪代码实现:
反向传播和前向传播十分相似,只是这两个算法的计算方向不一样,在反向传播算法中,是从右往左进行运算,两个算法的计算方式十分类似。
(4)梯度检验——从数值上计算梯度来检验反向传播的实现是否
神经网络与梯度下降或者其他算法一起运行时,有的时候虽然程序存在一些bug,但它确实能正常运行,并且代价函数 J ( θ ) J(\theta) J(θ)在每次梯度下降的迭代中不断减小,但最后得到的神经网络模型将比没有bug的情况下高出一个量级。
梯度检验可以解决几乎所有类似的问题,它可以保证我们的前向传播和反向传播完全正确地运行。
可以通过以上等式从数值上估算代价函数
J
J
J关于任何参数的偏导数
用这种估算方法进行梯度检验进行了两次前向传播,计算量会很大,而且只是估算。因此该方法只适用于检验不用于求偏导数。
(4)随机初始化(random initialization)
当我们执行梯度下降算法或者其他高级优化算法时,我们需要为 θ \theta θ设置初始值,对于高级优化算法,它默认你会为变量 θ \theta θ提供一些初始值。对于梯度下降算法,我们也需要对 θ \theta θ进行初始化,初始化后我们就会可以通过一步步梯度下降来最小化代价函数 J J J。
如何对 θ \theta θ设置初始值呢?有一种想法是将 θ \theta θ的初始值全都设为0。在逻辑回归中这种做法是被允许的,但实际上在训练网络时将所有参数初始化为0起不到任何作用。
原因:
所有的隐藏单元都在计算相同的特征,所有的隐藏单元都在以相同的函数作为输入,这是一种高度冗余的现象,这意味着最后的逻辑回归单元只能得到一个特征,因为所有的单元都一样,阻止了神经网络去学习有趣的东西。因此在神经网络的参数初始化上要采用随机初始化的思想。
对称权重问题:所有的权重都是一样的
随机初始化可以解决对称问题
小结:
为了训练神经网络,应首先将权重随机初始化为一个接近0的,范围在
(
−
ϵ
,
ϵ
)
(-\epsilon,\epsilon)
(−ϵ,ϵ)之间的数,然后进行反向传播,在进行梯度检验,最后使用梯度下降或其他高级优化算法来最小化代价函数
J
J
J。
四、训练神经网络全过程回顾
(1)选择神经网络的结构achitecture
(2)训练一个神经网络
- 随机初始化权重
- 执行前向传播算法: x ( i ) − > h Θ ( x ( i ) ) x^{(i)}->h_{\Theta}(x^{(i)}) x(i)−>hΘ(x(i))
- 计算出代价函数 J ( Θ ) J(\Theta) J(Θ)
- 执行反向传播算法计算偏导数项
∂
∂
Θ
j
k
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{jk}^{(l)}}J(\Theta)
∂Θjk(l)∂J(Θ)。使用反向传播时,要用for循环对所有训练样本进行遍历(有更复杂更高级的方法)
- 用梯度检测来比较已经用反向传播算法计算得到的偏导数值和用数值方法得到的估计值进行比较
- 用一个最优化算法比如梯度下降算法或更高级的优化算法(LBFGS算法、共轭梯度法或其他内置到fminunc函数中的方法),将这些算法和反向传播算法相结合:
反向传播计算出偏导项的值,用优化算法求出可以最小化代价函数 J ( Θ ) J(\Theta) J(Θ)的 Θ \Theta Θ。
注:对于神经网络,代价函数 J ( Θ ) J(\Theta) J(Θ)是一个非凸函数,理论上可能收敛到局部最小值