当前位置:   article > 正文

8 神经网络及Python实现_神经网络设定随机w和b

神经网络设定随机w和b

1 人工神经网络的历史

1.1 生物模型

1943年,心理学家W.S.McCulloch和数理逻辑学家W.Pitts基于神经元的生理特征,建立了单个神经元的数学模型(MP模型)。
神经元生理结构示意图

1.2 数学模型

神经元的数学模型示意图
y k = φ ( ∑ i = 1 m ω k i x i + b k ) = φ ( W k T X + b ) y_{k}=\varphi\left(\sum_{i=1}^{m} \omega_{k i} x_{i}+b_{k}\right)=\varphi\left(W_{k}^{T} X+b\right) yk=φ(i=1mωkixi+bk)=φ(WkTX+b)

1.3 感知器

1957年,Frank Rosenblatt从纯数学的度重新考察这一模型,指出能够从一些输入输出对 ( X , y ) (X, y) (X,y)中通过学习算法获得权重 W W W b b b
问题:给定一些输入输出对 ( X , y ) (X, y) (X,y),其中 y = ± 1 y = \pm 1 y=±1,求一个函数,使 f ( X ) = y f(X) = y f(X)=y
感知器算法:设定 f ( X ) = s i g n ( W T X + b ) f(X) = sign (W^T X + b) f(X)=sign(WTX+b),从一堆输入输出中自动学习,获得 W W W b b b

感知器算法(Perceptron Algorithm):
(1)随机选择 W W W b b b;
(2)取一个训练样本 ( X , y ) (X, y) (X,y)
(i) 若 W T X + b > 0 W^T X + b > 0 WTX+b>0 y = − 1 y = -1 y=1,则:
W = W − X , b = b − 1. W = W - X, b = b - 1. W=WX,b=b1.
(ii)若 W T X + b < 0 W^T X + b < 0 WTX+b<0 y = + 1 y = +1 y=+1,则:
W = W + X , b = b + 1. W = W + X, b = b + 1. W=W+X,b=b+1.
(3)再取另一个 ( X , y ) (X, y) (X,y),回到(2);
(4)终止条件:直到所有输入输出对 ( X , y ) (X, y) (X,y)都不满足(2)中(i)和(ii)之一,退出循环。

感知器算法演示:
在这里插入图片描述

1.4 多层网络

两层神经网络例子:
在这里插入图片描述
a 1 = ω 11 x 1 + ω 12 x 2 + b 1 a 2 = ω 21 x 1 + ω 22 x 2 + b 2 z 1 = φ ( a 1 ) z 2 = φ ( a 2 ) y = ω 1 z 1 + ω 2 z 2 + b 3 a1=ω11x1+ω12x2+b1a2=ω21x1+ω22x2+b2z1=φ(a1)z2=φ(a2)y=ω1z1+ω2z2+b3

