初识神经网络

非线性假设函数

将线性回归应用在一批复杂且有很多特征的数据集是非常不明智的。

假设你想用三个特征来组合产生所有二次项,并创建一个假设函数:
$g(θ_0+θ_1x^2_1+θ_2x_1x_2+θ_3x_1x_3+θ_4x^2_2+θ_5x_2x_3+θ_6x^2_3)$
可以看到,这里有6个特征,可以通过组合公式:$\frac{n+r-1}{r!(n-1)!}$ ,
来计算能产生多少个多项式组合。

比如100个特征,则可以产生$\frac{100+2-1}{2!(n100-1)!}=5050$个二次项特征。
如果想将特征组合成二次项,我们可以粗略地用$O(n^2/2)$来表示新特征数的增长情况。
如果想组合成立方式的话,特征数则约为$O(n^3)$。
这个增长比例是十分夸张的,所以随着特征数的增加,二次项和三次项的特征增加得十分迅速,此时若再使用线性回归是十分不切实际的。

举个例子:假设我们有一些50*50像素的黑白照片,我们的目标是分类出哪些照片是车。
此时我们的特征数n=2500,如果我们比较每一个像素点。
现在,如果我们需要构造一个二次项假设函数,根据前文,我们知道增长比例约为O(n^2/2)。所以,我们总共有$2500^2/2=3125000$个特征,可想而知,此时使用线性回归是十分不切实际的。

当我们遇到了很多特征的复杂函数时,神经网络提供了另一种机器学习的方法。

神经元和大脑

神经网络主要是通过模仿我们的大脑是如何工作的。
由于计算机硬件的进步,神经网络近期有了一次重大的复兴。
(早年神经网络的提出,由于计算机硬件的限制,无法得以发展。)

有证据表明,大脑对所有不同的功能只使用一种“学习算法”。
科学家们曾经试图切断耳道和听觉皮层之间的连接,
并将听觉皮层重新连接到光学神经上,发现听觉皮层慢慢地学会了看。

这个原理被称为“神经可塑性”,并有许多例子和实验证据。

模型表示 I

让我们来看看如何使用神经网络来表示一个假设函数。

**简单地说,神经元可以看做是一个计算单位,
它们将(来自树突的)输入作为电输入,(经过轴突)将其引导到输出。

在我们的模型当中,树突的输入相当于我们的输入特征$x_1…x_n$,而输出则是我们的假设函数:**

在这个模型中,我们的$X_0$输入节点也被成为“偏向单元”,其总是为1。
在神经网络中,我们使用同样的逻辑函数用于分类:$\frac{1}{1+e^{Θ^Tx}}$。
有时,我们也把它称为sigmoid(逻辑)激活函数。

其中,在神经网络模型中,$Θ$参数经常被称为”权重”。
一个简单的模型表示如下:
$\begin{bmatrix}x_0 \\ x_1\\ x_2\end{bmatrix}→\begin{bmatrix}\end{bmatrix}→h_Θ(x)$
在上面这个模型中,我们的输入节点(层1)被传入另一个节点(层2),并作为假设函数输出。
第一层也被成为“输入层”,最后一层被称为“输出层”,输出层会给出通过假设函数输出的最终值。

我们可以在输入层和输出层之间加入中间层节点,称为“隐层”
我们给这些中间层(或者叫隐层)标志为$a^2_0…a^2_n$,并称之为“激活单元”
$a^{(j)}_i =$第j层i个激活单元
$Θ^{(j)}$控制从j层映射到j+1层的权重矩阵

如果我们有一个隐层,则模型看起来如下:

$\begin{bmatrix}x_0 \\ x_1\\ x_2\\ x_3\end{bmatrix}→\begin{bmatrix}a^{(2)}_1\\a^{(2)}_2\\a^{(2)}_3\end{bmatrix}
→h_Θ(x)$

