神经网络异或(XOR)

神经网络异或(XOR)

这是典型的3层神经网络,Layer1层是输入层,Layer2层是隐含层,Layer3层是输出层。输入层还有两个神经元i1,i2和偏置项b1,输入层包含两个神经元i3,i4和偏置项b2,输出层只有一个神经元i5。b1,b2是偏置偏置单元(bias unit),在有些资料里也称为偏置项(bias term)或者截距项(intercept term),可以提高神经网络的精度,如果在写神经网络代码时把偏置项漏掉,神经网络很有可能变得很差,收敛很慢而且精度差,除非你有非常确定的理由去掉偏置项b。

神经元之间的连线是层与层之间的权重。

Step 1 前向传播

1、输入层 —>隐含层

方框里边是神经元的下标

计算隐含层神经元i3的输入加权和:

        net1 = b1 w00 + i1 w10 + i2 w20

        net2 = b1
w01 + i1 w11 + i2 w21

计算神经元隐含层i3输出值(这里用的sigmoid函数):

        i3 = sigmoid(net1)

计算神经元隐含层i4输出值:

        i4 = sigmoid(net2)

2、隐含层 —> 输出层:


计算输出层神经元i5的值:

        i5 = b2 w02 + i3 w12 + i4 * w22

计算输出层神经元i5输出值(同理通过sigmoid函数):

        out = sigmoid(i5)

Step 2 反向传播

1、计算误差

对于输出层误差:

方法一:


方法二:


这两个计算误差的方法本质是一样的

i5_err = out (1 - out) (d - out) d是预计值

对于隐含层误差:



隐含层i4神经元误差:i4_err = i4 (1 - i4) (w22 i5_err)

隐含层i3神经元误差:i3_err = i3
(1 - i3) (w12 i5_err)

2、权值更新



其中l表示学习速率,一般偏置项的值都为1

对于神经元b2-i5之间的权值更新:

        w02 = w02 + l i5_err

对于神经元i3-i5之间的权值更新:

        w12 = w12 + l
i5_err

对于神经元i4-i5之间的权值更新:

        w22 = w22 + l i5_err

对于神经元b1-i3之间的权值更新:

        w00 = w00 + l
i3_err

对于神经元b1-i4之间的权值更新:

        w01 = w01 + l i4_err

对于神经元i1-i3之间的权值更新:

        w10 = w10 + l
i3_err

对于神经元i1-i4之间的权值更新:

        w11 = w11 + l i4_err

对于神经元i2-i3之间的权值更新:

        w20 = w10 + l
i3_err

对于神经元i2-i4之间的权值更新:

        w21 = w11 + l * i4_err

3、偏向更新



本文中用不到,只是提一下

Step 3 终止条件

1、权值的更新低于某个阀值

2、预测的错误率低于某个阀值

3、达到预设的循环次数

代码在github上

代码链接