概要:直接上代码是最有效的学习方式。这篇教程通过由一段简短的 python 代码实现的非常简单的实例来讲解 BP 反向传播算法。

代码如下:

1234567891011 X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])y = np.array([[0,1,1,0]]).Tsyn0 = 2*np.random.random((3,4)) 1syn1 = 2*np.random.random((4,1)) 1for j in xrange(60000):    l1 = 1/(1+np.exp((np.dot(X,syn0))))    l2 = 1/(1+np.exp((np.dot(l1,syn1))))    l2_delta = (y l2)*(l2*(1l2))    l1_delta = l2_delta.dot(syn1.T) * (l1 * (1l1))    syn1 += l1.T.dot(l2_delta)    syn0 += X.T.dot(l1_delta)

当然,上述程序可能过于简练了。下面我会将其简要分解成几个部分进行探讨。


第一部分:一个简洁的神经网络

一个用 BP 算法训练的神经网络尝试着用输入去预测输出。

考虑以上情形:给定三列输入,试着去预测对应的一列输出。我们可以通过简单测量输入与输出值的数据来解决这一问题。这样一来,我们可以发现最左边的一列输入值和输出值是完美匹配/完全相关的。直观意义上来讲,反向传播算法便是通过这种方式来衡量数据间统计关系进而得到模型的。下面直入正题,动手实践。

2 层神经网络:

12345678910111213141516171819202122232425262728293031323334353637383940 import numpy as np # sigmoid functiondef nonlin(x,deriv=False):    if(deriv==True):        return x*(1x)    return 1/(1+np.exp(x)) # input datasetX = np.array([  [0,0,1],                [0,1,1],                [1,0,1],                [1,1,1] ]) # output dataset            y = np.array([[0,0,1,1]]).T # seed random numbers to make calculation# deterministic (just a good practice)np.random.seed(1) # initialize weights randomly with mean 0syn0 = 2*np.random.random((3,1)) 1 for iter in xrange(10000):    # forward propagation    l0 = X    l1 = nonlin(np.dot(l0,syn0))     # how much did we miss?    l1_error = y l1     # multiply how much we missed by the     # slope of the sigmoid at the values in l1    l1_delta = l1_error * nonlin(l1,True)     # update weights    syn0 += np.dot(l0.T,l1_delta)print \”Output After Training:\”print l1

Output After Training:

[[ 0.00966449]

[ 0.00786506]

[ 0.99358898]

[ 0.99211957]]

变量 定义说明
X 输入数据集,形式为矩阵,每 1 行代表 1 个训练样本。
y 输出数据集,形式为矩阵,每 1 行代表 1 个训练样本。
l0 网络第 1 层,即网络输入层。
l1 网络第 2 层,常称作隐藏层。
syn0 第一层权值,突触 0 ,连接 l0 层与 l1 层。
* 逐元素相乘,故两等长向量相乘等同于其对等元素分别相乘,结果为同等长度的向量。
元素相减,故两等长向量相减等同于其对等直接上代码是最有效的学习方式。这篇教程通过由一段简短的 python 代码实现的非常简单的实例来讲解 BP 反向传播算法。

代码如下:

1234567891011 X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])y = np.array([[0,1,1,0]]).Tsyn0 = 2*np.random.random((3,4)) 1syn1 = 2*np.random.random((4,1)) 1for j in xrange(60000):    l1 = 1/(1+np.exp((np.dot(X,syn0))))    l2 = 1/(1+np.exp((np.dot(l1,syn1))))    l2_delta = (y l2)*(l2*(1l2))    l1_delta = l2_delta.dot(syn1.T) * (l1 * (1l1))    syn1 += l1.T.dot(l2_delta)    syn0 += X.T.dot(l1_delta)

当然,上述程序可能过于简练了。下面我会将其简要分解成几个部分进行探讨。


第一部分:一个简洁的神经网络

一个用 BP 算法训练的神经网络尝试着用输入去预测输出。

考虑以上情形:给定三列输入,试着去预测对应的一列输出。我们可以通过简单测量输入与输出值的数据来解决这一问题。这样一来,我们可以发现最左边的一列输入值和输出值是完美匹配/完全相关的。直观意义上来讲,反向传播算法便是通过这种方式来衡量数据间统计关系进而得到模型的。下面直入正题,动手实践。

2 层神经网络:

12345678910111213141516171819202122232425262728293031323334353637383940 import numpy as np # sigmoid functiondef nonlin(x,deriv=False):    if(deriv==True):        return x*(1x)    return 1/(1+np.exp(x)) # input datasetX = np.array([  [0,0,1],                [0,1,1],                [1,0,1],                [1,1,1] ]) # output dataset            y = np.array([[0,0,1,1]]).T # seed random numbers to make calculation# deterministic (just a good practice)np.random.seed(1) # initialize weights randomly with mean 0syn0 = 2*np.random.random((3,1)) 1 for iter in xrange(10000):    # forward propagation    l0 = X    l1 = nonlin(np.dot(l0,syn0))     # how much did we miss?    l1_error = y l1     # multiply how much we missed by the     # slope of the sigmoid at the values in l1    l1_delta = l1_error * nonlin(l1,True)     # update weights    syn0 += np.dot(l0.T,l1_delta)print \”Output After Training:\”print l1

Output After Training:

[[ 0.00966449]

[ 0.00786506]

[ 0.99358898]

[ 0.99211957]]

变量 定义说明
X 输入数据集,形式为矩阵,每 1 行代表 1 个训练样本。
y 输出数据集,形式为矩阵,每 1 行代表 1 个训练样本。
l0 网络第 1 层,即网络输入层。
l1 网络第 2 层,常称作隐藏层。
syn0 第一层权值,突触 0 ,连接 l0 层与 l1 层。
* 逐元素相乘,故两等长向量相乘等同于其对等元素分别相乘,结果为同等长度的向量。
元素相减,故两等长向量相减等同于其对等an>dot(l1,syn1))))    l2_delta = (y l2)*(l2*(1l2))    l1_delta = l2_delta.dot(syn1.T) * (l1 * (1l1))    syn1 += l1.T.dot(l2_delta)    syn0 += X.T.dot(l1_delta)

当然,上述程序可能过于简练了。下面我会将其简要分解成几个部分进行探讨。


第一部分:一个简洁的神经网络

一个用 BP 算法训练的神经网络尝试着用输入去预测输出。

考虑以上情形:给定三列输入,试着去预测对应的一列输出。我们可以通过简单测量输入与输出值的数据来解决这一问题。这样一来,我们可以发现最左边的一列输入值和输出值是完美匹配/完全相关的。直观意义上来讲,反向传播算法便是通过这种方式来衡量数据间统计关系进而得到模型的。下面直入正题,动手实践。

2 层神经网络:

123