每一个“激活”节点是这样得到的:
$a^{(2)}_1=g(Θ^{(1)}_{10}x_0+Θ^{(1)}_{11}x_1+Θ^{(1)}_{12}x_2+Θ^{(1)}_{13}x_3)$
$a^{(2)}_2=g(Θ^{(1)}_{20}x_0+Θ^{(1)}_{21}x_1+Θ^{(1)}_{22}x_2+Θ^{(1)}_{23}x_3)$
$a^{(2)}_3=g(Θ^{(1)}_{30}x_0+Θ^{(1)}_{31}x_1+Θ^{(1)}_{32}x_2+Θ^{(1)}_{33}x_3)$
$h_Θ(x)=a^{(3)}_1=g(Θ^{(2)}_{10}a^{(2)}_0+Θ^{(2)}_{11}a^{(2)}_1+Θ^{(2)}_{12}a^{(2)}_2+Θ^{(2)}_{13}a^{(2)}_3)$

也就是说,要计算这个模型的激活节点,我们需要一个3*4的参数矩阵。
我们将每行参数应用于我们的输入以获取一个激活节点的值。
我们的假设函数输出是将逻辑函数应用于激活节点和参数$Θ^{(2)}$的乘积之和,
其中$Θ^{(2)}$包含了第二层节点的权重。

每一层都有一个自己的参数(权重)矩阵。
该权重矩阵的大小取决于:
如果该网络的$j$层有$s_j$个单元,$j+1$层有$s_{j+1}$个单元,那么权重矩阵$Θ_j$的大小将为$s_{j+1}×(s_j+1)$。
其中,+1是“偏向节点”$x_0$和$Θ^{(j)}_0$项的运算。
换句话说,输出节点中没有偏向节点,但输入节点中则包含偏向节点。

举个例子:
层1有2个输入节点,而层2有4个激活节点,
那么参数矩阵$Θ^{(j)}$则是一个4*3的矩阵,
其中,$s_j=2$,$s_{j+1}=4$,则$s_{j+1}×(s_j+1)=4*3$

模型表示 II

在这一节当中,我们将对上述的函数实现向量化
我们将要定义一个新的变量$z^{(j)}_k$来包含g函数中的参数。
在前面的例子中,我们可用z来替代所有的参数:
$a^{(2)}_1=g(z^{(2)}_1)$
$a^{(2)}_2=g(z^{(2)}_2)$
$a^{(2)}_3=g(z^{(2)}_3)$

换句话说,对于层j=2,第k个节点,变量z如下:
$z^{(2)}_k=Θ^{(1)}_{k0}x_0+Θ^{(1)}_{k1}x_1+Θ^{(1)}_{kn}x_n$

向量化的$x$和$z^j$如下:
$x=\begin{bmatrix}x_0\\x_1\\…\\x_n\end{bmatrix} ,z^{(j)}=\begin{bmatrix}z^{(j)}_1\\z^{(j)}_2\\…\\z^{(j)}_n\end{bmatrix}$

将$x$表示为$a^{(1)}$,我们可以重新整理公式如下:
$z^{j}=Θ^{(j-1)}a^{(j-1)}$
可以看出,$Θ^{(j-1)}$的大小为$s_j×(n+1)$,
其中$s_j$是激活节点的数目,$a^{(j-1)}$是$n+1$维的向量,
显然$z^{j}$的大小将为$s_j$。

现在,我们可以得到j层的激活节点:
$a^{(j)}=g(z^{(j)})$,其中函数g将会逐元素的应用在向量$z^{(j)}$上。
在我们计算完$a^{(j)}$后,我们可以加一个偏向单元(等于1),也就是$a_0^{(j)}$。
为了计算我们最终的假设函数,我们首先要计算另一个z向量:
$z^{j+1}=Θ^{(j)}a^{(j)}$
然后我们得到最后的结果如下:
$h_Θ(x)=a^{(j+1)}=g(z^{(j+1)})$

可以看到在最后一步中,层j和层j+1之间做的是和逻辑回归同样的事情。

在神经网络中,这些中间层使得我们可以很优雅地生成更加有趣且复杂的非线性假设函数。

