【基础入门篇】神经网络学习到的是什么?(Python)

神经网络(深度学习)学习到的是什么?一个含糊的回答是,学习到的是数据的本质规律。但具体这本质规律究竟是什么呢?要回答这个问题,我们可以从神经网络的原理开始了解。

一、 神经网络的原理

神经网络学习就是一种特征的表示学习,把原始数据通过一些简单非线性的转换成为更高层次的、更加抽象的特征表达。深度网络层功能类似于“生成特征”,而宽度层类似于“记忆特征”,增加网络深度可以获得更抽象、高层次的特征,增加网络宽度可以交互出更丰富的特征。通过足够多的转换组合的特征,非常复杂的函数也可以被模型学习好。
单隐藏层神经网络

可见神经网络学习的核心是,学习合适权重参数以对数据进行非线性转换,以提取关键特征或者决策。即模型参数控制着特征加工方法及决策。

了解了神经网络的原理,我们可以结合如下项目示例,看下具体的学习的权重参数,以及如何参与抽象特征生成与决策。


二、神经网络的学习内容

2.1 简单的线性模型的学习

我们先从简单的模型入手,分析其学习的内容。像线性回归、逻辑回归可以视为单层的神经网络,它们都是广义的线性模型,可以学习输入特征到目标值的线性映射规律。

如下代码示例,以线性回归模型学习加利福尼亚州房价数据集特征与房价的关系,并作出房价预测。数据是加利福尼亚州房价数据集,有共计8个特征,标签是房屋价格,单位为美元。

序号变量名说明示例
1MedInc该地区的收入中位数8.3252
2HouseAge该地区房屋的年龄中位数41
3AveRooms该地区平均房间数6.98412698
4AveBedrms该地区平均卧室数1.02380952
5Population该地区人口数量322.
6AveOccup该地区平均入住率2.55555556
7Latitude该地区的纬度37.88
8Longitude该地区的经度-122.23

该数据集包含了20640个样本。

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']="SimHei"
plt.rcParams['axes.unicode_minus']=False

from sklearn import datasets # 数据集
from sklearn import metrics # 模型度量
from sklearn.neural_network import MLPRegressor # 模型
from sklearn.model_selection import train_test_split # 数据集划分
'''
/**************************task1**************************/
导入数据集
/**************************task1**************************/
'''
# 定义数据集
housing_datasets = datasets.fetch_california_housing()
housing_features = housing_datasets['data']
housing_target = housing_datasets['target']
print("california_housing dataset has {} data points with {} variables each.".format(*housing_features.shape))

# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(housing_features, housing_target, test_size=0.3)

# 检查数据源各属性
# print("训练集大小:",len(x_train))
# print("训练集形状:",x_train.shape)
'''
/**************************task2**************************/
数据集特征分析
/**************************task2**************************/
'''# 显示某一因素对房价的影响图
plt.scatter(x_train[:,0], y_train)
plt.show()

# 显示所有因素属性与房价的关系图
plt.figure(figsize=(12,12))
titles = ["MedianIncome","HouseAge", "AveRooms", "AveBedrms", "Population" ,"AveOccup","Latitude" ,"Longitude"]
for i in range(8):
    plt.subplot(2,4,(i+1))
    plt.scatter(x_train[:,i],y_train)
    plt.xlabel(titles[i])
    plt.ylabel("Price")

plt.tight_layout()  # 自动调整子图,使之填充整个绘图区域,并消除子图之间的重叠
plt.show()

在这里插入图片描述
在这里插入图片描述

'''
/**************************task3**************************/
数据集标签分析
/**************************task3**************************/
'''
plt.hist(housing_target, bins=50, color=None)
plt.xlabel('SalePrice')
plt.show()

在这里插入图片描述

'''
/**************************task4**************************/
网络模型
/**************************task4**************************/
'''
model = MLPRegressor(hidden_layer_sizes=(64, 64), 
                     solver = 'adam', 
                     tol=1e-2)

# 模型训练
model.fit(x_train,y_train) 
# 模型预测
y_predict=model.predict(x_test)
print("正确标签:",y_test)
print("模型预测:",y_predict)

# 可视化训练过程
plt.figure(figsize=(12,6))
plt.plot(model.loss_curve_)
plt.xlabel("iters")
plt.ylabel(model.loss)
plt.show()

