吴恩达机器学习系列内容的学习目录 → \rightarrow →吴恩达机器学习系列内容汇总。
神经网络最初是一个生物学的概念,一般是指大脑神经元、触点、细胞等组成的网络,用于产生意识,帮助生物思考和行动,后来人工智能受神经网络的启发,发展出了人工神经网络。
人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称连接模型(Connection Model),它是一种模仿动物神经网络行为特征进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。
无论是在学习机器学习还是深度学习时,我们都会频繁接触神经网络这个词,人工智能、机器学习、深度学习、神经网络这几个概念之间的关系图如图1所示。
我们之前学的线性回归和Logistic回归都有这样一个缺点:当特征太多时,计算的负荷会非常大。图2是一个非线性分类的例子。
当我们使用 x 1 x_{1} x1、 x 2 x_{2} x2 的多次项式进行预测时,我们可以应用的很好。但当假设我们有非常多的特征时,例如有100个变量,我们希望用这100个特征来构建一个非线性的多项式模型,结果将是一个数量非常惊人的特征组合。即使我们只采用两两特征的组合 ( x 1 x 2 + x 1 x 3 + . . . + x 2 x 3 + x 2 x 4 + . . . + + x 99 x 100 ) (x_{1}x_{2}+x_{1}x_{3}+...+x_{2}x_{3}+x_{2}x_{4}+...++x_{99}x_{100}) (x1x2+x1x3+...+x2x3+x2x4+...++x99x100),也会有接近5000个组合而成的特征,这对于一般的Logistic回归来说需要计算的特征太多了。
下面是一个关于计算机视觉的例子,假设我们想要通过机器学习算法来训练一个分类器检测图像,判断某张图片是否为一辆汽车。当我们把一张汽车图片中的门把手部位放大时,人眼看到的红框部分,对计算机而言看到的是一个表示像素强度值的数据矩阵,如图3所示。计算机视觉问题就是根据这个像素点亮度矩阵来告诉我们这些数值代表一个门把手。
具体而言,用机器学习算法构造一个汽车识别器时,我们要做的就是提供一个带标签的样本集,其中一部分样本是各类汽车图片,另一部分样本不是汽车的图片,如图4所示。将这个样本集输入给学习算法,以训练出一个分类器,然后进行测试,即输入一张新的图片判断其是否为汽车。
为了更加深入地理解引入非线性假设的必要性,我们从学习算法的训练样本中找出一些汽车图片和一些非汽车图片,假设我们只选用灰度图片。我们从图片中选择一组像素点(pixel1,pixel2),在坐标系中标出汽车的位置,汽车的位置取决于pixel1和pixel2的强度。接下来我们用同样的方法处理其他图片,依次将其他图片的位置标记到坐标系中(汽车用“+”标记,非汽车用“-”标记),我们可以发现汽车样本和非汽车样本分布在坐标系中的不同区域,如图5所示。因此,我们需要一个非线性假设来使这两类样本尽量分开。
这个例子中特征空间维数是多少?假设我们用的是 50 × 50 50\times50 50×50 像素的图片,并且我们将所有的像素视为特征,则会有 2500个特征,如果我们要进一步将两两特征组合构成一个多项式模型,则会有约 250 0 2 2 \frac{2500^{2}}{2} 225002个(接近三百万个)特征。
普通的Logistic回归模型不能有效地处理这么多的特征,这时候我们就需要神经网络来帮助我们处理输入特征n很大时的情况。
神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器。
神经网络兴起于二十世纪八九十年代,当时应用的非常广泛。但由于各种原因,在90年代后期,它的应用逐渐减少了。近些年,神经网络可谓是又东山再起了,其中一个原因是:神经网络是计算量有些偏大的算法,而近些年计算机的运行速度变快,才足以真正运行起大规模的神经网络,如今的神经网络对于许多应用来说是最先进的技术。
神经元是神经系统最基本的结构和功能单位,由三部分组成,分别是树突、胞体和轴突,如图6所示。树突是接受输入,轴突是用于输出的。神经元的树突在接收到特定的输入刺激后,其胞体就会被激活,并通过轴突向其它神经元或神经元群输出兴奋,从而导致更多的神经元被激活,形成此起彼伏的神经元网络激活现象,而神经元间的有序激活就是产生我们的思维和行为的根本原因。
当我们想模拟大脑时,是指想制造出与人类大脑作用效果相同的机器。大脑可以学会用看而不是听的方式处理图像,学会处理我们的触觉,如图7所示。
神经系统科学家做了一个非常有趣的实验,把耳朵到听觉皮层的神经切断。在这种情况下,将其重新接到一个动物的大脑上,这样从眼睛到视神经的信号最终将传到听觉皮层,那么结果表明听觉皮层将会学会“看”。所以,如果对动物这样做,那么动物就可以完成视觉辨别任务,它们可以看图像,并根据图像做出适当的决定。这被称为神经重接实验。从这个意义上说,如果人体有同一块脑组织可以处理光、声或触觉信号,那么也许存在一种学习算法,可以同时处理视觉、听觉和触觉,而不是需要运行上千个不同的程序,或者上千个不同的算法来实现这些大脑所完成的成千上万的事情。也许我们需要做的就是找出一些近似的或实际的大脑学习算法,然后实现大脑通过自学掌握如何处理这些不同类型的数据。在很大的程度上,可以猜想如果我们把几乎任何一种传感器接入到大脑的几乎任何一个部位的话,大脑就会学会处理它。
为了构建神经网络模型,我们需要首先思考大脑中的神经网络是怎样的?每一个神经元都可以被认为是一个处理单元/神经核(processing unit/Nucleus),它包含许多输入/树突(input/Dendrite),并且有一个输出/轴突(output/Axon),如图8所示。神经网络是大量神经元相互连接并通过电脉冲来交流的一个网络。
神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输入,并且根据本身的模型提供一个输出。
图9所示是一个以Logistic回归模型作为自身学习模型的神经元例子。在神经网络中,参数又可被称为权重(weight)。
上面模型中的 h θ ( x ) = 1 1 + e − θ T x h_{\theta}(x)=\frac{1}{1+e^{-\theta ^{T}x}} hθ(x)=1+e−θTx1,即Sigmoid激活函数。
接下来我们设计出了类似于神经元的神经网络,如图10所示。
其中, x 1 x_{1} x1、 x 2 x_{2} x2、 x 3 x_{3} x3 是输入单元(input units),我们将原始数据输入给它们。 a 1 a_{1} a1、 a 2 a_{2} a2、 a 3 a_{3} a3 是中间单元,它们负责将数据进行处理,然后呈递到下一层。 最后是输出单元,它负责计算 h θ ( x ) h_{\theta}(x) hθ(x)。
神经网络模型是许多Logistic单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。图10为一个3层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏置单元(bias unit),如图11所示。
其中, a i ( j ) a_{i}^{(j)} ai(j)代表第 j j j层的第 i i i个激活单元。 θ ( j ) \theta^{(j)} θ(j)代表从第 j j j层映射到第 j + 1 j+1 j+1层时的权重的矩阵,其尺寸为以第 j + 1 j+1 j+1层的激活单元数量为行数,以第 j j j层的激活单元数加一为列数的矩阵。例如,上图所示的神经网络中的尺寸为 3 × 4 3\times4 3×4。
对于上图所示的模型,激活单元和输出分别表达为:
a 1 ( 2 ) = g ( θ 10 ( 1 ) x 0 + θ 11 ( 1 ) x 1 + θ 12 ( 1 ) x 2 + θ 13 ( 1 ) x 3 ) a_{1}^{(2)}=g(\theta_{10}^{(1)}x_{0}+\theta_{11}^{(1)}x_{1}+\theta_{12}^{(1)}x_{2}+\theta_{13}^{(1)}x_{3}) a1(2)=g(θ10(1)x0+θ11(1)x1+θ12(1)x2+θ13(1)x3)
a 2 ( 2 ) = g ( θ 20 ( 1 ) x 0 + θ 21 ( 1 ) x 1 + θ 22 ( 1 ) x 2 + θ 23 ( 1 ) x 3 ) a_{2}^{(2)}=g(\theta_{20}^{(1)}x_{0}+\theta_{21}^{(1)}x_{1}+\theta_{22}^{(1)}x_{2}+\theta_{23}^{(1)}x_{3}) a2(2)=g(θ20(1)x0+θ21(1)x1+θ22(1)x2+θ23(1)x3)
a 3 ( 2 ) = g ( θ 30 ( 1 ) x 0 + θ 31 ( 1 ) x 1 + θ 32 ( 1 ) x 2 + θ 33 ( 1 ) x 3 ) a_{3}^{(2)}=g(\theta_{30}^{(1)}x_{0}+\theta_{31}^{(1)}x_{1}+\theta_{32}^{(1)}x_{2}+\theta_{33}^{(1)}x_{3}) a3(2)=g(θ30(1)x0+θ31(1)x1+θ32(1)x2+θ33(1)x3)
h θ ( x ) = a 1 ( 3 ) = g ( θ 10 ( 2 ) a 0 ( 2 ) + θ 11 ( 2 ) a 1 ( 2 ) + θ 12 ( 2 ) a 2 ( 2 ) + θ 13 ( 2 ) a 3 ( 2 ) ) h_{\theta}(x)=a_{1}^{(3)}=g(\theta_{10}^{(2)}a_{0}^{(2)}+\theta_{11}^{(2)}a_{1}^{(2)}+\theta_{12}^{(2)}a_{2}^{(2)}+\theta_{13}^{(2)}a_{3}^{(2)}) hθ(x)=a1(3)=g(θ10(2)a0(2)+θ11(2)a1(2)+θ12(2)a2(2)+θ13(2)a3(2))
上面只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。我们知道每一个 a a a都是由上一层所有的 x x x和每一个 x x x所对应的 θ \theta θ决定的。我们把这样从左到右的算法称为前向传播算法( Forward Propagation)。
把 x 、 θ 、 a x、\theta、a x、θ、a 分别用矩阵表示:
X = [ x 0 x 1 x 2 x 3 ] , θ = [ θ 10 θ 11 θ 12 θ 13 θ 20 θ 21 θ 22 θ 23 θ 30 θ 31 θ 32 θ 33 ] , a = [ a 1 a 2 a 3 ] \begin{matrix} X=\begin{bmatrix} x_{0}\\ x_{1}\\ x_{2}\\ x_{3} \end{bmatrix} ,&\theta =\begin{bmatrix} \theta _{10} &\theta _{11} &\theta _{12} &\theta _{13}\\ \theta _{20} &\theta _{21} &\theta _{22} &\theta _{23} \\ \theta _{30}&\theta _{31} &\theta _{32} &\theta _{33} \end{bmatrix} , & a=\begin{bmatrix} a_{1}\\ a_{2}\\ a_{3} \end{bmatrix} \end{matrix} X=⎣⎢⎢⎡x0x1x2x3⎦⎥⎥⎤,θ=⎣⎡θ10θ20θ30θ11θ21θ31θ12θ22θ32θ13θ23θ33⎦⎤,a=⎣⎡a1a2a3⎦⎤
我们可以得到 θ ⋅ x = a \theta\cdot x=a θ⋅x=a。
相对于使用循环来编码,利用向量化的方法会使得计算更为简便。以上面的神经网络为例,试着计算第二层的值:
X = [ x 0 x 1 x 2 x 3 ] , z ( 2 ) = [ z 1 ( 2 ) z 2 ( 2 ) z 3 ( 2 ) ] \begin{matrix} X=\begin{bmatrix} x_{0}\\ x_{1}\\ x_{2}\\ x_{3} \end{bmatrix} ,& z^{(2)}=\begin{bmatrix} z^{(2)}_{1}\\ z^{(2)}_{2} \\ z^{(2)}_{3} \end{bmatrix} \end{matrix} X=⎣⎢⎢⎡x0x1x2x3⎦⎥⎥⎤,z(2)=⎣⎢⎡z1(2)z2(2)z3(2)⎦⎥⎤
z ( 2 ) = θ ( 1 ) x = θ ( 1 ) a ( 1 ) z^{(2)}=\theta^{(1)}x =\theta^{(1)}a^{(1)} z(2)=θ(1)x=θ(1)a(1)
a ( 2 ) = g ( z ( 2 ) ) a^{(2)}=g(z^{(2)}) a(2)=g(z(2))
计算后添加 a 0 ( 2 ) = 1 a_{0}^{(2)}=1 a0(2)=1,可以得到 z ( 3 ) = θ ( 2 ) a ( 2 ) z^{(3)}=\theta^{(2)}a^{(2)} z(3)=θ(2)a(2),则输出为 h θ ( x ) = a ( 3 ) = g ( z ( 3 ) ) h_{\theta}(x)=a^{(3)}=g(z^{(3)}) hθ(x)=a(3)=g(z(3))。 这只是针对训练集中的一个训练实例所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集的特征矩阵进行转置,使得同一个实例的特征都在同一列里。即:
z ( 2 ) = θ ( 1 ) X T z^{(2)}=\theta^{(1)}X^{T} z(2)=θ(1)XT
a ( 2 ) = g ( z ( 2 ) ) = g ( θ ( 1 ) X T ) a^{(2)}=g(z^{(2)})=g(\theta^{(1)}X^{T}) a(2)=g(z(2))=g(θ(1)XT)
为了更好地了解神经网络的工作原理,我们先把左半部分遮住,如图12所示。
右半部分其实就是以 a 0 、 a 1 、 a 2 、 a 3 a_{0}、a_{1}、a_{2}、a_{3} a0、a1、a2、a3 按照Logistic回归的方式输出 h θ ( x ) h_{\theta}(x) hθ(x)。
其实神经网络就像是Logistic回归,只不过我们把Logistic回归中的输入向量 x 1 、 x 2 、 x 3 x_{1}、x_{2}、x_{3} x1、x2、x3 变成了中间层的 a 1 、 a 2 、 a 3 a_{1}、a_{2}、a_{3} a1、a2、a3, 即: h θ ( x ) = g ( θ 0 ( 2 ) a 0 ( 2 ) + θ 1 ( 2 ) a 1 ( 2 ) + θ 2 ( 2 ) a 2 ( 2 ) + θ 3 ( 2 ) a 3 ( 2 ) ) h_{\theta}(x)=g(\theta_{0}^{(2)}a_{0}^{(2)}+\theta_{1}^{(2)}a_{1}^{(2)}+\theta_{2}^{(2)}a_{2}^{(2)}+\theta_{3}^{(2)}a_{3}^{(2)}) hθ(x)=g(θ0(2)a0(2)+θ1(2)a1(2)+θ2(2)a2(2)+θ3(2)a3(2))。我们可以把 a 0 a_{0} a0、 a 1 a_{1} a1、 a 2 a_{2} a2、 a 3 a_{3} a3看成更为高级的特征值,也就是 x 0 、 x 1 、 x 2 、 x 3 x_{0}、x_{1}、x_{2}、x_{3} x0、x1、x2、x3 的进化体,并且它们是由 x x x与 θ \theta θ决定的。因为是梯度下降的,所以 a a a是变化的,并且变得越来越厉害,那么这些更高级的特征值远比仅仅将 x x x次方厉害,也能更好的预测新数据。 这就是神经网络相比于Logistic回归回归和线性回归的优势。
手写数字的识别问题就是一个多类别分类问题,它有10种需要识别的类别。所以当我们有不止两种分类时(也就是 y = 1 , 2 , 3 , . . . y=1,2,3,... y=1,2,3,...),该怎么办?在神经网络中实现多类别分类采用的方法本质上就是一对多法的扩展。
如果我们要训练一个神经网络算法来识别行人、汽车、摩托车和卡车,如图13所示。不同于之前识别汽车与非汽车的例子,这次在输出层我们应该有4个值,第一个值为1或0用于预测是否是行人,第二个值用于判断是否为汽车,第三个值用于判断是否为摩托车,第二个值用于判断是否为卡车。
输入向量 x x x有三个维度,两个中间层,输出层有4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现 [ a , b , c , d ] T [a,b,c,d]^{T} [a,b,c,d]T,且 a , b , c , d a,b,c,d a,b,c,d中仅有一个为1,表示当前类。该例子对应的神经网络的可能结构如图14所示。
训练集为 ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) (x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)}) (x(1),y(1)),(x(2),y(2)),...,(x(m),y(m)),其中 m m m为样本数量, x ( i ) x^{(i)} x(i)为四种物体其中某一种的图片, y ( i ) y^{(i)} y(i)为向量 [ 1 0 0 0 ] 、 [ 0 1 0 0 ] 、 [ 0 0 1 0 ] 、 [ 0 0 0 1 ] \begin{matrix} \begin{bmatrix} 1\\ 0\\ 0\\ 0 \end{bmatrix}、&\begin{bmatrix} 0\\ 1\\ 0\\ 0 \end{bmatrix}、&\begin{bmatrix} 0\\ 0\\ 1\\ 0 \end{bmatrix}、 & \begin{bmatrix} 0\\ 0\\ 0\\ 1 \end{bmatrix} \end{matrix} ⎣⎢⎢⎡1000⎦⎥⎥⎤、⎣⎢⎢⎡0100⎦⎥⎥⎤、⎣⎢⎢⎡0010⎦⎥⎥⎤、⎣⎢⎢⎡0001⎦⎥⎥⎤四种情况中的一种。
我们希望构建的神经网络模型的输出值 h θ ( x ) ≈ y ( i ) h_{\theta}(x)\approx y^{(i)} hθ(x)≈y(i)。当 h θ ( x ) ≈ [ 1 0 0 0 ] h_{\theta}(x)\approx \begin{bmatrix} 1\\ 0\\ 0\\ 0 \end{bmatrix} hθ(x)≈⎣⎢⎢⎡1000⎦⎥⎥⎤时,预测图片为行人;当 h θ ( x ) ≈ [ 0 1 0 0 ] h_{\theta}(x)\approx \begin{bmatrix} 0\\ 1\\ 0\\ 0 \end{bmatrix} hθ(x)≈⎣⎢⎢⎡0100⎦⎥⎥⎤时,预测图片为汽车;当 h θ ( x ) ≈ [ 0 0 1 0 ] h_{\theta}(x)\approx \begin{bmatrix} 0\\ 0\\ 1\\ 0 \end{bmatrix} hθ(x)≈⎣⎢⎢⎡0010⎦⎥⎥⎤时,预测图片为摩托车;当 h θ ( x ) ≈ [ 0 0 0 1 ] h_{\theta}(x)\approx \begin{bmatrix} 0\\ 0\\ 0\\ 1 \end{bmatrix} hθ(x)≈⎣⎢⎢⎡0001⎦⎥⎥⎤时,预测图片为卡车。