美文网首页
零基础入门深度学习(3)

零基础入门深度学习(3)

作者: 青椒rose炒饭 | 来源:发表于2019-08-04 18:36 被阅读0次

原文地址:零基础入门深度学习(3) - 神经网络和反向传播算法

这篇是前三篇和后三篇过渡的分水岭,我也不保证敢说自己也看明白了。一遍看一遍写自己的理解有助于思考。



前面已经学习过了感知器和线性单元,区别主要是激活函数不同。神经网络就是这种小单元按照一定的规则连接起来形成的网络。

神经元

本质上和感知器是一样的,但是感知器的激活函数是分段函数,神经元的激活函数的sigmoid函数或者tanh函数,如图:


计算这个神经元的输出和感知器计算一样,权值,输入相乘相加,作为sigmoid的参数计算输出。
y=sigmoid(\vec{w}^T\centerdot\vec{x})\qquad(式1)
sigmoid函数值域(0,1),是一个非线性的函数
sigmoid的函数图像

神经网络是啥

神经网络

如图由多个神经元全连接形成神经网络,全连接说的是下一层和的单个节点和上一层的所有节点都有连接。
最左侧是输入层,中间是隐藏层,可以是很多层,最右边是输出层。神经网络的宽度就是输入输出层向量的长度,深度就是有多少层。节点之间的连线都有一个权值。

计算神经网络的输出

实际上是输入向量到输出向量的一个函数,
\vec{y} = f_{network}(\vec{x})
给各个节点以及边标上符号,方便说明计算过程,

神经网络
输入向量的维度必须和输入层的节点数相同,计算a4的值:
\begin{align} a_4&=sigmoid(\vec{w}^T\centerdot\vec{x})\\ &=sigmoid(w_{41}x_1+w_{42}x_2+w_{43}x_3+w_{4b}) \end{align}
式子中的w_{4b}是偏置项,式子中需要使用sigmoid函数神经元的激活函数。从上面可以看出神经网络的输出向量长度和输出层节点数相同。其他节点的计算也是参照上面这样计算。

神经网络的矩阵表示

就说这个网络吧。

神经网络
这个我觉得使用右乘的方式比较好理解,但是每一次的计算结果都需要做一次转置才好理解。还是参照原文的采用左乘理解。
\vec{a}= \begin{bmatrix} a_4 \\ a_5 \\ a_6 \\ a_7 \\ \end{bmatrix} = sigmoid( \begin{bmatrix} w_{41},w_{42},w_{43},w_{4b} \\ w_{51},w_{52},w_{53},w_{5b} \\ w_{61},w_{62},w_{63},w_{6b} \\ w_{71},w_{72},w_{73},w_{7b} \\ \end{bmatrix}* \begin{bmatrix}x_1\\x_2\\x_3\\1\end{bmatrix})
相同的道理,在计算y_1,y_2的时候,在左边乘节点8,9的权值矩阵,也是按照行排列。
\begin{bmatrix} y_1 \\ y_2 \\ \end{bmatrix} = sigmoid(\begin{bmatrix} w_{84},w_{85},w_{86},w_{87} ,w_{8b}\\ w_{94},w_{95},w_{96},w_{97},w_{9b} \\ \end{bmatrix}* \begin{bmatrix} a_4 \\ a_5 \\ a_6 \\ a_7 \\ 1 \end{bmatrix} )
嗯,就是这个样子,每次计算完一层的输出就需要扩展一个 1 。

神经网络的训练

神经网络中能够通过训练得来的只有权重,至于网络的深度,连接方式,每层的节点数等,只能是通过人为设定,我们称之为超参数。
神经网络的训练算法反向传播算法(back propagation)

神经网络
假设每个训练样本为(\vec{x},\vec{t})其中\vec{x}为样本的特征,\vec{t}为样本的目标值。
根据上一节的算法,用样本特征\vec{x}计算每个隐藏层节点的输出a_i,以及每个节点的输出y_i
下面使用\delta_i表示每个节点的误差。
  • 输出层节点的误差:
    \delta_i=y_i(1-y_i)(t_i-y_i)
    对于节点 i y_i是使用样本(\vec{x},\vec{t})种的特征进行计算输出的结果。当样本为(x_1,t_1)输出为y_1的时候的误差为:\delta_8=y_1(1-y_1)(t_1-y_1)
  • 隐藏层节点的误差
    \delta_i=a_i(1-a_i)\sum_{k\in{outputs}}w_{ki}\delta_k
    a_i为节点的输出值,w,\delta为下一层节点的权值和误差。例如几点4的误差:
    \delta_4=a_4(1-a_4)(w_{84}\delta_8+w_{94}\delta_9)
  • 更新每个链接的权值
    w_{ji}\gets w_{ji}+\eta\delta_jx_{ji}
    \eta为学习效率,\delta为节点的误差项,x为当前节点节点的输出
    例如w_{84}这条连接权重的更新
    w_{84}\gets w_{84}+\eta\delta_8a_{4}

反向传播算法的内容差不多就是这个样子的了,至于推导去看原文吧!这里就不用看了,我们理解了神经网络更重要。上面这三个就死记硬背吧!

梯度检查

用于判断神经网络是否正确。机器学习的套路,首先确定神经网络的目标函数,然后用梯度下降优化算法求目标函数最小的时候的参数值。求解出来的就是参数的调整规则了。
目标函数,好像目标函数都是整个网络中节点的误差,如本文的这个神经网络
E_d\equiv\frac{1}{2}\sum_{i\in outputs}(t_i-y_i)^2
梯度检查就是用下面的式子计算梯度和程序计算出整个网络误差对权值的偏导数,然后计算梯度,将此梯度和程序计算出的梯度进行比较,两者相差非常小则说明程序是正确的:
\frac{\partial{E_d(w_{ji})}}{\partial{w_{ji}}}\approx\frac{f(w_{ji}+\epsilon)-f(w_{ji}-\epsilon)}{2\epsilon}

自我感觉梯度就是偏导再乘一个w的极小变化量。

相关文章

网友评论

      本文标题:零基础入门深度学习(3)

      本文链接:https://www.haomeiwen.com/subject/qppydctx.html