感谢EEWORLD举办的这次活动,很荣幸收到了《动手学深度学习PyTorch版》这本巨著。
说他是巨著,名副其实,一方面作者是中美两位深耕机器学习的专家。
一方面,这本书是真的厚,足足有572页,像一本字典,概念、内容非常丰富,可作为入门及深究的书籍。
本次,重点学习本书的第一章~第四章。
也就是深度学习的基本概念,以及线性回归、多层感知机等,这部分算是一个入门,把读者带入到机器学习的门口,看看里面都有什么。
首先是基本概念:
机器学习:机器学习(Machine Learning,ML)是研究计算机模拟人类的学习活动,获取知识和技能的理论和方法,改善系统性能的学科。
有监督学习指利用一组带标签的数据(已知输出的数据)训练学习模型,然后用经训练的模型对未知数据进行预测。
无监督学习根据类别未知(没有被标记)的训练样本解决模式识别中的各种问题。
强化学习(Reinforcement Learning,RL)又称为再励学习、评价学习,是一种通过模拟大脑神经细胞中的奖励信号来改善行为的机器学习方法。
有监督学习(Supervised)
回归
分类
排序
无监督学习
聚类
降维
密度估计
生成模型
生成对抗网络(GAN)
关联规则学习(Association rule learning)
Apriori
Eclat
半监督学习(Semi-supervised)
强化学习(Reinforcement)
无模型的
策略优化(Policy Optimization)
优化 Q-Learning
有模型的
AlphaZero
目前,我们入门部分主要针对的就是有监督学习(Supervised)
1. 回归
2. 分类
3. 排序
张量:
在多维 Numpy 数组中,也叫张量(tensor)。一般来说,当前所有机器学习系统都使用张量作为基本数据结构。
张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。你可能对矩阵很熟悉,它是二维张量。张量是矩阵向任意维度的推广。
回归:分为线性回归和非线性回归。
线性:两个变量之间的关系是一次函数关系的——图象是直线,叫做线性。
注意:线性是指广义的线性,也就是数据与数据之间的关系。
非线性:两个变量之间的关系不是一次函数关系的——图象不是直线,叫做非线性。
那到底什么时候可以使用线性回归呢?统计学家安斯库姆给出了四个数据集,被称为安斯库姆四重奏。
从这四个数据集的分布可以看出,并不是所有的数据集都可以用一元线性回归来建模。现实世界中的问题往往更复杂,变量几乎不可能非常理想化地符合线性模型的要求。因此使用线性回归,需要遵守下面几个假设:
线性回归是一个回归问题。
要预测的变量 y 与自变量 x 的关系是线性的(图2 是一个非线性)。
各项误差服从正太分布,均值为0,与 x 同方差(图4 误差不是正太分布)。
变量 x 的分布要有变异性。
多元线性回归中不同特征之间应该相互独立,避免线性相关。
一个线性回归的Python实例。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression # 线性回归
# 样本数据集,第一列为x,第二列为y,在x和y之间建立回归模型
data=[
[0.067732,3.176513],[0.427810,3.816464],[0.995731,4.550095],[0.738336,4.256571],[0.981083,4.560815],
[0.526171,3.929515],[0.378887,3.526170],[0.033859,3.156393],[0.132791,3.110301],[0.138306,3.149813],
[0.247809,3.476346],[0.648270,4.119688],[0.731209,4.282233],[0.236833,3.486582],[0.969788,4.655492],
[0.607492,3.965162],[0.358622,3.514900],[0.147846,3.125947],[0.637820,4.094115],[0.230372,3.476039],
[0.070237,3.210610],[0.067154,3.190612],[0.925577,4.631504],[0.717733,4.295890],[0.015371,3.085028],
[0.335070,3.448080],[0.040486,3.167440],[0.212575,3.364266],[0.617218,3.993482],[0.541196,3.891471]
]
#生成X和y矩阵
dataMat = np.array(data)
X = dataMat[:,0:1] # 变量x
y = dataMat[:,1] #变量y
# ========线性回归========
model = LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
model.fit(X, y) # 线性回归建模
print('系数矩阵:\n',model.coef_)
print('线性回归模型:\n',model)
# 使用模型预测
predicted = model.predict(X)
plt.scatter(X, y, marker='x')
plt.plot(X, predicted,c='r')
plt.xlabel("x")
plt.ylabel("y")
运行结果为:
多层感知机:
多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构,如下图:
既然有多层感知机,那必然有单层感知机
感知机是由美国学者FrankRosenblatt在1957年提出来的。感知机是作为神经网络(深度学习)的起源的算法。因此,学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。
感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。像电流流过导线,向前方输送电子一样,感知机的信号也会形成流,向前方输送信息。但是,和实际的电流不同的是,感知机的信号只有“流/不流”(1/0)两种取值。这里我们认为0对应“不传递信号”, 1对应“传递信号”。
下图就是一个接收几个输入信号的感知机的例子。
一个感知机的python实例如下:
>>> import numpy as np
>>> x = np.array([0, 1]) # 输入
>>> w = np.array([0.5, 0.5]) # 权重
>>> b = -0.7 # 偏置
>>> w*x
array([ 0. , 0.5])
>>> np.sum(w*x)
0.5
>>> np.sum(w*x) + b
-0.19999999999999996 # 大约为-0.2(由浮点小数造成的运算误差)
回到多层感知机。
多层感知机的训练学习过程包括以下步骤:
- 准备数据集:将数据集划分为训练集和测试集,并进行必要的预处理(如归一化或标准化)。
- 构建模型:选择合适的网络结构,包括隐藏层的数量和神经元的数量,并确定激活函数和损失函数。
- 编译和训练模型:指定优化算法、学习率和迭代次数等参数,并使用训练集对模型进行训练。
- 模型评估和预测:使用测试集评估模型的性能,并对新数据进行预测。
下面是一个使用Keras库实现的多层感知机(MLP)的代码示例:
# 5.1 导入必要的库
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
# 5.2 准备数据集
X_train = ...
y_train = ...
X_test = ...
y_test = ...
# 5.3 构建模型
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
# 5.4 编译和训练模型
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=32)
# 5.5 模型评估和预测
loss, accuracy = model.evaluate(X_test, y_test)
predictions = model.predict(X_test)
在上述代码中,我们首先导入了所需的库,然后准备了训练集和测试集数据。接下来,我们构建了一个Sequential模型,并使用Dense层定义了网络结构。在编译模型时,我们指定了损失函数、优化算法和评估指标。然后,使用训练集对模型进行训练,并指定迭代次数和批次大小。最后,我们使用测试集评估了模型的性能,并对新数据进行了预测。
本次的学习分享就到这里。