a1=ω11x1+ω12x2+b1a2=ω21x1+ω22x2+b2z1=φ(a1)z2=φ(a2)y=ω1z1+ω2z2+b3
其中, φ ( ⋅ ) \varphi(\cdot) φ()为非线性函数。
定理:当 φ ( x ) \varphi(x) φ(x)为阶跃函数时,三层网络可以模拟任意决策面。
举例:

  • 两层神经网络模拟一个非线性决策面,最后W取[1,1,1], b取-2.5;
  • 如果决策面是四边形,第二层神经元就有4个,最后W取[1,1,1,1], b取-3.5;
  • 如果决策面是圆的话,第二层就有无穷多个神经元,去逼近圆;
  • 如果决策面分开了,要在第二层里把神经元竖着写下去,并且加一层神经元,把他们的结果合并起来。对于两个三角形的情况,最后W取[1,1], b取-0.5。只要有一个1,最后结果就是1;都是0,最后结果就是0。
    在这里插入图片描述
    学习算法:后向传播(Back Propogation Algorithm)。
    输入 ( X , Y ) (X, Y) (X,Y),其中 X = [ x 1 , x 2 ] T X = [x_1,x_2]^T X=[x1,x2]T, Y Y Y是标签值(label),即我们希望改变 ω \omega ω b b b,使得标签值 Y Y Y与网络输出的预测值 y y y尽量接近。
    定义目标函数为:
    min ⁡ E ( ω , b ) = min ⁡ E ( X , Y ) [ ( Y − y ) 2 ] \min E(ω,b) = \min E_{(X,Y)}[(Y−y)^2] minE(ω,b)=minE(X,Y)[(Yy)2]
    最简单的梯度下降法(Gradient Descent Method):
    ω ( new  ) = ω ( o l d ) − α ∂ E ∂ ω ∣ ω ( o l d ) , b ( o l d ) b ( new  ) = b ( o l d ) − α ∂ E ∂ b ∣ ω ( o l d ) , b ( o l d ) ω(new )=ω(old)αEω|ω(old),b(old)b(new )=b(old)αEb|ω(old),b(old)
    ω(new )=ω(old)αωE ω(old),b(old)b(new )=b(old)αbE ω(old),b(old)

    Hinton et al 2016.
    常见非线性函数 φ ( x ) \varphi(x) φ(x)的选择:
    (1)Sigmoid: φ ( x ) = 1 1 + e − x , φ ′ ( x ) = φ ( x ) [ 1 − φ ( x ) ] \varphi(x) = \frac{1}{1+ e^{-x}}, \varphi'(x) = \varphi(x)[1 - \varphi(x)] φ(x)=1+ex1,φ(x)=φ(x)[1φ(x)]
    在这里插入图片描述
    (2)tanh: φ ( x ) = e x − e − x e x + e − x , φ ′ ( x ) = 1 − [ φ ( x ) ] 2 \varphi(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}, \varphi'(x) = 1 - [\varphi(x)]^2 φ(x)=ex+exexex,φ(x)=1[φ(x)]2
    在这里插入图片描述
    多层神经网络的优势:
  • (1)基本单元简单,多个基本单元可扩展为非常复杂的非线性函数。因此易于构建,同时模型有很强的表达能力;
  • (2)训练和测试的计算并行性非常好,有利于在分布式系统上的应用;
  • (3)模型构建来源于对人脑的仿生,话题丰富,各种领域的研究人员都有兴趣,都能做贡献。

多层神经网络的劣势:

  • (1)数学不漂亮,优化算法只能获得局部极值,算法性能与初始值有关;
  • (2)不可解释。训练神经网络获得的参数与实际任务的关联性非常模糊;
  • (3)模型可调整的参数很多 (网络层数、每层神经元个数、非线性函数、学习率、优化方法、终止条件等等),使得训练神经网络变成了一门“艺术”;
  • (4)如果要训练相对复杂的网络,需要大量的训练样本。

训练建议:

  • (1)一般情况下,在训练集上的目标函数的平均值(cost)会随着训练的深入而不断减小,如果这个指标有增大情况,停下来。有两种情况:第一是采用的模型不够复杂,以致于不能在训练集上完全拟合;第二是已经训练很好了;
  • (2)分出一些验证集(Validation Set),训练的本质目标是在验证集上获取最大的识别率。因此训练一段时间后,必须在验证集上测试识别率,保存使验证集上识别率最大的模型参数,作为最后结果;
  • (3)注意调整学习率(Learning Rate),如果刚训练几步cost就增加,一般来说是学习率太高了;如果每次cost变化很小,说明学习率太低。

2 参数设置

2.1 随机梯度下降

(1)不用每输入一个样本就去变换参数,而是输入一批样本(叫做一个BATCH或MINI-BATCH),求出这些样本的梯度平均值后,根据这个平均值改变参数。
(2)在神经网络训练中,BATCH的样本数大致设置为50-200不等。

batch_size = option.batch_size;
m = size(train_x,1);
num_batches = m / batch_size;
for k = 1 : iteration
    kk = randperm(m);
    for l = 1 : num_batches
        batch_x = train_x(kk((l - 1) * batch_size + 1 : l * batch_size), :);
        batch_y = train_y(kk((l - 1) * batch_size + 1 : l * batch_size), :);
        nn = nn_forward(nn,batch_x,batch_y);
        nn = nn_backpropagation(nn,batch_y);
        nn = nn_applygradient(nn);
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
m = size(batch_x,2);
  • 1

前向计算

nn.cost(s) = 0.5 / m * sum(sum((nn.a{k} - batch_y).^2)) + 0.5 * nn.weight_decay * cost2;
  • 1

后向传播

