{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 多层神经网络和反向传播\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 神经元\n", "\n", "神经元和感知器本质上是一样的,只不过我们说感知器的时候,它的激活函数是阶跃函数;而当我们说神经元时,激活函数往往选择为sigmoid函数或tanh函数。如下图所示:\n", "![neuron](images/neuron.gif)\n", "\n", "计算一个神经元的输出的方法和计算一个感知器的输出是一样的。假设神经元的输入是向量$\\vec{x}$,权重向量是$\\vec{w}$(偏置项是$w_0$),激活函数是sigmoid函数,则其输出y:\n", "$$\n", "y = sigmod(\\vec{w}^T \\cdot \\vec{x})\n", "$$\n", "\n", "sigmoid函数的定义如下:\n", "$$\n", "sigmod(x) = \\frac{1}{1+e^{-x}}\n", "$$\n", "将其带入前面的式子,得到\n", "$$\n", "y = \\frac{1}{1+e^{-\\vec{w}^T \\cdot \\vec{x}}}\n", "$$\n", "\n", "sigmoid函数是一个非线性函数,值域是(0,1)。函数图像如下图所示\n", "![sigmod_function](images/sigmod.jpg)\n", "\n", "sigmoid函数的导数是:\n", "$$\n", "y = sigmod(x) \\ \\ \\ \\ \\ \\ (1) \\\\\n", "y' = y(1-y)\n", "$$\n", "可以看到,sigmoid函数的导数非常有趣,它可以用sigmoid函数自身来表示。这样,一旦计算出sigmoid函数的值,计算它的导数的值就非常方便。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 神经网络是啥?\n", "\n", "![nn1](images/nn1.jpeg)\n", "\n", "神经网络其实就是按照一定规则连接起来的多个神经元。上图展示了一个全连接(full connected, FC)神经网络,通过观察上面的图,我们可以发现它的规则包括:\n", "\n", "* 神经元按照层来布局。最左边的层叫做输入层,负责接收输入数据;最右边的层叫输出层,我们可以从这层获取神经网络输出数据。输入层和输出层之间的层叫做隐藏层,因为它们对于外部来说是不可见的。\n", "* 同一层的神经元之间没有连接。\n", "* 第N层的每个神经元和第N-1层的所有神经元相连(这就是full connected的含义),第N-1层神经元的输出就是第N层神经元的输入。\n", "* 每个连接都有一个权值。\n", "\n", "上面这些规则定义了全连接神经网络的结构。事实上还存在很多其它结构的神经网络,比如卷积神经网络(CNN)、循环神经网络(RNN),他们都具有不同的连接规则。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 计算神经网络的输出\n", "\n", "神经网络实际上就是一个输入向量$\\vec{x}$到输出向量$\\vec{y}$的函数,即:\n", "\n", "$$\n", "\\vec{y} = f_{network}(\\vec{x})\n", "$$\n", "根据输入计算神经网络的输出,需要首先将输入向量$\\vec{x}$的每个元素的值$x_i$赋给神经网络的输入层的对应神经元,然后根据式1依次向前计算每一层的每个神经元的值,直到最后一层输出层的所有神经元的值计算完毕。最后,将输出层每个神经元的值串在一起就得到了输出向量$\\vec{y}$。\n", "\n", "接下来举一个例子来说明这个过程,我们先给神经网络的每个单元写上编号。\n", "\n", "![nn2](images/nn2.png)\n", "\n", "如上图,输入层有三个节点,我们将其依次编号为1、2、3;隐藏层的4个节点,编号依次为4、5、6、7;最后输出层的两个节点编号为8、9。因为我们这个神经网络是全连接网络,所以可以看到每个节点都和上一层的所有节点有连接。比如,我们可以看到隐藏层的节点4,它和输入层的三个节点1、2、3之间都有连接,其连接上的权重分别为$w_{41}$,$w_{42}$,$w_{43}$。那么,我们怎样计算节点4的输出值$a_4$呢?\n", "\n", "\n", "为了计算节点4的输出值,我们必须先得到其所有上游节点(也就是节点1、2、3)的输出值。节点1、2、3是输入层的节点,所以,他们的输出值就是输入向量$\\vec{x}$本身。按照上图画出的对应关系,可以看到节点1、2、3的输出值分别是$x_1$,$x_2$,$x_3$。我们要求输入向量的维度和输入层神经元个数相同,而输入向量的某个元素对应到哪个输入节点是可以自由决定的,你偏非要把$x_1$赋值给节点2也是完全没有问题的,但这样除了把自己弄晕之外,并没有什么价值。\n", "\n", "一旦我们有了节点1、2、3的输出值,我们就可以根据式1计算节点4的输出值$a_4$:\n", "![eqn_3_4](images/eqn_3_4.png)\n", "\n", "上式的$w_{4b}$是节点4的偏置项,图中没有画出来。而$w_{41}$,$w_{42}$,$w_{43}$分别为节点1、2、3到节点4连接的权重,在给权重$w_{ji}$编号时,我们把目标节点的编号$j$放在前面,把源节点的编号$i$放在后面。\n", "\n", "同样,我们可以继续计算出节点5、6、7的输出值$a_5$,$a_6$,$a_7$。这样,隐藏层的4个节点的输出值就计算完成了,我们就可以接着计算输出层的节点8的输出值$y_1$:\n", "![eqn_5_6](images/eqn_5_6.png)\n", "\n", "同理,我们还可以计算出$y_2$的值。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量$\\vec{x} = (x_1, x_2, x_3)^T$时,神经网络的输出向量$\\vec{y} = (y_1, y_2)^T$。这里我们也看到,输出向量的维度和输出层神经元个数相同。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 神经网络的矩阵表示\n", "\n", "神经网络的计算如果用矩阵来表示会很方便(当然逼格也更高),我们先来看看隐藏层的矩阵表示。\n", "\n", "首先我们把隐藏层4个节点的计算依次排列出来:\n", "![eqn_hidden_units](images/eqn_hidden_units.png)\n", "\n", "接着,定义网络的输入向量$\\vec{x}$和隐藏层每个节点的权重向量$\\vec{w}$。令\n", "\n", "![eqn_7_12](images/eqn_7_12.png)\n", "\n", "代入到前面的一组式子,得到:\n", "\n", "![eqn_13_16](images/eqn_13_16.png)\n", "\n", "现在,我们把上述计算$a_4$, $a_5$,$a_6$,$a_7$的四个式子写到一个矩阵里面,每个式子作为矩阵的一行,就可以利用矩阵来表示它们的计算了。令\n", "![eqn_matrix1](images/eqn_matrix1.png)\n", "\n", "带入前面的一组式子,得到\n", "![formular_2](images/formular_2.png)\n", "\n", "在式2中,$f$是激活函数,在本例中是$sigmod$函数;$W$是某一层的权重矩阵;$\\vec{x}$是某层的输入向量;$\\vec{a}$是某层的输出向量。式2说明神经网络的每一层的作用实际上就是先将输入向量左乘一个数组进行线性变换,得到一个新的向量,然后再对这个向量逐元素应用一个激活函数。\n", "\n", "每一层的算法都是一样的。比如,对于包含一个输入层,一个输出层和三个隐藏层的神经网络,我们假设其权重矩阵分别为$W_1$,$W_2$,$W_3$,$W_4$,每个隐藏层的输出分别是$\\vec{a}_1$,$\\vec{a}_2$,$\\vec{a}_3$,神经网络的输入为$\\vec{x}$,神经网络的输出为$\\vec{y}$,如下图所示:\n", "![nn_parameters_demo](images/nn_parameters_demo.png)\n", "\n", "则每一层的输出向量的计算可以表示为:\n", "![eqn_17_20](images/eqn_17_20.png)\n", "\n", "\n", "这就是神经网络输出值的矩阵计算方法。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 神经网络的训练 - 反向传播算法\n", "\n", "现在,我们需要知道一个神经网络的每个连接上的权值是如何得到的。我们可以说神经网络是一个模型,那么这些权值就是模型的参数,也就是模型要学习的东西。然而,一个神经网络的连接方式、网络的层数、每层的节点数这些参数,则不是学习出来的,而是人为事先设置的。对于这些人为设置的参数,我们称之为超参数(Hyper-Parameters)。\n", "\n", "反向传播算法其实就是链式求导法则的应用。然而,这个如此简单且显而易见的方法,却是在Roseblatt提出感知器算法将近30年之后才被发明和普及的。对此,Bengio这样回应道:\n", "\n", "> 很多看似显而易见的想法只有在事后才变得显而易见。\n", "\n", "按照机器学习的通用套路,我们先确定神经网络的目标函数,然后用随机梯度下降优化算法去求目标函数最小值时的参数值。\n", "\n", "我们取网络所有输出层节点的误差平方和作为目标函数:\n", "![bp_loss](images/bp_loss.png)\n", "\n", "其中,$E_d$表示是样本$d$的误差。\n", "\n", "然后,使用随机梯度下降算法对目标函数进行优化:\n", "![bp_weight_update](images/bp_weight_update.png)\n", "\n", "随机梯度下降算法也就是需要求出误差$E_d$对于每个权重$w_{ji}$的偏导数(也就是梯度),怎么求呢?\n", "![nn3](images/nn3.png)\n", "\n", "观察上图,我们发现权重$w_{ji}$仅能通过影响节点$j$的输入值影响网络的其它部分,设$net_j$是节点$j$的加权输入,即\n", "![eqn_21_22](images/eqn_21_22.png)\n", "\n", "$E_d$是$net_j$的函数,而$net_j$是$w_{ji}$的函数。根据链式求导法则,可以得到:\n", "\n", "![eqn_23_25](images/eqn_23_25.png)\n", "\n", "\n", "上式中,$x_{ji}$是节点传递给节点$j$的输入值,也就是节点$i$的输出值。\n", "\n", "对于的$\\frac{\\partial E_d}{\\partial net_j}$推导,需要区分输出层和隐藏层两种情况。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 输出层权值训练\n", "\n", "![nn3](images/nn3.png)\n", "\n", "对于输出层来说,$net_j$仅能通过节点$j$的输出值$y_j$来影响网络其它部分,也就是说$E_d$是$y_j$的函数,而$y_j$是$net_j$的函数,其中$y_j = sigmod(net_j)$。所以我们可以再次使用链式求导法则:\n", "![eqn_26](images/eqn_26.png)\n", "\n", "考虑上式第一项:\n", "![eqn_27_29](images/eqn_27_29.png)\n", "\n", "\n", "考虑上式第二项:\n", "![eqn_30_31](images/eqn_30_31.png)\n", "\n", "将第一项和第二项带入,得到:\n", "![eqn_ed_net_j.png](images/eqn_ed_net_j.png)\n", "\n", "如果令$\\delta_j = - \\frac{\\partial E_d}{\\partial net_j}$,也就是一个节点的误差项$\\delta$是网络误差对这个节点输入的偏导数的相反数。带入上式,得到:\n", "![eqn_delta_j.png](images/eqn_delta_j.png)\n", "\n", "将上述推导带入随机梯度下降公式,得到:\n", "![eqn_32_34.png](images/eqn_32_34.png)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 隐藏层权值训练\n", "\n", "现在我们要推导出隐藏层的$\\frac{\\partial E_d}{\\partial net_j}$。\n", "\n", "![nn3](images/nn3.png)\n", "\n", "首先,我们需要定义节点$j$的所有直接下游节点的集合$Downstream(j)$。例如,对于节点4来说,它的直接下游节点是节点8、节点9。可以看到$net_j$只能通过影响$Downstream(j)$再影响$E_d$。设$net_k$是节点$j$的下游节点的输入,则$E_d$是$net_k$的函数,而$net_k$是$net_j$的函数。因为$net_k$有多个,我们应用全导数公式,可以做出如下推导:\n", "![eqn_35_40](images/eqn_35_40.png)\n", "\n", "因为$\\delta_j = - \\frac{\\partial E_d}{\\partial net_j}$,带入上式得到:\n", "![eqn_delta_hidden.png](images/eqn_delta_hidden.png)\n", "\n", "\n", "至此,我们已经推导出了反向传播算法。需要注意的是,我们刚刚推导出的训练规则是根据激活函数是sigmoid函数、平方和误差、全连接网络、随机梯度下降优化算法。如果激活函数不同、误差计算方式不同、网络连接结构不同、优化算法不同,则具体的训练规则也会不一样。但是无论怎样,训练规则的推导方式都是一样的,应用链式求导法则进行推导即可。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 具体解释\n", "\n", "我们假设每个训练样本为$(\\vec{x}, \\vec{t})$,其中向量$\\vec{x}$是训练样本的特征,而$\\vec{t}$是样本的目标值。\n", "\n", "![nn3](images/nn3.png)\n", "\n", "首先,我们根据上一节介绍的算法,用样本的特征$\\vec{x}$,计算出神经网络中每个隐藏层节点的输出$a_i$,以及输出层每个节点的输出$y_i$。\n", "\n", "然后,我们按照下面的方法计算出每个节点的误差项$\\delta_i$:\n", "\n", "* **对于输出层节点$i$**\n", "![formular_3.png](images/formular_3.png)\n", "其中,$\\delta_i$是节点$i$的误差项,$y_i$是节点$i$的输出值,$t_i$是样本对应于节点$i$的目标值。举个例子,根据上图,对于输出层节点8来说,它的输出值是$y_1$,而样本的目标值是$t_1$,带入上面的公式得到节点8的误差项应该是:\n", "![forumlar_delta8.png](images/forumlar_delta8.png)\n", "\n", "* **对于隐藏层节点**\n", "![formular_4.png](images/formular_4.png)\n", "\n", "其中,$a_i$是节点$i$的输出值,$w_{ki}$是节点$i$到它的下一层节点$k$的连接的权重,$\\delta_k$是节点$i$的下一层节点$k$的误差项。例如,对于隐藏层节点4来说,计算方法如下:\n", "![forumlar_delta4.png](images/forumlar_delta4.png)\n", "\n", "\n", "最后,更新每个连接上的权值:\n", "![formular_5.png](images/formular_5.png)\n", "\n", "其中,$w_{ji}$是节点$i$到节点$j$的权重,$\\eta$是一个成为学习速率的常数,$\\delta_j$是节点$j$的误差项,$x_{ji}$是节点$i$传递给节点$j$的输入。例如,权重$w_{84}$的更新方法如下:\n", "![eqn_w84_update.png](images/eqn_w84_update.png)\n", "\n", "类似的,权重$w_{41}$的更新方法如下:\n", "![eqn_w41_update.png](images/eqn_w41_update.png)\n", "\n", "\n", "偏置项的输入值永远为1。例如,节点4的偏置项$w_{4b}$应该按照下面的方法计算:\n", "![eqn_w4b_update.png](images/eqn_w4b_update.png)\n", "\n", "我们已经介绍了神经网络每个节点误差项的计算和权重更新方法。显然,计算一个节点的误差项,需要先计算每个与其相连的下一层节点的误差项。这就要求误差项的计算顺序必须是从输出层开始,然后反向依次计算每个隐藏层的误差项,直到与输入层相连的那个隐藏层。这就是反向传播算法的名字的含义。当所有节点的误差项计算完毕后,我们就可以根据式5来更新所有的权重。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Program" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "% matplotlib inline\n", "\n", "import numpy as np\n", "from sklearn import datasets, linear_model\n", "import matplotlib.pyplot as plt\n", "\n", "# generate sample data\n", "np.random.seed(0)\n", "X, y = datasets.make_moons(200, noise=0.20)\n", "\n", "# plot data\n", "plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0. 0. 0.]\n", "[[0.64542838 0.53253913]\n", " [0.69587439 0.42127568]\n", " [0.6467884 0.5194472 ]\n", " [0.66961109 0.4603445 ]\n", " [0.68655514 0.45194099]\n", " [0.68403036 0.46245535]\n", " [0.65214419 0.52105738]\n", " [0.68892948 0.43762808]\n", " [0.65145727 0.5206233 ]\n", " [0.69530054 0.42184819]\n", " [0.63375592 0.54536443]\n", " [0.67734017 0.45826309]\n", " [0.68873965 0.44569752]\n", " [0.68078977 0.46324812]\n", " [0.62047762 0.57572069]\n", " [0.66201234 0.50066075]\n", " [0.62652672 0.57428354]\n", " [0.67509297 0.46349122]\n", " [0.62805646 0.56459649]\n", " [0.6152309 0.59291485]\n", " [0.68078014 0.47463854]\n", " [0.68748493 0.441169 ]\n", " [0.62239908 0.58064425]\n", " [0.67780698 0.46845549]\n", " [0.61527952 0.59674834]\n", " [0.65301299 0.51009919]\n", " [0.68376885 0.46380142]\n", " [0.67950967 0.47280018]\n", " [0.65645741 0.50068735]\n", " [0.63190383 0.55322732]\n", " [0.64037549 0.54669781]\n", " [0.63787445 0.53626206]\n", " [0.68467178 0.44815997]\n", " [0.64570275 0.52307364]\n", " [0.63344061 0.55925768]\n", " [0.66650866 0.50490272]\n", " [0.66778592 0.48305992]\n", " [0.66821283 0.4855335 ]\n", " [0.62708697 0.55849838]\n", " [0.63539954 0.54308505]\n", " [0.6904015 0.43232959]\n", " [0.62327583 0.57132177]\n", " [0.63599942 0.5506892 ]\n", " [0.6639626 0.48714273]\n", " [0.68848035 0.44364042]\n", " [0.61757474 0.58765271]\n", " [0.67112162 0.48276929]\n", " [0.63035903 0.55087898]\n", " [0.67762199 0.45834684]\n", " [0.68731172 0.44302289]\n", " [0.62012115 0.57656213]\n", " [0.67576847 0.46515467]\n", " [0.68195096 0.47546646]\n", " [0.65345847 0.50121404]\n", " [0.6912795 0.43349233]\n", " [0.64241185 0.54058069]\n", " [0.64086261 0.53843287]\n", " [0.69231373 0.42931476]\n", " [0.62351095 0.57425031]\n", " [0.61877032 0.58419728]\n", " [0.66997231 0.47376432]\n", " [0.63513368 0.53712308]\n", " [0.68923874 0.44208853]\n", " [0.65058673 0.52584242]\n", " [0.68680992 0.44426858]\n", " [0.63646722 0.53146383]\n", " [0.61773704 0.58747212]\n", " [0.68683432 0.44921554]\n", " [0.62428515 0.5741634 ]\n", " [0.6265398 0.55867386]\n", " [0.68940031 0.43474757]\n", " [0.62197316 0.57076654]\n", " [0.68821242 0.43274634]\n", " [0.62632075 0.56167933]\n", " [0.67996616 0.45840974]\n", " [0.62840877 0.55422297]\n", " [0.65735698 0.50007275]\n", " [0.653575 0.51892012]\n", " [0.62728417 0.56933143]\n", " [0.6722307 0.47508204]\n", " [0.67766291 0.48462976]\n", " [0.62045451 0.5777636 ]\n", " [0.69462011 0.42118748]\n", " [0.65379768 0.54029292]\n", " [0.65015355 0.51394856]\n", " [0.61399683 0.60063388]\n", " [0.66967155 0.48178393]\n", " [0.61883545 0.58214799]\n", " [0.68330641 0.44954534]\n", " [0.66958159 0.50147962]\n", " [0.63123528 0.56360973]\n", " [0.64975211 0.52940887]\n", " [0.6791724 0.47711072]\n", " [0.62127769 0.57407004]\n", " [0.67138342 0.49887158]\n", " [0.68166774 0.46593973]\n", " [0.68914381 0.44418348]\n", " [0.6814121 0.45406161]\n", " [0.63320629 0.54115769]\n", " [0.66525169 0.483365 ]\n", " [0.70113207 0.4021057 ]\n", " [0.66042727 0.5239104 ]\n", " [0.6158391 0.5984706 ]\n", " [0.67563006 0.47185796]\n", " [0.62405364 0.56675149]\n", " [0.6341422 0.54968736]\n", " [0.65033621 0.50399789]\n", " [0.61560564 0.59223984]\n", " [0.68851143 0.44424884]\n", " [0.63032714 0.55790845]\n", " [0.62373144 0.56780916]\n", " [0.6190955 0.58654498]\n", " [0.61479149 0.59778757]\n", " [0.64013597 0.52883008]\n", " [0.65526041 0.51466915]\n", " [0.69730956 0.41614571]\n", " [0.63243373 0.55370584]\n", " [0.67098643 0.49947521]\n", " [0.68511739 0.44534543]\n", " [0.65313156 0.51375309]\n", " [0.63300568 0.56124219]\n", " [0.63605962 0.539493 ]\n", " [0.64836686 0.51628529]\n", " [0.62139293 0.58008798]\n", " [0.64932898 0.51333776]\n", " [0.6235741 0.56673449]\n", " [0.67305114 0.47308517]\n", " [0.65700846 0.50320471]\n", " [0.68682776 0.44420681]\n", " [0.65349271 0.53822609]\n", " [0.64658026 0.53509776]\n", " [0.63130791 0.54998535]\n", " [0.62871243 0.55143978]\n", " [0.67641457 0.46208977]\n", " [0.68083831 0.4618562 ]\n", " [0.67051156 0.48964901]\n", " [0.67839015 0.46427427]\n", " [0.64545239 0.51292276]\n", " [0.6606294 0.52549281]\n", " [0.64222193 0.53932354]\n", " [0.65220627 0.50861605]\n", " [0.63349683 0.54876668]\n", " [0.62113983 0.58530881]\n", " [0.61760612 0.58478278]\n", " [0.62154618 0.57528528]\n", " [0.66276585 0.49998043]\n", " [0.64789962 0.52213533]\n", " [0.69171714 0.43236179]\n", " [0.61884282 0.59008273]\n", " [0.66202646 0.48904737]\n", " [0.68505323 0.44422315]\n", " [0.69703152 0.41719461]\n", " [0.65463078 0.51385956]\n", " [0.62727924 0.56710318]\n", " [0.68234907 0.45343016]\n", " [0.62152597 0.57502776]\n", " [0.69106941 0.43467972]\n", " [0.6577279 0.50070683]\n", " [0.62167217 0.58763578]\n", " [0.6319471 0.56142611]\n", " [0.66526845 0.48615861]\n", " [0.69239083 0.43076428]\n", " [0.6302144 0.56671889]\n", " [0.68269858 0.45823332]\n", " [0.69473345 0.42048606]\n", " [0.66914479 0.49183979]\n", " [0.62590343 0.57079016]\n", " [0.67882189 0.45883859]\n", " [0.69099277 0.43617846]\n", " [0.69857324 0.4111444 ]\n", " [0.6257689 0.57580567]\n", " [0.64428699 0.51370314]\n", " [0.62812104 0.5542497 ]\n", " [0.64162491 0.52666474]\n", " [0.66370428 0.48858184]\n", " [0.68245629 0.45374376]\n", " [0.6439251 0.54817104]\n", " [0.63229486 0.54634744]\n", " [0.63368004 0.54360187]\n", " [0.62920379 0.56252525]\n", " [0.68802781 0.44443285]\n", " [0.63367224 0.54096919]\n", " [0.66908967 0.50101927]\n", " [0.69333237 0.43288566]\n", " [0.66294924 0.5164213 ]\n", " [0.62071028 0.58516989]\n", " [0.63089179 0.55649663]\n", " [0.6960798 0.41867759]\n", " [0.63428896 0.54164095]\n", " [0.62316292 0.56879113]\n", " [0.63333752 0.54240036]\n", " [0.62334574 0.57923263]\n", " [0.65510668 0.51380363]\n", " [0.65758931 0.50857068]\n", " [0.64630815 0.52118855]\n", " [0.62065332 0.5763107 ]\n", " [0.67037756 0.49168361]\n", " [0.66297331 0.4903177 ]\n", " [0.62110186 0.58268245]\n", " [0.68025074 0.46575819]]\n" ] } ], "source": [ "# generate the NN model\n", "class NN_Model:\n", " epsilon = 0.01 # learning rate\n", " n_epoch = 1000 # iterative number\n", " \n", "nn = NN_Model()\n", "nn.n_input_dim = X.shape[1] # input size\n", "nn.n_output_dim = 2 # output node size\n", "nn.n_hide_dim = 3 # hidden node size\n", "\n", "# initial weight array\n", "nn.W1 = np.random.randn(nn.n_input_dim, nn.n_hide_dim) / np.sqrt(nn.n_input_dim)\n", "nn.b1 = np.zeros((1, nn.n_hide_dim))\n", "nn.W2 = np.random.randn(nn.n_hide_dim, nn.n_output_dim) / np.sqrt(nn.n_hide_dim)\n", "nn.b2 = np.zeros((1, nn.n_output_dim))\n", "\n", "# defin sigmod & its derivate function\n", "def sigmod(X):\n", " return 1.0/(1+np.exp(-X))\n", "\n", "def sigmod_derivative(X):\n", " f = sigmod(X)\n", " return f*(1-f)\n", "\n", "# network forward calculation\n", "def forward(n, X):\n", " n.z1 = sigmod(X.dot(n.W1) + n.b1)\n", " n.z2 = sigmod(n.z1.dot(n.W2) + n.b2)\n", " return n\n", "\n", "# use random weight to perdict\n", "forward(nn, X)\n", "y = nn.z2[:, 0]>nn.z2[:,1]\n", "y_pred = np.zeros(nn.z2.shape[0])\n", "y_pred[np.where(nn.z2[:,0]