美文网首页工作生活
《python神经网络编程》一

《python神经网络编程》一

作者: sadamu0912 | 来源:发表于2019-06-30 22:44 被阅读0次

线性回归 ,简单的分类器

在概率统计中,其实这就是一个参数估计的问题。我们可以用最小二乘法来搞定这个参数。用矩估计,区间估计(不行,这里是得到一个确切的参数)。
这里的分类器,更像是利用贝叶斯估计来计算出参数值。
利用样本数据和模型值的误差值,来不断调整模型的斜率,最终得到很好的一个分类效果。书中
t-y =( A+ \Delta A)x -Ax
误差E = \DeltaA x
根据误差值,不断更新斜率。
根据上面的公式的话,只会和最后一个样本值靠近,前面的样本值,好像没什么作用。所以采用了 learningRate 学习率这么个概念。
我们最终是希望,分类准确率足够高。也就是各个点到模型的损失函数\sum e足够小。
题外话:索引就是对整个样本空间的逐级划分。比如B树索引。比如AVL树。

训练模型的时候总是学习误差的一部分

就是把利用线性模型分割整个样本空间。那么只要计算出各个样本数据到这个临界点的损失函数。求导就可以确定斜率是多少。损失函数考虑到了所有的样本数据。对于只有两种情况的分类,损失函数的导函数=0的时候,就是梯度为0 的时候误差最小。这就是线性模型中的梯度下降。

神经网络

当无法用线性模型来划分样本空间的时候。可以采用神经网络
神经元的激活函数 S(x) = \frac{1}{1+e^{-x}}
其函数曲线和导数曲线如下图:

image.png

神经元(相当于一个算子对输入信号,加权求和,然后激活):

image.png
这里,整合的过程是线性加权的过程,各输入特征 之间没有相互作用。激活函数(active function)一般来说则是非线性的,各输入特征 在此处相互作用。
基本的神经网络三层构成。输入层,隐藏层,输出层。
image.png

神经网络通过训练,调整里面的W_{11} W_{12} W_{13} W_{21}等这些权重,来不断减少误差。

在神经网络训练完后,查询时通过矩阵运算,直接算出最终的输出信号。
O = Sigmoid( W.I )
然后这一层的输出就是下一层的输入。

在神经网络中,由于输入信号经过权重的比例分别输送到下一层的各个神经元。我们通过样本值,可以知道,神经网络最后一层的输出误差。那么根据E_o以及按照权重比例反馈回上一层节点。为了简单化,我们
e_{hidden1} = e_{output1} * \frac{w_{11}}{w_{11}+w_{21}} + e_{output2} * \frac{w_{12}}{w_{12}+w_{22}}

e_{hidden1} = 连接W_{11}W_{12} 上的分割误差之和。

image.png image.png

从图上可以看出每一层的误差之和是相等的。但是实际上,我们少考虑了激活函数。正向传播的时候,激活函数小于1 的,也就是削弱信号,那反向传播的话,隐藏层的误差和,应该大于输出层的误差和。反向传播容易导致梯度消失
几种激活函数的比较

矩阵乘法计算反向传播误差。
error_{hidden} = W_{hidden_output}^T .error_{output}

W_{jk}如何变化的时候,神经网络的误差如何最小化,求偏导函数本质是某个维度上的变化率
方向导数,偏导数,梯度关系

采用梯度下降法,当权重变化时,误差最小。
\frac{\partial E}{\partial W_{jk}}

image.png image.png image.png
image.png

相关文章

网友评论

    本文标题:《python神经网络编程》一

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