首页天道酬勤()

()

admin 12-01 16:21 228次浏览

注:本文按《Sklearn 与 TensorFlow 机器学习实用指南》完成。所有版权和解释权属于作者和翻译成员。我只是随身携带和做笔记。

进入深度学习的第二部分。

00-1010在第10章和之前的tf练习中,经过训练的深度神经网络只是一个简单的演示。如果数据量增加或面临更多功能,遇到的问题将变得更加困难。

梯度消失(梯度爆炸),会影响深层神经网络,使下层难以训练。具有数百万个参数的模型将具有过度拟合训练集的严重风险。在这一章中,教程从解释渐变消失的问题开始,并讨论了这个问题的一些最流行的解决方案。接下来,讨论了各种优化器,与普通梯度下降相比,它们可以加速大规模模型的训练。介绍了大规模神经网络的正则化技术。

#通用导入和初始化设置

将numpy作为np导入

导入操作系统

将张量流导入为tf

#为了使笔记本的输出在各次运行中保持稳定

def reset_graph(seed=42):

tf.reset_default_graph()

tf.set_random_seed(种子)

np.random.seed(种子)

导入matplotlib

将matplotlib.pyplot导入为plt

PLT . rcparams[' axes . labelsize ']=14

PLT . rcparams[' xtick . labelsize ']=12

PLT . rcparams[' ytick . labelsize ']=12

#在哪里保存数字

PROJECT_ROOT_DIR=' . '

章节号='深度'

def save_fig(fig_id,紧密_布局=True):

path=OS . path . join(PROJECt _ ROOT _ DIR,' images ',CHAPTER _ ID,fig_id '。png ')

打印('保存数字',图_id)

if紧密_布局:

plt .紧绷_布局()

plt.savefig(路径,格式='png ',dpi=300)

第十一章训练深层神经网络

什么是梯度消失/爆炸?

传播误差的梯度,一旦算法已经计算了网络中每个参数的损失函数的梯度,它就使用这些梯度来用梯度下降步骤更新每个参数。

梯度消失:梯度趋于变得越来越小,并且随着算法进展到更低的水平。结果,梯度下降更新保持低级连接权重几乎不变,训练永远不会收敛到好的解。这就是所谓的梯度消失问题。梯度爆炸:梯度可能会变得越来越大,很多图层更新的权重非常大,算法发散。这就是梯度爆炸问题,这是循环神经网络中最常见的问题。深度神经网络的梯度是不稳定的,不同的层次可能以非常不同的速度学习。目前流行的激活函数sigmoid可以看到,当输入值的范数变大时,函数在0或1饱和,导数非常接近0。

因此,当反向传播开始时,它几乎没有通过网络反向传播的梯度,并且由于反向传播是通过顶层向下传输的,所以现有的小梯度被不断稀释,所以在下层真的没有可用的东西。

因此,各层之间的信息不能很好地传输。

def logit(z):

返回1/(1 np.exp(-z))

z=np.linspace(-5,5,200)

plt.plot([-5,5],[0,0],' k-')

plt.plot([-5,5],[1,1],' k -')

plt.plot([0,0],[-0.2,1.2],' k-')

plt.plot([-5,5],[-3/4,7/4],' g -')

plt.plot(z,logit(z),' b- ',线宽=2)

props=dict(facecolor='black ',shrink=0.1)

PLT . annotation(' satsing ',xytext=(3.5,0.7),xy=(5,1),arrowprops=props,fontsize=14,ha='center ')

PLT . annotation(' satsing ',xytext=(-3.5,0.3),xy=(-5,0),arrowprops=props,fontsize=14,ha='center ')

PLT . annotation(' Linear ',xytext=(2,0.2),xy=(0,0.5),arrowprops=props,fontsize=14,ha='center ')

网格(真)

plt.title('Sigmoid激活功能',fontsize=14)

plt.axis([-5,5,-0.2,1.2])

