BP神经网络学习-(1)

神经网络构成

神经网络分为三层:输入层(input layer),隐含层(hidden layer),输出层(output layer)
BP神经网络学习-(1)_第1张图片
(输入层的个数由输入层的特征个数决定,而不是样本的个数)

假设输入层有n个节点,隐含层有m个节点,输出层有k个节点

令W_ni_mj为输入层第i个节点到隐含层第j个节点的一个连接强度(这两个节点之间的权值),bj为隐含层第j个节点的阈值

第i个输入节点经过第j个隐含层的输出为
W_ni_mj*xi+bj

所有的输入节点经过第j个隐含层的输出为
S=sum{W_ni_mj*xI}+bj i=1,2,3…n

当然并不能把S直接输出
要通过传递函数/激活函数(transfer function/activate function )f(.) 进行转换就可以输出了

BP神经网络学习-(1)_第2张图片

训练方式

BP神经网络由数据流的前向运算和误差分析的反向传播两部分构成

正向传播
方向为输入层->隐含层->输出层
每层神经元状态只影响下一层神经元
使用规定好的参数来一层一层的进行计算直到最后输出

反向传播
当得到的值不符合期望值时,就会反向传播根据损失函数来更新每一层神经元的参数值

神经网络的训练就是不断的在正反向传播的交替中运行
每一次迭代都会更新一次阈值,通过梯度下降法来找寻最佳的阈值

有多少个训练样本就会进行多少次迭代

具体涉及到的函数

设神经网络三层分别为

正向:

每一层都要进行的运算
Z=WX+b
A=ReLU(Z)
ReLU是在隐含层采用的激活函数(最开始是采用的sigmoid函数,但是由于该函数容易出现梯度消失的情况,所以选择性能更好的ReLu函数)
至于为什么要加入激活函数呢?
可以看到第一个式子是一个线性的函数,为了能够更好的毕竟非线性的情况,所以引入了激活函数,来对第一个函数所得到的值进行变形

损失函数(使用交叉熵)
二分类问题:
L(y^,y) = -[y·log(y^ )+(1-y)·log(1-y^ )]
多分类问题:
L=-Σy(j)·y^(j)
最终的cost
J(W,b) = 1/m·ΣL(y^(i),y(i))

反向:
根据以上的J来对w和b进行求导,使用梯度下降的方法来对参数进行更新,
其中梯度下载的学习率(步长)不要设置的太大

现在的许多机器学习框架类如Tensorflow等都不需要我们自己来构建反向传播过程,只需要自己构建好正向传播过程就可以了

python实现的代码(使用tensorflow学习框架)

//待我写完就传代码

你可能感兴趣的:(人工智能学习)