例子和直观理解 I

一个简单的例子是把神经网络应用到预测$x_1$和$x_2$的逻辑与
(只有当$x_1$和$x_2$同时为1的时候返回True)。

我们的函数如下:
$\begin{bmatrix}x_0\\x_1\\x_2\end{bmatrix}→\begin{bmatrix}g(z^{(2)})\end{bmatrix}→hΘ(x)$,其中偏向项$x_0=1$。

设置第一个$Θ$矩阵如下:
$Θ^{(1)}=\begin{bmatrix}-30\\20\\20\end{bmatrix}$

这将会导致假设函数的输出仅在$x_1$和$x_2$同时为1的时候为1。

换句话说:
$h_Θ(x)=g(−30+20x_1+20x_2)$
$x_1=0$ 且 $x_2=0$ 那么 $g(−30)≈0$
$x_1=0$ 且 $x_2=1$ 那么 $g(−10)≈0$
$x_1=1$ 且 $x_2=0$ 那么 $g(−10)≈0$
$x_1=1$ 且 $x_2=1$ 那么 $g(10)≈1$

也就是说我们可以通过使用小型神经网络,
而不是使用实际的与门来构建计算机中的基本操作之一。
当然,神经网络也可以用来模拟所有其他的逻辑门。

例子和直观理解 II

我们可以这样构建与(AND)、非(NOR)、或(OR)等逻辑门的参数矩阵$Θ^{(1)}$:
AND:
$Θ^{(1)}=\begin{bmatrix}−30&20&20\end{bmatrix}$
NOR:
$Θ^{(1)}=\begin{bmatrix}10&−20&−20\end{bmatrix}$
OR:
$Θ^{(1)}=\begin{bmatrix}−10&20&20\end{bmatrix}$

通过这些,我们可以组合出同或(XNOR)逻辑门(当$x_1$和$x_2$同时为1或0时为1)。
$\begin{bmatrix}x_0\\x_1\\x_2\end{bmatrix}→\begin{bmatrix}a^{(2)}_1\\a^{(2)}_2\end{bmatrix}→\begin{bmatrix}a^{(3)}\end{bmatrix}→hΘ(x)$

对于第一层和第二层之间的过渡,我们将使用$Θ^{(1)}$,其中结合了AND和NOR的值:
$Θ^{(1)}=\begin{bmatrix}−30&20&20\\10&−20&−20\end{bmatrix}$

而第二层和第三层之间的过渡,我们将使用$Θ^{(2)}$(使用了OR的值):
$Θ^{(2)}=\begin{bmatrix}−10&20&20\end{bmatrix}$

最后整理一下所有节点:
$a^{(2)}=g(Θ^{(1)}⋅x)$
$a^{(3)}=g(Θ^{(2)}⋅a^{(2)})$
$h_Θ(x)=a^{(3)}$

到这里为止,我们为XNOR操作构建了两个隐层。

多元分类

在神经网络中,如果想要进行多元分类,需要使得假设函数返回一个向量组。

比如,我们想要将数据分为4类:
$\begin{bmatrix}x_0\\x_1\\x_2\\…\\x_n\end{bmatrix}→\begin{bmatrix}a^{(2)}_0\\a^{(2)}_1\\a^{(2)}_2\\…\end{bmatrix}→\begin{bmatrix}a^{(3)}_0\\a^{(3)}_1\\a^{(3)}_2\\…\end{bmatrix}→\begin{bmatrix}h_Θ(x)_1\\h_Θ(x)_2\\h_Θ(x)_3\\h_Θ(x)_4\end{bmatrix}→$

我们对一组输入的假设函数输出结果可能如下所示:
$h_Θ(x)=\begin{bmatrix}0\\0\\1\\0\end{bmatrix}$
这种情况意味着,我们的结果类是第三个类。
我们可以将我们的结果类定义为y:
$y^{(i)}=\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}$
假设函数对一组输入的最终输出值将是y中的一个元素。

分享到