版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hemk340200600/article/details/85222567
非线性问题
对于一张汽车图片,如何将其识别为汽车呢?我们人可能看一眼就能识别出来,但是如何让计算机也拥有同样的技能呢?我们知道,一张图片在计算机中都是以像素矩阵的形式存储的,无论是一辆汽车,还是一辆飞机,在计算机中都是一个个矩阵,并无法直观地感受到这个矩阵代表是汽车还是飞机。用逻辑回归似乎也无法分出一个很好的决策边界。为了尝试解决这种问题,学者们模仿人的大脑,提出了神经元模型的概念。
神经元模型
输入特征x1,x2,x3,……到若干个神经元中,神经元记过计算后输出结果,这个结果再经过非线性函数
hθ(x)=activation(x)。这里的激活函数可以是
sigmoid(x)=1+e−θTx1,也可以是其他。
激活函数
对于非线性函数g(z)的一个学术称呼。如之前学习过的
h(x)=1+e−x1就是一个激活函数,也叫做Sigmoid函数。它的作用是让整个模型可以适应非线性的情况。
模型概念介绍
输入层的每一个神经元对应一个样本特征的输入,比如
x0,x1,x2,x3等特征。
输出层的神经元输出模型的输出结果,通常只有一个神经元。
隐藏层的神经元并不存在于模型中,通常用来学习隐藏的特征。
对于输入层的神经元,接受特征输入后直接输出到所有隐含层神经元,不做任何处理。
对于每个隐藏层的神经元,接受所有的特征输入后,经过权重矩阵的线性组合后,经过激活函数得到相应的输出。
对于输出层的神经元,接受所有来自隐藏层的输出后,经过权重矩阵的线性组合后,经过激活函数得到相应的输出。
前向传播算法
其实就是一步一步计算的过程。
类似逻辑回归,但是逻辑回归的输入是特征,而这里的输入是隐藏元的输出。而隐藏元的输出是通过特征进行学习得到的。
ai(j)表示第j层的第i个神经元,
θ(j)表示从第j到第j+1层的权重矩阵
对于输入层有4个神经元,隐藏层有4个神经元,输出层有1个神经元,兵并且层与层之间是全连接的情况,有如下的公式
a1(2)=g(θ10(1)x0+θ11(1)x1+θ12(1)x2+θ13(1)x3)a2(2)=g(θ20(1)x0+θ21(1)x1+θ22(1)x2+θ23(1)x3)a3(2)=g(θ30(1)x0+θ31(1)x1+θ32(1)x2+θ33(1)x3)hθ(x)=a1(3)=g(θ10(2)a0(2)+θ11(2)a1(2)+θ12(2)a2(2)+θ13(2)a3(2))
算法推导
sl表示神经网络第l层的神经元个数,
hθ(x)是K维列向量,令
(hθ(x))k表示第k个输出,则神经网络的损失函数如下:
J(W,b;x,y)=m1i=1∑m(21∣∣hW,b(x(i)−y(i))∣∣2)+2λl=1∑L−1i=1∑slj=1∑sl+1(Wji(l))2
梯度下降法中每一次迭代都按照如下公式对W和b进行更新:
Wij(l)=Wij(l)−α∂Wij(l)∂J(W,b)
bi(l)=bi(l)−α∂bi(l)∂J(W,b)
其中的关键步骤是计算偏导数。
∂Wij(l)∂J(W,b)=[m1i=1∑m∂Wij(l)∂J(W,b;x(i),y(i))]+λWij(l)
∂bi(l)∂J(W,b)=[m1i=1∑m∂bi(l)∂J(W,b;x(i),y(i))]
这里需要使用反向传播算法,它是计算偏导数的有效方法。
反向传播算法
给定一个样本,我们首先对它进行前向传播,算出网络中所有的激活值以及左后的预测值。令
Layeri表示神经网络的第i层,no表示输出层,
δi(l)表示第l层的第i个节点的误差(也称为“残差”),
αi(l)表示第l层第i个节点的激励值。
反向传播算法的流程如下:
- 对样本
<x(i),y(i)>输入到网络中,进行前向传播,得到
Layer2,Layer3,...直到输出层
Layerno的激活值。
- 对于最后一层,我们使用
δno=∂zi(no)∂21∣∣y−hθ(x)∣∣2=−(yi−ai(no))⋅f′(zi(no))
- 对于
l=no−1,no−2,no−3...的每一层,有
δi(l)=(∑j=1sl+1θjilδj(l+1))f′(zi(l))
- 计算偏导数,
∂θijl∂J(θ)=aj(l)δi(l+1)
对于上面第二步的公式,推导如下:
δino=∂zi(no)∂21∣∣y−hθ(x)∣∣2=∂zi(no)∂21j=1∑Sno(yj−ajno)2=∂zi(no)∂21j=1∑Sno(yj−f(zjno))2=−(yi−f(zino))⋅f′(zino)=−(yi−aino))⋅f′(zino)
对于上面第三步的公式,推导如下:
δi(no−1)=∂zi(no−1)∂21∣∣y−hθ(x)∣∣2=∂zi(no−1)∂21j=1∑Sno(yj−ajno)2=21j=1∑Sno∂zi(no)∂(yj−f(zjno))2=j=1∑Sno−(yj−f(zjno))⋅f′(zjno)∂zi(no−1)∂zj(no)=j=1∑Snoδjno∂zi(no−1)∂zj(no)=j=1∑Sno(δjno⋅∂zi(no−1)∂k=1∑Sno−1f(zkno−1))⋅θjkno−1)=j=1∑Snoδjno⋅θjino−1⋅f′(zino−1)=(j=1∑Snoθjino−1δjno)⋅f′(zino−1)
将no和no-1的关系换为l和l+1的关系得
δi(l)=(j=1∑Sl+1θji(l)δj(l+1))⋅f′(zi(l))
在上述流程中,令激活函数f(x)=Sigmoid(x)函数,那么
f′(zi(l))=ai(l)(1−ai(l)),而其中的
ai(l)是在前向传播的过程中就计算出来了的。可以很方便地直接得到。最终我们将利用残差计算出了偏导数,更新了权重矩阵里面的每个权重的值,从而完成了一次反向传播。最终我们通过梯度下降算法不停迭代,降低代价函数的值,从而得到最终的神经网络。