系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力。
第6章 多入单出的单层神经网路
6.0 线性二分类
6.0.1 提出问题
我们经常看到中国象棋棋盘中,用楚河汉界分割开了两个阵营的棋子。回忆历史,公元前206年前后,楚汉相争,当时刘邦和项羽麾下的城池,在中原地区的地理位置示意图如图6-1所示,部分样本数据如表6-1所示。
图6-1 样本数据可视化
- 红色圆点,楚,项羽的城池
- 绿色叉子,汉,刘邦的城池
表6-1 样本数据抽样
样本序号 | X1:经度相对值 | X2:纬度相对值 | Y:1=汉, 0=楚 |
---|---|---|---|
1 | 0.325 | 0.888 | 1 |
2 | 0.656 | 0.629 | 0 |
3 | 0.151 | 0.101 | 1 |
4 | 0.785 | 0.024 | 0 |
... | ... | ... | ... |
200 | 0.631 | 0.001 | 0 |
我们在上一章学习了特征归一化的方法。在本例中,中原地区的经纬度坐标其实应该是一个两位数以上的实数,比如(35.234, -122.455)。为了简化问题,我们已经把它们归一化到[0,1]之间了。
问题:
- 经纬度相对坐标值为(0.58,0.92)时,属于楚还是汉?
- 经纬度相对坐标值为(0.62,0.55)时,属于楚还是汉?
- 经纬度相对坐标值为(0.39,0.29)时,属于楚还是汉?
读者可能会觉得这个太简单了,这不是有图吗?定位坐标值后在图上一比划,一下子就能找到对应的区域了。但是我们要求用机器学习的方法来解决这个看似简单的问题,以便将来的预测行为是快速准确的,而不是拿个尺子在图上去比划。
另外,本着用简单的例子说明复杂的原理的原则,我们用这个看似简单的例子,是想让读者对问题和解决方法都有一个视觉上的清晰认识,而这类可以可视化的问题,在实际生产环境中并不多见。
6.0.2 逻辑回归模型
回归问题可以分为两类:线性回归和逻辑回归。在第二步中,我们学习了线性回归模型,在第三步中,我们将一起学习逻辑回归模型。
逻辑回归的英文是Logistic Regression,逻辑回归是用来计算“事件=Success”和“事件=Failure”的概率。当因变量的类型属于二元(1 / 0,真/假,是/否)变量时,我们就应该使用逻辑回归。
回忆线性回归,使用一条直线拟合样本数据,而逻辑回归是“拟合”0或1两个数值,而不是具体的连续数值,所以它叫广义线性模型。逻辑回归又称logistic回归分析,常用于数据挖掘,疾病自动诊断,经济预测等领域。
例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”;自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。
自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。
逻辑回归的另外一个名字叫做分类器,分为线性分类器和非线性分类器,本章中我们学习线性分类器。而无论是线性还是非线性分类器,又分为两种:二分类问题和多分类问题,在本章中我们学习二分类问题。线性多分类问题将会在下一章讲述,非线性分类问题在后续的步骤中讲述。
综上所述,我们本章要学习的路径是:回归问题->逻辑回归问题->线性逻辑回归即分类问题->线性二分类问题。
表6-2示意说明了线性二分类和非线性二分类的区别。
表6-2 直观理解线性二分类与非线性二分类的区别
线性二分类 | 非线性二分类 |
---|---|
我们先学习如何解决线性二分类为标题,在此基础上可以扩展为非线性二分类问题。
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力。
6.1 二分类函数
此函数对线性和非线性二分类都适用。
6.1.1 二分类函数
对率函数Logistic Function,即可以做为激活函数使用,又可以当作二分类函数使用。而在很多不太正规的文字材料中,把这两个概念混用了,比如下面这个说法:“我们在最后使用Sigmoid激活函数来做二分类”,这是不恰当的。在本书中,我们会根据不同的任务区分激活函数和分类函数这两个概念,在二分类任务中,叫做Logistic函数,而在作为激活函数时,叫做Sigmoid函数。
- 公式
\[Logistic(z) = \frac{1}{1 + e^{-z}} \rightarrow a\]
- 导数
\[Logistic'(z) = a(1 - a)\]
具体求导过程可以参考8.1节。
- 输入值域
\[(-\infty, \infty)\]
- 输出值域
\[(0,1)\]
- 函数图像(图6-2)
图6-2 Logistic函数图像
- 使用方式
此函数实际上是一个概率计算,它把\((-\infty, \infty)\)之间的任何数字都压缩到\((0,1)\)之间,返回一个概率值,这个概率值接近1时,认为是正例,否则认为是负例。
训练时,一个样本x在经过神经网络的最后一层的矩阵运算结果作为输入z,经过Logistic计算后,输出一个\((0,1)\)之间的预测值。我们假设这个样本的标签值为0属于负类,如果其预测值越接近0,就越接近标签值,那么误差越小,反向传播的力度就越小。
推理时,我们预先设定一个阈值比如0.5,则当推理结果大于0.5时,认为是正类;小于0.5时认为是负类;等于0.5时,根据情况自己定义。阈值也不一定就是0.5,也可以是0.65等等,阈值越大,准确率越高,召回率越低;阈值越小则相反,准确度越低,召回率越高。
比如:
- input=2时,output=0.88,而0.88>0.5,算作正例
- input=-1时,output=0.27,而0.27<0.5,算作负例
6.1.2 正向传播
矩阵运算
\[ z=x \cdot w + b \tag{1} \]
分类计算
\[ a = Logistic(z)={1 \over 1 + e^{-z}} \tag{2} \]
损失函数计算
二分类交叉熵损失函数:
\[ loss(w,b) = -[y \ln a+(1-y) \ln(1-a)] \tag{3} \]
6.1.3 反向传播
求损失函数对a的偏导
\[ \frac{\partial loss}{\partial a}=-[{y \over a}+{-(1-y) \over 1-a}]=\frac{a-y}{a(1-a)} \tag{4} \]
求a对z的偏导
\[ \frac{\partial a}{\partial z}= a(1-a) \tag{5} \]
求损失函数loss对z的偏导
使用链式法则链接公式4和公式5:
\[ \frac{\partial loss}{\partial z}=\frac{\partial loss}{\partial a}\frac{\partial a}{\partial z} \]