学习笔记

学习笔记



softmax

sigmod  1/1+exp(-x)

交叉熵损失函数


Relu激活函数

相较于sigmoid和tanh,Relu的主要优势是计算效率高且不会出现梯度消失问题

ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。

用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。 

在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。

在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。

importtorch

fromtorchimportnn

fromtorch.nnimportinit

importnumpyasnp

importsys

sys.path.append("/home/kesci/input")

importd2lzh1981asd2l

print(torch.__version__)

num_inputs,num_outputs,num_hiddens=784,10,256


net=nn.Sequential(

d2l.FlattenLayer(),

nn.Linear(num_inputs,num_hiddens),

nn.ReLU(),

nn.Linear(num_hiddens,num_outputs),

       )

forparamsinnet.parameters():

init.normal_(params,mean=0,std=0.01)​

batch_size=256

train_iter,test_iter=d2l.load_data_fashion_mnist(batch_size,root='/home/kesci/input/FashionMNIST2065')

loss=torch.nn.CrossEntropyLoss()

optimizer=torch.optim.SGD(net.parameters(),lr=0.1)    

num_epochs=5

d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,None,None,optimizer)

L2范式正则化


dropout

训练误差 泛化误差

通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。


K折交叉验证

由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。一种改善的方法是K折交叉验证(K-fold cross-validation)。在K折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。


梯度消失和梯度爆炸

当神经网络的层数较多时,模型的数值稳定性容易变差

解决办法

换用relu 激活函数

BatchNormalization

ResNet残差结构

LSTM结构

预训练加finetunning

此方法来自Hinton在06年发表的论文上,其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层的输出作为下一层的输入,这就是逐层预训练。

训练完成后,再对整个网络进行“微调(fine-tunning)”。

此方法相当于是找全局最优,然后整合起来寻找全局最优,但是现在基本都是直接拿imagenet的预训练模型直接进行finetunning。

梯度剪切、正则

这个方案主要是针对梯度爆炸提出的,其思想是设值一个剪切阈值,如果更新梯度时,梯度超过了这个阈值,那么就将其强制限制在这个范围之内。这样可以防止梯度爆炸。

另一种防止梯度爆炸的手段是采用权重正则化,正则化主要是通过对网络权重做正则来限制过拟合,但是根据正则项在损失函数中的形式:

可以看出,如果发生梯度爆炸,那么权值的范数就会变的非常大,反过来,通过限制正则化项的大小,也可以在一定程度上限制梯度爆炸的发生。

参考链接 https://www.jianshu.com/p/3f35e555d5ba

你可能感兴趣的:(学习笔记)