「吴恩达机器学习」9.神经网络学习
当我们的特征值太多,模型太复杂时,之前学习的线性回归和逻辑回归都会遇到计算负荷太大的问题,所以我们需要学习神经网络。
Non-linear Hypotheses
本节课程主要通过示例讲解了引入神经网络的实际意义。
之前的一个例子:
在这个例子中,由于我们只有\(x_1\)和\(x_2\)两个特征值,所以即使模型很复杂,引入了多次项,也可以得到一个不错的结果。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf2f1toytwj31rk0min4r.jpg)
但是当我们的特征非常多的时候,比如100个,即使我们只采用两两特征组合的形式\((x_1x_2+x_1x_3 + \cdots + x_2x_3 + x_2x_4 + \cdots x_{99}x_{100})\),我们也会有大概\(O(n^2/2)\),即5000个组合特征,这个计算量已经很大了。
如果我们想要解决的是计算机视觉的问题的话,那么数据量将会更加庞大。
比如下图的汽车,在计算机眼中就是一个代表着每个像素点的矩阵。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf2f8r8s9rj31l80u0dx5.jpg)
假如我们要实现计算机视觉中的汽车检测问题,即使我们只选取灰度图片(\(50 \times 50\)个像素点),那么每张图片也需要一个\(n=2500\)的向量进行表示(如果采用RGB,则需要一个\(n=7500\)的向量进行表示)。
如果我们采用简单的两两组合构成一个多项式模型,则会有约\(2500^2/2\)(接近3百万)个特征,所以采用普通的逻辑回归模型,很难有效地处理这么多特征值,所以我们需要神经网络。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf2fjb7y19j31hf0u014c.jpg)
Neurons and the Brain
主要讲解神经网络的相关背景知识。
神经网络:
- 起源:试图模仿大脑的算法;
- 在80年代和90年代初广泛应用,在90年代后期人气下降;
- 最近复兴:由于计算机计算能力的巨大提升,使得神经网络中的一些算法又重焕生机。
Model Representation I
主要讲解神经网络的表示,以及一些相关概念。
Neuron in the brain
每一个神经元都可以认为是一个处理单元/神经核(processing unit/Nucleaus),它含有许多输入/树突(input/Dendrite),并且只有一个输出/轴突(output/Axon)。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf2ncr79ogj31dl0u0nmx.jpg)
大量神经元相互连接并通过电脉冲进行交流,就形成了神经网络。
Neuron model: Logistic unit
每一个神经元就是一个个的学习模型,也叫激活单元(activation unit)。下图是以逻辑回归模型作为自身学习模型的神经元,因此也称为Sigmoid (logistic) activation function。
\(x_0=1\)项被称为偏置单元(bias unit),通常不画出来。在神经网络中,参数又称为权重(weight)。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf4zcivhe9j319r0u0gr6.jpg)
Neural Network
以神经元为基础,模仿人脑的神经网络,设计出了计算机神经网络:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf4ziccxerj31h80qoag8.jpg)
上图从左至右,第一层称为输入层(input layer),将原始数据输入给它们;第二层(中间所有层)称为隐藏层(hidden layer),负责处理数据并传递给下一层;最后一层称为输出层(output layer),负责输出数据给\(h_\theta(x)\)。
神经网络模型是许多逻辑单元按照不同的层级组织起来的网络,每一层的输出变量都是下一层的输入变量。
引入标记法帮助描述模型:
-
\(a_j^{(i)}\)代表第\(j\)层第\(i\)个激活单元;
-
\(\Theta^{(j)}\)代表从第\(j\)层映射到第\(j+1\)层时的权重的矩阵,其尺寸为:以第\(j+1\)层的激活单元数量为行数,以第\(j\)层激活单元加1(加上\(x_0\)偏置项)为列数的矩阵,E.g. \(\Theta^{(1)}\)代表从第一层映射到第二层的权重的矩阵,其尺寸为\(3 \times 4\).
对于上图模型,激活单元表达为:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf505aiyesj315a0ain12.jpg)
输出表达为:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf505anl9aj31gs04475s.jpg)
Model Representation II(重新看一遍视频)
主要讲解如何通过向量化的方式计算神经网络。
Forward propagation: Vectorized implementation
前面我们已经得到:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf50lps19jj31hu0fa0yn.jpg)
以上面神经网络为例,试着计算第二层的值,令:
令\(z^{(2)}=\Theta^{(1)}x\),则\(a^{(2)}=g(z^{(2)})\)。
Examples and Intuitions
主要通过一些简单的例子(简单模型)来直观感受神经网络模型的工作。
AND function
假设输入\(x_1,x_2 \in \{0, 1\}\),输出\(y = x_1 \space AND \space x_2\)。
我们可以用这样的一个神经网络表示AND函数:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9lj9kmq0j30zu0ju76p.jpg)
其中参数\(\Theta=[-30, 20, 20]\),则输出函数\(h_\Theta(x)=g(-30+20x_1+20x_2)\),可以对不同的输入\(x_1\)和\(x_2\)计算对应的输出。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9lohgt3kj315s0h8acq.jpg)
可以看到结果符合我们的要求:\(h_\Theta(x) \approx x_1 \space AND \space x_2\)。
OR function
如果想用神经网络表示OR函数:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9lsdtofrj30xi0je76o.jpg)
则输出函数\(h_\Theta(x)=g(-10+20x_1+20x_2)\),分别对不同的输入\(x_1\)和\(x_2\)计算对应的输出。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9m0g2tytj316c0mqtcl.jpg)
可以看到除了参数不同,其他都和AND函数一致。
可以自己构造一些数据看能不能训练出这样的神经网络
Negation/NOT function
用神经网络表示NOT函数:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9mgi2nhdj30xs0dm40a.jpg)
则输出函数\(h_\Theta(x)=g(10-20x_1)\),对不同的输入\(x_1\)计算对应的输出。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9mip3j4zj30ww0gmabz.jpg)
XNOR function
前面已经得到了下面的3个简单的神经网络:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9n68n3l8j32820imjy5.jpg)
我们可以通过组合神经元来实现更为复杂的神经网络,以实现更复杂的运算。例如我们想要实现XNOR函数(异或,输入的两个值相同则为1,否则为0)。
因此我们可以通过将XNOR拆解成3个部分实现:
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9n4t6fr1j319z0rs7iz.jpg)
我们就得到了一个能实现XNOR运算符功能的神经网络。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9napay2gj30te0h6409.jpg)
通过这种方法我们能够逐渐构造出越来越复杂的函数,神经网络的强大之处在于后面一层的输入是前面一层的输出,相当于对原始的特征值进行了加工,构造出复杂的特征值。这样一层一层下去,最后就能拟合出非常复杂的函数。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9nakuxamj32110u0wnj.jpg)
Multi-class Classification
主要讲解了多元分类问题。
神经网络解决多元分类问题,其实就是对之前逻辑回归中的“one-vs-all”方法进行拓展。
E.g. 假如我们要训练一个神经网络来识别路人、汽车、摩托车和卡车4种类别,那么在输出层我们应该有4个值。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9nlmeu70j323e0rcgw4.jpg)
也就是每一个输入数据在输出层结果都是\(\begin{bmatrix}a \\ b\\ c \\ d \end{bmatrix}\),且\(a,b,c,d\)中仅有一个为1,表示当前类别。
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf9nqhx36zj31li0f477v.jpg)