神经网络分类


活动地址:CSDN21天学习挑战赛

概念

感知机

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 Y
1 0 0 -1
1 0 1 1
1 1 0 1
1 1 1 1
0 0 1 -1
0 1 0 -1
0 1 1 1
0 0 0 -1

感知机

  • 输入结点
  • 输入结点做一个线性变化
  • 把线性变化的值做一个符号函数
  • 输出到输出结点

eg
y ^ { 1 ,    0.3 x 1 + 0.3 x 2 + 0.3 x 3 − 0.4 > 0 − 1 ,    0.3 x 1 + 0.3 x 2 + 0.3 x 3 − 0.4 < 0 \hat{y} \begin{cases} 1,\,\,0.3x_1+0.3x_2+0.3x_3-0.4>0\\ -1,\,\,0.3x_1+0.3x_2+0.3x_3-0.4<0 \end{cases} y^{1,0.3x1+0.3x2+0.3x30.4>01,0.3x1+0.3x2+0.3x30.4<0

  • 感知机能够通过有限次训练就能学会正确的行为
  • 感知机无法执行异或问题

多层感知机

用于解决感知机无法执行异或问题

即用两计算层感知器解决异或问题

x 1 x_1 x1 x 2 x_2 x2 y 1 y_1 y1 y 2 y_2 y2 o
0 0 1 1 1
0 1 1 0 0
1 0 0 1 0
1 1 1 1 1
  • 第一层感知机,将(1,0)作为一类,其它作为一类分开,得到第一层感知机结果 y 1 y_1 y1
  • 第二层感知机,将(0,1)作为一类,其他作为一类分开,得到第二层感知机结果 y 2 y_2 y2
  • 第三层感知机的输入,是前两层感知机的输出,三个点(1,1)(1,0)(0,1),很容易找到一条直线将他们分开,得到的输出就能解决异或问题

多层人工神经网络

  • 人工神经网路比感知机模型复杂

    • 输入层和输出层之间包含隐藏层

    神经网络分类_第1张图片

误差反向传播(BP)网络

神经网络分类_第2张图片

  • 我们得到 o 1    o 2 . . . o n o_1\,\,o_2...o_n o1o2...on的预测值,预测值与真实值存在误差,这部分误差从上再往下进行传播

BP网络模型

  • 激活函数

    • 必须处处可导
    • 一般使用S型函数——sigmoid函数
  • 使用S型激活函数是BP网络输入与输出关系

    • 输入
      n e t = x 1 w 1 + x 2 w 2 + . . . + x n w n net=x_1w_1+x_2w_2+...+x_nw_n net=x1w1+x2w2+...+xnwn

    • 输出
      y = f ( n e t ) = 1 1 + e − n e t y=f(net)=\frac{1}{1+e^{-net}} y=f(net)=1+enet1

后向传播算法理论支撑

  • 超参数
    ∙ 激活函数: S i g m o i d ∙ 损失函数:均方差损失——计算误差 B a t c h     s i z e : 1 \bullet 激活函数:Sigmoid\\ \bullet 损失函数:均方差损失——计算误差\\ Batch\,\,\,size:1 激活函数:Sigmoid损失函数:均方差损失——计算误差Batchsize:1

  • 训练的参数
    W e i g h t s   ω → , B i a s   b → 权值和偏置项 Weights\,\overrightarrow{\omega},Bias\,\overrightarrow{b}\\ 权值和偏置项 Weightsω ,Biasb 权值和偏置项

  • 最小化
    E = 1 2 ∑ j = 1 n ( y ^ j − y j ) 2 目的——均方误差尽可能的小 E=\frac{1}{2}\sum_{j=1}^n(\hat y_j-y_j)^2\\ 目的——均方误差尽可能的小 E=21j=1n(y^jyj)2目的——均方误差尽可能的小

D = { ( x 1 → , y 1 → ) , ( x 2 → , y 2 → ) , . . . , ( x n → , y n → ) } , x → ∈ R 3 , y → ∈ R 3 D=\{(\overrightarrow{x_1},\overrightarrow{y_1}),(\overrightarrow{x_2},\overrightarrow{y_2}),...,(\overrightarrow{x_n},\overrightarrow{y_n}) \},\overrightarrow{x}\in R^3,\overrightarrow{y}\in R^3\\ D={(x1 ,y1 ),(x2 ,y2 ),...,(xn ,yn )},x R3,y R3

——训练集

如何学习权值和偏置项

——梯度下降法

反复进行迭代学习,找到较优的权值和偏置项

激活函数

  • 激活函数可以是多种函数

采用梯度下降法
即当前结果 = 上一次迭代结果 − 学习率 ∗ 梯度 θ 0 ← θ 0 − η ∂ f ∂ θ 0 即当前结果=上一次迭代结果-学习率*梯度\\ \theta_0\leftarrow\theta_0-\eta\frac{\partial f}{\partial \theta_0} 即当前结果=上一次迭代结果学习率梯度θ0θ0ηθ0f

  • 第一种,线性激活函数

    一般不使用,因为线性激活函数的梯度为0,则没有办法调整权值

  • Sigmoid函数

  • 双面正切函数

  • 符号函数

为了解决梯度消失的问题,我们通常补充使用线性整流函数 R e L U ReLU ReLU
f ( x ) = max ⁡ ( 0 , x ) f ′ ( x ) = I ( x > 0 ) f(x)=\max(0,x)\\ f'(x)=I(x>0) f(x)=max(0,x)f(x)=I(x>0)

  • 解决了部分梯度消失的问题,而且梯度是常数,其权值可以根据这个常数进行调整
  • 如果输入是负值,则导致梯度为0

当梯度为0,无法再调整权值时,我们称其为导致了神经元的死亡,我们通常设置一个较小的学习率来解决神经元的死亡

后向传播算法步骤

  1. 初始化权重

    • 循环以下两步,直到满足条件
  2. 向前传播输入

    • 在每个结点加权求和,再代入激活函数
      y ^ = s i g n ( ∑ i w i j x i − t j ) \hat{y}=sign(\sum_iw_{ij}x_i-t_j) y^=sign(iwijxitj)
  3. 向后传播误差
    E r r j = O j ( 1 − O j ) ( T j − O j ) E r r j = O j ( 1 − O j ) ∑ k E r r k w j k w i j = w i j + λ E r r j y i t j = t j + λ E r r j T j : 真实的输出 O j : 预测的输出 ∑ k E r r k w j k : 反向传播过来的误差 ∗ 对应权值 λ : 学习率 Err_j=O_j(1-O_j)(T_j-O_j)\\ Err_j=O_j(1-O_j)\sum_kErr_kw_{jk}\\ w_{ij}=w_{ij}+\lambda Err_jy_i\\ t_j=t_j+\lambda Err_j\\ T_j:真实的输出\\ O_j:预测的输出\\ \sum_kErr_kw_{jk}:反向传播过来的误差*对应权值\\ \lambda:学习率 Errj=Oj(1Oj)(TjOj)Errj=Oj(1Oj)kErrkwjkwij=wij+λErrjyitj=tj+λErrjTj:真实的输出Oj:预测的输出kErrkwjk:反向传播过来的误差对应权值λ:学习率

神经网络分类_第3张图片

  • 边上的值为权值,点下的值为偏置项

——正向传播

神经网络分类_第4张图片

——误差反向传播过程

传播到4和5的时候,我们计算出4和5的误差之后,开始调整权值和偏置值

学习率:

  • 学习率过大时,一步走的步子大,可以很快到达收敛点,但这个收敛点不一定是最优的收敛点,可能会在最优收敛点来回进行一个徘徊
  • 学习率过小,步子很小,需要很多次的迭代次数,才能到达收敛点

得到新的权值和偏置值时,再进行一次正向传播和反向传播

直到误差小到一定程度,或者迭代次数达到阈值

注意事项

  • 初始值选择

    • 权值向量以及阈值的初始值应设定在一均匀分布的小范围内
    • 初始值不能为零,否则性能曲面会趋于鞍点
    • 初始值不能太大,否则会远离优化点,导致性能曲面平坦,学习率很慢
  • 训练样本输入次序

    • 不同,也会造成不一样的学习结果
    • 在每一次的学习循环中,输入向量输入网络的次序应使其不同
  • BP算法的学习过程的终止条件

    • 权值向量的梯度<给定值
    • 均方误差值<给定误差容限值
    • 若其推广能力达到目标则予中止
    • 可以结合上述各种方式
  • 普适近似,精度较多

  • 噪声敏感

  • 训练耗时,分类较快

编程实践

from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd

data_url="diabetes.csv"
df=pd.read_csv(data_url)

X=df.iloc[:,0:8]
y=df.iloc[:,8]

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)

clf=MLPClassifier(solver='sgd',alpha=1e-5,hidden_layer_sizes=(5,2),random_state=1)
clf.fit(X_train,y_train)

参数说明

  1. hidden_layer_sizes :例如hidden_layer_sizes=(50, 50),表示有两层隐藏层,第一层隐藏层有50个神经元,第二层也有50个神经元。

  2. activation :激活函数,{‘identity’, ‘logistic’, ‘tanh’, ‘relu’}, 默认relu

  • identity:f(x) = x

  • logistic:其实就是sigmod,f(x) = 1 / (1 + exp(-x)).

  • tanh:f(x) = tanh(x).

  • relu:f(x) = max(0, x)

  1. solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 默认adam,用来优化权重
  • lbfgs:quasi-Newton方法的优化器

  • sgd:随机梯度下降

  • adam: Kingma, Diederik, and Jimmy Ba提出的机遇随机梯度的优化器

注意:默认solver ‘adam’在相对较大的数据集上效果比较好(几千个样本或者更多),对小数据集来说,lbfgs收敛更快效果也更好。

  1. alpha :float,可选的,默认0.0001,正则化项参数

  2. batch_size : int , 可选的,默认’auto’,随机优化的minibatches的大小batch_size=min(200,n_samples),如果solver是’lbfgs’,分类器将不使用minibatch

  3. learning_rate :学习率,用于权重更新,只有当solver为’sgd’时使用,{‘constant’,’invscaling’, ‘adaptive’},默认constant

  • ‘constant’: 有’learning_rate_init’给定的恒定学习率

  • ‘incscaling’:随着时间t使用’power_t’的逆标度指数不断降低学习率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t)

  • ‘adaptive’:只要训练损耗在下降,就保持学习率为’learning_rate_init’不变,当连续两次不能降低训练损耗或验证分数停止升高至少tol时,将当前学习率除以5.

  1. power_t: double, 可选, default 0.5,只有solver=’sgd’时使用,是逆扩展学习率的指数.当learning_rate=’invscaling’,用来更新有效学习率。

  2. max_iter: int,可选,默认200,最大迭代次数

  3. random_state:int 或RandomState,可选,默认None,随机数生成器的状态或种子。

  4. shuffle: bool,可选,默认True,只有当solver=’sgd’或者‘adam’时使用,判断是否在每次迭代时对样本进行清洗。

  5. tol:float, 可选,默认1e-4,优化的容忍度

  6. learning_rate_int:double,可选,默认0.001,初始学习率,控制更新权重的补偿,只有当solver=’sgd’ 或’adam’时使用。

  7. verbose : bool, 可选, 默认False,是否将过程打印到stdout

  8. warm_start : bool, 可选, 默认False,当设置成True,使用之前的解决方法作为初始拟合,否则释放之前的解决方法。

  9. momentum : float, 默认 0.9,动量梯度下降更新,设置的范围应该0.0-1.0. 只有solver=’sgd’时使用.

  10. nesterovs_momentum : boolean, 默认True, Whether to use Nesterov’s momentum. 只有solver=’sgd’并且momentum > 0使用.

  11. early_stopping : bool, 默认False,只有solver=’sgd’或者’adam’时有效,判断当验证效果不再改善的时候是否终止训练,当为True时,自动选出10%的训练数据用于验证并在两步连续迭代改善,低于tol时终止训练。

  12. validation_fraction : float, 可选, 默认 0.1,用作早期停止验证的预留训练数据集的比例,早0-1之间,只当early_stopping=True有用

  13. beta_1 : float, 可选, 默认0.9,只有solver=’adam’时使用,估计一阶矩向量的指数衰减速率,[0,1)之间

  14. beta_2 : float, 可选, 默认0.999,只有solver=’adam’时使用估计二阶矩向量的指数衰减速率[0,1)之间

  15. epsilon : float, 可选, 默认1e-8,只有solver=’adam’时使用数值稳定值。

属性说明

  • classes_:每个输出的类标签

  • loss_:损失函数计算出来的当前损失值

  • coefs_:列表中的第i个元素表示i层的权重矩阵

  • intercepts_:列表中第i个元素代表i+1层的偏差向量

  • n_iter_ :迭代次数

  • n_layers_:层数

  • n_outputs_:输出的个数

  • out_activation_:输出激活函数的名称。

方法说明

  • fit(X,y):拟合

  • get_params([deep]):获取参数

  • predict(X):使用MLP进行预测

  • predic_log_proba(X):返回对数概率估计

  • predic_proba(X):概率估计

  • score(X,y[,sample_weight]):返回给定测试数据和标签上的平均准确度

  • set_params(**params):设置参数。

你可能感兴趣的:(AIStudy,神经网络,分类,算法)