目录
非线性假设
神经元和大脑
模型表示-1
模型表示-2
特征和直观理解-1
特征和直观理解-2
多类分类
【此为本人学习吴恩达的机器学习课程的笔记记录,有错误请指出!】
我们之前学的,无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大。
下面是一个例子:
当我们使用1, 2 的多次项式进行预测时,可以应用的很好。
使用多项式的非线性模型虽然可以较好的预测效果,但是如果特征数量非常多,例如100个特征变量,通过特征的两两组合,将接近5000个组合而成的特征。 这对一般的逻辑回归来说需要计算的特征太多了。
如果我们希望训练一个模型来识别视觉对象, 然后利用这些图片上一个个像素的值(饱和度或亮度)来作为特征。即使只选用灰度图(每个像素则只有一个值0或1), 那么 50x50 像素的小图片就会有2500个特征,如果进一步将两两特征组合构成一个多项式模型,则会有约2500^2/2个(接近 3 百万个)特征。普通的逻辑回归模型,不能有效地处理这么多的特征,这时候我们需要神经网络。
神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器。
神经网络逐渐兴起于二十世纪八九十年代,应用得非常广泛。但由于各种原因,在90年代的后期应用减少了。但是最近,神经网络又东山再起了。其中一个原因是:神经网络是计算量有些偏大的算法。然而大概由于近些年计算机的运行速度变快,才足以真正运行起大规模的神经网络。
为了构建神经网络模型,我们需要首先思考大脑中的神经网络是怎样的?
每一个神经元都可以被认为是一个处理单元/神经核( processing unit/Nucleus),它含有许多输入/树突( input/Dendrite),并且有一个输出/轴突( output/Axon)。神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络。如图:
神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。
这些神经元(也叫激活单元,activation unit)采纳一些特征作为输出,并且根据本身的模型提供一个输出。下图是一个以逻辑回归模型作为自身学习模型的神经元示例,在神经网络中,参数又可被成为权重(weight)。
我们设计出了类似于神经元的神经网络,效果如下:
其中1, 2, 3是输入单元( input units),我们将原始数据输入给它们。
1, 2, 3是中间单元,它们负责将数据进行处理,然后呈递到下一层。
最后是输出单元,它负责计算ℎ()。
神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。
下图为一个 3 层的神经网络,我们为每一层都增加一个偏差单位( bias unit):
第一层成为输入层( Input Layer)。
中间一层成为隐藏层( Hidden Layers)。
最后一层称为输出层( Output Layer)。
对于上图所示的模型,激活单元和输出分别表达为:
上面进行的讨论中只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。
我们可以知道:每一个 (激活单元)都是由上一层所有的 和每一个所对应的权重决定的。
这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION )。
把, , 分别用矩阵表示, 我们可以得到 ⋅ = :
前向传播算法( FORWARD PROPAGATION ) ,相对于使用循环来编码来说,利用向量化的方法会使得计算更为简便。以上面的神经网络为例,计算第二层的输出值:
最后计算第三层的输出值:
这只是针对训练集中一个训练实例所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。即:
为了更好了了解 Neuron Networks 的工作原理,我们先把左半部分遮住:
其实神经网络就像是 logistic regression,只不过我们把 logistic regression 中的输入向量[1 ∼ 3] 变成了中间层的 [1(2) ∼ 3(2)], 即:
我们可以把0, 1, 2, 3看成更为高级的特征值,也就是0, 1, 2, 3的进化体,并且它们是由 与决定的,因为是梯度下降的,所以是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 次方厉害,也能更好的预测新数据。
这就是神经网络相比于逻辑回归和线性回归的优势。
在神经网络中,单层神经元(无中间层)的计算可用来表示逻辑运算,比如逻辑与(AND)、逻辑或(OR)。
举例说明:逻辑与(AND);下图中左半部分是神经网络的设计与 output 层表达式,右边上部分是 sigmod 函数,下半部分是真值表。
我们可以用这样的一个神经网络表示 AND 函数:
其中0 = -30, 1 = 20, 2 = 20 我们的输出函数ℎ()即为: ℎ() = (-30 + 201 +202)
所以: ℎ() ≈ x1AND x2
接下来再介绍一个 OR 函数:
OR 与 AND 整体一样,区别只在于的取值不同。
二元逻辑运算符( BINARY LOGICAL OPERATORS),当输入特征为布尔值( 0 或 1)时,我们可以用一个单一的激活层可以作为二元逻辑运算符,为了表示不同的运算符,我们只需要选择不同的权重即可。
下图的神经元(三个权重分别为-30, 20, 20)可以被视为作用同于逻辑与( AND):
下图的神经元(三个权重分别为-10, 20, 20)可以被视为作用等同于逻辑或( OR):
下图的神经元(两个权重分别为 10, -20)可以被视为作用等同于逻辑非( NOT):
我们可以利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。例如我们要实现 XNOR-异或功能(输入的两个值必须一样,均为 1 或均为 0),即:XNOR = (x1 AND x2) OR ((NOT x1) AND( NOT x2))
首先构造一个能表达(NOT x1)AND(NOT x2)部分的神经元:
然后将表示 AND 的神经元和表示(NOT x1)AND(NOT x2)的神经元以及表示 OR 的神经元进行组合:
这样就得到了一个能实现 XNOR 运算符功能的神经网络。
按这种方法我们可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值。
这就是神经网络的厉害之处。
当我们有不止两种分类时(也就是 = 1,2,3 ….),比如我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有 4 个值。例如,第一个值为 1 或 0 用于预测是否是行人,第二个值用于判断是否为汽车。
输入向量有三个维度,两个中间层,输出层 4 个神经元分别用来表示 4 类,也就是每一个数据在输出层都会出现[ ],且 , , , 中仅有一个为 1,其它为0,表示当前类。下面是该神经网络的可能结构示例:
该神经网络算法的输出结果为四种可能情形之一: