神经元
神经网络由多个神经元组成,其中神经元由几个部分组成:输入、输入权重、输出和激活函数组成,类似于生物神经元的树突、轴突的组成。
神经元的输入由左边的神经元输出 x
常用的激活函数(activation function)是Sigmod,它的函数图像如下,在逻辑回归的时候使用过:
其中偏置单元 b
神经网络
多个神经元组层一个神经网络:
神经网络第一层是输入层(input),最后一层是输出层(output),而中间的就是神经网络的隐藏层(hidden layer)
神经网络的训练过程如下:
- 随机初始化权重 wi
wi - 代入执行前向传播得到神经网络的输出 oi
oi - 计算代价函数 J(W)
J(W) - 执行反向传播,计算偏导数 ∂J(W)∂wi
∂J(W)∂wi ,依次更新网络的权重 - 将样本 (xi,yi)
(xi,yi) 不断代入第2步到第4步。
前向传播
前向传播的过程目的是计算出神经网络的输出:
首先开始计算 net0
到达隐藏层的神经元后,会通过激活函数作为神经元的输出 a0
计算该神经元后继续向前计算,和前面一层的计算类似:
按照这样的传播过程,这样就能计算出神经网络的输出 o1,o2,…,on
反向传播
按照神经网络的训练过程,接下来是希望计算代价函数 J(W)
以更新 w5
(1)首先求∂J(W)∂o1
其中对 o1 的偏导数为:
(2)然后是求 ∂o1∂net3:
其中对 net3 的偏导数为:
激活函数Sigmoid的函数 f(x) 的导数等于 f(x)∗(1−f(x)) ,见证明。
(3)最后是求 ∂net3∂w5 :
所以最终求得偏导项:
而 w5 也能在反向传播中更新自己的权重,通过减去 a∗∂J(W)∂w5。
第三个导数项求偏导时都会等于上一层的激活函数的输出值,如果把前两个导数项 ∂J(W)∂oi∗∂oi∂neti 用符号 δi 代替的话,那么:∂J(W)∂w5=ajδi
如果要更新隐藏层的权重 w1 ,则
因为 ∂J(W)∂a0 同时受到 o0 和 o1 的影响,所以:
其中 J(W)0 代表在 o0 的损失,计算和前面的规则类似,依次根据链式求导规则展开即可对给定的 (xi,yi) 拟合。
其他资料
在这里基本打开了神经网络的大门,虽然目前学到只是一个全连接网络和基本的BP算法,但是在这篇文章中可以看到还有支持增量学习的自适应谐振理论网络(ART),以及自动连接神经元的自我组织网络(SOM)等等网络架构。
其他我用到的资料:
- 一步一步进行反向传播: https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/
- 上文的在 cnblog 中文翻译: https://www.cnblogs.com/charlotte77/p/5629865.html
- Sigmoid 激活函数求导推导: https://zhuanlan.zhihu.com/p/215323317
- bias 的作用: https://www.zhihu.com/question/305340182
__EOF__






