自己简略的, 有参考黄海广前辈 !黄博士GitHub
第4周
第八、神经网络:表述(Neural Networks: Representation)
8.1 非线性假设
无论是线性回归还是逻辑回归都有一个缺点,即:当特征太多时,计算的负荷非常大。
下面是一个例子:

当使用x1, x2 的多次项式进行预测时,可以应用的很好。
使用非线性多项式项,能够建立更好的分类模型。假设有非常多的特征,例如大于100个变量,希望用这100个特征来构建一个非线性的多项式模型,结果将是数量非常大的特征组合,即便只采用两两特征的组合(x1x2+x1x3+x1x4+...+x2x3+x2x4+...+x99x100),也有接近5000个组合而成的特征。这对于一般的逻辑回归来说,需要计算的特征太多了。假如只选用灰度图片,每个像素则只有一个值,可以选取图片上的两个不同位置上的两个像素,然后训练一个逻辑回归算法利用这两个像素的值来判断图片上是否是汽车:

假使采用50x50像素的小图片,并将所有的像素视为特征,则有 2500个特征,如果要进一步将两两特征组合成多项式模型,则会有约25002/2个(接近3百万个)特征。普通的逻辑回归模型,不能有效地处理这么多特征,这时候我们需要神经网络。
8.2 神经元和大脑
神经网络的目的是制造能模拟大脑的机器。
8.3 模型表示1
大脑中的神经网络:每一个神经元都被认为是一个处理单元/神经核(processing unit/Nucleus),它含有许多输入/树突(input/Dendrite),并且有一个输出/轴突(output/Axon)。神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络。

神经网络模型建立在很多神经元之上,每个神经元又是一个学习模型。这些神经元(也叫**单元,activation unit)采纳一些特征作为输入,并且根据本身模型提供一个输出。下图是一个以逻辑回归模型作为自身学习模型的神经元示例,在神经网络中,参数又可被成为权重(weight)。

我们设计出了类似于神经元的神经网络,效果如下:

其中x1, x2, x3是输入单元(input units),将原始数据输入给它们。a1, a2, a3是中间单元,负责将数据进行处理,呈递到下一层。最后是输出单元,它负责计算hθ(x)。
神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。下图为一个3层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit):

下面引入一些标记法来帮助描述模型:
ai(j) 代表第j 层的第 i 个**单元。
θ(j)代表从第 j 层映射到第$ j+1$ 层时的权重的矩阵,例如θ(1)代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第 j+1层的**单元数量为行数,以第 j 层的**单元数加一为列数的矩阵。例如:上图所示的神经网络中θ(1)的尺寸为 3*4。
对于上图所示的模型,**单元和输出分别表达为:
a1(2)=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)
a2(2)=g(Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3)
a3(2)=g(Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3)
hΘ(x)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))
上面讨论只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。
可以知道:每一个a都是由上一层所有的x和每一个x所对应决定的。
(把这样从左到右的算法称为 前向传播算法 ( FORWARD PROPAGATION ))
把x, θ, a 分别用矩阵表示:

我们可以得到θ⋅X=a 。
8.4 模型表示2
( FORWARD PROPAGATION )
相对于使用循环来编写代码,向量化的方法会使计算更为简便。以上面的神经网络为例,计算第二层的值:

令 z(2)=θ(1)x,则 a(2)=g(z(2)) ,计算后添加 a0(2)=1。 计算输出的值为:

令 z(3)=θ(2)a(2),则 hθ(x)=a(3)=g(z(3))。
这只是针对训练集中一个训练实例所进行的计算。
如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。即:
z(2)=Θ(1)×XT
a(2)=g(z(2))
为了更好理解Neuron Networks的工作原理,我们先把左半部分遮住:

右半部分其实就是以a0,a1,a2,a3, 按照Logistic Regression的方式输出hθ(x):

神经网络就像是logistic regression,只不过把logistic regression中的输入向量[x1∼x3] 变成了中间层的[a1(2)∼a3(2)], 即: hθ(x)=g(Θ0(2)a0(2)+Θ1(2)a1(2)+Θ2(2)a2(2)+Θ3(2)a3(2))
我们可以把a0,a1,a2,a3看成更为高级的特征值,也就是x0,x1,x2,x3的进化体,并且它们是由 x与θ决定的,因为是梯度下降的,所以a是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 x次方厉害,也能更好的预测新数据。
这就是神经网络相比于逻辑回归和线性回归的优势。
8.5 特征和直观理解1
本质上讲,神经网络能够通过学习得出自身的一系列特征。普通的逻辑回归中,限制为使用数据中的原始特征x1,x2,...,xn,虽然可以使用一些二项式项组合这些特征,但是我们仍然受到这些原始特征的限制。但是神经网络中,原始特征只是输入层,在我们上面三层神经网络例子中,第三层做出的预测利用的是第二层的特征,而非输入层中的原始特征,可以认为第二层中的特征是神经网络通过学习后得出的一系列用于预测输出变量的新特征。
神经网络中,单层神经元(无中间层)的计算可用来表示逻辑运算,比如逻辑与(AND)、逻辑或(OR)。
举例说明:逻辑与(AND);下图中左半部分是神经网络的设计与output层表达式,右边上部分是sigmod函数,下半部分是真值表。
可以用这样的一个神经网络表示AND 函数:

其中θ0=−30,θ1=20,θ2=20
我们的输出函数hθ(x)即为:hΘ(x)=g(−30+20x1+20x2)
我们知道g(x)的图像是:


所以我们有:hΘ(x)≈x1ANDx2
所以我们的:hΘ(x),这就是AND函数。
OR函数:

OR与AND整体一样,区别在于取值不同。
8.6 样本和直观理解II
二元逻辑运算符(BINARY LOGICAL OPERATORS)当输入特征为布尔值(0或1)时,我们可以用一个单一的**层可以作为二元逻辑运算符,为了表示不同的运算符,我们只需要选择不同的权重即可。
下图的神经元(三个权重分别为-30,20,20)可以被视为作用同于逻辑与(AND):

下图的神经元(三个权重分别为-10,20,20)可以被视为作用等同于逻辑或(OR):

下图的神经元(两个权重分别为 10,-20)可以被视为作用等同于逻辑非(NOT):

可以用神经元来组合成更为复杂的神经网络以实现更复杂的运算。例如要实现XNOR 功能(输入的两个值必须一样,均为1或均为0),即 XNOR=(x1ANDx2)OR((NOTx1)AND(NOTx2))
首先构造一个能表达(NOTx1)AND(NOTx2)部分的神经元:

然后将表示 AND 的神经元和表示(NOTx1)AND(NOTx2)的神经元以及表示 OR 的神经元进行组合:

就得到了一个能实现 XNOR 运算符功能的神经网络。
8.7 多类分类
当有不止两种分类时(也就是y=1,2,3….),比如要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。例如,第一个值为1或0用于预测是否是行人,第二个值用于判断是否为汽车。
输入向量x有三个维度,两个中间层,输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现[a b c d]T,且a,b,c,d中仅有一个为1,表示当前类。下面是该神经网络的可能结构示例:

神经网络算法的输出结果为四种可能情形之一:
