机器学习03:人工神经网络
人工神经元
人工神经元的结构
人工神经元模型如下:
一个人工神经元由两部分组成:
- 前半部分对前方所有神经元的输出进行线性加权求和.
- 后半部分是一个激活函数,这个激活函数通常是非线性的.
一个完整的神经元相当于一个非线性回归环节.
激活函数的选择
激活函数为什么是非线性的
神经网络是由多层神经元组成的.若激活函数是线性的,则该层神经元仅仅是对上一层的输出做了一个线性加权,可以与下一层神经元的线性加权环节相合并,没有实际意义.
常见的激活函数
常见的激活函数有三种:
-
Sigmond函数: 将 ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞)映射到 ( 0 , 1 ) (0, 1) (0,1)之间.
-
优点: 易于求导
-
缺点:
-
在 ∞ \infty ∞处导数值趋近于0,易产生梯度消失(gradient vanishing)问题.
-
输出不是原点对称(zero-centered)的,输出永远大于0,这会导致振荡收敛,收敛速度较慢.
-
幂运算耗时,实际上我们这里需要的只是一个阈值(threshold),并不需要复杂的幂运算.
-
-
-
tanh函数: 将 ( − ∞ , + ∞ ) (-\infty, +\infty) (−∞,+∞)映射到 ( − 1 , 1 ) (-1, 1) (−1,1)之间.
它的输出是原点对称的,解决了振荡收敛的问题;但仍未解决梯度消失以及复杂幂运算的问题.
-
Relu函数: 在 ( − ∞ , 0 ) (-\infty, 0) (−∞,0)之间函数值为0,在 ( 0 , + ∞ ) (0, +\infty) (0,+∞)为输入值.
在正区间解决了梯度消失的问题;同时其计算也相当简单,只要进行一个简单的判断.
神经网络
人工神经网络分为三个部分: 输入层(input layer),隐藏层(hidden layer),输出层(output layer).
隐藏层的作用
隐藏层可以对数据进行推理演绎,将输入层的特征抽象到另一个空间.可以对原始数据进行升维或降维.
使用代码训练神经网络
Sklearn库的sklearn.neural_network
模块提供了一个人工神经网络的简单实现.其MLPClassifier
类为神经网络分类器,MLPRegressor
为神经网络回归器.下面演示其简单使用.
from sklearn.neural_network import MLPRegressor
import pandas
# 读取数据并分为训练数据和测试数据
concrete_data = pandas.read_csv('./concrete.csv')
train_data = concrete_data.loc[0:927]
test_data = concrete_data.loc[928:1029]
train_X = train_data[['cement', 'slag', 'ash', 'water', 'superplastic', 'coarseagg', 'fineagg', 'age']]
train_Y = train_data['strength']
test_X = test_data[['cement', 'slag', 'ash', 'water', 'superplastic', 'coarseagg', 'fineagg', 'age']]
test_Y = test_data['strength']
# 创建神经网络分类器并进行拟合
# 其hidden_layer_sizes参数表示隐藏层的形状,元组中每一个数字代表一个隐藏层的神经元数
clf = MLPRegressor(solver='sgd', alpha=1e-5, activation='logistic',
hidden_layer_sizes=(5, 2), max_iter=2000, tol=1e-4)
clf.fit(train_X, train_Y)
# 输出神经网络的形状
print([coef.shape for coef in clf.coefs_])
print([coef for coef in clf.coefs_])
predicted_value = clf.predict(test_X)
上面程序的输出如下:
# 输出神经网络的形状
[(8, 5), (5, 2), (2, 1)]
# 输出神经网络的参数
# 输入层到第一隐藏层的参数
array([[ 0.03656307, 0.21450494, -0.01190188, 0.38241027, 0.17812552],
[-0.17398515, 0.18235492, -0.1642647 , -0.2432147 , -0.21413478],
[ 0.17538532, -0.22586185, -0.2528862 , 0.15323971, 0.32104582],
[-0.18579287, 0.30107637, -0.10311124, 0.32848603, -0.20293293],
[ 0.19456542, -0.03718471, 0.18091665, -0.128537 , 0.11027603],
[-0.2848081 , 0.01154393, -0.07177461, 0.33554702, 0.07990813],
[ 0.22875706, 0.14532693, 0.02153075, -0.20555497, 0.21749038],
[-0.31004214, 0.28754916, -0.02676772, 0.37536369, -0.05403968]]),
# 第一隐藏层到第二隐藏层的参数
array([[-0.17190271, 0.43500973],
[ 1.3087405 , 1.91464934],
[ 0.52443292, -0.50701212],
[ 1.2645472 , 1.25159916],
[ 1.71981097, 1.1135027 ]]),
# 第二隐藏层到输出层的参数
array([[ 9.60390747], [12.45077171]])