分析预测的效果,用上面数值体现不太直观,如下画出实际值与预测值的曲线,可见,整体模型预测值与实际值的差异还是比较小的(模型拟合较好)。

#绘图表示
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 设置图形大小
plt.figure(figsize=(8, 4), dpi=80)
plt.plot(range(len(y_test)), y_test, ls='-.',lw=2,c='r',label='真实值')
plt.plot(range(len(y_predict)), y_predict, ls='-',lw=2,c='b',label='预测值')

# 绘制网格
plt.grid(alpha=0.4, linestyle=':')
plt.legend()
plt.xlabel('number') #设置x轴的标签文本
plt.ylabel('房价') #设置y轴的标签文本

# 展示
plt.show()

在这里插入图片描述

'''
/**************************task5**************************/
模型评估
/**************************task5**************************/
'''
from sklearn.metrics import mean_squared_error, mean_absolute_error

R2 = model.score(X_test, y_test)
print ("Test R2 Score = ", R2)
'''计算训练集 MSE'''
pre_train = model.predict(x_train)
mse_train = mean_squared_error(pre_train,y_train)
print ("Train mean squared ERROR = ", mse_train)
'''计算训练集 MAE'''
pre_train = model.predict(x_train)
mae_train = mean_absolute_error(pre_train,y_train)
print ("Train mean absolute ERROR = ", mae_train)
'''计算测试集mse'''
pred_test = model.predict(x_test)
mse_test = mean_squared_error(pred_test,y_test)
print ("Test mean_squared ERROR = ", mse_test)

回到正题,我们的单层神经网络模型(线性回归),在数据(波士顿房价)、优化目标(最小化预测误差mse)、优化算法(梯度下降)的共同配合下,从数据中学到了什么呢?
将参数与对应输入特征组合一下,训练模型学到内容也就是——权重参数,它可以对输入特征进行加权求和输出预测值决策。

2.2 深度神经网络的学习

深度神经网络(深度学习)与单层神经网络的结构差异在于,引入了层数>=1的非线性隐藏层。从学习的角度上看,模型很像是集成学习方法——以上层的神经网络的学习的特征,输出到下一层。而这种学习方法,就可以学习到非线性转换组合的复杂特征,达到更好的拟合效果。

对于学习到的内容,他不仅仅是利用权重值控制输出决策结果–f(WX),还有比较复杂多层次的特征交互, 这也意味着深度学习不能那么直观数学形式做表示——它是一个复杂的复合函数f(f…f(WX)),有着更高的复杂度和更好的学习效果。

从深度神经网络的示例可以看出,神经网络学习的内容一样是权重参数。由于非线性隐藏层的作用下,深度神经网络可以通过权重参数对数据非线性转换,交互出复杂的、高层次的特征,并利用这些特征输出决策,最终取得较好的学习效果。但是,正也因为隐藏层交互组合特征过程的复杂性,学习的权重参数在业务含义上如何决策,并不好直观解释。

对于深度神经网络的解释,常常说深度学习模型是“黑盒”,学习内容很难表示成易于解释含义的形式。在此,一方面可以借助shap等解释性的工具加于说明。另一方面,还有像深度学习处理图像识别任务,就是个天然直观地展现深度学习的过程。如下展示输入车子通过层层提取的高层次、抽象的特征,图像识别的过程。注:图像识别可视化工具来源于https://poloclub.github.io/cnn-explainer/
在这里插入图片描述
在这里插入图片描述
在神经网络学习提取层次化特征以识别图像的过程:

  • 第一层,像是各种边缘探测特征的集合,在这个阶段,激活值仍然是保留了几乎原始图像的所有信息。
  • 更高一层,激活值就变得进一步抽象,开始表示更高层次的内容,诸如“车轮”。有着更少的视觉表示(稀疏),也提取到了更关键特征的信息。
    这和人类学习(图像识别)的过程是类似的——从具体到抽象,简单概括出物体的本质特征。

总结

大脑学习输入的视觉图像的抽象特征,而不相关忽略的视觉细节,提高效率的同时,学习的内容也有很强的泛化性,我们只要识别一辆车的样子,就也会辨别出不同样式的车。这也是深度神经网络学习更高层次、抽象的特征的过程。

参考

机器学习项目:boston_housing
神经网络学习到的是什么?(Python)
波士顿房价数据集、Iris数据集、MINIST数据集可视化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值