深度学习入门(一) 从感知机到神经网络
一、前言
第一次接触AI应该是大学的数据挖掘课,老师布置过一个课题是用matlab实现手写数字识别,当时没太认真
学。只依稀记得有个什么k-近邻算法,现在想想这应该是一种有监督的分类算法。
毕业后从事了java开发,但天天curd没能磨灭我对人工智能的向往(有可能是觉得AI很酷炫,有可能是被高
薪资吸引,也有可能单纯是做java做累了想换下口味,所以总结下来就是“向往”,而谈不上“热爱”)。
为此我倒是买了不少书,什么周志华机器学习、花书、模式分类,甚至还有一本计算机视觉方面研究生课程
的书。然而我的自学计划并不顺利,主要原因应该是数学基础太差,其次是自己的意志力不够,没能持之以恒。
另外不得不承认的是,随着年龄增长,加上这些年生活的颓废,自己能感觉到自己的IQ有比较明显的下滑。
总之走了很多弯路。
直到最近,我为了复习python,偶然发现一本好书。这本书叫《深度学习入门:基于Python的理论与实
现》,优点是几乎零基础就能学。我准备先看完这本书,再去回看花书。
二、感知机
感知机(perceptron)由美国学者Frank Rosecnblatt于1957年提出,是神经网络(深度学习)的起源算法。
如下图所示,这是一个接受两个输入信号的感知机的例子。图中的圈称为“神经元”或者“节点”。
这是神经元是否被激活公式, 其中x1、x2是输入信号,w1、2是权重,b是偏置,y=1表示神经元被激活。
下面我们将使用感知机来实现基本逻辑电路。首先列出每种逻辑计算的真值表,然后将真值表转化为
直角坐标系上的点,以便于观察。
(1)以下按顺序分别是“与”、“与非”、“或”的真值表、直接坐标系点分布图、python代码实现。
(2)通过观察“异或”在直角坐标系的点位图,我们发现无论如何我们都无法用一条直线分开0和1(线性空间),
但是用曲线可以(非线性空间)。右下为实现“异或”所使用的python代码,这里可以理解为一个双层感知机。
三、从感知机到神经网络
1. 激活函数(将输入信号的总和转化成输出信号)
(1)激活函数以阈值为界,一但输出超过阈值,就切换函数,这就是阶跃函数。阶跃函数总是输出0和1。
(2)sigmoid函数(平滑的),输出值介于(0,1)之间。
python代码:
def sigmoid(x): return 1/(1+np.exp(-x))
注意,神经网络的激活函数必须使用非线性的,否则加深神经网络的层数将变得毫无意义。
(3)Relu函数(Rectified Linear Unit)
python代码:
def relu(x): return np.maximum(0, x)
最近面试需要突击java,没空看这个,这个系列的学习先搁置。。。