nn.W_grad{nn.depth-1} = nn.theta{nn.depth}*nn.a{nn.depth-1}'/m + nn.weight_decay*nn.W{nn.depth-1};
nn.b_grad{nn.depth-1} = sum(nn.theta{nn.depth},2)/m;
  • 1
  • 2

2.2 激活函数选择

在这里插入图片描述

2.3 训练数据初始化

建议:做均值和方差归一化
n e w X = X − m e a n ( X ) s t d ( X ) newX = \frac{X - mean(X)}{std(X)} newX=std(X)Xmean(X)
在这里插入图片描述

[U,V] = size(xTraining);
avgX = mean(xTraining);
sigma = std(xTraining);
xTraining = (xTraining - repmat(avgX,U,1))./repmat(sigma,U,1);
  • 1
  • 2
  • 3
  • 4

2.4 ( ω , b ) (\omega,b) (ωb)的初始化

梯度消失现象:如果 W X T + b W X^T + b WXT+b一开始很大或很小,那么梯度将趋近于0,反向传播后前面与之相关的梯度也趋近于0,导致训练缓慢。
因此,我们要使 W X T + b W X^T + b WXT+b一开始在零附近。
一种比较简单有效的方法是:

  • ( W , b ) (W,b) (W,b)初始化从区间 ( − 1 d , 1 d ) (- \frac{1}{\sqrt{d}}, \frac{1}{\sqrt{d}}) (d 1,d 1)均匀随机取值。其中 d d d ( W , b ) (W,b) (W,b)所在层的神经元个数。
  • 可以证明,如果 X X X服从正态分布,均值0,方差1,且各个维度无关,而 ( W , b ) (W,b) (W,b) ( − 1 d , 1 d ) (- \frac{1}{\sqrt{d}}, \frac{1}{\sqrt{d}}) (d 1,d 1)的均匀分布,则 W X T + b W X^T + b WXT+b是均值为0, 方差为1/3的正态分布。
nn.W{k} = 2*rand(height, width)/sqrt(width)-1/sqrt(width);
nn.b{k} = 2*rand(height, 1)/sqrt(width)-1/sqrt(width);
  • 1
  • 2

参数初始化是一个热点领域,相关论文包括:
在这里插入图片描述

2.5 Batch normalization

论文:Batch normalization accelerating deep network training by reducing internal covariate shift (2015)
基本思想:既然我们希望每一层获得的值都在0附近,从而避免梯度消失现象,那么我们为什么不直接把每一层的值做基于均值和方差的归一化呢?
在这里插入图片描述
每一层FC(Fully Connected Layer)接一个BN(Batch Normalization)层。
x ^ ( k ) = x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ] \hat{x}^{(k)} = \frac{x^{(k)} - E[x^{(k)}]}{\sqrt{\mathbf{Var}[x^{(k)}]}} x^(k)=Var[x(k)] x(k)E[x(k)]
算法流程:
在这里插入图片描述
前向计算:

y = nn.W{k-1} * nn.a{k-1} + repmat(nn.b{k-1},1,m);
if nn.batch_normalization
    nn.E{k-1} = nn.E{k-1}*nn.vecNum + sum(y,2);
    nn.S{k-1} = nn.S{k-1}.^2*(nn.vecNum-1) + (m-1)*std(y,0,2).^2;
    nn.vecNum = nn.vecNum + m;
    nn.E{k-1} = nn.E{k-1}/nn.vecNum;
    nn.S{k-1} = sqrt(nn.S{k-1}/(nn.vecNum-1));
    y = (y - repmat(nn.E{k-1},1,m))./repmat(nn.S{k-1}+0.0001*ones(size(nn.S{k-1})),1,m);
    y = nn.Gamma{k-1}*y+nn.Beta{k-1};
end;
switch nn.activaton_function
    case 'sigmoid'
        nn.a{k} = sigmoid(y);
    case 'tanh'
        nn.a{k} = tanh(y);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

后向传播:

