一个神经元,有多个输入,一个输出。令输入是x1,x2,x3,输出是y。 y=sigmoid(wx+wx+wx+b) w是权重,b是偏移量。 小括号里的部分对3个x进行“加权求和”。 sigmoid函数是众多激励函数中最古老的一个,它的特点是,把负无穷到正无穷之间的值,映射到0到1之间。这么设计是为了模拟真实的神经元,上述3个x的值属于0到1的区间,加权求和之后,超出区间了。这时,用sigmoid函数“压缩”,让y回到0到1的区间。 假设有2个这样的神经元,输入是x1,x2,x3,输出是y1,y2,它们构成一个3×2全连接。这样的神经元网络叫做全连接神经元网络。 y=sigmoid(wx+wx+wx+b) y=sigmoid(wx+wx+wx+b) 学习中,遇到了线性代数,用矩阵乘法和矩阵加法可以简化描述上述方程组。注意只是简化描述,而不是简化,运算量不减,只是描述起来方便了。 还有一个词,叫深度学习,它所对应的是更深的网络:有多个隐藏层。 从现在开始,用大写的X代替3个小写的x。输入是X,它通过全连接输出H1,H1再输出H2,……如此多层,直至输出Y。这便是有多个隐藏层的全连接神经元网络,深度学习的前两个字:深度,指的就是层数多。 不管大X有几个小x,不管整个网络有几层,它都是一个函数F。这个函数F可以叫做执行函数,是以后干活要用的函数。例如手写数字识别的任务,输入一个图,它有几百个小x,每个x是一个像素,其值不是0到255,而是0到1。有10个小y,对应0到9这10个数字,哪个输出点亮了,就说明该神经元网络识别出了哪个数字。 至此,神经元网络搭建完成了,但它还不能工作。因为有许多参数,{w,b},还没有确定。
以上是“深度”,以下说“学习”。 用梯度下降法进行学习,并需要构造一个损失函数L,它的输入是F的参数,是许多w,b的集合,{w,b}。因为有多个w,b参数,所以它是一个高维函数! 输出是什么呢?输出是一个一维量,可以理解为现在的状态和理想状态之间的“距离”。用梯度下降法求这个距离的最小值,对应的{w,b}就是最优的参数集。 什么是理想状态呢?就是训练样本中的Y。训练样本由许多(X,Y)组成,对于一组{w,b},用执行函数F计算X对应的Y,这个Y应该用Y’表示,因为它和训练样本里的Y不同。 本例中,大Y由2个小y组成,计算Y和Y’的距离,用公式(y’-y)2+(y’-y)2,这计算了一个训练样本,有N个训练样本,就计算N次,并求和。所得到值,即损失函数L的输出。 说到这里,仅构造了损失函数L,还没有开始梯度下降。要想了解梯度,可以用一元函数来过渡。对于一元函数来说,梯度就是斜率。我们要解的那个损失函数L有几百上千个输入的{w,b},暂时忘了它,用一元函数来说明。
在x-y平面上有一个不规则的一元函数,求它的最小值。先给一个随机的x,求得函数在x处的斜率(以后这个概念要用梯度来代替)。如果斜率为正,说明最小值在左边,应该将x减去一个值;如果斜率为负,说明应该让x变大一点。 新的x对应更小的y,重复上述过程,直至斜率接近0,此时对应一个局部最小值。为了找到更好的局部最小值,可以将上述过程重复多次,每次都以不同的随机值开始。 总之,最后我们找到了求不规则函数局部最小值的方法。把斜率换成梯度,就可以求高维不规则函数的局部最小值了。 将梯度下降法应用于损失函数L,求出最小值对应的{w,b},这是我们想要的。把它给执行函数F,F就能工作了。
估算一下训练的运算量。 设执行函数F有A个参数,大约需要A次运算,以完成一次F的执行。在训练过程中,需要大量重复执行F。 损失函数L的输入值个数等于A,这是个A元函数。计算A元函数的梯度,需要几次运算呢?需要在每一个维度上都计算一次F,运算量约是A2。设有B个训练样本,则计算损失函数L时,还需要3B次运算。训练一次需要A2+3B次运算,设训练C次,则总的运算量是C(A2+3B),时间复杂度约是3次方。 A是神经元网络的复杂度 B是训练样本的个数 C是训练的次数
|