本文作为日本斋藤康毅《深度学习入门—基于Python的理论与实现》(以后简称深度学习入门)的学习总结(国内译版本由人民邮电出版社出版)。
首先作为一个半路出家的人工智能初学者和爱好者,在网上首先购入的就是花书DL和瓜书的ML,拿到这两本书捧在手上顿时感觉一种学院派的气息,走在路上都格外的有格调。
但是这两本书让白纸一样的我陷入了迷茫。直到现在,我都没有从头至尾的读完那两本书(关于不推荐入门者使用这两本书的理由在很多地方都可以找到,这里不再赘述)。而深度学习入门挽救了我,个人认为如果是从零自学DL,这本书应该再适合不过的了。
首先,如前言中所述,这本书需要使用的前置知识:
- Python语言及Numpy等数据处理库——整本书都使用Python语言及Python的相关库来实现深度学习算法。
- 基础的微积分知识和线性代数理论。
其次,这么薄薄的一本书,不会全面的介绍到深度学习的每一个角落,恰恰这也是最适合新手的原因。以下是个人认为在深度学习中很重要但是本书不会涉及的内容:
- 不介绍任何深度学习框架的使用方法。
- 不介绍深度学习相关的最新研究进展。
- 不介绍深度学习的详细理论。
- 不会为了实现深度学习而进行GPU相关实现。
- 本书以图像识别为主题,不会介绍自然语言处理等深度学期其他热门应用的例子。
接下来为正式内容。
感知机
书中介绍感知机(perceptron)应该是理论上的朴素感知机,即现今普遍认为的深度学习算法的起源算法。
感知机输入为多个信号值,输出单个信号值。输入信号经过与权重(weight)记做、和偏置(bias)记做b的组合计算后得到的值与阈值(记做T)进行比较,若该结果超过阈值,则输出信号为1否则输出信号为0。
用数学内容来表达就是:
y
=
{
0
(
w
1
×
x
1
+
w
2
×
x
2
+
b
⩽
0
)
1
(
w
1
×
x
1
+
w
2
×
x
2
+
b
>
0
)
y = \left\{\begin{matrix} 0\quad(w1\times x1 + w2\times x2 + b \leqslant 0) \\ 1\quad(w1\times x1 + w2\times x2 +b >0 ) \end{matrix}\right.
y={0(w1×x1+w2×x2+b⩽0)1(w1×x1+w2×x2+b>0)
使用感知机可以实现以逻辑电路为题材的与或非门,以下代码实现了一个感知机类,通过输入信号和偏置来实现一个实例化一个感知机,并且通过感知机实现与门、或门、与非门、或非门、异或门。分别表示对输入信号进行与或非以及异或运算。其中的异或运算使用单层感知机无法实现,这在历史上也称为线性不可分问题,为了解决该问题,使用了双层感知机,即第一层对输入信号分别进行与非运算和或运算,再用二者的运算结果进行与运算,相当于对输入信号进行了异或运算。
class preceptron:
def __init__(self,x1,x2,b=0):
self.x1 = x1
self.x2 = x2
self.b = b
def andGate(self):
w1,w2,theta = 0.5,0.5,0.8
tmp = w1 * self.x1 + w2 * self.x2 + self.b
if tmp > theta:
return 1
else:
return 0
def orGate(self):
w1,w2,theta = 0.5,0.5,0.3
tmp = w1 * self.x1 + w2 * self.x2 + self.b
if tmp > theta:
return 1
else:
return 0
def notAndGate(self):
w1,w2,theta = -0.5,-0.5,-0.8
tmp = w1 * self.x1 + w2 * self.x2 + self.b
if tmp > theta:
return 1
else:
return 0
def notOrGate(self):
w1,w2,theta = -0.5,-0.5,-0.3
tmp = w1 * self.x1 + w2 * self.x2 + self.b
if tmp >theta:
return 0
else:
return 1
def xorGate(self):
#可以看到异或运算分别调用了与非门、或门,再将其结果放入与门。
self.x1 = self.notAndGate()
self.x2 = self.orGate()
return self.andGate()
使用多层感知机来解决线性不可分问题为当代深度神经网络提供了一个指导方向——使用多层神经网络来解决单层不能解决的问题,使用深层深度网络达到浅层不能达到的精度。