nn.theta{k} = ((nn.W{k}'*nn.theta{k+1})) .* nn.a{k} .* (1 - nn.a{k});
if nn.batch_normalization
    x = nn.W{k-1} * nn.a{k-1} + repmat(nn.b{k-1},1,m);
    x = (x - repmat(nn.E{k-1},1,m))./repmat(nn.S{k-     1}+0.0001*ones(size(nn.S{k-1})),1,m);
    temp = nn.theta{k}.*x;
    nn.Gamma_grad{k-1} = sum(mean(temp,2));
    nn.Beta_grad{k-1} = sum(mean(nn.theta{k},2));
    nn.theta{k} = nn.Gamma{k-1}*nn.theta{k}./repmat((nn.S{k-1}+0.0001),1,m);
end;
nn.W_grad{k-1} = nn.theta{k}*nn.a{k-1}'/m + nn.weight_decay*nn.W{k-1};
nn.b_grad{k-1} = sum(nn.theta{k},2)/m;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.6 目标函数选择

  1. 正则项 (Regulation Term)
    L ( W ) = F ( W ) + R ( W ) = 1 2 ( ∑ 1 b a t c h _ s i z e ∣ ∣ y i − Y i ∣ ∣ 2 + β ∑ k ∑ l W k , l 2 ) L(W)=F(W)+R(W)=12(batch_size1||yiYi||2+βklW2k,l)
    L(W)=F(W)+R(W)=21(1batch_size∣∣yiYi2+βklWk,l2)

    前向计算
cost2 = cost2 +  sum(sum(nn.W{k-1}.^2));
nn.cost(s) = 0.5 / m * sum(sum((nn.a{k} - batch_y).^2)) + 0.5 * nn.weight_decay * cost2;
  • 1
  • 2

后向传播

nn.W_grad{k-1} = nn.theta{k}*nn.a{k-1}'/m + nn.weight_decay*nn.W{k-1};
  • 1
  1. 如果是分类问题, F ( W ) F(W) F(W)可以采用SOFTMAX函数和交叉熵的组合。
    (a)SOFTMAX函数:
    在这里插入图片描述
    p i = e y i ∑ j = 1 N e y j p_i = \frac{e^{y_i}}{\sum_{j=1}^{N} e^{y_j}} pi=j=1Neyjeyi
    通过网络学习 Y = [ y 1 , y 2 , … , y N ] T Y = [y_1, y_2, \dots, y_N]^T Y=[y1,y2,,yN]T P = [ p 1 , p 2 , … , p N ] T P = [p_1, p_2, \dots, p_N]^T P=[p1,p2,,pN]T的映射,其中 ∑ i = 1 N p i = 1 \sum_{i=1}^N p_i = 1 i=1Npi=1
    (b)交叉熵
    目标函数为:
    E = − ∑ i = 1 N c i ∗ log ⁡ ( p i ) E = - \sum_{i=1}^N c_i * \log(p_i) E=i=1Ncilog(pi)
    (c)SOFTMAX函数和交叉熵的组合
    在这里插入图片描述
    如果 F ( W ) F(W) F(W)是SOFTMAX函数和交叉熵的组合,那么求导将会有非常简单的形式:
    ∂ E ∂ y i = p i − c i \frac{\partial E}{\partial y_i} = p_i - c_i yiE=pici
    前向计算
if strcmp(nn.objective_function,'Cross Entropy')
    nn.cost(s) = -0.5*sum(sum(batch_y.*log(nn.a{k})))/m + 0.5 * nn.weight_decay * cost2;
  • 1
  • 2

后向传播

case 'softmax'
     y = nn.W{nn.depth-1} * nn.a{nn.depth-1} + repmat(nn.b{nn.depth-1},1,m);
     nn.theta{nn.depth} = nn.a{nn.depth} - batch_y;
  • 1
  • 2
  • 3

2.7 参数更新策略

(1)常规的更新 (Vanilla Stochastic Gradient Descent)

nn.W{k} = nn.W{k} - nn.learning_rate*nn.W_grad{k};
nn.b{k} = nn.b{k} - nn.learning_rate*nn.b_grad{k};
  • 1
  • 2

SGD的问题
(1) ( W , b ) (W,b) (W,b)的每一个分量获得的梯度绝对值有大有小,一些情况下,将会迫使优化路径变成Z字形状。
在这里插入图片描述
(2)SGD求梯度的策略过于随机,由于上一次和下一次用的是完全不同的BATCH数据,将会出现优化的方向随机的情况。
L ( W ) = 1 N ∑ i = 1 N L i ( x i , y i , W ) ∇ L ( W ) = 1 N ∑ i = 1 N ∇ W L i ( x i , y i , W ) L(W)=1NNi=1Li(xi,yi,W)L(W)=1NNi=1WLi(xi,yi,W)

L(W)=N1i=1NLi(xi,yi,W)L(W)=N1i=1NWLi(xi,yi,W)
在这里插入图片描述
解决各个方向梯度不一致的方法:
(1)AdaGrad
AdaGrad 算法在随机梯度下降法的基础上,通过记录各个分量梯度的累计情况, 以对不同的分量方向的步长做出调整。具体而言,利用 G k = ∑ i = 1 k g i ⊙ g i G^k=\sum^k_{i=1} g_i⊙g_i Gk=i=1kgigi 记录分量梯度的累计,并构造如下迭代格式:
x k + 1 = x k − α G k + ϵ 1 n ⊙ g k , G k + 1 = G k + g k + 1 ⊙ g k + 1 . x^{k+1} =x^k−\frac{α}{G^k+ϵ\mathbf{1}_n}⊙g^k, \\ G^{k+1} = G^k+g^{k+1}⊙g^{k+1}. xk+1=xkGk+ϵ1nαgk,Gk+1=Gk+gk+1gk+1.
在这里插入图片描述

if strcmp(nn.optimization_method, 'AdaGrad')

nn.rW{k} = nn.rW{k} + nn.W_grad{k}.^2;
nn.rb{k} = nn.rb{k} + nn.b_grad{k}.^2;

nn.W{k} = nn.W{k} - nn.learning_rate*nn.W_grad{k}./(sqrt(nn.rW{k})+0.001);

nn.b{k} = nn.b{k} - nn.learning_rate*nn.b_grad{k}./(sqrt(nn.rb{k})+0.001);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(2)RMSProp
在这里插入图片描述

if strcmp(nn.optimization_method, 'RMSProp')
nn.rW{k} = 0.9*nn.rW{k} + 0.1*nn.W_grad{k}.^2;
nn.rb{k} = 0.9*nn.rb{k} + 0.1*nn.b_grad{k}.^2;
 
nn.W{k} = nn.W{k} - nn.learning_rate*nn.W_grad{k}./(sqrt(nn.rW{k})+0.001);
            
nn.b{k} = nn.b{k} - nn.learning_rate*nn.b_grad{k}./(sqrt(nn.rb{k})+0.001); %rho = 0.9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

解决梯度随机性问题:
(3)Momentum
在这里插入图片描述
在这里插入图片描述

if strcmp(nn.optimization_method, 'Momentum')
nn.vW{k} = 0.5*nn.vW{k} + nn.learning_rate*nn.W_grad{k};
 
nn.vb{k} = 0.5*nn.vb{k} + nn.learning_rate*nn.b_grad{k};
            
nn.W{k} = nn.W{k} - nn.vW{k};
nn.b{k} = nn.b{k} - nn.vb{k}; %rho = 0.5;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

同时两个问题:
(4)Adam
在这里插入图片描述

if strcmp(nn.optimization_method, 'Adam')
nn.sW{k} = 0.9*nn.sW{k} + 0.1*nn.W_grad{k};
nn.sb{k} = 0.9*nn.sb{k} + 0.1*nn.b_grad{k};
nn.rW{k} = 0.999*nn.rW{k} + 0.001*nn.W_grad{k}.^2;
nn.rb{k} = 0.999*nn.rb{k} + 0.001*nn.b_grad{k}.^2;
            
nn.W{k} = nn.W{k} - 10*nn.learning_rate*nn.sW{k}./sqrt(1000*nn.rW{k}+0.00001);
            
nn.b{k} = nn.b{k} - 10*nn.learning_rate*nn.sb{k}./sqrt(1000*nn.rb{k}+0.00001);  %rho1 = 0.9, rho2 = 0.999, delta = 0.00001
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.8 训练建议

(1) Batch Normalization 比较好用,用了这个后,对学习率、参数更新策略等不敏感。建议如果用Batch Normalization, 更新策略用最简单的SGD即可,我的经验是加上其他反而不好。
(2)如果不用Batch Normalization, 通过合理变换其他参数组合,也可以达到目的。
(3)由于梯度累积效应,AdaGrad, RMSProp, Adam三种更新策略到了训练的后期会很慢,可以采用提高学习率的策略来补偿这一效应。

参考文献

浙江大学胡浩基《机器学习:人工神经网络介绍》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/314090
推荐阅读
相关标签
  

闽ICP备14008679号