深度学习三步曲
和机器学习类似,也是定义一个函数集、判断函数的好坏以及找到最好的函数。就像把大象放到冰箱一样:把门打开、把大象赶进去、把冰箱门关上。
在第一步中的定义一个函数,该函数就是神经网络。
神经网络
把逻辑回归前后连接在一起,把每个逻辑回归叫做神经元,整个叫做神经网络。
见上篇文章最后部分
用不同的方法连接神经元可以得到不同的神经网络,每个逻辑回归都有自己不同的权重(weight)和偏差(bias)。
有不同连接方式,最常见的连接方式是全连接前馈网络(Fully Connect Feedforward Network),如下所示:
每个神经元都有一组权重和偏差。假设上面蓝色的神经元权重是1,-2偏差是1;下面蓝色的神经元权重是-1,1偏差是0。
现在输入是1,-1。第一个蓝色的计算:,代入Sigmoid
函数的0.98。同理下面蓝色的得出0.12。然后0.98和0.12相当于中间两个红色神经元的输入,假设知道它们的权重和偏差就可以继续计算下去,直到得出最终输出。
如果输入是0,0:
所以整个神经网络可以看成是一个函数,给定输入,得到输出。
如果还不知道这些神经元的参数,只是定出了结构,把它们连接在一起。其实就是定义了一个函数集,可以给这个网络设不同的参数,就能得到不同的函数。
在这个例子中,我们把神经元分成了三排,每排之间都互相连接。通常,可以把神经网络画成下面这样:
Layer1的神经元的输出当成Layer2的输入,因为层(Layer)间是每个神经元两两相连,所以叫做全连接。现在传递的方向是Layer1到Layer2、Layer2到Layer3,是由后往前传,所以叫做前馈网络。整个网络的输入是一组向量,对于Layer1来说,每个输入就是这组向量的每个维度。最后LayerL的输出也就是整个网络的输出。这里L层有M个神经元,所以输出是到
要注意的是,输入向量叫做输入层,虽然它没有包含神经元,最后一层L叫做输出层。输出层不是输出向量。
输入层和输出层之间的叫做隐藏层。深度学习中的深度就是指由很多隐藏层。
前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。信号从输入层向输出层单向传播,可用一个有向无环图表示。
其实神经网络的运算可以用矩阵操作来描述,如下:
然后通过Sigmoid
函数(其实这里不一定是Sigmoid
函数,可以换成其他函数)得到0.98和0.12。
假设把第一层的权重全写在一起,当成向量,偏差写在一起当成向量;把第二层的权重全写在一起,当成向量,偏差写在一起当成向量…
把整个输入用向量表示,那么输出可写成:
得到层1的输出,记为,把它当成层2的输入得到层2的输出,最后得到整个网络的输出。
可以如下展开:
所以一个神经网络做的事情是一连串的向量乘以矩阵再加上向量,把它们写成矩阵运算可以用GPU加速。
我们可以把这些隐藏层看成是特征提取器,可以把最后一个隐藏层的输出想成是新的特征。
输出层就是多类别分类器,它用的特征是原输入特征经过复杂的转换得到的一组比较好的特征。
判断函数的好坏
以手写数字识别为例,假设包含数字1的图片有256个像素,作为输入,给定一些参数,得到10个输出(),分别对应属于每个数字的概率。我们用这个输出和它实际对应的数字进行交叉熵就可以判断函数的好坏了。
训练集中第一笔数据得到的交叉熵是,第二笔是…
把所有的交叉熵累加起来得到损失函数L,然后需要找到函数集中使得损失最小的函数,也就是找到使得损失最小的参数
那么如何找到最小的参数呢,还是使用梯度下降。
首先计算损失函数对每个参数的偏微分,
然后不断的更新参数。
和机器学习不同,机器学习我们可以手写出梯度下降的过程,但是深度学习的梯度下降比较复杂,一般使用反向传播(Backpropagation)算法来计算参数的偏微分。