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