Browse Source

Improve description

savefigrue
bushuhui 3 years ago
parent
commit
b0b775682c
2 changed files with 27 additions and 20 deletions
  1. +13
    -9
      5_nn/1-Perceptron.ipynb
  2. +14
    -11
      5_nn/2-mlp_bp.ipynb

+ 13
- 9
5_nn/1-Perceptron.ipynb View File

@@ -6,7 +6,7 @@
"source": [
"# 感知机\n",
"\n",
"感知机(Perceptron)是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机对应于输入空间中将实例划分为两类的分离超平面,感知机旨在求出该超平面。为求得超平面导入了基于误分类的损失函数,利用梯度下降法对损失函数进行最优化。感知机的学习算法具有简单而易于实现的优点,感知机预测是用学习得到的感知机模型对新的实例进行预测的,因此属于判别模型。\n",
"感知机(Perceptron)是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取`+1`或`-1`)。感知机对应于输入空间中将实例划分为两类的分离超平面,感知机旨在求出该超平面。为求得超平面导入了基于误分类的损失函数,利用梯度下降法对损失函数进行最优化。感知机的学习算法具有简单而易于实现的优点,感知机预测是用学习得到的感知机模型对新的实例进行预测的,因此属于判别模型。\n",
"\n",
"![perceptron](images/perceptron.png)\n"
]
@@ -17,13 +17,13 @@
"source": [
"## 1. 生物学、心理学解释\n",
"\n",
"心理学家唐纳德·赫布(Donald Olding Hebb)于1949年提出赫布理论,该理论能够解释学习的过程中脑中的神经元所发生的变化。赫布理论描述了突触可塑性的基本原理,即突触前神经元向突触后神经元的持续重复的刺激,可以导致突触传递效能的增加:\n",
"心理学家唐纳德·赫布(Donald Olding Hebb)于1949年提出`赫布理论`,该理论能够解释学习的过程中脑中的神经元所发生的变化。赫布理论描述了突触可塑性的基本原理,即突触前神经元向突触后神经元的持续重复的刺激,可以导致突触传递效能的增加:\n",
"> 当细胞A的轴突足以接近以激发细胞B,并反复持续地对细胞B放电,一些生长过程或代谢变化将发生在某一个或这两个细胞内,以致A作为对B放电的细胞中的一个,导致突触传递效能的增加。\n",
"\n",
"![neuron_cell](images/neuron_cell_cn.png)\n",
"\n",
"\n",
"心理学家弗兰克·罗森布拉特(Frank Rosenblatt)于1957年提出了感知机,它作为简化的数学模型解释大脑神经元如何工作:它取一组二进制输入值(附近的神经元),将每个输入值乘以一个连续值权重(每个附近神经元的突触强度),并设立一个阈值,如果这些加权输入值的和超过这个阈值,就输出1,否则输出0,这样的工作原理就相当于神经元是否放电。\n",
"心理学家弗兰克·罗森布拉特(Frank Rosenblatt)于1957年提出了`感知机`,它作为简化的数学模型解释大脑神经元如何工作:它取一组二进制输入值(附近的神经元),将每个输入值乘以一个连续值权重(每个附近神经元的突触强度),并设立一个阈值,如果这些加权输入值的和超过这个阈值,就输出1,否则输出0,这样的工作原理就相当于神经元是否放电。\n",
"\n",
"\n",
"感知机并没有完全遵循赫布理论,**但通过调输入值的权重,可以有一个非常简单直观的学习方案:给定一个有输入输出实例的训练集,感知机应该「学习」一个函数:对每个例子,若感知机的输出值比实例低太多,则增加它的权重,否则若设比实例高太多,则减少它的权重。**\n",
@@ -61,7 +61,7 @@
"metadata": {},
"source": [
"### 2.1 几何解释 \n",
"感知机模型是线性分类模型,感知机模型的假设空间是定义在特征空间中的所有线性分类模型,即函数集合$\\{ f | f(x)=w·x+b\\}$。线性方程 $w·x+b=0$对应于特征空间$\\mathbb{R}^n$中的一个超平面$S$,其中$w$是超平面的法向量,$b$是超平面的截距。这个超平面把特征空间划分为两部分,位于两侧的点分别为正负两类。超平面$S$称为分离超平面,如下图:\n",
"感知机模型是`线性分类模型`,感知机模型的假设空间是定义在特征空间中的所有线性分类模型,即函数集合$\\{ f | f(x)=w·x+b\\}$。线性方程 $w·x+b=0$对应于特征空间$\\mathbb{R}^n$中的一个超平面$S$,其中$w$是超平面的法向量,$b$是超平面的截距。这个超平面把特征空间划分为两部分,位于两侧的点分别为正负两类。超平面$S$称为分离超平面,如下图:\n",
"![perceptron_geometry_def](images/perceptron_geometry_def.png)\n",
"\n",
"### 2.2 生物学类比\n",
@@ -77,7 +77,7 @@
"\n",
"假设训练数据集是 **线性可分**,感知机学习的目标是求得一个能够将训练数据的正负实例点完全分开的分离超平面,即最终求得参数$w, b$。这需要一个学习策略,即定义(经验)损失函数并将损失函数最小化。\n",
"\n",
"损失函数的一个自然的选择是误分类的点的总数。但是这样得到的损失函数不是参数$w,b$的连续可导函数,不宜优化。损失函数的另一个选择是误分类点到分类面的距离之和。\n",
"损失函数的一个自然的选择是误分类的点的总数,但是这样得到的损失函数不是参数$w,b$的连续可导函数,不宜优化。损失函数的另一个选择是误分类点到分类面的距离之和。\n",
"\n",
"首先,对于任意一点$x$到超平面的距离([参考资料](https://www.cnblogs.com/graphics/archive/2010/07/10/1774809.html))为\n",
"$$\n",
@@ -88,11 +88,11 @@
"\n",
"这样,假设超平面$S$的总的误分类点集合为$\\mathbf{M}$,那么所有误分类点到$S$的距离之和为\n",
"$$\n",
"-\\frac{1}{||w||} \\sum_{x_i \\in M} y_i (w \\cdot x_i + b)\n",
"-\\frac{1}{||w||} \\sum_{x_i \\in \\mathbf{M}} y_i (w \\cdot x_i + b)\n",
"$$\n",
"不考虑$1/||w||$,就得到了感知机学习的损失函数\n",
"$$\n",
"L = - \\sum_{x_i \\in M} y_i (w \\cdot x_i + b)\n",
"L = - \\sum_{x_i \\in \\mathbf{M}} y_i (w \\cdot x_i + b)\n",
"$$\n",
"\n",
"### 3.1 经验风险函数\n",
@@ -111,7 +111,7 @@
"* 如果没有误分类点,那么$L(w,b)$为0\n",
"* 误分类点数越少,$L(w,b)$值越小\n",
"\n",
"一个特定的损失函数:在误分类时是参数$w,b$的线性函数,在正确分类时该损失函数是0。因此,给定训练数据集T,损失函数$L(w,b)$是$w,b$的连续可导函数。\n"
"该损失函数在误分类时是参数$w,b$的线性函数,在正确分类时该损失函数是0。因此,给定训练数据集$\\mathbf{T}$,损失函数$L(w,b)$是$w,b$的连续可导函数。\n"
]
},
{
@@ -121,7 +121,11 @@
"## 4. 感知机学习算法\n",
"\n",
"\n",
"最优化问题:给定数据集$\\mathbf{T} = \\{(x_1,y_1), (x_2, y_2), ... (x_N, y_N)\\}$,其中$x_i \\in \\mathbb{R}^n$, $y_i \\in \\{-1, +1\\},i=1,2...N$,求参数$w,b$,使其成为损失函数的解,其中$\\mathbf{M}$为误分类数据的集合:\n",
"最优化问题:给定数据集$\\mathbf{T} = \\{(x_1,y_1), (x_2, y_2), ... (x_N, y_N)\\}$,其中\n",
"* $x_i \\in \\mathbb{R}^n$\n",
"* $y_i \\in \\{-1, +1\\},i=1,2...N$\n",
"\n",
"求参数$w,b$,使其成为损失函数的解,其中$\\mathbf{M}$为误分类数据的集合:\n",
"\n",
"$$\n",
"min_{w,b} L(w, b) = - \\sum_{x_i \\in \\mathbf{M}} y_i (w \\cdot x_i + b)\n",


+ 14
- 11
5_nn/2-mlp_bp.ipynb View File

@@ -17,11 +17,11 @@
"source": [
"## 1. 神经元\n",
"\n",
"神经元和感知器本质上是一样的,只不过我们说感知器的时候,它的激活函数是阶跃函数;而当我们说神经元时,激活函数往往选择为sigmoid函数或tanh函数。如下图所示:\n",
"神经元和感知器本质上是一样的,感知器的激活函数是阶跃函数;而神经元的激活函数往往选择为sigmoid函数或tanh函数。如下图所示:\n",
"\n",
"![neuron](images/neuron.gif)\n",
"\n",
"计算一个神经元的输出的方法和计算一个感知器的输出是一样的。假设神经元的输入是向量$\\vec{x}$,权重向量是$\\vec{w}$(偏置项是$w_0$),激活函数是sigmoid函数,则其输出y:\n",
"计算一个神经元的输出的方法和计算一个感知器的输出是一样的。假设神经元的输入是向量$\\vec{x}$,权重向量是$\\vec{w}$(偏置项是$w_0$),激活函数是sigmoid函数,则其输出$y$:\n",
"$$\n",
"y = sigmod(\\vec{w}^T \\cdot \\vec{x})\n",
"$$\n",
@@ -45,7 +45,7 @@
"y' & = & y(1-y)\n",
"\\end{eqnarray}\n",
"\n",
"可以看到,sigmoid函数的导数非常有趣,它可以用sigmoid函数自身来表示。这样,一旦计算出sigmoid函数的值,计算它的导数的值就非常方便。\n",
"可以看到,sigmoid函数的导数可以用sigmoid函数自身来表示。这样,一旦计算出sigmoid函数的值,计算它的导数的值就非常方便。\n",
"\n"
]
},
@@ -57,21 +57,21 @@
"\n",
"![nn1](images/nn1.jpeg)\n",
"\n",
"神经网络其实就是按照一定规则连接起来的多个神经元。上图展示了一个全连接(full connected, FC)神经网络,通过观察上面的图,我们可以发现它的规则包括:\n",
"神经网络就是按照一定规则连接起来的多个神经元。上图展示了一个全连接(Full Connected, FC)神经网络,通过观察上面的图,我们可以发现它的规则包括:\n",
"\n",
"* 神经元按照层来布局\n",
"* 神经元按照层来布局\n",
" - 最左边的层叫做输入层,负责接收输入数据;\n",
" - 最右边的层叫输出层,我们可以从这层获取神经网络输出数据;\n",
" - 输入层和输出层之间的层叫做隐藏层,因为它们对于外部来说是不可见的。\n",
"* 同一层的神经元之间没有连接\n",
"* 第N层的每个神经元和第N-1层的所有神经元相连(这就是full connected的含义),第N-1层神经元的输出就是第N层神经元的输入\n",
"* 每个连接都有一个权值\n",
"* 同一层的神经元之间没有连接\n",
"* 第N层的每个神经元和第N-1层的所有神经元相连(这就是full connected的含义),第N-1层神经元的输出就是第N层神经元的输入\n",
"* 每个连接都有一个权值\n",
"\n",
"\n",
"由此可知,神经网络主要有三个基本要素:权重、偏置和激活函数\n",
"* 权重:神经元之间的连接强度由权重表示,权重的大小表示可能性的大小\n",
"* 权重:神经元之间的连接强度由权重控制,权重的大小表示可能性的大小\n",
"* 偏置:偏置的设置是为了正确分类样本,是模型中一个重要的参数,即保证通过输入算出的输出值不能随便激活。\n",
"* 激活函数:起非线性映射的作用,其可将神经元的输出幅度限制在一定范围内,一般限制在(-1~1)或(0~1)之间。最常用的激活函数是Sigmoid函数,可将(-∞,+∞)的数映射到(0~1)的范围内。\n",
"* 激活函数:起非线性映射的作用,其可将神经元的输出幅度限制在一定范围内,一般限制在(-1\\~1)或(0\\~1)之间。最常用的激活函数是Sigmoid函数,可将(-∞,+∞)的数映射到(0~1)的范围内。\n",
"\n",
"上面这些规则定义了全连接神经网络的结构。事实上还存在很多其它结构的神经网络,比如卷积神经网络(CNN)、循环神经网络(RNN),他们都具有不同的连接规则。\n"
]
@@ -87,7 +87,10 @@
"$$\n",
"\\vec{y} = f_{network}(\\vec{x})\n",
"$$\n",
"根据输入计算神经网络的输出,需要首先将输入向量$\\vec{x}$的每个元素的值$x_i$赋给神经网络的输入层的对应神经元,然后根据式1依次向前计算每一层的每个神经元的值,直到最后一层输出层的所有神经元的值计算完毕。最后,将输出层每个神经元的值串在一起就得到了输出向量$\\vec{y}$。\n"
"根据输入计算神经网络的输出\n",
"* 首先将输入向量$\\vec{x}$的每个元素的值$x_i$赋给神经网络的输入层的对应神经元\n",
"* 然后根据式(1)依次向前计算每一层的每个神经元的值,直到最后一层输出层的所有神经元的值计算完毕\n",
"* 最后,将输出层每个神经元的值串在一起就得到了输出向量$\\vec{y}$。\n"
]
},
{


Loading…
Cancel
Save