在神经网络中,最基本的单元为神经元。一个神经元可以视为具有i=1,2,...,n个输入,一个偏移量bias的单元,假设输入信号为x1,x2,...,xn,每个输入信号的权重为w1,w2,...,wn,则这个神经元的总体输入为:
而通常我们为了计算方便,我们会额外引入一个输入i=0,并设置其输入权重为w0,在数值上等于偏移量bias,则上面的公式可以简化为:
下面我们通过代码实例来看一下,对一个实际的神经元,怎样使用Theano来求出总输入:
import theano import theano.tensor as T from theano import function # 假设神经元有两个输入,加上bias结点(其值始终为1) # 所以我们需要一个三列的向量 x = T.dvector("x") # 设置权值变量,第一列为神经元的bias w = T.dvector("w") # 求神经元的总输入 s = T.dot(x, w) # 定义函数 sum = function([x, w], s) x = [1.0, 1.5, 2.5] w = [0.0, 0.2, 0.4] print(sum(x, w))
神经元会对输入信号进行非线性处理,从而得到一个输出,称为激活函数,其中用得最多的是下面这个函数:
假设神经元的激活值为x=10.0,我们可以用上面的激活函数求出该神经元的输出,代码如下所示:
import theano import theano.tensor as T from theano import function x = T.dscalar("x") s = 1 / (1 + T.exp(-x)) logistic = function([x], s) x = 10.0 print("logistic=%f" % logistic(x))上面代码的输出结果:logistic=0.999955
有了以上的基础知识,我们完全可以构造出一个最简单的神经网络模型---感知器模型。通常在这一模型中,有N个输入向量组,同时了N个希望输出值向量,对于每个输入向量,我们可以算出一个实际输出值,对于所有输入样本,就有N个实际输出值组成的向量,在感知器学习算法中,会求出实际输出值向量与希望输出值向量的误差,然后根据误差对连接权值进行调整,如此往复循环,直到误差达到足够小为止。虽然上述算法原理很简单,但是感知器模型在线性可分的问题中,功能非常强大。
下面我们来看一下怎么求实际输出向量和希望输出向量的平方差误差,在这里我们假设一共有5个输入样本,所以希望输出向量和实际输出向量均为5列,代码如下所示:
import theano import theano.tensor as T from theano import function d = T.dvector("d") y = T.dvector("y") diff = (d - y ) ** 2 f = function([d, y], diff) r = T.dvector("r") vectorSum = T.sum(r) vectorSumF = function([r], vectorSum) d = [1.0, 2.0, 3.0, 4.0, 5.0] y = [1.1, 2.1, 3.5, 4.2, 5.3] print(vectorSumF(f(d, y)))在上面的代码中,我们首先求出希望输出向量和实际输出向量逐列的平方差,然后定义一个求向量所有元素和的函数,求出针对所有输入样本的平方差误差,而感知器算法的目标就是通过调整连接权值,使这个值达到最小。如果感举趣的话,大家可以在这些方法的基础上,实现一个完整的感知器算法。