save_fig('sigmoid

_saturation_plot") plt.show()

解决办法

Glorot 和 Bengio 提出需要信号在两个方向上正确地流动:在进行预测时是正向的,在反向传播梯度时是反向的。 我们不希望信号消失,也不希望它爆炸并饱和。

为了使信号正确流动,作者认为需要每层输出的方差等于其输入的方差。实际上不可能保证两者都是一样的,除非这个层具有相同数量的输入和输出连接,他们提出了折衷办法:随机初始化连接权重必须如公式所描述的那样。其中n_inputs和n_outputs是权重正在被初始化的层(也称为扇入和扇出)的输入和输出连接的数量。 这种初始化策略通常被称为Xavier初始化。

公式如下

在满足之前要求的每层输出的方差等于其输入的方差的情况下时n_inputs = n_outputs,公式可以简化为

现在发展出了不同的激活函数,logistic、He、Relu等。Tensorflow修改了部分方法名称。

activation_fn变成激活(类似地,_fn后缀从诸如normalizer_fn之类的其他参数中移除)weights_initializer变成kernel_initializer默认激活现在是None,而不是tf.nn.relu不支持正则化的参数

2.非饱和激活函数

这里使用的使Relu作为激活函数,优点是对于正值不会饱和,而且计算速率更快。

但是存在的问题是Relu死区。

Relu死区

在训练过程中,一些神经元死亡,意味着它们停止输出 0 以外的任何东西。

在某些情况下,你可能会发现你网络的一半神经元已经死亡,特别是如果你使用大学习率。

在训练期间,如果神经元的权重得到更新,使得神经元输入的加权和为负,则它将开始输出 0 。当这种情况发生时,由于当输入为负时,ReLU函数的梯度为0,神经元不可能恢复生机。

使用leakyRelu

为了解决Relu死区问题,可以使用Relu函数的变体leaky RelU。

这个函数定义为LeakyReLUα(z)= max(αz,z)

超参数α定义了函数“leaks”的程度:它是z < 0时函数的斜率,通常设置为 0.01。这个小斜坡确保 leaky ReLU 永不死亡;他们可能会长期昏迷,但他们有机会最终醒来。

也有文献指出当alpha=0.2时,即是设定一个超大的超参数的性能更优(在大型的数据集中表现良好,但是在小数据集中会出现过拟合的现象)

def logit(z): return 1/(1+np.exp(-z)) z=np.linspace(-5,5,200) #重置tf的图 reset_graph() n_inputs=28*28 n_hidden1=300 X=tf.placeholder(tf.float32,shape=(None,n_inputs),name="X") he_init=tf.variance_scaling_initializer() hidden1=tf.layers.dense(X,n_hidden1,activation=tf.nn.relu,kernel_initializer=he_init,name="hidden1") #超参数α定义了函数“leaks”的程度:它是z < 0时函数的斜率,通常设置为 0.01 def leaky_relu(z, alpha=0.01): return np.maximum(alpha*z, z) plt.plot(z,leaky_relu(z,0.05),"b-",linewidth=2) plt.plot([-5,5],[0,0],'k-') plt.plot([0,0],[-0.5,4.2],'k-') plt.grid(True) props=dict(facecolor='black', shrink=0.1) plt.annotate('Leak', xytext=(-3.5, 0.5), xy=(-5, -0.2), arrowprops=props, fontsize=14, ha="center") plt.title("Leaky ReLU activation function", fontsize=14) plt.axis([-5, 5, -0.5, 4.2]) save_fig("leaky_relu_plot") plt.show()

linux下运行文件的命令是什么-linux运维从Perl中的HTMl/XML标签提取文本编译与测试基础网络 UNetJavaWeb快速入门 MVC架构&web前端的三大技术是哪几个云直播是什么 ULive
什么是感恩节(生成对抗网络详解) n卡cuda(英伟达arm处理器)
相关内容